Skip to content

Commit 79a7cba

Browse files
committed
HitchingPost: Allow individual unhitching
1 parent 9bcb14a commit 79a7cba

File tree

5 files changed

+146
-7
lines changed

5 files changed

+146
-7
lines changed

modules/demo/hitchingpost/src/main/java/org/gotti/wurmunlimited/mods/hitchingpost/HitchingPostMod.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,19 @@
66

77
import org.gotti.wurmunlimited.modloader.interfaces.Initable;
88
import org.gotti.wurmunlimited.modloader.interfaces.ItemTemplatesCreatedListener;
9+
import org.gotti.wurmunlimited.modloader.interfaces.PreInitable;
910
import org.gotti.wurmunlimited.modloader.interfaces.ServerStartedListener;
1011
import org.gotti.wurmunlimited.modloader.interfaces.WurmServerMod;
1112
import org.gotti.wurmunlimited.modsupport.ItemTemplateBuilder;
13+
import org.gotti.wurmunlimited.modsupport.actions.ModActions;
1214
import org.gotti.wurmunlimited.modsupport.vehicles.ModVehicleBehaviours;
1315

1416
import com.wurmonline.server.MiscConstants;
1517
import com.wurmonline.server.items.AdvancedCreationEntry;
1618
import com.wurmonline.server.items.CreationCategories;
1719
import com.wurmonline.server.items.CreationEntryCreator;
1820
import com.wurmonline.server.items.CreationRequirement;
21+
import com.wurmonline.server.items.Item;
1922
import com.wurmonline.server.items.ItemList;
2023
import com.wurmonline.server.items.ItemTemplate;
2124
import com.wurmonline.server.items.ItemTypes;
@@ -30,7 +33,7 @@
3033
* 3. Register a custom vehicle behaviour
3134
*
3235
*/
33-
public class HitchingPostMod implements WurmServerMod, Initable, ServerStartedListener, ItemTemplatesCreatedListener, ItemTypes, MiscConstants {
36+
public class HitchingPostMod implements WurmServerMod, PreInitable, Initable, ServerStartedListener, ItemTemplatesCreatedListener, ItemTypes, MiscConstants {
3437

3538
private static Logger logger = Logger.getLogger(HitchingPostMod.class.getName());
3639
private int hitchingPostId;
@@ -113,10 +116,23 @@ public void onServerStarted() {
113116
creationEntry.addRequirement(new CreationRequirement(3, ItemList.plank, 2, true));
114117
creationEntry.addRequirement(new CreationRequirement(4, ItemList.horseShoe, 3, true));
115118
}
119+
120+
UnhitchAction unhitchAction = new UnhitchAction(this);
121+
ModActions.registerBehaviourProvider(unhitchAction);
122+
ModActions.registerActionPerformer(unhitchAction);
116123
}
117124

118125
@Override
119126
public void init() {
120127
ModVehicleBehaviours.init();
121128
}
129+
130+
@Override
131+
public void preInit() {
132+
ModActions.init();
133+
}
134+
135+
public boolean isHitchingPost(Item item) {
136+
return item != null && item.getTemplateId() == hitchingPostId;
137+
}
122138
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package org.gotti.wurmunlimited.mods.hitchingpost;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
import java.util.logging.Level;
6+
import java.util.logging.Logger;
7+
8+
import org.gotti.wurmunlimited.modsupport.actions.ActionPerformer;
9+
import org.gotti.wurmunlimited.modsupport.actions.ActionPropagation;
10+
import org.gotti.wurmunlimited.modsupport.actions.BehaviourProvider;
11+
import org.gotti.wurmunlimited.modsupport.vehicles.VehicleFacadeImpl;
12+
13+
import com.wurmonline.server.NoSuchItemException;
14+
import com.wurmonline.server.behaviours.Action;
15+
import com.wurmonline.server.behaviours.ActionEntry;
16+
import com.wurmonline.server.behaviours.Actions;
17+
import com.wurmonline.server.behaviours.Vehicle;
18+
import com.wurmonline.server.behaviours.VehicleBehaviour;
19+
import com.wurmonline.server.creatures.Creature;
20+
import com.wurmonline.server.creatures.Creatures;
21+
import com.wurmonline.server.items.Item;
22+
import com.wurmonline.server.zones.VolaTile;
23+
import com.wurmonline.server.zones.Zone;
24+
import com.wurmonline.server.zones.Zones;
25+
26+
public class UnhitchAction implements BehaviourProvider, ActionPerformer {
27+
28+
private static Logger logger = Logger.getLogger(HitchingPostMod.class.getName());
29+
30+
private HitchingPostMod mod;
31+
32+
protected UnhitchAction(HitchingPostMod mod) {
33+
this.mod = mod;
34+
}
35+
36+
@Override
37+
public short getActionId() {
38+
return Actions.UNHITCH;
39+
}
40+
41+
private boolean canUnhitch(Creature performer, Creature target) {
42+
try {
43+
if (!target.isHitched()) {
44+
return false;
45+
}
46+
final Vehicle hitched = target.getHitched();
47+
if (hitched == null) {
48+
return false;
49+
}
50+
51+
final Item item = new VehicleFacadeImpl(hitched).getItem();
52+
if (mod.isHitchingPost(item) && (VehicleBehaviour.hasKeyForVehicle(performer, item) || VehicleBehaviour.mayDriveVehicle(performer, item, null))) {
53+
return true;
54+
}
55+
return false;
56+
} catch (NoSuchItemException e) {
57+
logger.log(Level.WARNING, e.getMessage(), e);
58+
return false;
59+
}
60+
}
61+
62+
@Override
63+
public List<ActionEntry> getBehavioursFor(Creature performer, Item subject, Creature target) {
64+
return getBehavioursFor(performer, target);
65+
}
66+
67+
@Override
68+
public List<ActionEntry> getBehavioursFor(Creature performer, Creature target) {
69+
if (canUnhitch(performer, target)) {
70+
return Arrays.asList(Actions.actionEntrys[Actions.UNHITCH]);
71+
}
72+
return null;
73+
}
74+
75+
@Override
76+
public boolean action(Action action, Creature performer, Creature target, short num, float counter) {
77+
if (canUnhitch(performer, target)) {
78+
final Vehicle hitched = target.getHitched();
79+
try {
80+
final Zone z = Zones.getZone(target.getTilePos(), target.isOnSurface());
81+
target.getStatus().savePosition(target.getWurmId(), true, z.getId(), true);
82+
} catch (Exception ex) {
83+
logger.log(Level.WARNING, ex.getMessage(), ex);
84+
}
85+
hitched.removeDragger(target);
86+
Creatures.getInstance().setLastLed(target.getWurmId(), performer.getWurmId());
87+
final VolaTile t = target.getCurrentTile();
88+
if (t == null) {
89+
logger.log(Level.WARNING, target.getName() + " has no tile?");
90+
return propagate(action, ActionPropagation.NO_SERVER_PROPAGATION, ActionPropagation.NO_ACTION_PERFORMER_PROPAGATION, ActionPropagation.FINISH_ACTION);
91+
}
92+
t.sendAttachCreature(target.getWurmId(), -10L, 0.0f, 0.0f, 0.0f, 0);
93+
return propagate(action, ActionPropagation.NO_SERVER_PROPAGATION, ActionPropagation.NO_ACTION_PERFORMER_PROPAGATION, ActionPropagation.FINISH_ACTION);
94+
}
95+
return propagate(action);
96+
}
97+
98+
@Override
99+
public boolean action(Action action, Creature performer, Item source, Creature target, short num, float counter) {
100+
return this.action(action, performer, target, num, counter);
101+
}
102+
}

modules/dist/src/assembly/modlauncher.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
<exclude>${project.groupId}:christmasmod</exclude>
1919
<exclude>${project.groupId}:creaturedemo</exclude>
2020
<exclude>${project.groupId}:digtoground</exclude>
21-
<exclude>${project.groupId}:hitchingpost</exclude>
2221
<exclude>${project.groupId}:serverfixes</exclude>
2322
</excludes>
2423
<useProjectArtifact>false</useProjectArtifact>

modules/modlauncher/src/main/java/org/gotti/wurmunlimited/modsupport/vehicles/VehicleFacade.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.gotti.wurmunlimited.modsupport.vehicles;
22

3+
import com.wurmonline.server.NoSuchItemException;
34
import com.wurmonline.server.behaviours.Seat;
5+
import com.wurmonline.server.items.Item;
46

57
public interface VehicleFacade {
68

@@ -33,6 +35,11 @@ public interface VehicleFacade {
3335
void setMaxSpeed(float f);
3436

3537
void setCanHaveEquipment(boolean b);
38+
39+
Item getItem() throws NoSuchItemException;
40+
41+
long getWurmid();
42+
3643
}
3744

3845

modules/modlauncher/src/main/java/org/gotti/wurmunlimited/modsupport/vehicles/VehicleFacadeImpl.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,26 @@
66

77
import org.gotti.wurmunlimited.modloader.ReflectionUtil;
88

9+
import com.wurmonline.server.Items;
10+
import com.wurmonline.server.NoSuchItemException;
911
import com.wurmonline.server.behaviours.Seat;
1012
import com.wurmonline.server.behaviours.Vehicle;
13+
import com.wurmonline.server.items.Item;
1114

1215
public class VehicleFacadeImpl implements VehicleFacade {
1316

14-
private static Method createOnlyPassengerSeats;
15-
private static Method createPassengerSeats;
16-
private static Field embarkString;
17-
private static Field maxSpeed;
18-
private static Field canHaveEquipment;
17+
private static final Method createOnlyPassengerSeats;
18+
private static final Method createPassengerSeats;
19+
private static final Method getWurmid;
20+
private static final Field embarkString;
21+
private static final Field maxSpeed;
22+
private static final Field canHaveEquipment;
1923

2024
static {
2125
try {
2226
createOnlyPassengerSeats = ReflectionUtil.getMethod(Vehicle.class, "createOnlyPassengerSeats");
2327
createPassengerSeats = ReflectionUtil.getMethod(Vehicle.class, "createPassengerSeats");
28+
getWurmid = ReflectionUtil.getMethod(Vehicle.class, "getWurmid", new Class[] {});
2429
embarkString = ReflectionUtil.getField(Vehicle.class, "embarkString");
2530
maxSpeed = ReflectionUtil.getField(Vehicle.class, "maxSpeed");
2631
canHaveEquipment = ReflectionUtil.getField(Vehicle.class, "canHaveEquipment");
@@ -126,5 +131,15 @@ public void setMaxSpeed(float f) {
126131
public void setCanHaveEquipment(boolean b) {
127132
setPrivateField(canHaveEquipment, b);
128133
}
134+
135+
@Override
136+
public Item getItem() throws NoSuchItemException {
137+
return Items.getItem(this.getWurmid());
138+
}
139+
140+
@Override
141+
public long getWurmid() {
142+
return callPrivateMethod(getWurmid);
143+
}
129144

130145
}

0 commit comments

Comments
 (0)