Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ////////////////////////////////////////
- // Salvage Mod Truce //
- ////////////////////////////////////////
- package Salvage
- {
- function hammerImage::onFire(%this,%obj,%slot)
- {
- %time = getSimTime();
- if(%obj.lastSwingTime + 190 > %time)
- return;
- %obj.lastSwingtime = %time;
- %ep = %obj.getEyePoint();
- %ev = %obj.getEyeVector();
- %add = vectorAdd(%ep,vectorScale(%ev,5));
- %type = $TypeMasks::fxBrickObjectType | $TypeMasks::PlayerObjectType;
- %ray = containerRaycast(%ep,%add,%type,%obj);
- %col = getWord(%ray,0);
- if(!isObject(%col))
- return;
- %cl = %obj.client;
- %type = %col.getClassName();
- %pos = posFromRaycast(%ray);
- %proj = new Projectile()
- {
- datablock = hammerProjectile;
- initialVelocity = "0 0 0";
- initialPosition = %pos;
- sourceObject = %obj;
- sourceSlot = %slot;
- client = %cl;
- };
- MissionCleanup.add(%proj);
- switch$(%type)
- {
- case "fxDTSBrick":
- if(%col.willCauseChainKill() || %col.getName() $= "_static")
- return;
- %data = %col.getDatablock();
- %sizex = %data.brickSizeX;
- %sizey = %data.brickSizeY;
- %sizez = %data.brickSizeZ;
- %vol = %sizex * %sizey * %sizez;
- if(%vol > 180)
- return;
- for(%i = 0; %i < 10; %i++)
- {
- if(%cl.inventory[%i] $= "")
- break;
- }
- if(%i == 10)
- {
- %cl.centerPrint("<color:FF0000>Your pack is full!",2);
- return;
- }
- %normal = max(1,mFloor(%vol / 3));
- %health = %col.health--;
- if(%health == -1)
- {
- %col.health += %normal;
- %health += %normal;
- }
- %cl.centerPrint("<color:00FF00>Health: " @ %health,1);
- if(%health)
- return;
- %cl.salvaged[%i] = Salvage_Input(%col);
- %cl.inventory[%i] = %data;
- %cl.color[%i] = %col.getColorID();
- %col.killBrick();
- serverCmdBuyBrick(%cl);
- case "Player":
- %db = %col.getDatablock();
- %db.damage(%col,%obj,%pos,10,$DamageType::HammerDirect);
- }
- }
- function hammerImage::onHitObject(%this)
- {
- }
- function wrenchImage::onFire(%this,%obj,%slot)
- {
- %time = getSimTime();
- if(%obj.lastSwingTime + 540 > %time)
- return;
- %obj.lastSwingtime = %time;
- %ep = %obj.getEyePoint();
- %ev = %obj.getEyeVector();
- %add = vectorAdd(%ep,vectorScale(%ev,5));
- %type = $TypeMasks::fxBrickObjectType | $TypeMasks::PlayerObjectType;
- %ray = containerRaycast(%ep,%add,%type,%obj);
- %col = getWord(%ray,0);
- if(!isObject(%col))
- return;
- %cl = %obj.client;
- %type = %col.getClassName();
- %proj = new Projectile()
- {
- datablock = wrenchProjectile;
- initialVelocity = "0 0 0";
- initialPosition = posFromRaycast(%ray);
- sourceObject = %obj;
- sourceSlot = %slot;
- client = %cl;
- };
- MissionCleanup.add(%proj);
- switch$(%type)
- {
- case "fxDTSBrick":
- if(%col.getName() $= "_static")
- return;
- %data = %col.getDatablock();
- %sizex = %data.brickSizeX;
- %sizey = %data.brickSizeY;
- %sizez = %data.brickSizeZ;
- %vol = %sizex * %sizey * %sizez;
- if(%vol > 180)
- return;
- %normal = max(1,mFloor(%vol / 3));
- %boost = mCeil(1.5 * %normal);
- %health = %col.health++;
- if(%health == 1)
- {
- %col.health += %normal;
- %health += %normal;
- }
- if(%health > %boost)
- {
- %col.health = %boost;
- %health = %boost;
- }
- %cl.centerPrint("<color:FFFF00>Health: " @ %health,1);
- case "Player":
- %dmg = %col.getDamageLevel() - 10;
- %buff = %col.overheal;
- if(%dmg < 0)
- {
- %buff += -1 * %dmg;
- %dmg = 0;
- if(%buff > 50)
- %buff = 50;
- %col.overheal = %buff;
- }
- %col.setDamageLevel(%dmg);
- %cl.centerPrint("<color:FF8000>Health: " @ 100 - mFloor(%col.getDamageLevel()) @ " + " @ mCeil(%buff),1);
- }
- }
- function wrenchImage::onHitObject(%this)
- {
- }
- function serverCmdBuyBrick(%cl)
- {
- for(%i = 0; %i < 10; %i++)
- {
- %db = %cl.inventory[%i];
- if(%db $= "")
- %db = -1;
- Parent::serverCmdBuyBrick(%cl,%i,%db);
- messageClient(%cl,'MsgSetInvData',"",%i,%db);
- }
- }
- function servercmdUseInventory(%cl,%i)
- {
- if(%i < 0 || %i > 9)
- return;
- %pl = %cl.player;
- %so = %cl.salvaged[%i];
- if(!isObject(%pl))
- return;
- if(!isObject(%so))
- {
- %cl.inventory[%i] = "";
- serverCmdBuyBrick(%cl);
- return;
- }
- %temp = %pl.tempBrick;
- %color = %cl.color[%i];
- %cl.currentColor = %color;
- if(isObject(%temp))
- %temp.setColor(%color);
- serverCmdInstantUseBrick(%cl,%cl.inventory[%i],"\x90");
- %cl.currInv = %i;
- %cl.currInvSlot = %i;
- }
- function serverCmdInstantUseBrick(%cl,%db,%hash)
- {
- if(%hash !$= "\x90")
- return;
- Parent::serverCmdInstantUseBrick(%cl,%db);
- }
- function serverCmdPlantBrick(%cl)
- {
- %slot = %cl.currInv;
- %so = %cl.salvaged[%slot];
- %brick = Salvage_Output(%so,%cl);
- if(!isObject(%brick))
- return;
- %cl.salvaged[%slot] = "";
- %cl.inventory[%slot] = "";
- %cl.instantUseData = "";
- serverCmdCancelBrick(%cl);
- serverCmdBuyBrick(%cl);
- %so.delete();
- }
- function serverCmdDropTool(%cl,%i)
- {
- if(%i < 0 || %i > 9)
- return;
- %pl = %cl.player;
- %slot = %cl.currInv;
- if(!isObject(%pl))
- return;
- if(%slot == -1)
- {
- Parent::serverCmdDropTool(%cl,%i);
- return;
- }
- %i = %cl.currInv;
- %so = %cl.salvaged[%i];
- %inv = %cl.inventory[%i];
- if(!isObject(%so))
- {
- %cl.inventory[%i] = "";
- serverCmdBuyBrick(%cl);
- return;
- }
- %ep = %pl.getEyePoint();
- %ev = %pl.getEyeVector();
- %add = vectorAdd(%ep,vectorScale(%ev,1.1));
- %type = $TypeMasks::fxBrickObjectType | $TypeMasks::InteriorObjectType |
- $TypeMasks::StaticShapeObjectType | $TypeMasks::StaticTSObjectType;
- %ray = containerRaycast(%ep,%add,%type);
- %col = getWord(%ray,0);
- %dir = 1;
- if(isObject(%col))
- {
- %add = vectorAdd(%ep,vectorScale(%ev,-1.1));
- %ray = containerRaycast(%ep,%add,%type);
- %col = getWord(%ray,0);
- %dir = -1;
- if(isObject(%col))
- return;
- }
- %obj = new Item()
- {
- datablock = brickItem;
- position = vectorAdd(%ep,vectorScale(%ev,%dir));
- index = $Salvage::Index++;
- inventory = %inv;
- color = %cl.color[%i];
- };
- MissionCleanup.add(%obj);
- $Salvage::Drop[$Salvage::Index] = %so;
- %cl.salvaged[%i] = "";
- %cl.inventory[%i] = "";
- for(%i = 0; %i !$= ""; %i++)
- {
- %line = %so.data[%i];
- if(%line $= "")
- {
- %name = %inv.uiName;
- %obj.schedule(120000,delete);
- break;
- }
- if(getField(%line,0) $= "+-EVENT")
- continue;
- %type = getWord(%line,0);
- %data = getWords(%line,1);
- %pos = strPos(%data,"\"");
- %name = getSubStr(%data,0,%pos);
- switch$(%type)
- {
- case "+-ITEM": break;
- case "+-VEHICLE": break;
- }
- }
- %obj.setShapeName(%name);
- %obj.setVelocity(vectorScale(%ev,getRandom(5,15) * %dir));
- serverCmdCancelBrick(%cl);
- serverCmdBuyBrick(%cl);
- }
- function serverCmdUseTool(%cl,%i)
- {
- Parent::serverCmdUseTool(%cl,%i);
- %cl.currInv = -1;
- }
- function GameConnection::onClientEnterGame(%this)
- {
- Parent::onClientEnterGame(%this);
- Salvage_Minigame.addMember(%this);
- }
- function GameConnection::getSpawnPoint(%this)
- {
- %brick = %this.checkpointBrick;
- if(isObject(%brick))
- return %brick.getSpawnPoint();
- return Parent::getSpawnPoint(%this);
- }
- function GameConnection::onDeath(%this,%a,%cl,%b,%c)
- {
- %this.currInv = -1;
- for(%i = 0; %i < 5; %i++)
- serverCmdDropTool(%this,%i);
- for(%i = 0; %i < 10; %i++)
- {
- %this.currInv = %i;
- serverCmdDropTool(%this);
- }
- Parent::onDeath(%this,%a,%cl,%b,%c);
- bottomPrint(%this,"<just:center><color:FF8000>Health: 0 + 0");
- }
- function GameConnection::onClientLeaveGame(%this)
- {
- %pl = %this.player;
- if(isObject(%pl))
- {
- %this.currInv = -1;
- for(%i = 0; %i < 5; %i++)
- serverCmdDropTool(%this,%i);
- for(%i = 0; %i < 10; %i++)
- {
- %this.currInv = %i;
- serverCmdDropTool(%this);
- }
- }
- Parent::onClientLeaveGame(%this);
- }
- function Armor::damage(%this,%obj,%proj,%pos,%dmg,%type)
- {
- %crouch = %obj.isCrouched();
- %buff = %obj.overheal;
- if(%crouch)
- %dmg *= 2.1;
- if(%buff > 0)
- {
- %buff -= %dmg;
- %dmg = 0;
- if(%buff < 0)
- {
- %dmg += -1 * %buff;
- %buff = 0;
- }
- %obj.overheal = %buff;
- }
- if(%dmg)
- {
- if(%crouch)
- %dmg /= 2.1;
- Parent::damage(%this,%obj,%proj,%pos,%dmg,%type);
- }
- }
- function getTrustLevel(%a,%b)
- {
- return 2;
- }
- function serverCmdUndoBrick(%cl)
- {
- }
- function serverCmdClearBricks(%cl)
- {
- }
- function serverCmdClearAllBricks(%cl)
- {
- }
- function serverCmdClearBrickGroup(%cl)
- {
- }
- function serverCmdMagicWand(%cl)
- {
- }
- function serverCmdInitUploadHandshake(%cl)
- {
- }
- function serverCmdReloadBricks(%cl)
- {
- }
- function serverCmdCreateMinigame(%cl)
- {
- }
- function serverCmdJoinMinigame(%cl)
- {
- }
- function serverCmdLeaveMinigame(%cl)
- {
- }
- function serverCmdTeamMessageSent(%cl)
- {
- }
- function serverCmdLight(%cl)
- {
- }
- function serverCmdUsePrintGun(%cl)
- {
- }
- function serverCmdDuplicator(%cl)
- {
- }
- function serverCmdFillcan(%cl)
- {
- }
- function serverCmdChangemap(%cl)
- {
- }
- function serverCmdTimescale(%cl)
- {
- }
- };
- activatePackage(Salvage);
- function Salvage_Input(%brick)
- {
- %so = new ScriptObject();
- %cnt = %brick.numEvents;
- %idx = -1;
- %name = %brick.getDatablock().uiName;
- %angle = %brick.getAngleID();
- %plate = %brick.isBasePlate();
- %color = %brick.getColorID();
- %print = %brick.getPrintName();
- %cfx = %brick.getColorFXID();
- %sfx = %brick.getShapeFXID();
- %ray = %brick.isRaycasting();
- %col = %brick.isColliding();
- %rend = %brick.isRendering();
- %so.brick = %name @ "\" 0 0 0 " @ %angle SPC %plate SPC %color SPC %print SPC %cfx SPC %sfx SPC %ray SPC %col SPC %rend;
- %vehicle = %brick.vehicleDatablock;
- %emitter = %brick.emitter;
- %light = %brick.light;
- %item = %brick.item;
- %music = %brick.audioEmitter;
- %name = %brick.getName();
- if(isObject(%vehicle)) %so.data[%idx++] = "+-VEHICLE " @ %vehicle.uiName @ "\" " @ %brick.reColorVehicle;
- if(isObject(%emitter)) %so.data[%idx++] = "+-EMITTER " @ %emitter.emitter.uiName @ "\" " @ %brick.emitterDirection;
- if(isObject(%light)) %so.data[%idx++] = "+-LIGHT " @ %light.dataBlock.uiName @ "\" ";
- if(isObject(%item)) %so.data[%idx++] = "+-ITEM " @ %item.dataBlock.uiName @ "\" " @ %brick.itemPosition SPC %brick.itemDirection SPC %brick.itemRespawnTime;
- if(isObject(%music)) %so.data[%idx++] = "+-AUDIOEMITTER " @ %music.profile.uiName @ "\" ";
- if(%name !$= "") %so.data[%idx++] = "+-NTOBJECTNAME " @ %name;
- for(%i = 0; %i < %cnt; %i++)
- {
- %enabled = %brick.eventEnabled[%i];
- %input = %brick.eventInput[%i];
- %delay = %brick.eventDelay[%i];
- %target = %brick.eventTarget[%i];
- %eventNT = %brick.eventNT[%i];
- %output = %brick.eventOutput[%i];
- %so.data[%idx++] = "+-EVENT\t" @ %i TAB %enabled TAB %input TAB %delay TAB %target TAB %eventNT TAB %output;
- %iidx = %brick.eventInputIdx[%i];
- %tidx = %brick.eventTargetIdx[%i];
- %oidx = %brick.eventOutputIdx[%i];
- %class = (%tidx == -1) ? "fxDTSBrick" : InputEvent_GetTargetClass("fxDTSBrick",%iidx,%tidx);
- %list = $OutputEvent_ParameterList[%class,%oidx];
- for(%j = 1; %j < 5; %j++)
- {
- %param = %brick.eventOutputParameter[%i,%j];
- %word = getWord(getField(%list,%j - 1),0);
- if(%word $= "datablock" && isObject(%param))
- %param = %param.getName();
- %so.data[%idx] = %so.data[%idx] TAB %param;
- }
- }
- return %so;
- }
- function Salvage_Output(%so,%cl)
- {
- %temp = %cl.player.tempBrick;
- if(!isObject(%so) || !isObject(%temp))
- return -1;
- %dest = %temp.getPosition();
- %xpos = getWord(%dest,0);
- %ypos = getWord(%dest,1);
- %zpos = getWord(%dest,2);
- if(%xpos <= -59 || %xpos >= 191 || %ypos <= -205 || %ypos >= -57 || %zpos <= 286 || %zpos >= 406)
- return -1;
- %str = %so.brick;
- %pos = strPos(%str,"\"");
- %name = getSubStr(%str,0,%pos);
- %str = getSubStr(%str,%pos + 2,strLen(%str));
- %angle = getWord(%str,3);
- %change = angleID(%temp.angleID - %angle);
- %angle = angleID(%angle + %change);
- switch(%angle)
- {
- case 0: %rot = "1 0 0 0";
- case 1: %rot = "0 0 1 90";
- case 2: %rot = "0 0 1 180";
- case 3: %rot = "0 0 -1 90";
- }
- %brick = new fxDTSBrick()
- {
- position = %dest;
- rotation = %rot;
- datablock = $uiNameTable[%name];
- angleID = %angle;
- colorID = getWord(%str,5);
- colorFXID = getWord(%str,7);
- shapeFXID = getWord(%str,8);
- isPlanted = 1;
- client = %cl;
- };
- %brick.setTrusted(1);
- if(%err = %brick.plant())
- {
- switch(%err)
- {
- case 1: %cmd = 'MsgPlantError_Overlap';
- case 2: %cmd = 'MsgPlantError_Float';
- case 3: %cmd = 'MsgPlantError_Stuck';
- case 4: %cmd = 'MsgPlantError_Unstable';
- case 5: %cmd = 'MsgPlantError_Buried';
- case 6: %cmd = 'MsgPlantError_TooFar';
- case 7: %cmd = 'MsgPlantError_TooLoud';
- case 8: %cmd = 'MsgPlantError_Limit';
- }
- messageClient(%cl,%cmd);
- %brick.delete();
- return -1;
- }
- %bg = %cl.brickGroup;
- %print = getWord(%str,6);
- %ray = getWord(%str,9);
- %col = getWord(%str,10);
- %rend = getWord(%str,11);
- %bg.add(%brick);
- %brick.setPrint($printNameTable[%print]);
- %brick.setRayCasting(%ray);
- %brick.setColliding(%col);
- %brick.setRendering(%rend);
- for(%i = 0; %i !$= ""; %i++)
- {
- %line = %so.data[%i];
- if(%line $= "")
- break;
- if(getField(%line,0) $= "+-EVENT")
- {
- %idx = getField(%line,1);
- %input = getField(%line,3);
- %target = getField(%line,5);
- %output = getField(%line,7);
- %iidx = InputEvent_GetInputEventIdx(%input);
- %tidx = InputEvent_GetTargetIndex("fxDTSBrick",%iidx,%target);
- %class = (%tidx == -1) ? "fxDTSBrick" : InputEvent_GetTargetClass("fxDTSBrick",%iidx,%tidx);
- %oidx = OutputEvent_GetOutputEventIdx(%class,%output);
- %brick.eventEnabled[%idx] = getField(%line,2);
- %brick.eventInput[%idx] = %input;
- %brick.eventInputIdx[%idx] = %iidx;
- %brick.eventDelay[%idx] = getField(%line,4);
- %brick.eventTarget[%idx] = %target;
- %brick.eventTargetIdx[%idx] = %tidx;
- %brick.eventNT[%idx] = getField(%line,6);
- %brick.eventOutput[%idx] = %output;
- %brick.eventOutputIdx[%idx] = %oidx;
- %brick.eventOutputAppendClient[%idx] = $OutputEvent_AppendClient[%class,%oidx];
- for(%j = 1; %j < 5; %j++)
- {
- %list = $OutputEvent_ParameterList[%class,%oidx];
- %type = getField(%list,%j - 1);
- %val = getField(%line,%j + 7);
- if(getWord(%type,0) $= "dataBlock" && isObject(%val))
- %brick.eventOutputParameter[%idx,%j] = %val.getID();
- else
- %brick.eventOutputParameter[%idx,%j] = %val;
- }
- %brick.numEvents++;
- %brick.implicitCancelEvents = 0;
- continue;
- }
- %type = getWord(%line,0);
- %data = getWords(%line,1);
- if(%type $= "+-NTOBJECTNAME")
- {
- %brick.setNTObjectName(getWord(%data,0));
- continue;
- }
- %pos = strPos(%data,"\"");
- %name = getSubStr(%data,0,%pos);
- %args = getSubStr(%data,%pos + 2,strLen(%data));
- switch$(%type)
- {
- case "+-VEHICLE":
- %brick.setRecolorVehicle(getWord(%args,0));
- %brick.setVehicle($uiNameTable_Vehicle[%name],%cl);
- case "+-EMITTER":
- %dir = getWord(%args,0);
- if(%dir > 1)
- %dir = angleID(%dir + %change - 2) + 2;
- %brick.setEmitterDirection(%dir);
- %brick.setEmitter($uiNameTable_Emitters[%name],%cl);
- case "+-ITEM":
- %pos = getWord(%args,0);
- %dir = getWord(%args,1);
- %time = getWord(%args,2);
- if(%pos > 1)
- %pos = angleID(%pos + %change - 2) + 2;
- %dir = angleID(%dir + %change - 2) + 2;
- %brick.setItemPosition(%pos);
- %brick.setItemDirection(%dir);
- %brick.setItemRespawnTime(%time);
- %brick.setItem($uiNameTable_Items[%name]);
- case "+-LIGHT":
- %brick.setLight($uiNameTable_Lights[%name],%cl);
- case "+-AUDIOEMITTER":
- %brick.setSound($uiNameTable_Music[%name],%cl);
- }
- }
- if($AddOn__JVS_Content == 1 && %brick.contentTypeID() > -1)
- %brick.noContentEvents = 1;
- return %brick;
- }
- function Salvage_HPDisplay()
- {
- %count = ClientGroup.getCount();
- for(%i = 0; %i < %count; %i++)
- {
- %cl = ClientGroup.getObject(%i);
- %pl = %cl.player;
- if(!isObject(%pl))
- continue;
- %dmg = mFloor(%pl.getDamageLevel());
- %buff = mCeil(%pl.overheal);
- bottomPrint(%cl,"<just:center><color:FF8000>Health: " @ 100 - %dmg @ " + " @ %buff);
- }
- cancel($Salvage::HPDisplay);
- $Salvage::HPDisplay = schedule(100,0,Salvage_HPDisplay);
- }
- function angleID(%id)
- {
- while(%id < 0)
- %id += 4;
- while(%id > 3)
- %id -= 4;
- return %id;
- }
- if(!isObject(Salvage_Minigame))
- {
- new ScriptObject(Salvage_Minigame)
- {
- class = "MinigameSO";
- playerDatablock = PlayerNoJet.getID();
- startEquip0 = hammerItem.getID();
- startEquip1 = wrenchItem.getID();
- enableBuilding = 1;
- useAllPlayersBricks = 1;
- fallingDamage = 1;
- weaponDamage = 1;
- vehicleDamage = 1;
- selfDamage = 1;
- };
- // PlayerDropPoints.getObject(0).setName(SpawnSphere);
- // SpawnSphere.position = "-1 16 0";
- // SpawnSphere.rayHeight = 30;
- // SpawnSphere.radius = 70;
- cancel($Salvage::HPDisplay);
- Salvage_HPDisplay();
- }
- datablock ItemData(brickItem)
- {
- category = "Weapon";
- className = "Weapon";
- colorShiftColor = "0.65 0.65 0.65 1";
- shapeFile = "base/data/shapes/brickWeapon.dts";
- density = 0.2;
- doColorShift = 1;
- elasticity = 0.2;
- emap = 1;
- friction = 0.6;
- mass = 1;
- rotate = 0;
- };
- function brickItem::onPickup(%this,%item,%obj)
- {
- %cl = %obj.client;
- %index = %item.index;
- if(!isObject($Salvage::Drop[%index]))
- return;
- for(%i = 0; %i < 10; %i++)
- {
- if(%cl.inventory[%i] $= "")
- break;
- }
- if(%i == 10)
- {
- %cl.centerPrint("<color:FF0000>Your pack is full!",2);
- return;
- }
- %cl.salvaged[%i] = $Salvage::Drop[%index];
- %cl.inventory[%i] = %item.inventory;
- %cl.color[%i] = %item.color;
- $Salvage::Drop[%index] = "";
- serverCmdBuyBrick(%cl);
- %item.delete();
- }
- function brickSpawnpointData::onPlant(%this,%obj)
- {
- %obj.enableTouch = true;
- }
- function brickSpawnpointData::onPlayerTouch(%this,%obj,%pl)
- {
- %cl = %pl.client;
- if(!isObject(%cl))
- return;
- if(%cl.brickGroup.isMember(%obj) && %cl.checkPointBrick != %obj)
- {
- %cl.checkPointBrick = %obj;
- %cl.checkPointBrickPos = %obj.getPosition();
- %cl.centerPrint("\c4You have set this as your spawn point.",2);
- %cl.play2D(Beep_Popup_Sound);
- Parent::onPlayerTouch(%this,%obj,%pl);
- }
- }
- function fxDtsBrick::getPrintName(%this)
- {
- if(%this.getDataBlock().subCategory $= "Prints")
- {
- %texture = getPrintTexture(%this.getPrintID());
- %path = filePath(%texture);
- %underPos = strPos(%path,"_");
- %name = getSubStr(%path,%underPos + 1,strPos(%path,"_",14) - 14) @ "/" @ fileBase(%texture);
- if($printNameTable[%name] !$= "")
- return %name;
- }
- }
- announce("Salvage Mod executed successfully.");
- echo("Salvage Mod executed successfully.");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement