home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 58 / pcpp58b_TRIBES.iso / Tribes / base / scripts.vol / player.cs < prev    next >
Encoding:
Text File  |  1998-12-16  |  11.4 KB  |  347 lines

  1. $PlayerAnim::Crouching = 25;
  2. $PlayerAnim::DieChest = 26;
  3. $PlayerAnim::DieHead = 27;
  4. $PlayerAnim::DieGrabBack = 28;
  5. $PlayerAnim::DieRightSide = 29;
  6. $PlayerAnim::DieLeftSide = 30;
  7. $PlayerAnim::DieLegLeft = 31;
  8. $PlayerAnim::DieLegRight = 32;
  9. $PlayerAnim::DieBlownBack = 33;
  10. $PlayerAnim::DieSpin = 34;
  11. $PlayerAnim::DieForward = 35;
  12. $PlayerAnim::DieForwardKneel = 36;
  13. $PlayerAnim::DieBack = 37;
  14.  
  15. //----------------------------------------------------------------------------
  16. $CorpseTimeoutValue = 22;
  17. //----------------------------------------------------------------------------
  18.  
  19. // Player & Armor data block callbacks
  20.  
  21. function Player::onAdd(%this)
  22. {
  23.     GameBase::setRechargeRate(%this,8);
  24. }
  25.  
  26. function Player::onRemove(%this)
  27. {
  28.     // Drop anything left at the players pos
  29.     for (%i = 0; %i < 8; %i = %i + 1) {
  30.         %type = Player::getMountedItem(%this,%i);
  31.         if (%type != -1) {
  32.             // Note: Player::dropItem ius not called here.
  33.             %item = newObject("","Item",%type,1,false);
  34.          schedule("Item::Pop(" @ %item @ ");", $ItemPopTime, %item);
  35.  
  36.          addToSet("MissionCleanup", %item);
  37.             GameBase::setPosition(%item,GameBase::getPosition(%this));
  38.         }
  39.     }
  40. }
  41.  
  42. function Player::onNoAmmo(%player,%imageSlot,%itemType)
  43. {
  44.     //echo("No ammo for weapon ",%itemType.description," slot(",%imageSlot,")");
  45. }
  46.  
  47. function Player::onKilled(%this)
  48. {
  49.     %cl = GameBase::getOwnerClient(%this);
  50.     %cl.dead = 1;
  51.     if($AutoRespawn > 0)
  52.         schedule("Game::autoRespawn(" @ %cl @ ");",$AutoRespawn,%cl);
  53.     if(%this.outArea==1)    
  54.         leaveMissionAreaDamage(%cl);
  55.     Player::setDamageFlash(%this,0.75);
  56.     for (%i = 0; %i < 8; %i = %i + 1) {
  57.         %type = Player::getMountedItem(%this,%i);
  58.         if (%type != -1) {
  59.             if (%i != $WeaponSlot || !Player::isTriggered(%this,%i) || getRandom() > "0.5") 
  60.                 Player::dropItem(%this,%type);
  61.         }
  62.     }
  63.  
  64.    if(%cl != -1)
  65.    {
  66.         if(%this.vehicle != "")    {
  67.             if(%this.driver != "") {
  68.                 %this.driver = "";
  69.                  Client::setControlObject(Player::getClient(%this), %this);
  70.                  Player::setMountObject(%this, -1, 0);
  71.             }
  72.             else {
  73.                 %this.vehicle.Seat[%this.vehicleSlot-2] = "";
  74.                 %this.vehicleSlot = "";
  75.             }
  76.             %this.vehicle = "";        
  77.         }
  78.       schedule("GameBase::startFadeOut(" @ %this @ ");", $CorpseTimeoutValue, %this);
  79.       Client::setOwnedObject(%cl, -1);
  80.       Client::setControlObject(%cl, Client::getObserverCamera(%cl));
  81.       Observer::setOrbitObject(%cl, %this, 5, 5, 5);
  82.       schedule("deleteObject(" @ %this @ ");", $CorpseTimeoutValue + 2.5, %this);
  83.       %cl.observerMode = "dead";
  84.       %cl.dieTime = getSimTime();
  85.    }
  86. }
  87.  
  88. function Player::onDamage(%this,%type,%value,%pos,%vec,%mom,%vertPos,%quadrant,%object)
  89. {
  90.     if (Player::isExposed(%this)) {
  91.       %damagedClient = Player::getClient(%this);
  92.       %shooterClient = %object;
  93.  
  94.         Player::applyImpulse(%this,%mom);
  95.         if($teamplay && %damagedClient != %shooterClient && Client::getTeam(%damagedClient) == Client::getTeam(%shooterClient) ) {
  96.             if (%shooterClient != -1) {
  97.                 %curTime = getSimTime();
  98.                if ((%curTime - %this.DamageTime > 3.5 || %this.LastHarm != %shooterClient) && %damagedClient != %shooterClient && $Server::TeamDamageScale > 0) {
  99.                     Client::sendMessage(%damagedClient,0,"You took Friendly Fire from " @ Client::getName(%shooterClient) @ "!");
  100.                     Client::sendMessage(%shooterClient,0,"You just harmed Teammate " @ Client::getName(%damagedClient) @ "!");
  101.                     %this.LastHarm = %shooterClient;
  102.                     %this.DamageStamp = %curTime;
  103.                 }
  104.             }
  105.             %friendFire = $Server::TeamDamageScale;
  106.         }
  107.         else 
  108.             %friendFire = 1.0;    
  109.  
  110.         if (!Player::isDead(%this)) {
  111.             %armor = Player::getArmor(%this);
  112.             //More damage applyed to head shots
  113.             if(%vertPos == "head" && %type == $LaserDamageType) {
  114.                 if(%armor == "harmor") { 
  115.                     if(%quadrant == "middle_back" || %quadrant == "middle_front" || %quadrant == "middle_middle") {
  116.                         %value += (%value * 0.3);
  117.                     }
  118.                 }
  119.                 else {
  120.                     %value += (%value * 0.3);
  121.                 }
  122.             }
  123.             //If Shield Pack is on
  124.             if (%type != -1 && %this.shieldStrength) {
  125.                 %energy = GameBase::getEnergy(%this);
  126.                 %strength = %this.shieldStrength;
  127.                 if (%type == $ShrapnelDamageType || %type == $MortarDamageType)
  128.                     %strength *= 0.75;
  129.                 %absorb = %energy * %strength;
  130.                 if (%value < %absorb) {
  131.                     GameBase::setEnergy(%this,%energy - ((%value / %strength)*%friendFire));
  132.                     %thisPos = getBoxCenter(%this);
  133.                     %offsetZ =((getWord(%pos,2))-(getWord(%thisPos,2)));
  134.                     GameBase::activateShield(%this,%vec,%offsetZ);
  135.                     %value = 0;
  136.                 }
  137.                 else {
  138.                     GameBase::setEnergy(%this,0);
  139.                     %value = %value - %absorb;
  140.                 }
  141.             }
  142.               if (%value) {
  143.                 %value = $DamageScale[%armor, %type] * %value * %friendFire;
  144.             %dlevel = GameBase::getDamageLevel(%this) + %value;
  145.             %spillOver = %dlevel - %armor.maxDamage;
  146.                 GameBase::setDamageLevel(%this,%dlevel);
  147.                 %flash = Player::getDamageFlash(%this) + %value * 2;
  148.                 if (%flash > 0.75) 
  149.                     %flash = 0.75;
  150.                 Player::setDamageFlash(%this,%flash);
  151.                 //If player not dead then play a random hurt sound
  152.                 if(!Player::isDead(%this)) { 
  153.                     if(%damagedClient.lastDamage < getSimTime()) {
  154.                         %sound = radnomItems(3,injure1,injure2,injure3);
  155.                         playVoice(%damagedClient,%sound);
  156.                         %damagedClient.lastdamage = getSimTime() + 1.5;
  157.                     }
  158.                 }
  159.                 else {
  160.                if(%spillOver > 0.5 && (%type== $ExplosionDamageType || %type == $ShrapnelDamageType || %type== $MortarDamageType|| %type == $MissileDamageType)) {
  161.                          Player::trigger(%this, $WeaponSlot, false);
  162.                         %weaponType = Player::getMountedItem(%this,$WeaponSlot);
  163.                         if(%weaponType != -1)
  164.                             Player::dropItem(%this,%weaponType);
  165.                     Player::blowUp(%this);
  166.                     }
  167.                     else
  168.                     {
  169.                         if ((%value > 0.40 && (%type== $ExplosionDamageType || %type == $ShrapnelDamageType || %type== $MortarDamageType || %type == $MissileDamageType )) || (Player::getLastContactCount(%this) > 6) ) {
  170.                               if(%quadrant == "front_left" || %quadrant == "front_right") 
  171.                                 %curDie = $PlayerAnim::DieBlownBack;
  172.                             else
  173.                                 %curDie = $PlayerAnim::DieForward;
  174.                         }
  175.                         else if( Player::isCrouching(%this) ) 
  176.                             %curDie = $PlayerAnim::Crouching;                            
  177.                         else if(%vertPos=="head") {
  178.                             if(%quadrant == "front_left" ||    %quadrant == "front_right"    ) 
  179.                                 %curDie = radnomItems(2, $PlayerAnim::DieHead, $PlayerAnim::DieBack);
  180.                               else 
  181.                                 %curDie = radnomItems(2, $PlayerAnim::DieHead, $PlayerAnim::DieForward);
  182.                         }
  183.                         else if (%vertPos == "torso") {
  184.                             if(%quadrant == "front_left" ) 
  185.                                 %curDie = radnomItems(3, $PlayerAnim::DieLeftSide, $PlayerAnim::DieChest, $PlayerAnim::DieForwardKneel);
  186.                             else if(%quadrant == "front_right") 
  187.                                 %curDie = radnomItems(3, $PlayerAnim::DieChest, $PlayerAnim::DieRightSide, $PlayerAnim::DieSpin);
  188.                             else if(%quadrant == "back_left" ) 
  189.                                 %curDie = radnomItems(4, $PlayerAnim::DieLeftSide, $PlayerAnim::DieGrabBack, $PlayerAnim::DieForward, $PlayerAnim::DieForwardKneel);
  190.                             else if(%quadrant == "back_right") 
  191.                                 %curDie = radnomItems(4, $PlayerAnim::DieGrabBack, $PlayerAnim::DieRightSide, $PlayerAnim::DieForward, $PlayerAnim::DieForwardKneel);
  192.                         }
  193.                         else if (%vertPos == "legs") {
  194.                             if(%quadrant == "front_left" ||    %quadrant == "back_left") 
  195.                                 %curDie = $PlayerAnim::DieLegLeft;
  196.                             if(%quadrant == "front_right" ||    %quadrant == "back_right") 
  197.                                 %curDie = $PlayerAnim::DieLegRight;
  198.                         }
  199.                         Player::setAnimation(%this, %curDie);
  200.                     }
  201.                     if(%type == $ImpactDamageType && %object.clLastMount != "")  
  202.                         %shooterClient = %object.clLastMount;
  203.                     Client::onKilled(%damagedClient,%shooterClient, %type);
  204.                 }
  205.             }
  206.         }
  207.     }
  208. }
  209.  
  210. function radnomItems(%num, %an0, %an1, %an2, %an3, %an4, %an5, %an6)
  211. {
  212.     return %an[floor(getRandom() * (%num - 0.01))];
  213. }
  214.  
  215. function Player::onCollision(%this,%object)
  216. {
  217.     if (Player::isDead(%this)) {
  218.         if (getObjectType(%object) == "Player") {
  219.             // Transfer all our items to the player
  220.             %sound = false;
  221.             %max = getNumItems();
  222.             for (%i = 0; %i < %max; %i = %i + 1) {
  223.                 %count = Player::getItemCount(%this,%i);
  224.                 if (%count) {
  225.                     %delta = Item::giveItem(%object,getItemData(%i),%count);
  226.                     if (%delta > 0) {
  227.                         Player::decItemCount(%this,%i,%delta);
  228.                         %sound = true;
  229.                     }
  230.                 }
  231.             }
  232.             if (%sound) {
  233.                 // Play pickup if we gave him anything
  234.                 playSound(SoundPickupItem,GameBase::getPosition(%this));
  235.             }
  236.         }
  237.     }
  238. }
  239.  
  240. function Player::getHeatFactor(%this)
  241. {
  242.     // Hack to avoid turret turret not tracking vehicles.
  243.     // Assumes that if we are not in the player we are
  244.     // controlling a vechicle, which is not always correct
  245.     // but should be OK for now.
  246.     %client = Player::getClient(%this);
  247.     if (Client::getControlObject(%client) != %this)
  248.         return 1.0;
  249.  
  250.    $time     = getSimTime();
  251.    $lastTime = Player::lastJetTime(%this) / 1000.0;
  252.  
  253.    if (($lastTime + 1.5) < $time) {
  254.       return 0.0;
  255.    } else {
  256.       $diff = $time - $lastTime;
  257.       $heat = 1.0 - ($diff / 1.5);
  258.       return $heat;
  259.    }
  260. }
  261.  
  262. function Player::jump(%this,%mom)
  263. {
  264.    %cl = GameBase::getControlClient(%this);
  265.    if(%cl != -1)
  266.    {
  267.       %vehicle = Player::getMountObject (%this);
  268.         %this.lastMount = %vehicle;
  269.         %this.newMountTime = getSimTime() + 3.0;
  270.         Player::setMountObject(%this, %vehicle, 0);
  271.         Player::setMountObject(%this, -1, 0);
  272.         Player::applyImpulse(%pl,%mom);
  273.         playSound (GameBase::getDataName(%this).dismountSound, GameBase::getPosition(%this));
  274.    }
  275. }
  276.  
  277.  
  278. //----------------------------------------------------------------------------
  279.  
  280. function remoteKill(%client)
  281. {
  282.    %player = Client::getOwnedObject(%client);
  283.    if(%player != -1 && getObjectType(%player) == "Player" && !Player::isDead(%player))
  284.    {
  285.         playNextAnim(%client);
  286.        Player::kill(%client);
  287.        Client::onKilled(%client,%client);
  288.    }
  289. }
  290.  
  291. $animNumber = 25;     
  292. function playNextAnim(%client)
  293. {
  294.     if($animNumber > 36) 
  295.         $animNumber = 25;        
  296.     Player::setAnimation(%client,$animNumber++);
  297. }
  298.  
  299. function Client::takeControl(%clientId, %objectId)
  300. {
  301.    // remote control
  302.    if(%objectId == -1)
  303.    {
  304.       //echo("objectId = " @ %objectId);
  305.       return;
  306.    }
  307.    if(GameBase::getTeam(%objectId) != Client::getTeam(%clientId))
  308.    {
  309.       //echo(GameBase::getTeam(%objectId) @ " " @ Client::getTeam(%clientId));
  310.       return;
  311.    }
  312.    if(GameBase::getControlClient(%objectId) != -1)
  313.    {
  314.       echo("Ctrl Client = " @ GameBase::getControlClient(%objectId));
  315.       return;
  316.    }
  317.    if(!%clientId.CommandTag && GameBase::getDataName(%objectId) != CameraTurret &&
  318.       !$TestCheats) {
  319.         Client::SendMessage(%clientId,0,"Must be at a Command Station to control turrets");
  320.            return;
  321.    }
  322.    if(GameBase::getDamageState(%objectId) == "Enabled") {
  323.        Client::setControlObject(%clientId, %objectId);
  324.        Client::setGuiMode(%clientId, $GuiModePlay);
  325.     }
  326. }
  327.  
  328. function remoteCmdrMountObject(%clientId, %objectIdx)
  329. {
  330.    Client::takeControl(%clientId, getObjectByTargetIndex(%objectIdx));
  331. }
  332.  
  333. function checkControlUnmount(%clientId)
  334. {
  335.    %ownedObject = Client::getOwnedObject(%clientId);
  336.    %ctrlObject = Client::getControlObject(%clientId);
  337.    if(%ownedObject != %ctrlObject)
  338.    {
  339.       if(%ownedObject == -1 || %ctrlObject == -1)
  340.          return;
  341.       if(getObjectType(%ownedObject) == "Player" && Player::getMountObject(%ownedObject) == %ctrlObject)
  342.          return;
  343.       Client::setControlObject(%clientId, %ownedObject);
  344.    }
  345. }
  346.  
  347.