| Blockland Forums > Modification Help |
| Knife Damage |
| (1/1) |
| AirGlider:
--- Code: ---////////////////////////////////////////////////////////////////////////////////////////////////// // Support_RaycastingWeapons.cs // //Creator: Space Guy, Iban // //Allows you to create weapons that function by instant raycasts rather than projectiles // //Set these fields in the datablock: // //raycastWeaponRange: Range of weapon (> 0) // //raycastWeaponTargets: Typemasks // //raycastWeaponPierceTargets: Typemasks (weapon fires through these targets, hitting each) // //raycastDirectDamage: Direct Damage // //raycastDirectDamageType: Damage Type ID // //raycastCritDirectDamageType: Critical Hit Damage Type ID // //raycastExplosionProjectile: Creates this projectile on impact // //raycastExplosionSound: AudioProfile of sound to play on impact // //raycastExplosionPlayerSound: AudioProfile of sound to play on hitting a player // //raycastExplosionBrickSound: AudioProfile of sound to play on hitting a brick // //raycastExplosionCritSound: AudioProfile of sound to play a critical impact // //raycastSpreadAmt: Spread radius of weapon // //raycastSpreadCount: Number of spreading projectiles // //raycastTracerProjectile: Fires tracer projectiles along the spread path // //raycastCritTracerProjectile: Fires tracer projectiles along the spread path if critical hit // //raycastFromMuzzle: Fire from muzzle point to muzzle vector instead of eye // // // //Radius and Brick Damage can be done through the projectile and explosion. // ////////////////////////////////////////////////////////////////////////////////////////////////// if($SpaceMods::Server::RaycastingWeaponsVersion > 2) return; $SpaceMods::Server::RaycastingWeaponsVersion = 2; package RaycastingFire { function WeaponImage::onFire(%this,%obj,%slot) { if(%this.raycastWeaponRange <= 0) return Parent::onFire(%this,%obj,%slot); %targets = %this.raycastWeaponTargets; %ptargets = %this.raycastWeaponPierceTargets; %hit = 0; if(%this.raycastFromMuzzle) { %start = %obj.getMuzzlePoint(0); %aimVec = %obj.getMuzzleVector(0); } else { %start = %obj.getEyePoint(); %fvec = %obj.getForwardVector(); %fX = getWord(%fvec,0); %fY = getWord(%fvec,1); %evec = %obj.getEyeVector(); %eX = getWord(%evec,0); %eY = getWord(%evec,1); %eZ = getWord(%evec,2); %eXY = mSqrt(%eX*%eX+%eY*%eY); %aimVec = %fX*%eXY SPC %fY*%eXY SPC %eZ; } if(%this.raycastSpreadCount <= 0) %shellcount = 1; else %shellcount = %this.raycastSpreadCount; %fireCrit = 0; %critHit = 1; for(%i=0;%i<%shellcount;%i++) { %shellCrit = 0; if(%this.raycastSpreadAmt > 0) { %spread = %this.raycastSpreadAmt; %vector = VectorScale(%aimVec, 100); %x = (getRandom() - 0.5) * 10 * 3.1415926 * %spread; %y = (getRandom() - 0.5) * 10 * 3.1415926 * %spread; %z = (getRandom() - 0.5) * 10 * 3.1415926 * %spread; %mat = MatrixCreateFromEuler(%x @ " " @ %y @ " " @ %z); %shotVec = vectorNormalize(MatrixMulVector(%mat, %vector)); } else %shotVec = %aimVec; %range = %this.raycastWeaponRange*getWord(%obj.getScale(),2); if(%range > 100) { %rangeRem = %range - 100; %range = 100; } %end = vectorAdd(%start,vectorScale(%shotVec,%range)); %pos = %end; %ray = ContainerRayCast(%start, %end, %targets, %obj); %col = getWord(%ray,0); if(isObject(%col)) { %colType = %col.getType(); %pos = posFromRaycast(%ray); %normal = normalFromRaycast(%ray); %end = %pos; %hit++; %crit = 0; if(isObject(CritProjectile)) { if(%this.isRaycastCritical(%obj, %slot, %col, %pos, %normal, %hit)) { %crit = 1; %shellCrit = 1; %fireCrit = 1; } } %this.onHitObject(%obj, %slot, %col, %pos, %normal, %shotVec, %crit); if(%colType & %ptargets) { %rangeRem = %rangeRem + vectorLen(vectorSub(%pos,%start)) - 1; %end = vectorAdd(%end,vectorScale(%shotVec,1)); } else %rangeRem = 0; } else { //%rangeRem = %rangeRem - 100; %crit = 0; if(isObject(CritProjectile)) { if(%this.isRaycastCritical(%obj, %slot, -1, "0 0 0", "0 0 1", %hit)) { %crit = 1; %shellCrit = 1; %fireCrit = 1; } } } while(%rangeRem > 0) { %count++; %range = %rangeRem; if(%range >= 100) { %rangeRem = %range - 100; %range = 100; } %point = %end; %end = vectorAdd(%point,vectorScale(%shotVec,%range)); %ray = ContainerRayCast(%point, %end, %targets, %obj); %col = getWord(%ray,0); if(isObject(%col)) { %colType = %col.getType(); %pos = posFromRaycast(%ray); %normal = normalFromRaycast(%ray); %end = %pos; %hit++; %crit = 0; if(isObject(CritProjectile)) { if(%this.isRaycastCritical(%obj, %slot, %col, %pos, %normal, %hit)) { %crit = 1; %critHit = 1; %shellCrit = 1; %fireCrit = 1; } } %this.onHitObject(%obj, %slot, %col, %pos, %normal, %shotVec, %crit); if(%colType & %ptargets) { %rangeRem = %rangeRem + vectorLen(vectorSub(%pos,%point)) - 1; %end = vectorAdd(%end,vectorScale(%shotVec,1)); } else %rangeRem = 0; } else { %crit = 0; if(isObject(CritProjectile)) { if(%this.isRaycastCritical(%obj, %slot, -1, "0 0 0", "0 0 1", %hit)) { %crit = 1; %shellCrit = 1; %fireCrit = 1; } } } } if(isObject(%this.raycastTracerProjectile)) { %projectile = %this.raycastTracerProjectile; if(%shellCrit && isObject(%this.raycastCritTracerProjectile)) %projectile = %this.raycastCritTracerProjectile; %muzzle = %obj.getMuzzlePoint(%slot); %scaleFactor = getWord(%obj.getScale(),2); %p = new (%this.projectileType)() { dataBlock = %projectile; initialVelocity = vectorScale(vectorNormalize(vectorSub(%end,%muzzle)),%projectile.muzzleVelocity); initialPosition = %muzzle; sourceObject = %obj; sourceSlot = %slot; client = %obj.client; }; %p.setScale(%scaleFactor SPC %scaleFactor SPC %scaleFactor); MissionCleanup.add(%p); } } if(%obj.getType() & $TypeMasks::PlayerObjectType && %fireCrit) { serverplay3d(critFireSound,%obj.getHackPosition()); if(isObject(%obj.client) && %critHit) %obj.client.play2d(critHitSound); } } function disconnect() { Parent::disconnect(); $SpaceMods::Server::RaycastingWeaponsVersion = -1; schedule(10, 0, deActivatePackage, RaycastingFire); //we probably don't want to de-activate a package while we're in it, so schedule it } };activatePackage(RaycastingFire); function WeaponImage::onHitObject(%this,%obj,%slot,%col,%pos,%normal,%shotVec,%crit) { if(!isObject(%col)) return; %colType = %col.getType(); //%col changes to CorpseObjectType if you kill a player if(!isObject(CritProjectile)) %crit = 0; if(%this.raycastDirectDamage > 0 && %colType & ($TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType)) { if(isObject(%col.spawnBrick) && %col.spawnBrick.getGroup().client == %obj.client) %dmg = 1; if(miniGameCanDamage(%obj,%col) == 1 || %dmg) %this.onRaycastDamage(%obj,%slot,%col,%pos,%normal,%shotVec,%crit); } if(isObject(%this.raycastExplosionProjectile)) { %scaleFactor = getWord(%obj.getScale(), 2); %p = new Projectile() { dataBlock = %this.raycastExplosionProjectile; initialPosition = %pos; initialVelocity = %normal; sourceObject = %obj; client = %obj.client; sourceSlot = 0; originPoint = %pos; }; MissionCleanup.add(%p); %p.setScale(%scaleFactor SPC %scaleFactor SPC %scaleFactor); %p.explode(); } if(isObject(%this.raycastExplosionSound)) serverplay3d(%this.raycastExplosionSound,%pos); if(isObject(%this.raycastExplosionCritSound) && %crit) serverplay3d(%this.raycastExplosionCritSound,%pos); %colPlayer = (%colType & $TypeMasks::PlayerObjectType); if(%colPlayer && isObject(%this.raycastExplosionPlayerSound)) serverplay3d(%this.raycastExplosionPlayerSound,%pos); else if(!%colPlayer && isObject(%this.raycastExplosionBrickSound)) serverplay3d(%this.raycastExplosionBrickSound,%pos); } function WeaponImage::onRaycastDamage(%this,%obj,%slot,%col,%pos,%normal,%shotVec,%crit) { %damageType = $DamageType::Direct; if(%this.raycastDirectDamageType) %damageType = %this.raycastDirectDamageType; %scale = getWord(%obj.getScale(), 2); %directDamage = mClampF(%this.raycastDirectDamage, -100, 100) * %scale; if(%crit) { if(%this.raycastCritDirectDamageType) %damageType = %this.raycastCritDirectDamageType; %directDamage = %directDamage * 3; %colscale = getWord(%col.getScale(),2); %col.spawnExplosion(critProjectile,%colscale); if(isObject(%col.client)) %col.client.play2d(critRecieveSound); } if(%this.raycastImpactImpulse > 0) %col.applyImpulse(%pos,vectorScale(%shotVec,%this.raycastImpactImpulse)); if(%this.raycastVerticalImpulse > 0) %col.applyImpulse(%pos,vectorScale("0 0 1",%this.raycastVerticalImpulse)); %col.damage(%obj, %pos, %directDamage, %damageType); } function WeaponImage::isRaycastCritical(%this,%obj,%slot,%col,%pos,%normal,%hit) { return 0; } --- End code --- I've never changed the damage of a melee weapon. What do I change? |
| Greek2me:
This isn't the correct file. But you would change raycastDirectDamage in the file where the item datablocks are defined. |
| Treynolds416:
You should look at the file of the default sword for some reference |
| Navigation |
| Message Index |