mirror of
https://github.com/Jusctsch5/ironsphererpg.git
synced 2026-01-20 03:54:45 +00:00
Balances Flow and Bound to not scale with Neutral Magic level. Fixes a bug where flow and bound would subtract from your base character's jumping and speed attributes when cast prior to death. Fixes some general formatting things in the related files.
3245 lines
95 KiB
C#
3245 lines
95 KiB
C#
// 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 - " SPC %armor SPC " - 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 );
|
|
}
|
|
|