ironsphererpg/scripts/RPGGame.cs

3245 lines
95 KiB
C#
Raw Normal View History

// DisplayName = Tribes 2 RPG
//--- GAME RULES BEGIN ---
//Play T2RPG
//--- GAME RULES END ---
$IS::Web = "ironsphererpg.sourceforge.net";
function execrpg()
{
exec("scripts/version.cs");
exec("scripts/rpgglobals.cs");
exec("scripts/rpgskills.cs");
exec("scripts/rpgsound.cs");// load before items
exec("scripts/rpgtelevalidation.cs");
exec("scripts/rpgspells.cs");
exec("scripts/rpgclasses.cs");
exec("scripts/rpgitems.cs");
exec("scripts/rpgmining.cs");
exec("scripts/rpgjail.cs");
exec("scripts/rpgbonusstate.cs");
exec("scripts/rpgchat.cs");
exec("scripts/rpgaccessory.cs");
exec("scripts/rpghp.cs");
exec("scripts/rpgmana.cs");
exec("scripts/rpgparty.cs");
exec("scripts/rpgraces.cs");
exec("scripts/rpgplayer.cs");
exec("scripts/rpgstats.cs");
exec("scripts/rpgzones.cs");
//exec("scripts/RPGEnterZone.cs"); //enterzone zones calls this.
exec("scripts/rpgspawns.cs");
exec("scripts/rpghouse.cs");
exec("scripts/rpgfunk.cs");
exec("scripts/rpgarray.cs");
exec("scripts/rpgeconomy.cs");
exec("scripts/LobbyGui.cs");
exec("scripts/rpgboat.cs");
exec("scripts/rpgshapes.cs");
exec("scripts/weapons/shockLance.cs");
exec("scripts/trident.cs"); //break activate
exec("scripts/aiRPG.cs");
exec("scripts/rpgguilds.cs");
exec("scripts/rpgarena.cs");
exec("scripts/rpgquest.cs");
exec("scripts/rpgsmithing.cs");
exec("scripts/RPGQuickBinder.cs"); //phantom's quickbind gui
exec("scripts/ruby.cs");//fixes stupid arithmetic problems
exec("scripts/helpers.cs");
exec("scripts/teaparty.cs"); // general server setup in example admin passwords and other various thingies
//exec("scripts/rpgshapes2.cs"); //new shapes for the mod not right now.
$execedagain++;
DefineItems();
DefineItemDatas();
}
execrpg();
//---------------------------------------------------------------------------------
$debugMode = false;
$Host::warmupTime = -1;
//---------------------------------------------------------------------------------
// stub functions to fix console warnings
function customLoadouts()
{
}
function customAISpawn()
{
}
function customZoneSpecifications()
{
}
function customTownBots()
{
}
function CustomMiningPoints()
{
}
function RPGGame::initGameVars(%game)
{
%game.fadeTimeMS = 2000;
%game.notifyMineDist = 7.5;
InitSpawnPoints();
}
function RPGGame::timeLimitReached(%game)
{
}
function RPGGame::scoreLimitReached(%game)
{
}
function RPGGame::gameOver(%game)
{
}
////////////////////////////////////////////////////////////////////////////////////////
function RPGGame::checkScoreLimit(%game, %team)
{
}
function RPGGame::enterMissionArea(%game, %playerData, %player)
{
}
function RPGGame::leaveMissionArea(%game, %playerData, %player)
{
}
function RPGGame::startMatch(%game)
{
if($debugMode == true) echo("RPGGame::startMatch(" @ %game @ ");");
//%game.clearDeployableMaxes();
$missionStartTime = getSimTime();
$matchStarted = true;
AISystemEnabled(true);
%game.saveWorldSchedule = %game.schedule($saveWorldDelay, "saveWorld");
%game.weatherCycleSchedule = %game.schedule($weatherWait, "weatherCycle");
%game.currentWeather = 1;
%game.switchToDusk();
if($MOTDprinting == true)
{
%game.motdDisplaySchedule = %game.schedule($MOTDcycletime , "motdDisplay");
}
}
function RPGGame::saveWorld(%game)
{
if($debugMode == true) echo("RPGGame::SaveWorld(" @ %game @ ");");
if (isEventPending(%game.saveWorldSchedule))
cancel(%game.saveWorldSchedule);
echo("Saving world...");
%cgroup = nametoID("ClientGroup");
%count = %cgroup.getCount();
for (%i = 0; %i < %count; %i++)
%game.saveCharacter(%cgroup.getObject(%i));
if ($SaveWorldMessage !$= "") //if $SaveWorldMessage string is not equal to "" , then
BottomPrintAll($SaveWorldMessage @ "\n\n(World saved)", 5, 3);
else
BottomPrintAll("\n(World saved)", 5, 3);
%game.saveWorldSchedule = %game.schedule($saveWorldDelay, "saveWorld");
}
function RpgGame::motdDisplay(%game) //shinji's prideful motddisplay of nubbishness (aka first real "new" script)
{ //i shall name it simba.
if (isEventPending(%game.motdDisplaySchedule))
cancel(%game.motdDisplaySchedule);
BottomPrintAll($MOTDmessage, 6, 1);
if($debugMode == true) echo("RpgGame::motdDisplay(" @ %game @ ");");
echo($MOTDmessage);
if($MOTDprinting == true)
{
%game.motdDisplaySchedule = %game.schedule($MOTDcycletime , "motdDisplay");
}
}
function RpgGame::weatherCycle(%game)
{
%group = nameToID("ClientGroup");
%len = %group.getCount();
$WeatherChanging = true;
schedule(2000,0, eval, "$WeatherChanging=false;");
bottomPrintAll("\nChanging weather...", 3, 3);
%newWeather = %game.currentWeather++;
if (%newWeather == 4)
%newWeather = %game.currentWeather = 1;
%wait = $weatherWait;
switch(%newWeather)
{
case 1:
if (!isFile("missions/" @ $CurrentMission @ "/night.cs")) //is this is how it detects the day/night...?
%game.exportNight();
%game.schedule(1000,switchToDay);
case 2:
%game.schedule(1000,switchToDusk);
%wait /= 2;
case 3:
if (!isFile("missions/" @ $CurrentMission @ "/day.cs"))
%game.exportDay();
%game.schedule(1000,switchToNight);
default:
%game.currentWeather = 0;
}
%game.weatherLoop = %game.schedule(%wait, "weatherCycle");
}
function RPGGame::exportDay(%game)
{
if($debugMode == true) echo("RPGGame::exportDay(" @ %game @ ");");
if ($exportedDay)
return;
if (!isObject(rpgdayeffect))
{
%game.schedule(10*1000, "ExportDay");
return;
}
%obj = rpgdayeffect;
%obj.save("missions/" @ $CurrentMission @ "/day.cs");
%obj.delete();
$exportedDay = true;
}
function RPGGame::exportNight(%game)
{
if($debugMode == true) echo("RPGGame::exportNight(" @ %game @ ");");
//export and delete!
if ($exportedNight)
return;
if (!isObject(rpgnighteffect))
{
%game.schedule(10*1000, "ExportNight");
return;
}
%obj = rpgnighteffect;
%obj.save("missions/" @ $CurrentMission @ "/night.cs");
%obj.delete();
$exportedNight = true;
}
function RPGGame::switchtoDay(%game)
{
if($debugMode == true) echo("RPGGame::switchtoday(" @ %game @ ");");
if($daynightcycle != -1)
{
if (isObject(RPGNightEffect))
RPGNightEffect.delete();
exec("missions/" @ $CurrentMission @ "/day.cs");
MissionCleanup.add(RPGDayEffect);
}
Game.addDaySky();
}
function RPGGame::switchtoNight(%game)
{
if($debugMode == true) echo("RPGGame::switchtonight(" @ %game @ ");");
if($daynightcycle != -1)
{
if (isObject(RPGDayEffect))
RPGDayEffect.delete();
exec("missions/" @ $CurrentMission @ "/night.cs");
MissionCleanup.add(rpgNightEffect);
}
%game.addNightSky();
}
function RPGGame::switchtodusk(%game)
{
if($debugMode == true) echo("RPGGame::switchtodusk(" @ %game @ ");");
game.addDuskSky();
//asdafgdfgdfg//
//hfghfgh look at me i'm not pretty
}
function RPGGAME::AddDaySky(%game)
{
if($debugMode == true) echo("RPGGame::adddaysky(" @ %game @ ");");
if (isObject(Sky))
Sky.delete();
new Sky(Sky) {
position = "-1216 -848 0";
rotation = "1 0 0 0";
scale = "1 1 1";
cloudHeightPer[0] = "0.5";
cloudHeightPer[1] = "0.25";
cloudHeightPer[2] = "0.199973";
cloudSpeed1 = "0.0001";
cloudSpeed2 = "0.0002";
cloudSpeed3 = "0.0003";
visibleDistance = "1000";
useSkyTextures = "1";
renderBottomTexture = "0";
SkySolidColor = "0.490196 0.639215 0.701960 0.000000";
fogDistance = "450";
fogColor = "0.490196 0.639215 0.701960 1.000000";
fogVolume1 = "200 1 46";
fogVolume2 = "0 0 0";
fogVolume3 = "0 0 0";
materialList = "RPG_WorldMapSky.dml";
windVelocity = "1 0 0";
windEffectPrecipitation = "0";
fogVolumeColor1 = "0.415000 0.666000 0.786000 1.000000";
fogVolumeColor2 = "128.000000 128.000000 128.000000 -198748244414614883000000000000000000000.000000";
fogVolumeColor3 = "128.000000 128.000000 128.000000 -222768174765569861000000000000000000000.000000";
high_visibleDistance = "-1";
high_fogDistance = "-1";
high_fogVolume1 = "-1 100 100";
high_fogVolume2 = "-1 0 0";
high_fogVolume3 = "-1 1.73876e-39 9.48132e+33";
locked = "true";
cloudSpeed0 = "0.000000 0.000000";
};
MissionGroup.add(Sky);
}
function RPGGAME::AddNightSky(%game)
{
if($debugMode == true) echo("RPGGame::addnightsky(" @ %game @ ");");
if (isObject(Sky))
Sky.delete();
new Sky(Sky) {
position = "-1216 -848 0";
rotation = "1 0 0 0";
scale = "1 1 1";
cloudHeightPer[0] = "0.5";
cloudHeightPer[1] = "0.25";
cloudHeightPer[2] = "0.199973";
cloudSpeed1 = "0.0001";
cloudSpeed2 = "0.0002";
cloudSpeed3 = "0.0003";
visibleDistance = "650";
useSkyTextures = "1";
renderBottomTexture = "0";
SkySolidColor = "0.0 0.0 0.0 0.000000";
fogDistance = "25";
fogColor = "0.000000 0.000000 0.000000 0.000000";
fogVolume1 = "200 10 100";
fogVolume2 = "0 0 0";
fogVolume3 = "0 0 0";
materialList = "RPG_Night.dml";
windVelocity = "1 0 0";
windEffectPrecipitation = "0";
fogVolumeColor1 = "0.415000 0.666000 0.786000 1.000000";
fogVolumeColor2 = "128.000000 128.000000 128.000000 -198748244414614883000000000000000000000.000000";
fogVolumeColor3 = "128.000000 128.000000 128.000000 -222768174765569861000000000000000000000.000000";
high_visibleDistance = "-1";
high_fogDistance = "-1";
high_fogVolume1 = "-1 100 100";
high_fogVolume2 = "-1 0 0";
high_fogVolume3 = "-1 1.73876e-39 9.48132e+33";
locked = "true";
cloudSpeed0 = "0.000000 0.000000";
};
MissionGroup.add(Sky);
}
function RPGGAME::AddDuskSky(%game)
{
if($debugMode == true) echo("RPGGame::adddusksky(" @ %game @ ");");
if (isObject(Sky))
Sky.delete();
new Sky(Sky) {
position = "-1216 -848 0";
rotation = "1 0 0 0";
scale = "1 1 1";
cloudHeightPer[0] = "0.5";
cloudHeightPer[1] = "0.25";
cloudHeightPer[2] = "0.199973";
cloudSpeed1 = "0.0001";
cloudSpeed2 = "0.0002";
cloudSpeed3 = "0.0003";
visibleDistance = "825";
useSkyTextures = "1";
renderBottomTexture = "0";
SkySolidColor = "0.0 0.0 0.0 0.000000";
fogDistance = "200";
fogColor = "0.490196 0.639215 0.701960 0.500000";
fogVolume1 = "200 1 46";
fogVolume2 = "0 0 0";
fogVolume3 = "0 0 0";
materialList = "RPG_50.dml";
windVelocity = "1 0 0";
windEffectPrecipitation = "0";
fogVolumeColor1 = "0.415000 0.666000 0.786000 1.000000";
fogVolumeColor2 = "128.000000 128.000000 128.000000 -198748244414614883000000000000000000000.000000";
fogVolumeColor3 = "128.000000 128.000000 128.000000 -222768174765569861000000000000000000000.000000";
high_visibleDistance = "-1";
high_fogDistance = "-1";
high_fogVolume1 = "-1 100 100";
high_fogVolume2 = "-1 0 0";
high_fogVolume3 = "-1 1.73876e-39 9.48132e+33";
locked = "true";
cloudSpeed0 = "0.000000 0.000000";
};
MissionGroup.add(Sky);
}
function RPGGAME::CreateSkyMap(%game)
{
if($debugMode == true) echo("RPGGame::createskymap(" @ %game @ ");");
}
function RPGGame::clientMissionDropReady(%game, %client)
{
if($debugMode == true) echo("RPGGame::clientMissionDropReady(" @ %game @ ", " @ %client @ ");");
//synchronize the clock HUD
messageClient(%client, 'MsgSystemClock', "", 0, 0);
//%game.sendClientTeamList(%client);
%game.setupClientHuds(%client);
// were ready to go.
%client.matchStartReady = true;
echo("Client" SPC %client SPC "is ready.");
clearBottomPrint(%client);
%retval = loadcharacter(%client);//use rpgname to load character...
if(%retval)
{
if(%client.choosingGroup == true)
{
%client.game = %game;
commandToClient(%client, 'OpenISMenu');
commandToClient(%client, 'RPGplayMusic', "SoftTown");
game.BuildMenu(%client, 0, 0);
}
else
%game.spawnPlayer(%client, false);
}
else
{
//this shouldnt happen but sometimes it can... ew....
// kill and delete this client
if( isObject( %client.player ) )
%client.player.delete();
if ( isObject( %client ) )
{
echo("Critical error, character could not be loaded!!");
%client.setDisconnectReason( "Your character could not be created or loaded! Notify server administrator to get it fixed!" );
%client.schedule(700, "delete");
}
}
}
function RPGGame::spawnPlayer(%game, %client, %respawn)
{
if($debugMode == true) echo("RPGGame::spawnPlayer(" @ %game @ ", " @ %client @ ", " @ %respawn @ ");");
if(!%respawn && !%client.newplayer )
{
%spawnpoint = fetchdata(%client, "camppos");
if(!(%spawnpoint !$= "" && %spawnpoint != -1))
{
%spawnPoint = %game.pickPlayerSpawn(%client);
}
}
else
if(%client.newplayer)
{
if(isObject(TrainingSpawn))
%spawnpoint = TrainingSpawn.getTransform();
else
%spawnPoint = %game.pickPlayerSpawn(%client);
}
else
%spawnPoint = %game.pickPlayerSpawn(%client);
%game.createPlayer(%client, %spawnPoint, %respawn);
}
function RPGGame::pickPlayerSpawn(%game, %client)
{
if($debugMode == true) echo("RPGGame::pickPlayerSpawn(" @ %game @ "," SPC %client @ ");");
if(fetchdata(%client, "lastzone") !$= "")
{
%lzone = fetchdata(%client, "lastzone");
if(%lzone.deathspawn !$= "")
{
return %lzone.deathspawn SPC "1 0 0 0";
}
}
return selectRandomMarker("MissionGroup/DefaultSpawnPoints");
}
function RPGGame::createPlayer(%game, %client, %spawnLoc, %respawn)
{
if($debugMode == true) echo("RPGGame::createPlayer(" @ %game @ ", " @ %client @ ", " @ %spawnLoc @ ", " @ %respawn @ ");");
if(%client.isAiControlled())
GiveAIDefaults(%client);
%client.team = 1;
if(%client.player > 0)
error("Attempting to create an angus ghost!");
//defaultplayerarmor is in 'players.cs'
if(%spawnLoc == -1)
///%spawnLoc="-1125.34 -2238.63 216.076 1 0 0 0";
%spawnLoc = "0 0 300 1 0 0 0";
%armor = fetchData(%client, "RACE") @ "Armor";
%armor = "D";
switch$(%armor)
{
case "MaleOrcArmor": echo("valid");
case "MaleHumanArmor":echo("valid");
default:echo("INVALID ARMOR! using server default");
%armor = "MaleHumanArmor";
}
%client.armor = %armor;
//echo("PLAYER" @ %client.key);
//%client.armor = "PLAYER" @ %client.key;
%player = new Player()
{
dataBlock = %client.armor;
};
%player.setTransform(%spawnLoc);
MissionCleanup.add(%player);
// setup some info
%player.setOwnerClient(%client);
%player.team = %client.team;
%client.player = %player;
if(%respawn)
if(%game.isjailed(%client))
%player.setPosition(game.GetPositionForJailNumber(game.GetJailNumber(%client) ) );
%game.playerSpawned(%client.player);
}
function UpdateTargetStuff(%client)
{
if($debugMode == true) echo("UpdateTargetStuff(" @ %client @ ");");
%player = %client.player;
%player.setTarget(%client.target);
setTargetDataBlock(%client.target, %player.getDatablock());
setTargetSensorData(%client.target, PlayerSensor);
setTargetSensorGroup(%client.target, 1);
%client.setSensorGroup(1);
setSensorGroupColor(1, 0xfffffffe, "196 188 10 128");
}
function RPGGame::playerSpawned(%game, %player)
{
if($debugMode == true) echo("RPGGame::playerSpawned(" @ %game @ ", " @ %player @ ");");
%client = %player.client;
if(%client.respawnTimer)
cancel(%client.respawnTimer);
%client.observerStartTime = "";
//set the spawn time (for use by the AI system)
%client.spawnTime = getSimTime();
%client.camera.mode = "";
commandToClient(%client, 'setHudMode', 'Standard');
%client.setControlObject(%player);
// updates client's target info for this player
UpdateTargetStuff(%client);
//--- temp until loadchar comes in
if(fetchdata(%client, "tmpHP")>0)
setHP(%client, fetchData(%client, "tmpHP"));
else
setHP(%client, fetchData(%client, "maxHP"));
if (fetchData(%client, "tmpMANA") > 0)
setMANA(%client, fetchData(%client, "tmpMANA"));
else
setMANA(%client, fetchData(%client, "maxMANA"));
storeData(%client, "templvl", GetLevel(fetchData(%client, "EXP")));
//----
commandToClient(%client, 'setReticle', "gui/ret_blaster" , true);
storeData(%client, "HasLoadedAndSpawned", true);
if(%client.newplayer)
{
%client.newplayer = false;
MessageClient(%client, 'MessageStart', "Go to the nearest human and type #say hi to talk to him.");
}
if($rules $= "dm" )
{
clearInventory(%client);
GiveDmEquipment(%client);
}
//%player.setrechargerate(0.1);
RefreshAll(%client);
}
function Player::scriptKill(%player, %damageType)
{
if($debugMode == true) echo("Player::scriptKill(" @ %player @ ");");
//%player.scriptKilled = 1;
%player.setInvincible(false);
//%targetObject, %sourceObject, %position, %amount, %damageType, %momVec
//game.onClientDamaged(%player.client, %player.client, 2, 0, 0);
%player.damage(0, %player.getPosition(), 100, $DamageType::Suicide);
}
function unfreeze(%id)
{
if($debugMode == true) echo("unfreeze(" @ %id @ ");");
%id.setControlObject(%id.player);
storeData(%id, "frozen", "");
}
function RPGGame::onClientDamaged(%game, %clVictim, %clAttacker, %damageType, %sourceObject, %value, %pos, %damloc) {
if($debugMode == true) echo("RPGGame::onClientDamaged(" @ %game @ "," SPC %clVictim @ "," SPC %clAttacker @ "," SPC %damageType @ "," SPC %sourceObject @ "," SPC %value @ "," SPC %pos @ "," SPC %damloc @ ");");
//if(%damageType == $DamageType::Lava)
// echo("lava: " @ "%clvictim -> " @ %clvictim @ " %clattacker -> " @ %clattacker);
%weapon = fetchData(%clVictim, "weaponInHand");
if(%clVictim > 0)
{
//even if it ends up a miss, the persons healing rate will stop.
%client.lasthittime = getSimTime();
%clVictim.humiliated = "";
%suicide = ( %damageType == 99 ? 1 : 0 );
if(%suicide)
{
%clAttacker = %clVictim;
}
%backupweapon = %weapon;
%weapon = %game.GetItem(%clAttacker, fetchData(%clAttacker, "weaponInHand"));
%weaponid = fetchData(%clattacker, "weaponinHand");
%dweapon = %game.GetItem(%clVictim, fetchData(%clVictim, "weaponInHand"));
%vguildid = IsInWhatGuild(%clVictim);
%aguildid = IsInWhatGuild(%clAttacker);
if(%vguildid != -1)
%vGuild = GuildGroup.getObject(%vguildid);
if(%aguildid != -1)
%aGuild = GuildGroup.GetObject(%aguildid);
%focused = 0;
%bash = 0;
%backstab = 0;
%mugged = 0;
%cleave = 0;
%ignite = 0;
%disrupt = 0;
if(%clAttacker && %clAttacker !$= %clVictim)
{
%clVictim.lastDamageTime = getSimTime();
%clVictim.lastDamageClient = %clAttacker;
if(%clVictim.isAIControlled())
%clVictim.clientDetected(%clAttacker);
}
%skilltype = $SkillType[%weapon];
%dskilltype = $SkillType[%dweapon];
%clVictimPos = %clVictim.player.getPosition();
if(%clAttacker.player)
%clAttackerPos = %clAttacker.player.getPosition();
%victimCurrentArmor = GetCurrentlyWearingArmor(%clVictim);
//==============
//PROCESS STATS
//==============
%isMiss = false;
%sameRaceNull = false;
//------------- CREATE DAMAGE VALUE -------------
if(%damagetype == $DamageType::Spell)
{
if(%clAttacker.focus == true)
{
%focused = true;
%clAttacker.focus = false;
}
%spell = %sourceobject.spell; //workaround
if(%spell $= "")
%spell = %clAttacker.lastspell;
%clAttacker.lastspell = "";
%weapon = %spell;
%value = $spelldata[%spell, DamageMod];//booom!
%element = $spelldata[%spell, Element];
//For the case of SPELLS, the initial damage has already been determined before calling this function
%skilltype = $Skill::OffensiveCasting;
%dmg = %value;
%value = (%dmg / 100) * GetPlayerSkill(%clAttacker, %skilltype) + %dmg/10;
if(%clAttacker.isAiControlled())
%value /= 2;//drop damage by 2 for bots, bots dont have to worry about mana.
%md = fetchdata(%clVictim, "MDEF");
if( $Spell::ElementDefense[%element] != 3 )
%md = CombineRpgRolls(%md, AddPoints(%clVictim, $Spell::ElementDefense[%element]), 0, "inf");
%md = GetRPGRoll(%md);
%ab = (getRandom() * (%md*10)) + 1;
%value = %value - %ab;
//damage resistance now
%value = Cap((%value)/1000, 0, "inf");
}
else if(%damageType != $DamageType::Ground && %damageType != $DamageType::Impact)
{
if(fetchData(%clVictim, "invisible") && %clVictim.adminLevel < 5)
Client::unhide(%clvictim);
//weapon
//----------
//%rweapon = getitem(fetchData(%clAttacker, "weaponInHand"));
//if(%rweapon !$= "")
// %rweapondamage = GetRpgRoll(GetWord(GetAccessoryVar(%rweapon, $SpecialVar), 1));
//else
// %rweapondamage = 0;
%weapondamage = GetRpgRoll(AddPoints(%clAttacker, 6));
%weapdam = %weapondamage;
%multi = Cap((%clAttacker.data.PlayerSkill[%skilltype]*(getRandom()+0.2) ), 1, "inf");
if(%multi < 0) %multi = 0;
%finalweapondamage = round(%weapdam * (%multi/1000+1) + %clattacker.data.PlayerSkill[%skilltype]*getRandom()/8);
//armor
//----------
%rarmor = GetRpgRoll(fetchData(%clVictim, "DEF"));//its definately here
if(fetchdata(%clattacker, "NextHitCleave") == true && %skilltype == $skill::slashing)
{
if(fetchdata(%clAttacker, "Mana") >= 2)
{
%rarmor = 0;
%multi = Cap((%clAttacker.data.PlayerSkill[%skilltype]*getRandom()/2), 1, "inf");
if(%multi < 0) %multi = 0;
%finalweapondamage = round(%weapdam * (%multi/1000+1) + %clattacker.data.PlayerSkill[%skilltype]*getRandom()/10 )*2;
%cleave = true;
refreshMANA(%clAttacker, 2);
}
else
MessageClient(%clAttacker, 'failedCleave', "You do not have enough Mana to Cleave.");
game.schedule(15*1000, "resetcleaveflag", %clAttacker);
storedata(%clAttacker, "NextHitCleave", false);
}
if(fetchdata(%clattacker, "NextHitBackstab") == true && %skilltype == $skill::Piercing)
{
%backfront = getword(%damloc, 1);
storedata(%clattacker, "NextHitBackstab", false);
game.schedule(10*1000, "resetbackstabflag", %clAttacker);
if(%backfront $= "back_right" || %backfront $= "back" || %backfront $= "back_left" || %backfront $= "middle_back")
{
if(fetchdata(%clAttacker, "Mana") >= 1)
{
%backstab = true;
%finalweapondamage *= 4;//OUCH
refreshMANA(%clAttacker, 1);
}
else
MessageClient(%clAttacker, 'failedbackstab', "You do not have enough Mana to backstab.");
}
}
if(fetchdata(%clattacker, "NextHitLeg") == true && %skilltype == $skill::Slashing)
{
%targetleg = true;
storedata(%clAttacker, "NextHitLeg", false);
game.schedule(20*1000, "resetlegflag", %clattacker);
}
if(fetchdata(%clattacker, "NextHitEncumber") == true && %skilltype == $skill::Piercing)
{
%encumber = true;
storedata(%clAttacker, "NextHitEncumber", false);
game.schedule(20*1000, "resetEncumberflag", %clattacker);
}
if(fetchdata(%clattacker, "NextHitStun") == true && %skilltype == $skill::Bludgeoning)
{
%stun = true;
storedata(%clAttacker, "NextHitStun", false);
game.schedule(20*1000, "resetStunflag", %clattacker);
}
if(fetchdata(%clattacker, "NextHitMug") == true)
{
storedata(%clattacker, "NextHitMug", false);
%mugged = true;
game.schedule(15*1000, "resetmugflag", %clattacker);
}
if(%clattacker.hitignite == true)
{
%ignite = true;
%clattacker.hitignite = false;
%em = createEmitter(%pos, "minelampemitter", "0 0 0");
%em.schedule(1000,"delete");
%value *= 1.5;
}
%value = Cap( (%finalweapondamage - %rarmor)/2, 0, "inf");//yea armor does take effect.
if(%value < 1)
%value = 1;
if(%suicide)
%value = fetchData(%clVictim, "MaxHP");
%value = (%value / $TribesDamageToNumericDamage);
if(%skilltype == $skill::Bludgeoning)
{
if(fetchdata(%clAttacker, "NextHitBash") == true)
{
//bash!
if(fetchdata(%clAttacker, "Mana") >= 1)
{
%bash = true;
%eye = %clAttacker.player.getEyeVector();
%vec = vectorScale(%eye, %clAttacker.data.PlayerSkill[$Skill::Bashing]/5);
%vec = VectorAdd(%vec, "0 0 15");
refreshMANA(%clAttacker, 1);
}
else
MessageClient(%clAttacker, 'failedbash', "You do not have enough Mana to bash");
game.schedule(10 * 1000, "resetbashflag", %clAttacker);
storedata(%clAttacker, "NextHitBash", false);
}
else if(fetchdata(%clAttacker, "NextHitDisrupt") == true)
{
if(fetchdata(%clAttacker, "Mana") >= 1)
{
%Disrupt = true;
refreshmana(%clattacker, 1);
if(iseventPending(%clvictim.spellcast))
{
cancel(%clvictim.spellcast);
}
}
else
messageClient(%clattacker, 'faileddisrupt', "You do not have enough Mana to disrupt");
game.schedule(15 * 1000, "resetDisruptFlag", %clAttacker);
storedata(%clAttacker, "NextHitDisrupt", false);
}
}
}
else
{
%skilltype = 0;
}
//------------- DETERMINE MISS OR HIT -------------
if(%damagetype !$= $LandingDamageType && %clAttacker !$= %clVictim && !%suicide && !(%clattacker.isaicontrolled() && %clvictim.isaicontrolled()))
{
//%skilldiff = %clVictim.PlayerSkill[%skilltype] - %clAttacker.PlayerSkill[%skilltype];
//if(%skilldiff >= 0)
// %m = 0.038;
//else
// %m = -0.038;
%d = %clAttacker.data.PlayerSkill[%skilltype] * getRandom() * 1.2 + 2;
%k = (%clvictim.data.PlayerSkill[%skilltype] / 20 + (%clvictim.data.PlayerSkill[%dskilltype] / 2)) * getrandom();
//%y = %m * %skilldiff * %skilldiff + 5;
//%p = Cap(%y, 0, 100);
//%r = (getRandom() * 100) + 1;
if(%d / %k < 1)
{
if(%focused)
{
%weakhit = true;
%value /= 2;
}
else
%isMiss = true;
}
else if (%d / %k < 2)
{
if(!%focused)
{
%weakhit = true;
%value /= 2;
}
}
else if (%d / %k > 5)
{
%criticalhit = true;
%value *= 2;
}
else
{
if(%focused)
{
%criticalhit = true;
%value *= 2;
}
}
}
else if(%damageType == $DamageType::Lava)
{
%value = fetchdata(%clvictim, "HP") * %value;
%value = (%value / $TribesDamageToNumericDamage);
}
else if(%damageType == $DamageType::Impact || %damageType == $DamageType::Ground)
{
%value = fetchdata(%clvictim, "HP") * %value;
%value = (%value / $TribesDamageToNumericDamage);
}
//-------------------------------------------------
// IF PLAYER IS ADMIN, NULLIFY LANDING DAMAGE
// IF PLAYER IS SUPERADMIN, NULLIFY ALL DAMAGE
//-------------------------------------------------
if(%clVictim.adminLevel >= 4 && (%damageType == $DamageType::Impact || %damageType == $DamageType::Ground))
%value = 0;
if(%clVictim.adminLevel >= 5)
%value = 0;
//------------------------------------------------
// SAME RACE CHECKS
//------------------------------------------------
if(IsSameRace(%clVictim, %clAttacker) && %clAttacker !$= %clVictim && $rules !$= "dm")
{
%pvpZneAtt = fetchData(%clAttacker, "inpvpzone");
%pvpZneVic = fetchData(%clVictim, "inpvpzone");
if(inarenabattle(%clAttacker) && inarenabattle(%clVictim))
{
//combat in the arena. allow damage!
}
else if(%pvpZneAtt && %pvpZneVic) {
//both players in pvp zone, allow damage
}
else if( %aGuild > 0 && fetchdata(%clAttacker, "zone").owner == %aguild && %aGuild != %vGuild && fetchdata(%clattacker, "zone") == fetchdata(%clvictim, "zone"))
{
//let damage pass
}
else if( !(IsInCommaList(fetchData(%clVictim, "targetlist"), %clAttacker.rpgname) || IsInCommaList(fetchData(%clAttacker, "targetlist"), %clVictim.rpgname)) )
{
//no target-list involved
if(%clVictim.guildmatchpvp && %clAttacker.guildmatchpvp)
{
if(%clvictim.enemyguild == %aGuild || %clAttacker.enemyguild == %vguild)
{
//valid let damage pass
}
else
{
%value = 0;
%isMiss = false;
%noImpulse = true;
%sameRaceNull = true;
}
}
else
{
%value = 0;
%isMiss = false;
%noImpulse = true;
%sameRaceNull = true;
}
}
else
{
//echo("true");
//one of the people involved has the other one on his/her target-list.
//so let damage go thru
}
}
//-------------------------------------------------
// SAME PLAYER CHECKS
//-------------------------------------------------
if((%clVictim $= %clAttacker) && %suicide == 0)
{
if(%damagetype $= $DamageType::Spell)
{
%value = %value / 3;
if(%value < 0.01)
%value = 0.01;
}
}
else
{
//suicide stabbed self
}
if(!IsDead(%clVictim))
{
%hitby = %clAttacker.nameBase;
%msgcolor = "";
//calculate spelldamage resistance
if(%skilltype == $Skill::OffensiveCasting)
{
//absorb damage
%value *= $TribesDamageToNumericDamage;
%rvalue = round(%value);
%rvalue = ModifyBonusState(%clvictim, $Spell::ElementResistance[%element], %rvalue);
if(%rvalue > 0) //continue
%rvalue = ModifyBonusState(%clvictim, $Spell::ElementResistance[Generic], %rvalue);
if(%rvalue <= 0)
{
%value = 0;
}
else
%value = %rvalue;
%value /= $TribesDamageToNumericDamage;
}
if(%isMiss)
{
%msgcolor = $MsgRed;
%value = 0;
// Fix for some silly message you get when admin
if (trim(%hitby) $= "")
%msgcolor = "";
}
else if(!%isMiss && %value $= 0 && %clAttacker !$= %clVictim)
{
%msgcolor = $MsgWhite;
}
if(%msgcolor !$= "")
{
if(%damagetype !$= $DamageType::Spell)
{
messageClient(%clAttacker, 'onClientDamaged', %msgcolor @ "You try to hit " @ %clVictim.nameBase @ ", but miss!");
messageClient(%clVictim, 'onClientDamaged', %msgcolor @ %hitby @ " tries to hit you, but misses!");
}
else
{
messageClient(%clAttacker, 'onClientDamaged', %msgcolor @ %clVictim.nameBase @ " resists your spell!");
messageClient(%clVictim, 'onClientDamaged', %msgcolor @ "You resist " @ %hitby @ "'s spell!");
}
}
//-------------------------------------------------
// SKILLS
//-------------------------------------------------
if(%skilltype >= 1 && !%sameRaceNull && %clAttacker !$= %clVictim)
{
%base1 = Cap(35 + (fetchData(%clAttacker, "LVL") - fetchData(%clVictim, "LVL")), 1, "inf");
%base2 = Cap(35 + (fetchData(%clVictim, "LVL") - fetchData(%clAttacker, "LVL")), 1, "inf");
if(%isMiss)
{
if(%skilltype > 0)
UseSkill(%clAttacker, %skilltype, false, true);
UseSkill(%clVictim, $SkillEndurance, true, true, 60);
}
else if(!%isMiss && %value $= 0)
{
if(%skilltype > 0)
UseSkill(%clAttacker, %skilltype, false, true);
UseSkill(%clVictim, $SkillEndurance, true, true, 60);
}
else
{
UseSkill(%clVictim, $SkillEndurance, true, true, 60);
if(%skilltype > 0)
UseSkill(%clAttacker, %skilltype, true, true, %base1);
}
if(%bash || %disrupt)
UseSkill(%clAttacker, $skill::Bashing, true, true, 5);
if(%cleave || %targetleg)
UseSkill(%clAttacker, $skill::Cleaving, true, true, 5);
if(%focused)
UseSkill(%clAttacker, $skill::focus, true, true, 5);
if(%backstab || %encumber)
UseSkill(%clAttacker, $skill::Backstabbing, true, true, 1/10);
if(%ignite)
UseSkill(%clAttacker, $skill::ignitearrow, true, true, 4);
}
if(%value < 0)
%value = 0;
if(%value)
{
if(%encumber)
{
//do the effect
%time = 4;
AddBonusState(%clVictim, "12 -40", %time, "Encumber");
weightcall(%clVictim);
//schedule(%time*1000+1, "CalculateBonusState", %clvictim);
schedule(%time*1000+2, %clvictim, "weightStep", %clvictim);
}
if(%stun)
{
//do the effect
%time = 3;
AddBonusState(%clVictim, "12 -100", %time, "Stun");
%clvictim.player.setPosition(%clvictim.player.getPosition());
%clvictim.player.applyimpulse("0 0 1");
%clvictim.player.setVelocity("0 0 0");
weightcall(%clVictim);
%clvictim.schedule(%time*1000+2, "setControlObject",%clvictim.player);
//schedule(%time*1000+1, "CalculateBonusState", %clvictim);
schedule(%time*1000+2, %clvictim, "weightStep", %clVictim);
}
if(%targetleg)
{
//do the effect
%time = 5;
AddBonusState(%clVictim, "12 -30", %time, "TargetLeg");
weightcall(%clVictim);
//schedule(%time*1000+1, "CalculateBonusState", %clvictim);
schedule(%time*1000+2, %clvictim, "weightcall", %clvictim);
}
if(%mugged)
{
domug(%clattacker, %clvictim, %damloc);
}
%backupValue = %value;
//can it be a lck miss?
if(%damageType == $DamageType::Lava )
%canlck = 0;
else
%canlck = 1;
//resolve damage
%client.canlck = %canlck;
%rhp = refreshHP(%clVictim, %value);
if(%bash)
%clVictim.player.setVelocity(%vec);
if(%rhp $= -1)
%value = -1; //There was an LCK miss
else
{
//if(%victimCurrentArmor !$= "")
// %ahs = $ArmorHitSound[%victimCurrentArmor];
//else
//%ahs = GetHitFleshSound(%weapon);
if(%skilltype == $Skill::Slashing)
%clVictim.player.Play3D(%ahs);
else if(%skilltype == $Skill::Bludgeoning)
%clVictim.player.Play3D(%ahs);
else if(%skilltype == $Skill::Piercing)
%clVictim.player.Play3D(%ahs);
else if(%skilltype == $Skill::Archery)
%clVictim.player.Play3D(ArrowHit);
else
%clVictim.player.Play3D(HitFlesh);
}
if(%clVictim.isAiControlled() && fetchData(%clVictim, "SpawnBotInfo") !$= "")
{
serverPlay3D(RandomRaceSound(fetchData(%clVictim, "RACE"), Hit), %clVictimPos);
}
//display amount of damage caused
%convValue = round(%value * $TribesDamageToNumericDamage);
if(%convValue > 0)
{
if(%damageType == $DamageType::Ground)
{
%hitby = "ground";
}
if(%clAttacker == %clVictim)
{
%hitby = "yourself";
}
else if(%clAttacker $= 0)
%hitby = "an NPC";
else
{
if(fetchData(%clAttacker, "invisible"))
%hitby = "an unknown assailant";
else
%hitby = %clAttacker.nameBase;
}
if(%Backstab)
{
%daction = "backstabbed";
%saction = "backstabbed";
}
else if(%Bash)
{
%daction = "bashed";
%saction = "bashed";
}
else if(%Disrupt)
{
%daction = "disrupted";
%saction = "disrupted";
}
else if(%cleave)
{
%daction = "cleaved";
%saction = "cleaved";
}
else if(%mugged)
{
%daction = "mugged";
%saction = "mugged";
}
else if(%targetleg)
{
%daction = "hit";// in the leg";
%saction = "hit";// in the leg";
%daAction = "in the leg ";
%saAction = "in the leg ";
}
else if(%encumber)
{
%daction = "encumbered";
%saction = "encumbered";
}
else if(%stun)
{
%daction = "stunned";
%saction = "stunned";
}
else
{
%daction = "hit";
%saction = "hit";
}
if(%weakhit)
{
%daction = "weakly" SPC %daction;
%saction = "weakly" SPC %saction;
}
if (%criticalhit)
{
%daction = "critically" SPC %daction;
%saction = "critically" SPC %saction;
}
//--------------------
//display to involved
//--------------------
if(!%suicide)
{
if(%clAttacker !$= %clVictim && %clAttacker != 0)
messageClient(%clAttacker, 'onClientDamaged', $MsgRed @ "You " @ %saction SPC %clVictim.nameBase SPC %saAction @ "for " @ %convValue @ " points of damage!");
if(%damageType == $DamageType::Ground || %damageType == $DamageType::Impact)
messageClient(%clVictim, 'onClientDamaged', $MsgRed @ "You fell to the ground for " @ %convValue @ " points of damage!");
else
messageClient(%clVictim, 'onClientDamaged', $MsgRed @ "You were " @ %daction SPC %daAction @ "by " @ %hitby @ " for " @ %convValue @ " points of damage!");
}
else
{
messageClient(%clVictim, 'onClientDamaged', $MsgRed @ "You hit yourself for " @ %convValue @ " points of damage!");
}
//--------------------
//display to radius
//--------------------
if(%clAttacker $= 0)
{
%sname = "An NPC";
%dname = %clVictim.rpgname;
}
else if(%clAttacker $= %clVictim)
{
%sname = %clAttacker.rpgname;
if(stricmp(%clVictim.sex, "Male") $= 0)
%dname = "himself";
else if(stricmp(%clVictim.sex, "Female") $= 0)
%dname = "herself";
else
%dname = "itself";
}
else
{
if(fetchData(%clAttacker, "invisible"))
{
%sname = "An unknown assailant";
Client::unhide(%clAttacker);
}
else
%sname = %clAttacker.rpgName;
%dname = %clVictim.rpgName;
}
if(%damageType == $DamageType::Lava )
{
radiusAllExcept(%clVictim, 0, $MsgBeige @ %dname @ "'s life came to an untimely end in the lava.");
}
else if(%damageType == $DamageType::Ground || %damageType == $DamageType::Impact)
{
radiusAllExcept(%clVictim, 0, $MsgBeige @ %dname @ " fell to their death.");
}
else
radiusAllExcept(%clVictim, %clAttacker, $MsgBeige @ %sname SPC %saction SPC %dname @ " for " @ %convValue @ " points of damage!");
}
else if(%convValue < 0)
{
//this happens when there's a LCK consequence as miss
%hitby = %clAttacker.rpgName;
messageClient(%clAttacker, 'onClientDamaged', $MsgRed @ "You try to hit " @ %clVictim.rpgName @ ", but miss! (LCK)");
messageClient(%clVictim, 'onClientDamaged', $MsgRed @ %hitby @ " tries to hit you, but misses! (LCK)");
}
else
{
errorReport("ERROR! RPGGame.cs RPGGame::onClientDamaged(" @ %game @ ", " @ %clVictim @ ", "
@ %clAttacker @ ", " @ %damageType @ ", " @ %sourceObject @ ", " @ %weapon @
") %convValue == 0 || %convValue $= \"\" %value = " @ %value @ " %backupvalue = " @ %backupvalue @
" %clvictim.rpgname = " @ %clvictim.rpgname @ " %clAttacker.rpgName = " @ %clAttacker.rpgName @
" Report this error line to dev if it does not show up on any known error list", 0);
}
//-------------------------------------------
//add entry to damagedClient's damagedBy list
//-------------------------------------------
//make new entry with shooter's name
if( %clAttacker !$= 0 && !%isMiss && fetchData(%clAttacker, "LVL") <= 150 )
{
%sname = %clAttacker.nameBase;
%dname = %clVictim.nameBase;
if(%clAttacker !$= %clVictim)
{
%index = "";
for(%i = 1; %i <= $maxDamagedBy; %i++)
{
if(%clVictim.damagedBy[%i] $= "" && %index $= "")
%index = %i;
}
if(%index !$= "")
{
%clVictim.damagedBy[%index] = %clAttacker @ " " @ %backupValue;
%clVictim.player.schedule($damagedByEraseDelay * 1000, "clearDamagedBy", %index);
}
else
{
//too many hits on waiting list, he doesn't get in on exp.
}
}
}
if (%clVictim.isAIControlled())
%clVictim.hitCheck = ruby_add(epochTime(),10);
%flash = Cap(%clVictim.player.getDamageFlash() + (%value * 2), 0, 0.75);
%clVictim.player.setDamageFlash(%flash);
if(fetchData(%clVictim, "HP") <= 0)
{
if(%clAttacker.isAiControlled())
{
if(false)
serverPlay3D(RandomRaceSound(fetchData(%clAttacker, "RACE"), Taunt), %clAttackerPos);
}
}
}
if(%isMiss)
{
if(fetchData(%clVictim, "isBonused"))
{
//GameBase::activateShield(%this, "0 0 1.57", 1.47);
serverPlay3D(SoundHitShield, %clVictimPos);
}
}
}
}
else
{
errorReport("ERROR! RPGGame.cs RPGGame::onClientDamaged(" @ %game @ ", " @ %clVictim @ ", "
@ %clAttacker @ ", " @ %damageType @ ", " @ %sourceObject @ ", " @ %value @
") :" @
" Report this error line to dev if it does not show up on any known error list", 0);
}
//call the game specific AI routines...
if(isObject(%clVictim) && %clVictim.isAIControlled() && %convValue > 0)
%game.onAIDamaged(%clVictim, %clAttacker, %damageType, %sourceObject);
if(isObject(%clAttacker) && %clAttacker.isAIControlled() )
%game.onAIDoDamage(%clVictim, %clAttacker, %damageType, %sourceObject); //bot did damage
//if(isObject(%clAttacker) && %clAttacker.isAIControlled())
// %game.onAIFriendlyFire(%clVictim, %clAttacker, %damageType, %sourceObject);
}
function errorReport(%string)
{
echo(%string);
}
function RPGGame::ResetDisruptFlag(%game, %client)
{
storedata(%client, "blockDisrupt", false);
}
function RPGGame::ResetBashFlag(%game, %client)
{
storedata(%client, "blockbash", false);
}
function RPGGame::ResetCleaveFlag(%game, %client)
{
storedata(%client, "blockcleave", false);
}
function RPGGame::ResetLegFlag(%game, %client)
{
storedata(%client, "blockLeg", false);
}
function RPGGAME::ResetBackstabFlag(%game, %client)
{
storedata(%client, "blockbackstab", false);
}
function RPGGAME::resetmugflag(%game, %client)
{
storedata(%client, "blockHitMug", false);
}
function RPGGAME::resetEncumberFlag(%game, %client)
{
storedata(%client, "blockEncumber", false);
}
function RPGGAME::resetStunFlag(%game, %client)
{
storedata(%client, "blockStun", false);
}
function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec)
{
if(%targetObject.getState() $= "Dead")
return;
%selfkiller = "";
if(%targetObject.isMounted())
{
%mount = %targetObject.getObjectMount();
if(%mount.team == %targetObject.team)
{
%found = -1;
for(%i = 0; %i < %mount.getDataBlock().numMountPoints; %i++)
{
if(%mount.getMountNodeObject(%i) == %targetObject)
{
%found = %i;
break;
}
}
if(%found != -1)
{
if(%mount.getDataBlock().isProtectedMountPoint[%found])
{
%mount.getDataBlock().damageObject(%mount, %sourceObject, %position, %amount, %damageType);
return;
}
}
}
}
%clVictim = %targetObject.getOwnerClient();
if(%clVictim $= "")
{
for(%i = 0; GetWord($townbotlist,%i) !$= ""; %i++)
if(%targetObject == GetWord($townbotlist,%i))
return false;
}
%clAttacker = %sourceObject ? %sourceObject.getOwnerClient() : 0;
if( %damagetype == 8 )
%clattacker = %sourceobject.sourceobject.getownerclient();
Game.onClientDamaged(%clVictim, %clAttacker, %damageType, %sourceObject, %amount, %position, %targetObject.getDamageLocation(%position));
%clVictim.lastDamagedBy = %damagingClient;
%clVictim.lastDamaged = getSimTime();
//now call the "onKilled" function if the client was... you know...
if(%targetObject.getState() $= "Dead")
{
// where did this guy get it?
%damLoc = %targetObject.getDamageLocation(%position);
// If we were killed, max out the flash
%targetObject.setDamageFlash(0.75);
%damLoc = %targetObject.getDamageLocation(%position);
Game.onClientKilled(%clVictim, %clAttacker, %damageType, %sourceObject, %damLoc);
}
else if(%amount > 0.1)
{
if(%targetObject.station $= "" && %targetObject.isCloaked())
{
%targetObject.setCloaked(false);
%targetObject.reCloak = %targetObject.schedule( 500, "setCloaked", true );
}
}
playPain( %targetObject );
%targetObject.scriptKilled = "";
}
function Armor::onImpact(%data, %playerObject, %collidedObject, %vec, %vecLen)
{
//problem happens BEFORE this function is called.
//if(%playerobject.client.rpgname $= $merpgname)
%data.damageObject(%playerObject, 0, VectorAdd(%playerObject.getPosition(),%vec), %vecLen * %data.speedDamageScale, $DamageType::Ground);
}
function RPGGame::onClientLeaveGame(%game, %client)
{
// if there is a player attached to this client, kill it
if ($DebugMode) echo("RPGGAME::onClientLeaveGame(" @ %game @ ", " @ %client @ ")");
//cancel a scheduled call...
logEcho(%client.nameBase@" (cl "@%client@") dropped");
}
function RPGGame::WeaponOnInventory(%game, %this, %obj, %amount)
{
return true;
}
function RPGGame::ShapeThrowWeapon(%game, %this)
{
return true;
}
function RPGGame::WeaponOnUse(%game, %data, %obj)
{
return true;
}
function GameConnection::onConnect( %client, %name, %raceGender, %skin, %voice, %voicePitch )
{
if ($DebugMode) echo("GameConnection::onConnect(" @ %client @ ", " @ %name @ ", " @ %raceGender @ ", " @ %skin @ ", " @ %voice @ ", " @ %voicePitch @ ")");
//sendLoadInfoToClient( %client );
commandToClient( %client, 'setBlackout', 1, true );
commandToClient( %client, 'RPGLoadscreen', true );
commandToClient( %client, 'RPGLoadscreenTitle', $Host::GameName );
// Get the client's unique id:
%authInfo = %client.getAuthInfo();
%client.guid = getField( %authInfo, 3 );
//gui check
%client.where = 0;
//create unique 'key' for player
for(%i = 0; %i<$Host::MaxPlayers;%i++)
{
if($client::key[%i] == 0)
{
$client::key[%i] = %client;
%client.key = %i;
break;
}
}
// check admin and super admin list, and set status accordingly
if(!%client.isSuperAdmin)
{
if(isOnSuperAdminList(%client))
{
%client.isAdmin = true;
%client.isSuperAdmin = true;
}
else if(isOnAdminList(%client))
{
%client.isAdmin = true;
}
}
// Sex/Race defaults
switch$(%raceGender)
{
case "Human Male":
%client.sex = "Male";
%client.race = "Human";
case "Human Female":
%client.sex = "Female";
%client.race = "Human";
case "Bioderm":
%client.sex = "Male";
%client.race = "Bioderm";
}
%client.armor = "Light";
// RPG mod will use a entirely different system for smurfs...
%realName = getField(%authInfo, 0);
%tag = getField( %authInfo, 1 );
%rpgSpecial = %tag; //server owners can set that they have to be in a certain clan in order to be able to play on their server? alternate to a password...
//or shall we have it for 'tribes'
if(!$playingonline)
%realname = %name;//doh!
%rpgname = %name @ " " @ %realName;
if(strcmp(%name, %realName) == 0)
{
%client.isSmurf = false;
// Add the tribal tag:
%append = getField( %authInfo, 2 );
%rpgname = %name;
%name = %name; // DO NOTHING WITH NAME! Needed for savecharacter!!
//addToServerGuidList( %client.guid );
//%client.sendGuid = %client.guid;
}
else
{
%client.isSmurf = true;
%smurfName = %name;
%name = %realName;//for savecharacter!
//rpgname is set above so we dont need to set it here
}
if(%client.isSmurf)
%client.nameBase = %smurfName;
else
%client.nameBase = %realName;
%client.name = addTaggedString(%client.namebase);
//echo("client: " @ %client @ " name: " @ %realname);
%client.realName = %realName;
%client.rpgName = %rpgname;
%client.clan = "";
%client.special = %rpgSpecial;//unno we might use this later...
%client.justConnected = true;
%client.isReady = false;
// Make sure that the connecting client is not trying to use a bot skin:
%temp = detag(%skin);
if( %temp $= "basebot" || %temp $= "basebbot")
%client.skin = addTaggedString( "base" );
else
%client.skin = addTaggedString( %skin );
// full reset of client target manager
clientResetTargets(%client, false);
%client.voice = %voice;
%client.voiceTag = addtaggedString(%voice);
//set the voice pitch based on a lookup table from their chosen voice
%client.voicePitch = getValidVoicePitch(%voice, %voicePitch);
%client.target = allocClientTarget(%client, %client.name, %client.skin, %client.voiceTag, '_ClientConnection', 0, 0, %client.voicePitch);
%client.score = 0;
%client.team = 0;
$instantGroup = ServerGroup;
$instantGroup = MissionCleanup;
//echo("CADD: " @ %client @ " " @ %client.getAddress());
%count = ClientGroup.getCount();
for(%cl = 0; %cl < %count; %cl++)
{
%recipient = ClientGroup.getObject(%cl);
if((%recipient != %client))
{
messageClient(%recipient, 'MsgClientJoin', %client.rpgname SPC "has joined the game.",
%recipient.name,
%recipient,
%recipient.target,
%recipient.isAIControlled(),
%recipient.isAdmin,
%recipient.isSuperAdmin,
%recipient.isSmurf,
%recipient.sendGuid);
}
}
//commandToClient(%client, 'getManagerID', %client);
commandToClient(%client, 'setBeaconNames', "Target Beacon", "Marker Beacon", "Bomb Target");
if($CurrentMissionType !$= "SinglePlayer")
{
messageClient(%client, 'MsgClientJoin', '\c2Welcome to Tribes2 RPG %1.',
%name,
%client,
%client.target,
false, // isBot
%client.isAdmin,
%client.isSuperAdmin,
%client.isSmurf,
%client.sendGuid );
messageAllExcept(%client, -1, 'MsgClientJoin', "",
%name,
%client,
%client.target,
false, // isBot
%client.isAdmin,
%client.isSuperAdmin,
%client.isSmurf,
%client.sendGuid );
}
else
{
messageClient(%client, 'MsgClientJoin', "\c0Mission Insertion complete...",
%name,
%client,
%client.target,
false, // isBot
false, // isAdmin
false, // isSuperAdmin
false, // isSmurf
%client.sendGuid );
}
//Game.missionStart(%client);
//setDefaultInventory(%client);
if($missionRunning)
%client.startMission();
$HostGamePlayerCount++;
}
function RPGGame::checkClientVersion(%game, %client)
{
%ver = %client.rpgver;
echo("client has version" SPC %ver);
if(%ver == $rpgver)
{
return false;
}
else
{
%pre = "Ironsphere RPG" SPC $rpgver @ "\n";
if (trim(%ver) $= "")
%client.setDisconnectReason(%pre NL "You do not have Ironsphere. You can download the mod at" SPC $IS::Web @ ".");
else
%client.setDisconnectReason(%pre NL "Your version of Ironsphere (" @ %ver @ ") is incompatible with this server. (" @ $rpgver @"). Please SVN Update on your ironsphererpg folder to update!");
%client.delete();
return true;
}
}
function servercmdsetClientVersion(%client, %ver)
{
if (%client.rpgver $= "")
%client.rpgver = %ver;
}
function GameConnection::onDrop(%client, %reason)
{
if ($DebugMode) echo("GameConnection::onDrop(" @ %client @ ", " @ %reason @ ")");
if($missionRunning)
{
if(inArena(%client))
{
if(!inArenaRoster(%client))
{
%client.player.scriptKill(0);
}
LeaveArena(%client);//leave arena for saving.
}
%guildid = IsInWhatGuild(%client);
%guild = GuildGroup.getObject(%guildid);
if(%client.guildmatchpvp)
{
//eject from match, calculate if ended.
%client.guildmatchpvp = "";
%client.participate = "";
%zone = fetchdata(%client, "zone");
if(%guild == %zone.owner)
{
%zone.home--;
if(%zone.home <= 0)
%zone.owner.EndZoneMatch( %zone, %zone.challenger);
}
if(%guild == %zone.challenger)
{
%zone.away--;
if(%zone.away <= 0)
%zone.owner.EndZoneMatch( %zone, %zone.challenger);
}
%client.enemyguild = "";
}
//save if player is alive some reason %client.player remains set if server runs a DISSCONNECT yet the player is gone
savecharacter(%client);
}
cancel(%client.weightstepcall);
game.onClientLeaveGame(%client);//game doesnt end, lets see if this is the problem
//fixed?...^^
$client::key[%client.key] = "";
if(isObject(%client.player))
%client.player.schedule(500, delete);
cancel(%client.respawnTimer);
%client.respawnTimer = "";
//if(!%client.isSmurf)
// removeFromServerGuidList( %client.guid );
if(!%client.isaicontrolled())
messageAllExcept(%client, -1, 'MsgClientDrop', %client.rpgname @ " has dropped.");
if ( isObject( %client.camera ) )
%client.camera.delete();
freeClientTarget(%client);
removeTaggedString(%client.name);
//echo("CDROP: " @ %client @ " " @ %client.getAddress());
if(!%client.isaicontrolled())
$HostGamePlayerCount--;
// reset the server if everyone has left the game
//if( $HostGamePlayerCount == 0 && $Host::Dedicated)
// schedule(0, 0, "resetServerDefaults");
}
// missioncleanup and missiongroup are checked prior to entering game code
function RPGGame::missionLoadDone(%game)
{
// walks through the mission group and sets the power stuff up
// - groups get initialized with power count 0 then iterated to
// increment powercount if an object within is powered
// - powers objects up/down
//MissionGroup.objectiveInit();
//#marker
MissionGroup.clearPower();
MissionGroup.powerInit(0);
%game.initGameVars(); //set up scoring variables and other game specific globals
setSensorGroupAlwaysVisMask(1, 0xffffffff);
setSensorGroupFriendlyMask(1, 0xffffffff);
// update colors:
// - enemy teams are red
// - same team is green
// - team 0 is white
for(%i = 0; %i < 32; %i++)
{
%team = (1 << %i);
//setSensorGroupColor(%i, %team, "0 255 0 255");
//setSensorGroupColor(%i, ~%team, "255 0 0 255");
//setSensorGroupColor(%i, 1, "255 255 255 255");
setSensorGroupColor(%i, %team, "0 255 0 255");
setSensorGroupColor(%i, ~%team, "0 0 0 255");
setSensorGroupColor(%i, 1, "0 255 255 255");
//setup the team targets (always friendly and visible to same team)
setTargetAlwaysVisMask(%i, %team);
setTargetFriendlyMask(%i, %team);
}
//set up the teams
%game.setUpTeams();//this will setup the townbots and guards
//initialize the AI system
%game.aiInit();//game::aiInit will call the map's ai load function.
$townbotlist = "";
DefineTownBots();
DefineMiningPoints();
LoadServerGuilds();//load up the guilds
//Save off respawn or Siege Team switch information...
//if(%game.class !$= "SiegeGame")
// MissionGroup.setupPositionMarkers(true);
echo("RPGGame mission load done.");
}
function RPGGame::onClientKilled(%game, %clVictim, %clKiller, %damageType, %implement, %damageLocation)
{
if($debugMode == true) echo("RPGGame::onClientKilled(" @ %game @ "," SPC %clVictim @ "," SPC %clKiller @ "," SPC %damageType @ "," SPC %implement @ "," SPC %damageLocation @ ");");
%plVictim = %clVictim.player;
%plKiller = %clKiller.player;
%clKiller.tkills++;
%clVictim.tkills++;
if($rules $= "dm")
{
%ditem = fetchData(%clVictim, "weaponInHand");
%clVictim.player.throw(%ditem);
}
//============
%guildid = IsInWhatGuild(%clvictim);
%guild = GuildGroup.getObject(%guildid);
if(%clvictim.guildmatchpvp)
{
//eject from match, calculate if ended.
%clvictim.guildmatchpvp = "";
%clvictim.participate = "";
%zone = fetchdata(%clvictim, "zone");
if(%guild == %zone.owner)
{
%zone.home--;
if(%zone.home <= 0)
%zone.owner.EndZoneMatch( %zone, %zone.challenger);
}
if(%guild == %zone.challenger)
{
%zone.away--;
if(%zone.away <= 0)
%zone.owner.EndZoneMatch( %zone, %zone.challenger);
}
%clvictim.enemyguild = "";
%guildkilled = true;
}
if(fetchData(%clVictim, "deathmsg") !$= "")
{
%kitem = Player::getMountedItem(%clKiller, $WeaponSlot);
RPGchat(%clVictim, 0, fetchData(%clVictim, "deathmsg"));
}
if(%clVictim.isAiControlled())
{
//event stuff
%i = GetEventCommandIndex(%clVictim, "onkill");
if(%i !$= -1)
{
%name = GetWord($EventCommand[%clVictim, %i], 0);
%type = GetWord($EventCommand[%clVictim, %i], 1);
%cl = getClientByName(%name);
if(%cl $= -1)
%cl = 2048;
%cmd = getSubStr($EventCommand[%clVictim, %i], String::findSubStr($EventCommand[%clVictim, %i], ">")+1, 99999);
%pcmd = ParseBlockData(%cmd, %clVictim, %clKiller);
$EventCommand[%clVictim, %i] = "";
schedule("RPGchat(" @ %cl @ ", 0, \"" @ %pcmd @ "\");", 2); // \"" @ %name @ "\");", 2);
}
ClearEvents(%clVictim);
}
//ok now get the players lck.. if player died without any lck, drop everything, thats the shaft!
%lootfl = fetchdata(%clVictim, "noDropLootbagFlag");
if(inArena(%clVictim))
%lootfl = 1;
if(%guildkilled)
%lootfl = 2;
%lck = fetchdata(%clVictim, "LCK");
if(%lck < 0 )
%timer = 60;
else
%timer = 600;
%ai = %clVictim.isaicontrolled();
%loot = "";
//Phantom139:
//Added support for PvP Zones, certian zones are "item Safe" which means
//players who die in these zones do not lose their items.
%inv = fetchData(%clVictim, "inventory");
%PvPISafe = false;
if(fetchData(%clVictim, "inpvpzone") == true) {
if(fetchData(%clVictim, "initemsafezone") == true) {
%PvPISafe = true;
}
}
for(%i = 0; (%itemstr = GetWord(%inv, %i)) !$= "" && %lootfl $= ""; %i++)
{
%itemstr = strreplace(%itemstr, "%", " ");
%item = GetWord(%itemstr, 1);
%prefix = GetWord(%itemstr, 0);
%suffix = GetWord(%itemstr, 2);
%num = %game.getItemCount(%clvictim, %item, %prefix, %suffix);
%fullitem = %game.GetFullItemName(%prefix, %item, %suffix);
%itemid = %clvictim.data.count[strreplace(%fullitem, " ", "x")];
%type = $itemType[%item];
if(%type $= "weapon" && %lck >= 0 && !%ai )
{
if(%clvictim.data.equipped[%itemid] )
{
%game.InventoryUse(%clvictim, %itemid);
if(!%PvPISafe) {
%game.RemoveFromInventory(%clVictim, 1, %item, %prefix, %suffix);
%loot = %loot @ %prefix @ "%" @ %item @ "%" @ %suffix @ "%" @ 1 @ " ";
}
}
}
else if(%type $= "Armor" && %lck >= 0 && !%ai )
{
if(%clvictim.data.equipped[%itemid] )
{
%game.InventoryUse(%clvictim, %itemid);
if(!%PvPISafe) {
%game.RemoveFromInventory(%clVictim, 1, %item, %prefix, %suffix);
%loot = %loot @ %prefix @ "%" @ %item @ "%" @ %suffix @ "%" @ 1 @ " ";
}
}
}
else
{
if(%lck < 0 || %ai)
{
if(%clvictim.data.equipped[%itemid])
%game.InventoryUse(%client, %itemid);//clean up
if(!%PvPISafe) {
%game.RemoveFromInventory(%clVictim, %num, %item, %prefix, %suffix);
%loot = %loot @ %prefix @ "%" @ %item @ "%" @ %suffix @ "%" @ %num @ " ";
}
}
}
}
if(%lootfl $= "" && !%PvPISafe) {
%coins = FetchData(%clVictim, "COINS")+1-1;
StoreData(%clVictim, "COINS", 0);
}
else if(%lootfl == 2 && !%PvPISafe) {
%coins = Fetchdata(%clVictim, "COINS")+1-1;
%bank = FetchData(%clVictim, "BANK")+1-1;
%asset = %coins+%bank;
%charge = mfloor(%asset/10);
if(%charge > %coins)
{
%bank = %bank - (%charge - %coins);
}
else
%charge = %coins;
storedata(%clvictim, "COINS", 0);
storedata(%clVictim, "BANK", %bank);
%coins = %charge;
%asset = "";
%bank = "";
%charge = "";
%timer = 0;
}
if(%lootfl $= "" || %lootfl == 2)
if(!%PvPISafe)
%Game.TossLootBag(%clVictim, %loot,%coins, %timer);
storeData(%clVictim, "noDropLootbagFlag", "");
storeData(%clVictim, "SpellCastStep", "");
%clVictim.sleepMode = "";
refreshHPREGEN(%clVictim);
refreshMANAREGEN(%clVictim);
//remember the last zone the player was in.
storeData(%clVictim, "lastzone", fetchData(%clVictim, "zone"));
//%clVictim.player.playAudio(0, RandomRaceSound(fetchData(%clVictim, "RACE"), Death));
DistributeExpForKilling(%clVictim);
//RefreshExp(%clKiller);
//============
%clVictim.plyrPointOfDeath = %plVictim.getPosition();
%clVictim.waitRespawn = 1;
cancel( %plVictim.reCloak );
cancel(%clVictim.respawnTimer);
%respawnDelay = 2;
%game.schedule(%respawnDelay*1000, "clearWaitRespawn", %clVictim);
if(%plVictim.lastVehicle !$= "")
{
schedule(15000, %plVictim.lastVehicle,"vehicleAbandonTimeOut", %plVictim.lastVehicle);
%plVictim.lastVehicle.lastPilot = "";
}
// unmount pilot or remove sight from bomber
if(%plVictim.isMounted())
{
if(%plVictim.vehicleTurret)
%plVictim.vehicleTurret.getDataBlock().playerDismount(%plVictim.vehicleTurret);
else
{
%plVictim.getDataBlock().doDismount(%plVictim, true);
%plVictim.mountVehicle = false;
}
}
if(%plVictim.inStation)
commandToClient(%plVictim.client,'setStationKeys', false);
%clVictim.camera.mode = "playerDeath";
// reset who triggered this station and cancel outstanding armor switch thread
if(%plVictim.station)
{
%plVictim.station.triggeredBy = "";
%plVictim.station.getDataBlock().stationTriggered(%plVictim.station,0);
if(%plVictim.armorSwitchSchedule)
cancel(%plVictim.armorSwitchSchedule);
}
//Close huds if player dies...
messageClient(%clVictim, 'CloseHud', "", 'RPGinventoryScreen');
messageClient(%clVictim, 'CloseHud', "", 'RPGshopScreen');
messageClient(%clVictim, 'CloseHud', "", 'vehicleHud');
commandToClient(%clVictim, 'setHudMode', 'Standard', "", 0);
// $weaponslot from item.cs
%plVictim.setRepairRate(0);
%plVictim.setImageTrigger($WeaponSlot, false);
playDeathAnimation(%plVictim, %damageLocation, %damageType);
playDeathCry(%plVictim);
//%ridx = mFloor(getRandom() * ($numDeathMsgs - 0.01));
%victimName = %clVictim.name;
//%game.displayDeathMessages(%clVictim, %clKiller, %damageType, %implement);
// toss whatever is being carried, '$flagslot' from item.cs
// MES - had to move this to after death message display because of Rabbit game type
// target manager update
setTargetDataBlock(%clVictim.target, 0);
// clear the hud
%clVictim.SetWeaponsHudClearAll();
%clVictim.SetInventoryHudClearAll();
%clVictim.setAmmoHudCount(-1);
//if the killer was an AI...
if(isObject(%clKiller) && %clKiller.isAIControlled())
%game.onAIKilledClient(%clVictim, %clKiller, %damageType, %implement);
// reset control object on this player: also sets 'playgui' as content
ResetControlObject(%clVictim);
// set control object to the camera
%clVictim.player.client = 0;
%clVictim.player = 0;
%transform = %plVictim.getTransform();
//note, AI's don't have a camera...
if (isObject(%clVictim.camera))
{
%clVictim.camera.setTransform(%transform);
%clVictim.camera.setOrbitMode(%plVictim, %plVictim.getTransform(), 0.5, 4.5, 4.5);
%clVictim.setControlObject(%clVictim.camera);
}
//hook in the AI specific code for when a client dies
if(%clVictim.isAIControlled())
{
aiReleaseHumanControl(%clVictim.controlByHuman, %clVictim);
%game.onAIKilled(%clVictim, %clKiller, %damageType, %implement);
}
else
aiReleaseHumanControl(%clVictim, %clVictim.controlAI);
//used to track corpses so the AI can get ammo, etc...
AICorpseAdded(%plVictim);
//if the death was a suicide, prevent respawning for 5 seconds...
%clVictim.lastDeathSuicide = false;
if(%damageType == $DamageType::Suicide)
{
%clVictim.lastDeathSuicide = true;
%clVictim.suicideRespawnTime = getSimTime() + 5000;
}
if(inArena(%clVictim))
{
if(!%clvictim.isAiControlled()) //dontrespawn if AI.
Game.createPlayer( %clVictim,ArenaExit1.getposition(), true);
//give the clvictim a new player object then tele him out of the arena!
LeaveArena(%clVictim);
ResetControlObject(%clVictim);
}
if(%guildkilled)
{
storedata(%clvictim, "LCK", fetchdata(%clvictim, "LCK")+1);//negate lck cost. note lck is negitive 1 if killed with no lck
if(fetchdata(%clvictim, "LCK") > 0)
MessageClient(%clVictim, 'Lck', "You gained a LCK point");
}
if(%lck < 0)
storedata(%clVictim, "LCK", 0);
}
function ItemData::onCollision(%data, %obj, %col)
{
game.ItemDataonCollision(%data, %obj, %col);
return;
}
function RPGshopScreen::updateHud(%this, %client, %tag, %aiId)
{
//echo("RPGshopScreen::updateHud(" @ %this @ ", " @ %client @ ", " @ %tag @ "," SPC %aiId @ ")");
commandToClient(%client, 'ShopUpdateHud');
//Server-side
%inv = fetchData(%client, "inventory");
%coins = fetchdata(%client, "COINS");
commandToClient(%client, 'SetCoins', %coins);
%val = 0;
for(%i = 0; (%item = GetWord(%aiId.shopwloadout, %i)) !$= ""; %i++)
{
commandToClient(%client, 'ShopAddRow',0,%item, $ItemDesc[%item]);
}
for(%i = 0; (%item = GetWord(%aiId.shopaloadout, %i)) !$= ""; %i++)
{
commandToClient(%client, 'ShopAddRow',0 ,%item, $ItemDesc[%item]);
}
for(%i = 0; (%item = GetWord(%aiId.shopiloadout, %i)) !$= ""; %i++)
{
commandToClient(%client, 'ShopAddRow',0 ,%item, $ItemDesc[%item]);
}
commandToClient(%client, 'ShopDone');
}
function serverCmdShopListOnSelect(%client, %item)
{
//Server-side
commandToClient(%client, 'ShopListOnSelect', GetItemCost(%client, %item));
}
function serverCmdShopInvListOnSelect(%client, %itemid, %item)
{
commandToClient(%client, 'ShopInvListOnSelect', GetItemValue(%client, GetItem(%itemid)));
}
function serverCmdShopOnBuy(%client, %item, %delta)
{
Client::OnBuy(%client, %Item, %delta);
}
function serverCmdShopOnSell(%client, %item, %delta)
{
Client::OnSell(%client, %Item, %delta);
}
function serverCmdOnOpenStat(%client)
{
RPGstatScreen::updateHud(1, %client, 'RPGstatScreen');
}
function RPGstatScreen::updateHud(%this, %client, %tag)
{
//Server-side
Game.UpdateRPGStatScreen(%this, %client, %tag);
}
function RPGGame::UpdateRPGStatScreen(%game, %this, %client, %tag)
{
commandToClient(%client, 'statUpdateHud');
%sp = fetchdata(%client, "SP");
commandToClient(%client, 'statSetSP', %sp);
%taggedskill[fetchdata(%client, "TagSkill1")] = "Tagged";
%taggedskill[fetchdata(%client, "TagSkill2")] = "Tagged";
%taggedskill[fetchdata(%client, "TagSkill3")] = "Tagged";
for(%i = 1; $SkillDesc[%i] !$= ""; %i++)
{
%skill = GetPlayerSkill(%client, %i);
%multi = GetSkillMultiplier(%client, %i);
%desc = $SkillData[%i];
%tagged = %taggedSkill[%i];
commandToClient(%client, 'StatAddRow',$SkillDesc[%i],%skill,%desc, %multi, %i, %tagged);
}
commandToClient(%client, 'StatDone');
}
function serverCmdStatonIncrease(%client, %skill, %amount)
{
//Server-side
if(%amount >=1 && fetchdata(%client, "SP") >= %amount && %skill > 0)
{
%askill = GetPlayerSkill(%client, %skill);
%lvl = fetchData(%client, "LVL");
if(%lvl > 101 && !isTaggedSkill(%client, %skill)) %lvl = 101;
%ub = ($skillRangePerLevel * %lvl) + 20;
for ( %i = 1; %askill + (%i * GetSkillMultiplier(%client, %skill)) <= %ub && %i <= mfloor(%amount); %i++)
{
storeData(%client, "SP", 1, "dec");
AddSkillPoint(%client, %skill, 1);
}
}
RPGstatScreen::updateHud(1,%client, 'RPGstatScreen');
}
function RPGGame::TagOnSelect(%game, %client, %id)
{
//get client level.
%remove = true;
%removed = false;
%lvl = fetchdata(%client, "LVL");
if(%lvl >= 101) %remove = false;
//first check to see if we are removing any tag skill
if(%remove)
{
if(fetchdata(%client, "TagSkill1") == %id)
{
storedata(%client, "TagSkill1", "");
commandToClient(%client, 'RemoveTag', %id);
%removed = true;
}
if(fetchdata(%client, "TagSkill2") == %id)
{
storedata(%client, "TagSkill2", "");
commandToClient(%client, 'RemoveTag', %id);
%removed = true;
}
if(fetchdata(%client, "TagSkill3") == %id)
{
storedata(%client, "TagSkill3", "");
commandToClient(%client, 'RemoveTag', %id);
%removed = true;
}
}
if( !%removed && fetchdata(%client, "TagSkill1") != %id && fetchdata(%client, "TagSkill2") != %id && fetchdata(%client, "TagSkill3") != %id )
{
if(fetchdata(%client, "TagSkill1") == 0)
{
storedata(%client, "TagSkill1", %id);
commandToClient(%client, 'AddTag', %id);
%tagged = true;
}
else
if(fetchdata(%client, "TagSkill2") == 0)
{
storedata(%client, "TagSkill2", %id);
commandToClient(%client, 'AddTag', %id);
%tagged = true;
}
else
if(fetchdata(%client, "TagSkill3") == 0)
{
storedata(%client, "TagSkill3", %id);
commandToClient(%client, 'AddTag', %id);
%tagged = true;
}
}
if(%tagged)
MessageClient(%client, 'Tagged', "You have tagged skill:" SPC $SkillDesc[%id] @ ".");
else if(%removed)
MessageClient(%client, 'RemoveTag', "You have detagged skill:" SPC $SkillDesc[%id] @ ".");
else if(!%remove && !%tagged)
MessageClient(%client, 'CantTag', "You cannot remove any Tag skills after level 100 and you cannot assign more than 3 tag skills.");
else
MessageClient(%client, 'CantTag', "You cannot tag more than 3 skills.");
}
function serverCmdTagOnSelect(%client, %id)
{
Game.TagOnSelect(%client, %id);
}
function serverCmdOnOpenMenu(%client)
{
ISGameMenu::updateHud(1, %client, 'ISGameMenu',0);
}
function serverCMDRequestPlayerList(%client)
{
commandToClient(%client, 'ISGameMenuUpdatePlayer');
for(%i = 0; %i < ClientGroup.getCount(); %i++)
{
%cl = ClientGroup.getObject(%i);
if (!%cl.isAIControlled())
{
commandToClient(%client, 'ISPlayerListAddRow', %cl, %cl.rpgname, GetLevel(fetchdata(%cl, "EXP")));
}
}
}
function ISGameMenu::updateHud(%this, %client, %tag, %where)
{
%client.menuwhere = %where;
BuildMenu(%client, %where, "");
}
function buildMenu(%client, %where, %check)
{
game.BuildMenu(%client, %where, %check);
}
function RPGGAME::BuildMenu(%game, %client, %where, %check)
{
commandToClient(%client, 'ISGameMenuUpdateHud');
%client.gamecheck = "";
if(%client.choosingGroup == true)
{
for(%i = 0; $group[%i] !$= ""; %i++)
{
commandToClient(%client, 'ISMenuAddRow', %i+1, %i + 1 @":" SPC $group[%i]);
}
}
else if(%client.choosingclass == true)
{
for(%i = 0; $class[%client.chosegroup, %i] !$= ""; %i++)
{
commandToClient(%client, 'ISMenuAddRow', %i+1, %i + 1 @":" SPC $class[%client.chosegroup, %i]);
}
commandToClient(%client, 'ISMenuAddRow', %i+1, %i + 1 @":" SPC "Back");
}
else if(%check == %client.selclient && %client.selclient !$= "")
{
if(%where == 0)
{
%client.gamecheck = %check;
if(%client.selclient == %client)
{
commandToClient(%client, 'ISMenuAddRow', 1, "1: View Info");
}
else
{
commandToClient(%client, 'ISMenuAddRow', 1, "1: " @ (IsInTargetList(%client, %client.selclient) == 1 ? "Remove From Target List" : (%client.targeting != %cl ? "Abort target" : "Add to Target List")));
commandToClient(%client, 'ISMenuAddRow', 2, "2: " @ (IsInGroupList(%client, %client.selclient) ? "Remove From Group List" : "Add to Group List"));
commandToClient(%client, 'ISMenuAddRow', 3, "3: View Info");
commandToClient(%client, 'ISMenuAddRow', 4, "4: " @ (%client.muted[%client.selclient] ? "UnMute" : "Mute" ) );
if(fetchData(%client, "partyOwned") && (IsInWhichParty(%client.selclient) == %client))
commandToclient(%client, 'ISMenuAddRow', 5, "5: Kick from Party");
else if(!IsInWhichParty(%client.selclient) && fetchData(%client, "partyOwned"))
commandToclient(%client, 'ISMenuAddRow', 5, "5: Invite To Party");
}
}
%client.menuwhere = %where;
commandToClient(%client, 'ISGameMenuDone');
return;
}
else if(%where == 0)
{
commandToClient(%client, 'ISMenuAddRow', 1, "1: Stats...");
commandToClient(%client, 'ISMenuAddRow', 2, "2: Skill Points...");
commandToClient(%client, 'ISMenuAddRow', 3, "3: Set LCK to (" @ (fetchData(%client, "LCKconsequence") $= "death" ? "miss" : "death") @ ")");
commandToClient(%client, 'ISMenuAddRow', 4, "4: Party Options...");
}
else if(%where == 4)
{
if(%client.inviteparty)
{
commandToClient(%client, 'ISMenuAddRow', 1, "1: Join");
commandToClient(%client, 'ISMenuAddRow', 2, "2: Reject");
commandToClient(%client, 'ISMenuAddRow', 3, "3: Back");
}
else if(fetchData(%client, "partyOwned"))
{
commandToClient(%client, 'ISMenuAddRow', 1, "1: Disband Party");
commandToClient(%client, 'ISMenuAddRow', 2, "2: Back");
}
else
{
if(!fetchData(%client, "partyOwned") && !(IsInWhichParty(%client) != false))
commandToClient(%client, 'ISMenuAddRow', 1, "1: Create");
if((IsInWhichParty(%client) != false) && !fetchData(%client, "partyOwned"))
commandToclient(%client, 'ISMenuAddRow', 1, "1: Leave");
commandToclient(%client, 'ISMenuAddRow', 2, "2: Back");
}
}
%client.menuwhere = %where;
commandToClient(%client, 'ISGameMenuDone');
%client.selclient = "";
}
function serverCmdISmenuOnSelect(%client, %id, %text)
{
game.onISMenuSelect(%client, %id, %text);
}
function RPGGAME::onISmenuSelect(%game, %client, %id, %text)
{
if(%client.ignoreclick)
return;
%client.ignoreclick = true;
schedule(100, %client, "unignoreclick", %client);
%where = %client.menuwhere;
if(%client.choosinggroup)
{
if($group[%id-1] !$= "")
{
%client.choosinggroup = false;
%client.choosingclass = true;
%client.chosegroup = %id-1;
storedata(%client, "GROUP", $group[%id-1]);
}
else
{
%client.choosinggroup = true;
%client.choosingclass = false;
%client.chosegroup = "";
storedata(%client, "GROUP", "");
}
}
else if(%client.choosingclass)
{
if(getword(%text, 1) $= "Back")
{
%client.choosinggroup = true;
%client.choosingclass = false;
%client.chosegroup = "";
}
else if ( $class[%client.chosegroup, %id-1] !$= "")
{
storedata(%client, "CLASS", $class[%client.chosegroup, %id-1]);
%client.choosingclass = false;
%client.chosegroup = "";
%game = %client.game;
%client.game = "";
SetSkillsToMulti(%client);
commandToClient(%client, 'closeISMenu');
%client.newplayer = true;
game.spawnplayer(%client, false);
}
}
else if(%client.gamecheck == %client.selclient && %client.selclient !$= "")
{
if(%where == 0)
{
if(%client.selclient.rpgname !$= "")
if(%client.selclient == %client)
{
switch(%id)
{
case 1:commandToClient(%client, 'closeISMenu');
displayGetInfo(%client, %client.selclient);
default: %client.selclient= "";
}
}
else
{
switch(%id)
{
case 1: if(IsInTargetList(%client, %client.selclient))
{
cancel(%client.autoremovetarget);
RemoveFromTargetList(%client, %client.selclient, false);
}
else if(%client.targeting == %client.selclient)
{
cancel(%client.scheduletarget);
%client.ScheduleTarget = "";
%client.targeting = "";
messageClient(%client, 'cancelTarget', "You stop considering to target " @ %client.selclient.rpgname);
}
else if(!%client.targeting)
{
%time = 15 + (fetchdata(%client, "LvL") - fetchdata(%client.selclient, "LVL"));
%client.ScheduleTarget = schedule(%time*1000, %client, "AddToTargetList", %client, %client.selclient);
%client.targeting = %client.selclient;
messageClient(%client, 'AddTarget', "You will add" SPC %client.selclient.rpgname SPC "to your target list in" SPC %time SPC "seconds.");
messageClient(%client.selclient, 'Targeted', "" SPC %client.rpgname SPC "will add you to his or her target list in" SPC %time SPC "seconds!");
%client.autoremovetarget = schedule(300 * 1000, %client, "RemoveFromTargetList", %client, %client.selclient, true);
}
case 2: if(IsInGroupList(%client, %client.selclient))
{
RemoveFromGroupList(%client, %client.selclient);
}
else
AddToGroupList(%client, %client.selclient);
%client.selclient= "";
case 3: commandToClient(%client, 'closeISMenu');
DisplayGetInfo(%client, %client.selclient);
//%time = 15;
//%line = "<COLOR:FF0000>Name:<COLOR:FFFFFF>" SPC %client.selclient.rpgname SPC "\n<COLOR:FF0000>Info:<COLOR:FFFFFF>" SPC fetchData(%client.selclient, "PlayerInfo");
//SendRPGBottomPrint(%client, %time, 2, %line);
case 4: if(%client.muted[%client.selclient])
%client.muted[%client.selclient] = false;
else
%client.muted[%client.selclient] = true;
%client.selclient= 0;
case 5:
echo(%client.selclient SPC %client);
if(fetchData(%client, "partyOwned") && (IsInWhichParty(%client.selclient) == %client))
{
//kick
RemoveFromParty(%client, %client.selclient, true);
%client.selclient.inparty = false;
}
else if(!IsInWhichParty(%client.selclient) && fetchData(%client, "partyOwned"))
{
//invite
%client.selclient.inviteparty = %client;
MessageClient(%client, 'InvitedParty', "You invited" SPC %client.selclient.rpgname SPC "to your party");
MessageClient(%client.selClient, 'InvitedParty', %client.rpgname SPC "has invited you to join" SPC %client.namebase @ "'s party");
}
%client.selclient= "";
}
}
%check = false;
}
}
else if(%where == 0)
{
switch(%id)
{
case 1: commandToClient(%client, 'closeISMenu');
//%client.BPopen = "";
%time = 30;
%rdsl = "<COLOR:FF0000>/";
%red = "<COLOR:FF0000>";
%blco = "<COLOR:000000>:";
%white = "<COLOR:FFFFFF>";
%brwn = "<COLOR:663300>";
%yel = "<COLOR:FFFF00>";
%blu = "<COLOR:000066>";
%gren = "<COLOR:6699FF>";
%blk = "<COLOR:000000>";
%line = "<COLOR:FF0000>HP:<COLOR:FFFFFF>" SPC Game.FetchData(%client, "HP") @ %rdsl @ %white @ Game.fetchData(%client, "MaxHP") @
"\n<COLOR:FF0000>Mana:<COLOR:FFFFFF>" SPC Game.FetchData(%client, "Mana") @ %rdsl @ %white @ Game.FetchData(%client, "MaxMana") @
"\n<COLOR:FF0000>EXP:<COLOR:FFFFFF>" SPC Game.FetchData(%client, "EXP") @
"\n<COLOR:FF0000>LVL:<COLOR:FFFFFF>" SPC Game.fetchData(%client, "LVL") @
"\n<COLOR:FF0000>Next Level:<COLOR:FFFFFF>" SPC GetExp(fetchData(%client, "LVL")+1, %client) - Game.fetchData(%client, "EXP") @
"\n<COLOR:FF0000>LCK:<COLOR:FFFFFF>" SPC Game.Fetchdata(%client, "LCK") @
"\n<COLOR:FF0000>Weight:<COLOR:FFFFFF>" SPC Game.fetchdata(%client, "weight") @ %rdsl @ %white @ Game.FetchData(%client, "MaxWeight") NL
"<COLOR:FF0000>Armor:<COLOR:FFFFFF>" SPC Game.FetchData(%client, "DEF") NL
"<COLOR:FF0000>MDEF:<COLOR:FFFFFF>" SPC Game.AddPoints(%client, 3) @ %blco @ %white @ AddPoints(%client, 19)
SPC %brwn @ Addpoints(%client, 22) @ %blco @ %brwn @ AddPoints(%client, 15)
SPC %red @ Addpoints(%client, 20) @ %blco @ %red @ AddPoints(%client, 13)
SPC %blu @ Addpoints(%client, 21) @ %blco @ %blu @ AddPoints(%client, 14)
SPC %yel @ Addpoints(%client, 24) @ %blco @ %yel @ AddPoints(%client, 17)
SPC %gren @ Addpoints(%client, 25) @ %blco @ %gren @ AddPoints(%client, 18)
SPC %blk @ Addpoints(%client, 23) @ %blco @ %blk @ AddPoints(%client, 16);
commandToClient(%client, 'RPGBottomPrint', %time, 9, getsubStr(%line, 0, 255), getsubstr(%line, 255, 255), getsubstr(%line, 255*2, 255), getsubstr(%line, 255*3, 255), getsubstr(%line, 255*4, 255));
//%client.BPopen = Schedule(60*1000, %client, "CloseBottomPrint", %client);
case 2: commandToClient(%client, 'closeISMenu');
commandToClient(%client, 'OpenStatGUI');
%client.menuwhere = 0;
return;
case 3: storedata(%client, "LCKconsequence", (fetchData(%client, "LCKconsequence") $= "death" ? "miss" : "death"));
case 4:
%where = 4;
default: echo("ERROR: " @ %client.rpgname SPC "(" SPC %client SPC ")" SPC "submitted an invalid menu command");
}
}
if(%where == 4)
{
switch(%id)
{
case 1:
if(%client.inviteparty)
{
//commandToClient(%client, 'ISMenuAddRow', 1, "1: Join");
//AddToPartyList(%client.inviteparty, %client, true);
AddToParty(%client.inviteparty, %client);
%client.inparty = %client.inviteparty;
%client.inviteparty = false;
}
else if(!fetchData(%client, "partyOwned") && !(IsInWhichParty(%client) != false))
{
//create
//%client.partyleader = true;
//%client.inparty = %client;
//addToPartyList(%client.inparty, %client, false);
CreateParty(%client);
}
else if(IsInWhichParty(%client) != false && !fetchData(%client, "partyOwned"))
{
//commandToclient(%client, 'ISMenuAddRow', 1, "1: Leave");
RemoveFromParty(%client.inparty, %client, true);
%client.inparty = false;
}
else if(fetchData(%client, "partyOwned"))
{
//commandToClient(%client, 'ISMenuAddRow', 2, "2: Disband Party");
DisbandParty(%client);
}
case 2:
if(%client.inviteparty)
{
%client.inviteparty = false;
}
else
%where = 0;
case 3: %where = 0;
}
}
BuildMenu(%client, %where, %check);
//ISGameMenu::updateHud(1, %client, 'ISGameMenu', %where);
}
function unignoreclick(%client)
{
%client.ignoreclick = false;
}
function SendRPGBottomPrint(%client, %time, %line, %text)
{
commandToClient(%client, 'RPGBottomPrint', %time, %line, getsubStr(%text, 0, 255), getsubstr(%text, 255, 255), getsubstr(%text, 255*2, 255), getsubstr(%text, 255*3, 255), getsubstr(%text, 255*4, 255));
}
function serverCmdClientCloseRPGbottomPrint(%client)
{
return;
}
function serverCmdClientCloseISMenu(%client)
{
if(%client.choosinggroup || %client.choosingclass) schedule(1000, 0, "commandToClient", %client, 'OpenISMenu');//force the client to reopen the window...
ISGameMenu::updateHud(1, %client, %tag,0,0);
}
function serverCmdISPlayerListOnSelect(%client, %id, %text)
{
%client.selclient = %id;
BuildMenu(%client, 0, %id);
return;//nothing for now
}
//----------------------------------------------------------------------------
// MessageHud message handlers
function serverCmdTeamMessageSent(%client, %text)
{
if(strlen(%text) >= $Host::MaxMessageLen)
%text = getSubStr(%text, 0, $Host::MaxMessageLen);
RPGchat(%client, 1, %text);
//chatMessageTeam(%client, %client.team, '\c3%1: %2', %client.name, %text);
}
//------------------------------------------------------------------------------
function serverCmdMessageSent(%client, %text)
{
if(strlen(%text) >= $Host::MaxMessageLen)
%text = getSubStr(%text, 0, $Host::MaxMessageLen);
RPGchat(%client, 0, %text);
//chatMessageAll(%client, '\c4%1: %2', %client.name, %text);
}
function serverCmdShowHud(%client, %tag)
{
%tagName = getWord(%tag, 1);
%tag = getWord(%tag, 0);
messageClient(%client, 'OpenHud', "", %tag);
switch$ (%tagname)
{
case "RPGinventoryScreen":
%client.numFavsCount = 0;
%client.shop = false;
if(!%client.alreadysentinventory)
RPGinventoryScreen::updateHud(1,%client,%tag);
case "vehicleHud":
vehicleHud::updateHud(1,%client,%tag);
case "scoreScreen":
updateScoreHudThread(%client, %tag);
case "ISGameMenu":
ISGameMenu::updateHud(1, %client, %tag,0,0);
case "RPGstatScreen":
RPGstatScreen::updateHud(1, %client, %tag);
}
//to see if it is the hud menu here that may be the problem
}
function cleanUpHuds()
{
if($Hud['RPGinventoryScreen'] !$= "")
{
for(%lineNum = 0; $Hud['RPGinventoryScreen'].data[%lineNum, 0] !$= ""; %lineNum++)
for(%i = 0; %i < $Hud['RPGinventoryScreen'].numCol; %i++)
{
$Hud['RPGinventoryScreen'].childGui.remove($Hud['RPGinventoryScreen'].data[%lineNum, %i]);
$Hud['RPGinventoryScreen'].data[%lineNum, %i] = "";
}
}
}
function serverCmdThrow(%client,%data)
{
}
function serverCmdThrowWeapon(%client,%data)
{
%itemId = fetchData(%client, "weaponInHand");
%obj = %client.getControlObject();
%obj.Throw(%itemId);
}
function serverCmdThrowPack(%client,%data)
{
}
function ShapeBase::use(%this, %itemId)
{
%data = Game.GetModelName(%this.client, %itemId);
if(%data !$= "")
{
%this.mountImage(%data.image, $WeaponSlot);
storeData(%this.client, "weaponInHand", %itemId);
return true;
}
else
{
DoConsider(%this.client);
//echo("hi");
//user is hitting the Pack key, onconsider here???
}
return false;
}
function ShapeBase::pickup(%this, %obj, %amount)
{
%data.onPickup(%obj, %this, %amount);
return true;
}
function ShapeBase::hasInventory(%this, %data)
{
// changed because it was preventing weapons cycling correctly (MES)
return (%this.inv[%data] > 0);
}
function ShapeBase::incInventory(%this, %data, %equipped)
{
if(%equipped $= "")
%equipped = false;
%tmp = AddToInventory(%this.client,1, %data, 3, 1, %equipped);
}
function ShapeBase::decInventory(%this, %data, %amount, %equipped)
{
%tmp = RemoveFromInventory(%this.client, %data, %amount, %equipped);
}
function ShapeBase::setInventory(%this, %data, %value)
{
return 0;
}
function ShapeBase::getInventory(%this, %data)
{
if(%data)
return %this.inv[%data.getName()];
}
function ShapeBase::hasAmmo( %this, %weapon )
{
return true;
switch$ ( %weapon )
{
case Blaster:
return( true );
case Plasma:
return( %this.getInventory( PlasmaAmmo ) > 0 );
case Chaingun:
return( %this.getInventory( ChaingunAmmo ) > 0 );
case Disc:
return( %this.getInventory( DiscAmmo ) > 0 );
case GrenadeLauncher:
return( %this.getInventory( GrenadeLauncherAmmo ) > 0 );
case SniperRifle:
return( %this.getInventory( EnergyPack ) );
case ELFGun:
return( true );
case Mortar:
return( %this.getInventory( MortarAmmo ) > 0 );
case MissileLauncher:
return( %this.getInventory( MissileLauncherAmmo ) > 0 );
case ShockLance:
return( true );
// This is our kinda hacky way to keep from cycling to the targeting laser:
case TargetingLaser:
return( false );
default:
warn( "\"" @ %weapon @ "\" is not recognized as a weapon!" );
return( false );
}
}
function ShapeBase::throw(%this, %itemId)
{
game.ShapeBaseThrow(%this, %itemid);
}
function ShapeBase::throwItem(%this, %itemId)
{
Game.ShapeBasethrowItem(%this, %itemId);
}
function ShapeBase::throwObject(%this,%obj)
{
//-------------------------------------------
// z0dd - ZOD, 5/27/02. Fixes flags hovering
// over friendly player when collision occurs
if(%obj.getDataBlock().getName() $= "Flag")
%obj.static = false;
//-------------------------------------------
//if the object is being thrown by a corpse, use a random vector
if (%this.getState() $= "Dead")
{
%vec = (-1.0 + getRandom() * 2.0) SPC (-1.0 + getRandom() * 2.0) SPC getRandom();
%vec = vectorScale(%vec, 10);
}
// else Initial vel based on the dir the player is looking
else
{
%eye = %this.getEyeVector();
%vec = vectorScale(%eye, 20);
}
// Add a vertical component to give the item a better arc
%dot = vectorDot("0 0 1",%eye);
if (%dot < 0)
%dot = -%dot;
%vec = vectorAdd(%vec,vectorScale("0 0 8",1 - %dot));
// Add player's velocity
%vec = vectorAdd(%vec,%this.getVelocity());
%pos = getBoxCenter(%this.getWorldBox());
//since flags have a huge mass (so when you shoot them, they don't bounce too far)
//we need to up the %vec so that you can still throw them...
if (%obj.getDataBlock().getName() $= "Flag")
%vec = vectorScale(%vec, 40);
//
%obj.setTransform(%pos);
%obj.applyImpulse(%pos,%vec);
%obj.setCollisionTimeout(%this);
%data = %obj.getDatablock();
%data.onThrow(%obj,%this);
//call the AI hook
AIThrowObject(%obj);
}
function ShapeBase::cycleWeapon(%this, %data)
{
Game.ShapeBasecycleWeapon(%this, %data);
}
function serverCmdTogglePack(%client,%data)
{
return;
%client.getControlObject().togglePack();
}
//------------------------------------------------------------------------------
function RPGInventoryScreen::updateHud(%this, %client, %tag)
{
commandToClient(%client, 'InventoryUpdateHud');
//Server-side
%inv = fetchData(%client, "inventory");
for(%i = 0; (%itemId = GetWord(%inv, %i)) !$= ""; %i++)
{
%fullitem = GetFullItemName(%itemId);
%type = $itemType[GetItem(%itemId)];
commandToClient(%client, 'InventoryAddRow', %itemId, %fullitem, %type, %itemId.shapeFile);
}
commandToClient(%client, 'InventoryDone');
commandToClient(%client, 'SetCoins', fetchdata(%client, "COINS"));
%client.alreadysentinventory = true;
}
function serverCmdRequestInvList(%client)
{
RPGInventoryScreen::updateHud('RPGInventoryScreen', %client);
}
function serverCmdInventoryListOnSelect(%client, %itemId)
{
game.inventoryListOnSelect(%client, %itemid);
}
//------------------------------------------------------------------------------
function serverCmdInventoryDrop(%client, %itemId)
{
game.InventoryDrop(%client, %itemid);
}
//------------------------------------------------------------------------------
function serverCmdInventoryUse(%client, %itemId)
{
game.InventoryUse(%client, %itemid);
}
//------------------------------------------------------------------------------
function RPGGame::UsePotion(%Game, %client, %itemid)
{
%prevhp = fetchdata(%client, "HP");
%item = %game.GetItem(%client, %itemid);
%prefix = %game.GetPrefix(%client, %itemid);
%suffix = %game.GetSuffix(%client, %itemid);
%addHp = %game.AddItemSpecificPoints(%itemid, 4, %client);
if(%addHP)
{
%client.phealtick += 30;//(10 ticks a second)
%client.hamt += %addhp;
if(!IsEventPending(%client.healevent))
%client.healevent = %game.schedule(100, "PotionHeal", %client, %prevhp);
}
%addMana = %game.AddItemSpecificPoints(%itemid, 5, %client);
//modifyhere #1
//setHP(%client, fetchData(%client, "HP")+%addhp, true);
setMana(%client, fetchData(%client, "MANA")+%addMana, true);
%Game.RemoveFromInventory(%client, 1, %item, %prefix, %suffix);
//ClearInvInfo(%itemId);
%newhp = fetchdata(%client, "HP");
if(%prevhp < %newhp)
UseSkill(%client, $Skill::Healing, true, true, 10);
//RPGInventoryScreen::updateHud(1, %client, 'RPGInventoryScreen');
}
function RPGGame::PotionHeal(%game, %client, %prevhp)
{
if(%client.phealtick == 0) return;
%amt = mfloor(%client.hamt / %client.phealtick);
if(%amt > %client.hamt) %amt = %client.hamt;
setHP(%client, fetchdata(%client, "HP")+%amt);
%client.hamt -= %amt;
if(( %client.phealtick % 30 ) == 0)
{
%newhp = fetchdata(%client, "HP");
if(%prevhp < %newhp)
UseSkill(%client, $Skill::Healing, true, true, 10);
%prevhp = %newhp;
}
%client.phealtick -= 1;
if(%client.hamt == 0) %client.phealtick = 0;
if(%client.phealtick > 0)
{
%client.healevent = %game.schedule(100, "PotionHeal", %client, %prevhp);
}
}
function serverCmdSelectWeaponSlot( %client, %data )
{
if(fetchdata(%client, "QuickBind" @ %data) !$= "")
RPGchat(%client, 1, fetchdata(%client, "QuickBind" @ %data));
}
//------------------------------------------------------------------------------
function RPGInventoryScreen::onWake(%this)
{
if ( $HudHandle['inventoryScreen'] !$= "" )
alxStop( $HudHandle['RPGInventoryScreen'] );
alxPlay(HudInventoryActivateSound, 0, 0, 0);
$HudHandle['inventoryScreen'] = alxPlay(HudInventoryHumSound, 0, 0, 0);
if ( isObject( hudMap ) )
{
hudMap.pop();
hudMap.delete();
}
new ActionMap( hudMap );
hudMap.blockBind( moveMap, toggleScoreScreen );
hudMap.blockBind( moveMap, toggleCommanderMap );
hudMap.bindCmd( keyboard, escape, "", "RPGInventoryScreen.onDone();" );
hudMap.push();
}
//------------------------------------------------------------------------------
function RPGInventoryScreen::onSleep()
{
hudMap.pop();
hudMap.delete();
alxStop($HudHandle['inventoryScreen']);
alxPlay(HudInventoryDeactivateSound, 0, 0, 0);
$HudHandle['inventoryScreen'] = "";
}
//------------------------------------------------------------------------------
function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, %playerVote)
{
return false;
}
function resetVotePrivs( %client )
{
return false;
}
function serverCmdSetPlayerVote(%client, %vote)
{
return false;
}
function calcVotes(%typeName, %arg1, %arg2, %arg3, %arg4)
{
return false;
}
// Tournament mode Stuff-----------------------------------
function setModeFFA( %mission, %missionType )
{
return false;
}
//------------------------------------------------------------------
function setModeTournament( %mission, %missionType )
{
return false;
}
function serverCmdClientTeamChange( %client )
{
return false; //DOH!
}
function serverCmdCannedChat( %client, %command, %fromAI )
{
%cmdCode = getWord( %command, 0 );
%cmdId = getSubStr( %cmdCode, 1, strlen( %command ) - 1 );
%cmdString = getWord( %command, 1 );
if ( %cmdString $= "" )
%cmdString = getTaggedString( %cmdCode );
if ( !isObject( $ChatTable[%cmdId] ) )
{
error( %cmdString @ " is not a recognized canned chat command." );
return;
}
%chatItem = $ChatTable[%cmdId];
//if there is text
if (%chatItem.text !$= "" || !%chatItem.play3D)
{
%message = %chatItem.text @ "~w" @ %chatItem.audioFile;
if ( %chatItem.teamOnly )
cannedChatMessageTeam( %client, %client.team, '\c3%1: %2', %client.name, %message, %chatItem.defaultKeys );
else
cannedChatMessageAll( %client, '\c4%1: %2', %client.name, %message, %chatItem.defaultKeys );
}
//if no text, see if the audio is to be played in 3D...
else if ( %chatItem.play3D && %client.player )
playTargetAudio(%client.target, addTaggedString(%chatItem.audioFile), AudioClosest3d, true);
if ( %chatItem.animation !$= "" )
serverCmdPlayAnim(%client, %chatItem.animation);
//removed - hopefully this will fix the vvh cheat
// Let the AI respond to the canned chat messages (from humans only)
//if (!%fromAI)
// CreateVoiceServerTask(%client, %cmdCode);
}
function ShapeBase::Play3D(%obj, %sound)
{
serverPlay3D(%sound, %obj.getTransform());
}
function serverCmdResetControlObject(%cleint)
{
return false;
}
function RPGGame::getServerStatusString(%game)
{
%status = %game.numTeams;
for ( %team = 1; %team - 1 < %game.numTeams; %team++ )
{
%score = isObject( $teamScore[%team] ) ? $teamScore[%team] : 0;
%teamStr = getTaggedString( %game.getTeamName(%team) ) TAB %score;
%status = %status NL %teamStr;
}
%status = %status NL ClientGroup.getCount();
for ( %i = 0; %i < ClientGroup.getCount(); %i++ )
{
%cl = ClientGroup.getObject( %i );
//%score = %cl.score $= "" ? 0 : %cl.score;
if(%cl.isaicontrolled())
continue;
%playerStr = getTaggedString( %cl.name ) TAB getTaggedString( %game.getTeamName(%cl.team) ) TAB fetchdata(%cl, "LVL");
%status = %status NL %playerStr;
}
return( %status );
}