| Blockland Forums > Modification Help |
| Editing a script so it has toggle-type handling |
| (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.. |
| Navigation |
| Message Index |