Blockland Forums > Modification Help
Editing a script so it has toggle-type handling
Pages: (1/1)
Wheatley:
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.
Chrono:
::onTrigger(%datablock,%player,%slot,%state)
If %slot and %state are both 0.
Wheatley:
--- Quote from: Chrono on July 21, 2011, 08:03:04 PM ---::onTrigger(%datablock,%player,%slot,%state)
If %slot and %state are both 0.
--- End quote ---
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
Wheatley:
Still need help with this.
However, I can post some code if it's any help..
--- Code: ---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);
}
}
--- End code ---
I don't think anything out of what's here should be interfering..
Pages: (1/1)