Author Topic: Editing a script so it has toggle-type handling  (Read 411 times)

Hello.
I'm fixing up the gravity gun and related things to fit some other things I'm doing.
I looked through the code, and I'm fairly sure the setImageTrigger(arg1,arg2) is the problem, but I'm changing it so that the holding is toggled instead of hold-release controlled.
Could anybody help me fix this?
Any help is very much appreciated.
« Last Edit: July 22, 2011, 07:55:59 PM by Wheatley »

::onTrigger(%datablock,%player,%slot,%state)

If %slot and %state are both 0.

::onTrigger(%datablock,%player,%slot,%state)

If %slot and %state are both 0.
I was hoping for something more like when the projectile hits the object, it becomes mounted to the player in the way it does when the player holds down mouse1.

Because of the way I'm using it, I can't use ::OnTrigger

Still need help with this.
However, I can post some code if it's any help..
Code: [Select]
datablock ShapeBaseImageData(grGunImage : printGunImage)
{
   colorShiftColor = "0.2 0.2 0.2 1.000";
   item = grGunItem;
   projectile = grGunProjectile;
   altProjectile = grGunBlastProjectile;
   gravFunc = "GrGunAltFire";
   isGravGun = 1;
   projectileType = Projectile;


// States
stateName[0]                     = "Activate";
stateTimeoutValue[0]             = 0.15;
stateTransitionOnTimeout[0]       = "Ready";
stateSound[0] = sprayActivateSound;

stateName[1]                     = "Ready";
stateTransitionOnTriggerDown[1]  = "Fire";
stateAllowImageChange[1]         = true;
stateSequence[1] = "Ready";

stateName[2]                    = "Fire";
stateTransitionOnTimeout[2]     = "Reload";
stateTimeoutValue[2]            = 0.2;
                   stateTransitionOnAmmo[2] = "GravLoop";
stateFire[2]                    = true;
stateAllowImageChange[2]        = false;
stateSequence[2]                = "Fire";
stateScript[2]                  = "onFire";
stateWaitForTimeout[2] = true;
stateEmitter[2] = "grGunemitter";
stateEmitterTime[2] = 0.15;
stateEmitterNode[2] = "muzzleNode";
stateSound[2] = printFireSound;
stateEjectShell[2]       = false;

stateName[3] = "Reload";
stateSequence[3]                = "Reload";
stateTransitionOnTrigger[3]     = "Ready";
stateSequence[3] = "Ready";

stateName[4] = "GravLoop";
stateEmitter[4] = grGunEmitter2;
stateEmitterTime[4] = 0.01;
stateEmitterNode[4] = "muzzleNode";
              stateTransitionOnTimeout[4]     = "GravLoop";
              stateTransitionOnTriggerUp[4] = "Cancel";
              stateTransitionOnNoAmmo[4] = "Cancel2";
              stateTimeoutValue[4]            = 0.01;
              stateScript[4]                  = "onGrav";
stateSequence[4] = "Ready";

              stateName[5] = "Cancel";
              stateScript[5] = "onCancel";
              stateTimeoutValue[5] = "0.1";
              stateTransitionOnTimeout[5] = "Ready";

              stateName[6] = "Cancel2";
              stateScript[6] = "onCancel";
              stateTimeoutValue[6] = "0.5";
              stateTransitionOnTimeout[6] = "Ready";
              stateTransitionOnTriggerUp[6] = "Ready";
};

datablock ItemData(GrGunItem)
{
category = "Weapon";  // Mission editor category
className = "Weapon"; // For inventory system

// Basic Item Properties
shapeFile = "base/data/shapes/printgun.dts";
rotate = false;
mass = 1;
density = 0.2;
elasticity = 0.2;
friction = 0.6;
emap = true;

//gui stuff
uiName = "Gravity Gun";
iconName = "base/client/ui/itemIcons/printer";
doColorShift = true;
colorShiftColor = "0.25 0.25 0.25 1.000";

// Dynamic properties defined by the scripts
image = grGunImage;
canDrop = true;
};

function grGunImage::onMount(%this,%obj,%slot)
{
 %obj.setImageAmmo(0,0);
}

function grGunProjectile::onCollision(%this,%obj,%col,%fade,%pos,%normal)
{
 if(!miniGameCanDamage(%obj,%col)){return;}
 if((strStr(strLwr(%col.getClassName()),"vehicle") !$= "-1" || %col.getclassname() $= "AIPlayer") && (!%col.isHeld) && %col.spawnbrick.getGroup().client.minigame $= %obj.client.minigame)
 {
  %obj.client.player.gravobj = %col;
  %obj.client.player.gravobj.holder = %obj.client.player;
  %obj.client.player.gravobj.lastpos = %col.position;
  %obj.client.player.gravobj.lastpos2 = %col.position;
  %obj.client.player.gravobj.lastrot = "0 0 0";
  %obj.client.player.setImageAmmo(0,1);
  %obj.client.player.gravobj.disablemove = 1;
 }
}

function grGunImage::onCancel(%this,%obj,%slot)
{
 if(isObject(%obj.gravObj)){ %obj.gravObj.setVelocity(vectorScale(vectorSub(%obj.gravObj.getTransform(),%obj.gravObj.lastpos2),5));}else{return;}
 %obj.gravobj.disablemove = 0;
 %obj.gravObj.isHeld = 0;
 cancel(%obj.gravobj.gravSched);
 %obj.gravobj.gravSched = %obj.gravobj.schedule(3000,gravHold);
 %obj.gravObj = "";
 %obj.setImageAmmo(0,0);
}

function grGunImage::onUnMount(%this,%obj,%slot)
{
 if(!isObject(%obj.gravObj)){return;}
 %obj.gravobj.disablemove = 0;
 cancel(%obj.gravobj.gravSched);
 %obj.gravobj.gravSched = %obj.gravobj.schedule(3000,gravHold);
 %obj.gravObj.holder = "";
 %obj.gravObj.isHeld = "";
 %obj.gravObj = "";
}

function grGunImage::onGrav(%this,%obj,%slot)
{
 %obj.setImageTrigger(0,1);
 if(!isObject(%obj.gravobj)){%obj.setImageTrigger(0,0);%obj.setImageAmmo(0,0);return;}
 if(isMountedTo(%obj,%obj.gravObj)){%obj.setImageTrigger(0,0);%obj.setImageAmmo(0,0);return;}
   %mouseVec = %obj.getMuzzleVector(0);
   %cameraPoint = %obj.getEyePoint();
   %selectRange = %obj.gravObj.getDatablock().mass / 30;
   %mouseScaled = VectorScale(%mouseVec, %selectRange);
   %rangeEnd = VectorAdd(%cameraPoint, %mouseScaled);

   %searchMasks = $TypeMasks::VehicleObjectType | $TypeMasks::FXBrickObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::StaticObjectType | $TypeMasks::TerrainObjectType;

   %player = %obj;
  %scanTarg = ContainerRayCast (%cameraPoint, %rangeEnd, %searchMasks,%obj.gravobj);
   if(!isObject(firstWord(%scanTarg)))
   {
    %pos = %rangeEnd;
   }
   else
   {
    %sub = vectorSub(posFromRaycast(%scanTarg),%cameraPoint);
    %nom = vectorNormalize(%sub);
    %len = vectorLen(%sub);
    %pos = vectorAdd(%cameraPoint,vectorScale(%nom,%len*0.5));
   }
   %obj.gravObj.holder = %obj;
   %obj.gravObj.isHeld = 1;
   %obj.gravObj.lastPos2 = %obj.gravObj.lastPos;
   %obj.gravObj.lastPos = %obj.gravObj.getTransform();
   %t = %obj.gravObj.getTransform();
   %rot =  eulerToMatrix(%obj.gravobj.lastrot);
     //Uncomment the line below and comment out the one below this to use alternate control method. It "swings" more realistically but kills people very easily and you if you turn too fast.
   //%obj.gravObj.setTransform(%obj.gravObj.position SPC %rot);
   %obj.gravObj.setTransform(%pos SPC %rot);
  %obj.gravobj.lastrot = vectorAdd(%obj.gravobj.lastrot,"0 0 0.035");
  //Uncomment the line below and comment out the one below this to use alternate control method. It "swings" more realistically but kills people very easily and you if you turn too fast.
   //%obj.gravObj.setVelocity(vectorScale(vectorSub(%pos,%obj.gravObj.position),5));
   %obj.gravObj.setVelocity("0 0 0");
}

function GrGunAltFire(%this,%player,%slot,%trigger)
{
 if(isObject(%player.gravobj))
 {
   %player.setImageTrigger(0,0);
   %player.setImageAmmo(0,0);
   %mouseVec = %player.getMuzzleVector(0);
   %vel = vectorScale(%mouseVec,4000 / (%player.gravobj.getDatablock().mass));
   %player.gravobj.setVelocity(%vel);
   %player.gravobj.disablemove = 0;
   %player.gravObj.isHeld = 0;
   cancel(%player.gravobj.gravSched);
   %player.gravobj.gravSched = %player.gravobj.schedule(3000,gravHold);
   %player.gravobj = "";
 }
 else
 {
%obj = %player;
%projectile = %obj.getMountedImage(0).altProjectile;
%vector = %obj.getEyeVector();
%objectVelocity = %obj.getVelocity();
%vector1 = VectorScale(%vector, %projectile.muzzleVelocity);
%vector2 = VectorScale(%objectVelocity, %projectile.velInheritFactor);
%velocity = VectorAdd(%vector1,%vector2);
%p = new Projectile()
{
dataBlock = %projectile;
initialVelocity = %velocity;
initialPosition = %obj.getMuzzlePoint(0);
sourceObject = %obj;
sourceSlot = %slot;
client = %obj.client;
};
MissionCleanup.add(%p);
 }
}
I don't think anything out of what's here should be interfering..