Files
dsrc/sku.0/sys.server/compiled/game/script/player/skill/taming.script
T
2013-09-10 23:17:15 -07:00

403 lines
9.9 KiB
Plaintext

include library.callable;
include library.beast_lib;
include library.pet_lib;
include library.utils;
include library.ai_lib;
include library.vehicle;
include library.buff;
const string_id SHAPECHANGE = new string_id("spam","not_while_shapechanged");
commandHandler cmdTellPet()
{
if(!callable.hasAnyCallable(self) || params == null || params.length() > 30)
{
return SCRIPT_CONTINUE; //got no pets out
}
obj_id[] callableList = callable.getCallables(self);
for (int i = 0; i < callableList.length; i++)
{
//otherwise use a messageTo, unless it is too far away or dead:
if(getDistance(callableList[i], self) < 200.0f && !ai_lib.aiIsDead(callableList[i]) && !beast_lib.isBeast(callableList[i]))
{
dictionary parms = new dictionary();
parms.put("text", params);
parms.put("master", self);
messageTo(callableList[i], "handleTellPet", parms, 0, false);
}
}
return SCRIPT_CONTINUE;
}
commandHandler tellPetAttack()
{
if(callable.hasAnyCallable(self))
{
obj_id[] callableList = callable.getCallables(self);
if(callableList.length > 0 && callableList != null)
{
for (int i = 0; i < callableList.length; i++)
{
if(getDistance(callableList[i], self) < 200.0f && !ai_lib.aiIsDead(callableList[i]) && !beast_lib.isBeast(callableList[i]))
{
pet_lib.doCommandNum(callableList[i], pet_lib.COMMAND_ATTACK, self);
}
}
}
}
return SCRIPT_CONTINUE;
}
commandHandler tellPetFollow()
{
if(callable.hasAnyCallable(self))
{
obj_id[] callableList = callable.getCallables(self);
if(callableList.length > 0 && callableList != null)
{
for (int i = 0; i < callableList.length; i++)
{
if(getDistance(callableList[i], self) < 200.0f && !ai_lib.aiIsDead(callableList[i]) && !beast_lib.isBeast(callableList[i]))
{
pet_lib.doCommandNum(callableList[i], pet_lib.COMMAND_FOLLOW, self);
}
}
}
}
return SCRIPT_CONTINUE;
}
commandHandler mount()
{
LOG("mount", "mount(): enter self: " + self + " target: " + target);
debugServerConsoleMsg(self, "+++ PLAYER.skill.taming +++ commandHandler mount() +++ just entered commandHandler mount()");
if(!isIdValid(self) || !isIdValid(target))
{
debugServerConsoleMsg(self, "+++ PLAYER.skill.taming +++ commandHandler mount() +++ either isIdValid(self) or isIdValid(target) failed");
LOG("mount", "mount(): player or mount id is not valid");
return SCRIPT_CONTINUE;
}
if ( buff.hasBuff(self, "instance_exiting") )
{
return SCRIPT_CONTINUE;
}
if(!pet_lib.isPet(target))
{
return SCRIPT_CONTINUE;
}
//Can't mount a vehicle while in shapechange.
int shapechange = buff.getBuffOnTargetFromGroup(self, "shapechange");
obj_id playerCurrentMount = getMountId(self);
if(isIdValid(playerCurrentMount) && exists(playerCurrentMount))
{
string mountName = getTemplateName(playerCurrentMount);
//Dismounting and packing jetpack if player is shapechanged.
if(vehicle.isJetPackVehicle(playerCurrentMount))
{
if(shapechange != 0)
{
utils.dismountRiderJetpackCheck(self);
return SCRIPT_CONTINUE;
}
}
}
if(shapechange != 0)
{
sendSystemMessage(self, SHAPECHANGE);
return SCRIPT_CONTINUE;
}
if(isIdValid(playerCurrentMount))
{
return SCRIPT_CONTINUE;
}
if(!isMob(target))
{
return SCRIPT_CONTINUE;
}
if(self != getMaster(target)) //modified 7/12/05 to allow for non-'offer ride' methodology to multi-passenger vehicle mounting. -rct
{
if(!doesMountHaveRoom(target))
{
return SCRIPT_CONTINUE;
}
else if(!vehicle.mountPermissionCheck(target, self, true))
{
return SCRIPT_CONTINUE;
}
}
if(pet_lib.isInRestrictedScene(self))
{
sendSystemMessage(self, pet_lib.SID_SYS_MOUNT_RESTRICTED_SCENE);
return SCRIPT_CONTINUE;
}
if(!hasObjVar(target, "vehicularTestBed"))
{
if(!hasScript(target, "ai.pet"))
{
debugServerConsoleMsg(self, "+++ PLAYER.skill.taming +++ commandHandler mount() +++ ai.pet isn't present on the target pet");
sendSystemMessage(self, pet_lib.SID_SYS_CANT_MOUNT);
return SCRIPT_CONTINUE;
}
}
if(getMountsEnabled() && pet_lib.canMount(target, self))
{
debugServerConsoleMsg(self, "+++ PLAYER.skill.taming +++ commandHandler mount() +++ pet_lib.canMount(target, self) returned TRUE");
//-- can't mount disabled vehicles
if(vehicle.isVehicle (target) && isDisabled (target))
{
sendSystemMessage (self, pet_lib.SID_SYS_CANT_MOUNT_VEHICLE_DISABLED);
debugServerConsoleMsg(self, "+++ PLAYER.skill.taming +++ commandHandler mount() +++ disabled vehicle");
return SCRIPT_CONTINUE;
}
queueClear(self);
if(!mountCreature(self, target))
{
debugServerConsoleMsg(self, "+++ PLAYER.skill.taming +++ commandHandler mount() +++ mountCreature (self,target) returned FALSE");
sendSystemMessage(self, pet_lib.SID_SYS_CANT_MOUNT);
}
else
{
pet_lib.setMountedMovementRate(self, target);
debugServerConsoleMsg(self, "+++ PLAYER.skill.taming +++ commandHandler mount() +++ mountCreature (self,target) returned TRUE");
//add new vehicle buffs
//have to send this in a message to prevent /prone exploitz
messageTo(self, "applyMountBuff", null, 1, false);
if(!hasObjVar(target, "vehicularTestBed"))
{
if(!hasScript(target, "ai.mount_combat"))
{
debugServerConsoleMsg(self, "+++ PLAYER.skill.taming +++ commandHandler mount() +++ mounted pet doesn't have ai.mount_combat script. adding it now");
attachScript(target, "ai.mount_combat");
}
}
}
}
else
{
debugServerConsoleMsg(self, "+++ PLAYER.skill.taming +++ commandHandler mount() +++ pet_lib.canMount(target, self) returned FALSE");
}
return SCRIPT_CONTINUE;
}
commandHandler battlefieldMount()
{
obj_id mount = target;
if(!isIdValid(self) || !isIdValid(mount))
{
return SCRIPT_CONTINUE;
}
if ( buff.hasBuff(self, "instance_exiting") )
{
return SCRIPT_CONTINUE;
}
// Disallow calling a vehicle while shapechanged.
int shapechange = buff.getBuffOnTargetFromGroup(self, "shapechange");
if(shapechange != 0)
{
sendSystemMessage(self, SHAPECHANGE);
return SCRIPT_CONTINUE;
}
obj_id playerCurrentMount = getMountId(self);
if(isIdValid(playerCurrentMount))
{
return SCRIPT_CONTINUE;
}
if(!doesMountHaveRoom(mount))
{
return SCRIPT_CONTINUE;
}
queueClear(self);
if(!mountCreature(self, mount))
{
debugSpeakMsg(self, "Epic fail");
//sendSystemMessage(self, pet_lib.SID_SYS_CANT_MOUNT);
}
else
{
obj_id pilot = getRiderId(mount);
if(!isIdValid(getMaster(mount)) || (pilot != getMaster(mount) && pilot == getObjectInSlot(mount, "rider")))
{
setMaster(mount, pilot);
}
pet_lib.setMountedMovementRate(self, mount);
setState(self, STATE_RIDING_MOUNT, true);
messageTo(self, "applyMountBuff", null, 1, false);
}
return SCRIPT_CONTINUE;
}
commandHandler dismount()
{
debugServerConsoleMsg(null, "+++ player.skill.taming.commandHandler dismount +++ just entered the dismount command handler");
obj_id playerCurrentMount = getMountId (self);
if(!isIdValid(playerCurrentMount))
{
return SCRIPT_CONTINUE;
}
if ( vehicle.isBattlefieldVehicle(playerCurrentMount) )
{
return SCRIPT_CONTINUE;
}
boolean dismountSuccess = pet_lib.doDismountNow(self);
if(!dismountSuccess)
{
LOG("mounts-bug", "taming.script.commandHandler dismount(): pet_lib.doDismountNow() failed for rider [" + self + "]");
}
//remove new vehicle buffs
int vehicleBuff = buff.getBuffOnTargetFromGroup(self, "vehicle");
if(vehicleBuff !=0)
{
buff.removeBuff(self, vehicleBuff);
}
string mountName = getTemplateName(playerCurrentMount);
if(vehicle.isJetPackVehicle(playerCurrentMount))
{
string_id jetDismount = new string_id ("pet/pet_menu", "jetpack_dismount");
sendSystemMessage(self, jetDismount);
obj_id petControlDevice = callable.getCallableCD(playerCurrentMount);
vehicle.storeVehicle(petControlDevice, self);
}
return SCRIPT_CONTINUE;
}
commandHandler battlefieldDismount()
{
obj_id mount = getMountId (self);
vehicle.setHoverHeight(mount, 0.5f);
dismountCreature(self);
setState(self, STATE_RIDING_MOUNT, false);
obj_id master = getMaster(mount);
if (isIdValid(master) && master == self) // Driver getting out.
{
//lets double check passengers get ejected
//cause we dont want anyone inside if the master is gone
obj_id[] passengerList = utils.getAllRidersInVehicle(self, mount);
if(passengerList != null && passengerList.length > 0)
{
//loop thru the list
for(int i = 0; i < passengerList.length; ++i)
{
//if we have a valid ID lets dismount them
if(isIdValid(passengerList[i]))
{
//dismount
dismountCreature(passengerList[i]);
}
}
}
//now that we are sure no one is inside
//lets set the master to null
//so someone else can jump in and be pilot.
setMaster(mount, null);
}
else // Passenger getting out.
{
if(isIdValid(master))
{
buff.removeBuff(mount, "vehicle_passenger");
}
}
int vehicleBuff = buff.getBuffOnTargetFromGroup(self, "vehicle");
if(vehicleBuff !=0)
{
buff.removeBuff(self, vehicleBuff);
}
int vehicleHasBuff = buff.getBuffOnTargetFromGroup(mount, "vehicle");
if(vehicleHasBuff !=0)
{
buff.removeBuff(mount, vehicleHasBuff);
}
return SCRIPT_CONTINUE;
}
commandHandler dismountandstore()
{
if(!isIdValid(self) || !getMountsEnabled())
{
return SCRIPT_CONTINUE;
}
// Attempt to do the dismount.
boolean dismountResult = pet_lib.doDismountNow(self);
if(!dismountResult)
{
LOG("mounts-bug", "dismountandstore called on rider [" + self + "] but pet_lib.doDismountNow() returned false; aborting store but essential state is already destroyed.");
sendSystemMessage(self, pet_lib.SID_SYS_CANT_DISMOUNT);
return SCRIPT_CONTINUE;
}
// Attempt to do the store.
obj_id playerCurrentMount = getMountId(self);
if(isIdValid(playerCurrentMount))
{
//standard pet storage code block follows.
obj_id petControlDevice = callable.getCallableCD(playerCurrentMount);
setObjVar(petControlDevice, "pet.timeStored", getGameTime());
destroyObject(playerCurrentMount);
}
else
{
sendSystemMessage(self, pet_lib.SID_SYS_CANT_DISMOUNT);
}
return SCRIPT_CONTINUE;
}