Fixed some vehicle bugs

This commit is contained in:
Seefo
2014-04-23 15:16:06 -04:00
parent cb162badd2
commit 8fdad1d4c5
2 changed files with 86 additions and 68 deletions
+80 -62
View File
@@ -32,6 +32,7 @@ import resources.common.OutOfBand;
import resources.datatables.DisplayType;
import resources.datatables.Options;
import resources.datatables.Posture;
import resources.datatables.State;
import resources.datatables.StateStatus;
import resources.objects.building.BuildingObject;
import resources.objects.creature.CreatureObject;
@@ -392,50 +393,55 @@ public class MountService implements INetworkDispatch {
}
public void mount(CreatureObject rider, CreatureObject mount) {
if (rider == null) {
return;
}
if (mount == null) {
return;
}
// FIXME like above, movement skillmod should be used instead of creo4 vars and never be 0, otherwise it thinks we are always rooted
//if (rider.getSkillModBase("movement") == 0) {
//rider.sendSystemMessage(OutOfBand.ProsePackage("@pet_menu:cant_mount_rooted"), DisplayType.Broadcast);
//return;
//rider.sendSystemMessage(OutOfBand.ProsePackage("@pet_menu:cant_mount_rooted"), DisplayType.Broadcast);
//return;
//}
if (mount.getOption(Options.DISABLED)) {
// Check if mount may be mounted
if (rider == null)
{
return;
}
if (mount == null)
{
return;
}
if (!mount.getOption(Options.MOUNT))
{
return;
}
if (mount.getOption(Options.DISABLED))
{
rider.sendSystemMessage(OutOfBand.ProsePackage("@pet_menu:cant_mount_veh_disabled"), DisplayType.Broadcast);
return;
}
if (!mount.getOption(Options.MOUNT)) {
if (rider.isInStealth())
{
rider.sendSystemMessage(OutOfBand.ProsePackage("@pet_menu:no_mount_stealth"), DisplayType.Broadcast);
return;
}
if (!canMount(rider, mount)) {
if (!canMount(rider, mount))
{
rider.sendSystemMessage(OutOfBand.ProsePackage("@pet_menu:cant_mount"), DisplayType.Broadcast);
return;
}
if (rider.isInStealth()) {
rider.sendSystemMessage(OutOfBand.ProsePackage("@pet_menu:no_mount_stealth"), DisplayType.Broadcast);
return;
}
// Put rider into mount
mount._add(rider);
rider.setStateBitmask(rider.getStateBitmask() | 0x8000000);
rider.setPosture((mount.getTemplate().contains("vehicle")) ? Posture.DrivingVehicle : Posture.RidingCreature);
// Set mount states and stuff
mount.setStateBitmask(mount.getStateBitmask() | State.MountedCreature);
mount.setState(State.MountedCreature, true);
mount.setPosture(Posture.DrivingVehicle);
synchronized(mount.getMutex()) {
mount._add(rider);
}
mount.setStateBitmask(mount.getStateBitmask() | 0x10000000);
//mount.setState(State.MountedCreature, true);
// Set rider states and stuff
rider.setStateBitmask(rider.getStateBitmask() | State.RidingMount);
rider.setState(StateStatus.RidingMount, true);
// Notify observers and update quadtree
mount.notifyObservers(new UpdateContainmentMessage(rider.getObjectID(), mount.getObjectID(), 4), true);
//rider.setState(State.RidingMount, true);
core.simulationService.remove(rider, rider.getWorldPosition().x, rider.getWorldPosition().z, false);
}
@@ -518,11 +524,16 @@ public class MountService implements INetworkDispatch {
return false;
}
if (mount.getSlottedObject("rider") != rider) {
return false;
if(mount.getSlottedObject("rider") == rider) return true;
if(mount.getAttachment("passenger") == null) return false;
for(int i = 1; i < (int) mount.getAttachment("passenger"); i++)
{
if (mount.getSlottedObject("rider" + i) != rider) return true;
}
return true;
return false;
}
public boolean isMounted(SWGObject actor, CreatureObject mount) {
@@ -621,52 +632,59 @@ public class MountService implements INetworkDispatch {
}
public void dismount(CreatureObject rider, CreatureObject mount) {
if (rider == null || mount == null) {
// Check if mount is currently mounted
if (rider == null || mount == null)
{
return;
}
if (!isMounted(rider))
{
return;
}
if (!mount.getOption(Options.MOUNT))
{
return;
}
if (!isMounted(rider)) {
return;
}
// Dismount all passengers
if (!mount.getOption(Options.MOUNT)) {
return;
}
if (rider.getObjectID() == mount.getOwnerId()) {
if (rider.getObjectID() == mount.getOwnerId())
{
CreatureObject owner = rider;
mount.viewChildren(owner, false, false, new Traverser() {
public void process(SWGObject passenger) {
if (passenger != owner) {
mount._remove(passenger);
mount.notifyObservers(new UpdateContainmentMessage(passenger.getObjectID(), 0, -1), false);
if (passenger instanceof CreatureObject) {
((CreatureObject) passenger).setState(StateStatus.RidingMount, false);
((CreatureObject) passenger).setPosture(Posture.Upright);
}
core.simulationService.add(passenger, mount.getWorldPosition().x, mount.getWorldPosition().z, false);
core.simulationService.teleport(passenger, mount.getWorldPosition(), mount.getOrientation(), 0);
}
mount.viewChildren(owner, false, false, new Traverser()
{
public void process(SWGObject passenger)
{
if (passenger != owner) dismount(rider, mount);
}
});
}
// Remove rider from mount
mount._remove(rider);
mount.notifyObservers(new UpdateContainmentMessage(rider.getObjectID(), 0, -1), false);
if (rider.getObjectID() == mount.getOwnerId()) {
mount.setState(StateStatus.MountedCreature, false);
// Set mount states and stuff
if (rider.getObjectID() == mount.getOwnerId())
{
mount.setStateBitmask(0);
mount.setState(State.MountedCreature, false);
}
core.simulationService.add(rider, mount.getWorldPosition().x, mount.getWorldPosition().z, false);
// Set rider states and stuff
rider.setStateBitmask(0);
rider.setState(StateStatus.RidingMount, false);
rider.setPosture((byte) 0);
// Update observers and quadtree
mount.notifyObservers(new UpdateContainmentMessage(rider.getObjectID(), 0, -1), true);
core.simulationService.teleport(rider, mount.getWorldPosition(), mount.getOrientation(), 0);
core.simulationService.add(rider, mount.getWorldPosition().x, mount.getWorldPosition().z, false);
if (!mount.getTemplate().contains("vehicle") && rider.getObjectID() == mount.getOwnerId()) {
// Store mount if it's a creature
if (!mount.getTemplate().contains("vehicle") && rider.getObjectID() == mount.getOwnerId())
{
store(rider, mount);
}
}