mirror of
https://github.com/ChocoTaco1/TacoServer.git
synced 2026-01-19 16:14:44 +00:00
Merge branch 'Dev' into Stable
This commit is contained in:
commit
137bf547bd
|
|
@ -2019,7 +2019,7 @@ function CTFGame::awardScoreKill(%game, %killerID)
|
|||
function checkVehicleCamping( %team )
|
||||
{
|
||||
%position = $flagPos[%team];
|
||||
%radius = 15;
|
||||
%radius = 5;
|
||||
InitContainerRadiusSearch(%position, %radius, $TypeMasks::VehicleObjectType );
|
||||
|
||||
while ((%vehicle = containerSearchNext()) != 0)
|
||||
|
|
|
|||
|
|
@ -323,17 +323,6 @@ function serverCmdScopeCommanderMap(%client, %scope)
|
|||
%client.player.ccActive = %scope;
|
||||
}
|
||||
|
||||
//Mortar Throw Reload Fix
|
||||
// function ShapeBase::throwWeapon(%this)
|
||||
// {
|
||||
// if((%this.getMountedImage($WeaponSlot).getName() $= "MortarImage" || %this.getMountedImage($WeaponSlot).getName() $= "MissileLauncherImage" || %this.getMountedImage($WeaponSlot).getName() $= "ShockLanceImage") &&
|
||||
// (%this.getImageState($WeaponSlot) $= "Reload" || %this.getImageState($WeaponSlot) $= "Fire")){
|
||||
// return;
|
||||
// }
|
||||
|
||||
// parent::throwWeapon(%this);
|
||||
// }
|
||||
|
||||
|
||||
// Added object check
|
||||
function VehicleData::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %theClient, %proj)
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
// Note See bottom of file for full log
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//-----------Settings-----------
|
||||
$dtStats::version = 10.59;
|
||||
$dtStats::version = 10.60;
|
||||
//disable stats system
|
||||
$dtStats::Enable = $Host::dtStatsEnable $= "" ? ($Host::dtStatsEnable = 1) : $Host::dtStatsEnable;
|
||||
if(!$dtStats::Enable){ return;}// so it disables with a restart
|
||||
|
|
@ -13981,8 +13981,10 @@ package dtBanSys{
|
|||
|
||||
//Reapply the gag
|
||||
function GameConnection::onConnect( %client, %name, %raceGender, %skin, %voice, %voicePitch ){
|
||||
if (banList_checkClient(%client, getField(%client.t2csri_authInfo, 3))){
|
||||
return 0;
|
||||
}
|
||||
parent::onConnect( %client, %name, %raceGender, %skin, %voice, %voicePitch );
|
||||
|
||||
%client.isGagged = ($chatGagged[getClientCleanIP(%client)] || $chatGagged[%client.guid]); //restore status
|
||||
}
|
||||
|
||||
|
|
@ -13991,7 +13993,8 @@ package dtBanSys{
|
|||
%time = (%time $= "") ? 100000 : %time;
|
||||
%name = getClientBanName(%guid, %ipAddress);
|
||||
%bareIP = getCleanIP(%ipAddress);
|
||||
if(!isObject($dtBanTemp::GUID[%guid]) && !isObject($dtBanTemp::GUID[%bareIP])){
|
||||
//error("GUID" SPC %guid SPC "IP" SPC %bareIP);
|
||||
if(!isObject($dtBanTemp::GUID[%guid]) && !isObject($dtBanTemp::IP[%bareIP])){
|
||||
if(!isObject(dtBanList)){
|
||||
new simGroup(dtBanList);
|
||||
RootGroup.add(dtBanList);
|
||||
|
|
@ -14001,64 +14004,20 @@ package dtBanSys{
|
|||
name = %name;
|
||||
guid = %guid;
|
||||
ip = %bareip;
|
||||
banDateTime = dtMarkDate();
|
||||
banDateTime = dtMarkDate();
|
||||
banLengthMin = %time;
|
||||
};
|
||||
dtBanList.add(%banObj);
|
||||
if(!%bareIP)
|
||||
if(%bareIP !$= "0")
|
||||
$dtBanTemp::IP[%bareIP] = %banObj;
|
||||
if(%guid){
|
||||
$dtBanTemp::GUID[%guid] = %banObj;
|
||||
rmvWhiteListGuid(%guid);
|
||||
}
|
||||
}
|
||||
if(isObject($dtBanTemp::GUID[%guid]) && !isObject($dtBanTemp::GUID[%bareIP])){
|
||||
%obj = $dtBanTemp::GUID[%guid];
|
||||
%obj.ip = %bareIP;
|
||||
}
|
||||
else if(isObject($dtBanTemp::GUID[%bareIP]) && !isObject($dtBanTemp::GUID[%guid])){
|
||||
%obj = $dtBanTemp::GUID[%bareIP];
|
||||
%obj.guid = %guid;
|
||||
}
|
||||
|
||||
saveBanList();
|
||||
}
|
||||
|
||||
function banList_checkIP(%client){
|
||||
%ip = getClientCleanIP(%client);
|
||||
%obj = $dtBanTemp::IP[%ip];
|
||||
if(isObject(%obj) && %obj.banDateTime > 0){
|
||||
%delta = getTimeDelta(%obj.banDateTime);
|
||||
if (%delta < %obj.banLengthMin){
|
||||
pushFailJoin(%obj.name, %obj.gui, 0, "Kick/Ban" SPC %obj.banDateTime - %delta SPC "Minutes Left", 1);
|
||||
return 1;
|
||||
}
|
||||
else{
|
||||
unbanUserObj(%obj);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// from tribes next did not want to override this but need to pass %client id into ban check to avoid wierd issues
|
||||
function serverCmdt2csri_challengeResponse(%client, %serverChallenge){
|
||||
if (%client.doneAuthenticating)
|
||||
return;
|
||||
|
||||
if (%client.t2csri_serverChallenge $= %serverChallenge){
|
||||
// check to see if the client is GUID banned, now that we verified their certificate
|
||||
if (banList_checkClientGUID(%client, getField(%client.t2csri_authInfo, 3))){
|
||||
return;
|
||||
}
|
||||
|
||||
// client checks out... continue loading sequence
|
||||
%client.onConnect(%client.tname, %client.trgen, %client.tskin, %client.tvoic, %client.tvopi);
|
||||
}
|
||||
else{
|
||||
%client.setDisconnectReason("Invalid server challenge. Check your account key for corruption.");
|
||||
%client.delete();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function dtIsAdmin(%client,%guid){
|
||||
|
|
@ -14082,10 +14041,12 @@ function dtIsAdmin(%client,%guid){
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function banList_checkClientGUID(%client, %guid){// only one we care about in whitelist mode
|
||||
%obj = $dtBanTemp::GUID[%guid];
|
||||
function banList_checkClient(%client, %guid){// only one we care about in whitelist mode
|
||||
//error("banlist check" SPC "client" SPC %client SPC "Guid" SPC %guid);
|
||||
%objA = $dtBanTemp::GUID[%guid];
|
||||
%ip = getClientCleanIP(%client);
|
||||
%objB = $dtBanTemp::IP[%ip];
|
||||
%obj = (isObject(%objA) == 1) ? %objA : %objB;
|
||||
if (isObject(%obj) && %obj.banDateTime > 0){
|
||||
%delta = getTimeDelta(%obj.banDateTime);
|
||||
if (%delta < %obj.banLengthMin){
|
||||
|
|
@ -14099,30 +14060,31 @@ function banList_checkClientGUID(%client, %guid){// only one we care about in wh
|
|||
unbanUserObj(%obj);
|
||||
}
|
||||
}
|
||||
if(isObject(%objA)){
|
||||
%realName = getField(%client.t2csri_authInfo, 0 );
|
||||
if(%realName !$= "")
|
||||
%name = trim(%realName);
|
||||
else
|
||||
%name = trim(stripChars( detag( getTaggedString( %fc.name ) ), "\cp\co\c6\c7\c8\c9\c0" ));
|
||||
|
||||
%realName = getField(%client.t2csri_authInfo, 0 );
|
||||
if(%realName !$= "")
|
||||
%name = trim(%realName);
|
||||
else
|
||||
%name = trim(stripChars( detag( getTaggedString( %fc.name ) ), "\cp\co\c6\c7\c8\c9\c0" ));
|
||||
%safe = ( dtIsAdmin(%client,%guid) || isObject($dtWhtList::WhiteList[%guid]));
|
||||
if(!%safe){
|
||||
pushFailJoin(%name, %guid, 0, "Not Whitelisted", 0);
|
||||
if($dtServerVars::WhiteListMode){
|
||||
%client.setDisconnectReason("Server is locked, please message admin or wait for approval");
|
||||
%client.delete();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
%safe = ( dtIsAdmin(%client,%guid) || isObject($dtWhtList::WhiteList[%guid]));
|
||||
if(!%safe){
|
||||
pushFailJoin(%name, %guid, 0, "Not Whitelisted", 0);
|
||||
if($dtServerVars::WhiteListMode){
|
||||
%client.setDisconnectReason("Server is locked, please message admin or wait for approval");
|
||||
// this is here in case of banned ip is a whitelisted account
|
||||
if($dtServerVars::IPBanListMode && $dtIPList[%ip] && !isObject($dtWhtList::WhiteList[%guid])){
|
||||
pushFailJoin(%name, %client.guid, %ip, "IP Ban List", 2);
|
||||
%client.setDisconnectReason("You are not allowed to play on this server.");
|
||||
%client.delete();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
%ip = getClientCleanIP(%client);// this is here in case of banned ip is a whitelisted account
|
||||
if($dtServerVars::IPBanListMode && $dtIPList[%ip] && !isObject($dtWhtList::WhiteList[%guid])){
|
||||
pushFailJoin(%name, %client.guid, %ip, "IP Ban List", 2);
|
||||
%client.setDisconnectReason("You are not allowed to play on this server.");
|
||||
%client.delete();
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -20571,16 +20533,17 @@ function mapCyleTest(){
|
|||
// Added custom two team debrief as well as a evo style extended stats
|
||||
// Reworked enable disable, only disables stats saving and stats access, do to systems relying on systems
|
||||
//
|
||||
// 10.1 - 10.2 - 10.3
|
||||
// 10.1 - 10.2 - 10.3 - 10.6
|
||||
// Ban system changes
|
||||
// Fix bad loop in ban system
|
||||
// Misc arena things
|
||||
// Added LCTF Naming
|
||||
// serverPrefs Support
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////Storage/////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// bansystem rework doto new tribes next changes
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
function testVarsRandomAll(%max){
|
||||
%game = Game.class;
|
||||
for(%q = 0; %q < $statsVars::count[%game]; %q++){
|
||||
|
|
|
|||
|
|
@ -459,9 +459,9 @@ function DefaultGame::createPlayer(%game, %client, %spawnLoc, %respawn)
|
|||
if(%respawn)
|
||||
{
|
||||
%player.setInvincible(true);
|
||||
%player.setCloaked(true); // z0dd - ZOD, 8/6/02. Don't spawn players cloaked //was //
|
||||
//%player.setCloaked(true); // z0dd - ZOD, 8/6/02. Don't spawn players cloaked
|
||||
%player.setInvincibleMode($InvincibleTime,0.02);
|
||||
%player.respawnCloakThread = %player.schedule($InvincibleTime * 50, "setRespawnCloakOff"); // z0dd - ZOD, 8/6/02. Don't spawn players cloaked //was 1000
|
||||
//%player.respawnCloakThread = %player.schedule($InvincibleTime * 50, "setRespawnCloakOff"); // z0dd - ZOD, 8/6/02. Don't spawn players cloaked //was 1000
|
||||
%player.schedule($InvincibleTime * 1000, "setInvincible", false);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ datablock AudioDescription(CloakLooping3d)
|
|||
|
||||
is3D = true;
|
||||
minDistance= 10.0;
|
||||
MaxDistance= 55.0; //Was 50
|
||||
MaxDistance= 50.0;
|
||||
type = $EffectAudioType;
|
||||
environmentLevel = 1.0;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ datablock ItemData(SensorJammerPack)
|
|||
};
|
||||
|
||||
|
||||
datablock SensorData(JammerSensorObjectPassive) //v2 was commented out...
|
||||
datablock SensorData(JammerSensorObjectPassive)
|
||||
{
|
||||
// same detection info as 'PlayerObject' sensorData
|
||||
detects = true;
|
||||
|
|
@ -76,7 +76,7 @@ datablock SensorData(JammerSensorObjectPassive) //v2 was commented out...
|
|||
detectFOVPercent = 1.3;
|
||||
useObjectFOV = true;
|
||||
|
||||
detectscloaked = 1; //v2
|
||||
//detectscloaked = 1; //v2
|
||||
|
||||
jams = true;
|
||||
jamsOnlyGroup = true;
|
||||
|
|
@ -96,52 +96,55 @@ datablock SensorData(JammerSensorObjectActive)
|
|||
detectFOVPercent = 1.3;
|
||||
useObjectFOV = true;
|
||||
|
||||
detectscloaked = 1; //v2
|
||||
//detectscloaked = 1; //v2
|
||||
|
||||
jams = true;
|
||||
jamsOnlyGroup = true;
|
||||
jamsUsingLOS = true;
|
||||
jamRadius = 45; //was 30
|
||||
jamRadius = 30;
|
||||
};
|
||||
|
||||
function SensorJammerPackImage::onMount(%data, %obj, %slot)
|
||||
{
|
||||
setTargetSensorData(%obj.client.target, JammerSensorObjectPassive); //v2
|
||||
%obj.setImageTrigger(%slot, false);
|
||||
commandToClient( %obj.client, 'setSenJamIconOff' );
|
||||
%obj.setJammerFX(false);
|
||||
setTargetSensorData(%obj.client.target, JammerSensorObjectPassive);
|
||||
}
|
||||
|
||||
function deactivateJammer(%data, %obj, %slot)
|
||||
function SensorJammerPackImage::onUnmount(%data, %obj, %slot)
|
||||
{
|
||||
SensorJammerPackImage::onDeactivate(%data, %obj, %slot);
|
||||
}
|
||||
|
||||
function SensorJammerPackImage::onUnmount(%data, %obj, %slot) //v2
|
||||
{
|
||||
%obj.setImageTrigger(%slot, false);
|
||||
setTargetSensorData(%obj.client.target, PlayerSensor);
|
||||
%obj.setImageTrigger(%slot, false);
|
||||
}
|
||||
|
||||
function SensorJammerPackImage::onActivate(%data, %obj, %slot)
|
||||
{
|
||||
messageClient(%obj.client, 'MsgSensorJammerPackOn', '\c2Sensor jammer pack on.');
|
||||
setTargetSensorData(%obj.client.target, JammerSensorObjectActive);
|
||||
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
||||
commandToClient( %obj.client, 'setSenJamIconOn' );
|
||||
|
||||
%obj.setJammerFX( true );
|
||||
}
|
||||
|
||||
function SensorJammerPackImage::onDeactivate(%data, %obj, %slot)
|
||||
{
|
||||
messageClient(%obj.client, 'MsgSensorJammerPackOff', '\c2Sensor jammer pack off.');
|
||||
setTargetSensorData(%obj.client.target, PlayerSensor); //v2 H bug fix
|
||||
%obj.setImageTrigger(%slot, false);
|
||||
setTargetSensorData(%obj.client.target, JammerSensorObjectPassive); //v2 was PlayerSensor
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// z0dd - ZOD, 4/25/02. This function is actually getting called AFTER
|
||||
// ::onUnmount. We must check to see what the players current sensor data
|
||||
// is, then if it is NOT PlayerSensor, set to passive jam, bug fix.
|
||||
if(getTargetSensorData(%obj.client.target).getName() !$= "PlayerSensor")
|
||||
setTargetSensorData(%obj.client.target, JammerSensorObjectPassive);
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
||||
commandToClient( %obj.client, 'setSenJamIconOff' );
|
||||
|
||||
%obj.setJammerFX( false );
|
||||
}
|
||||
|
||||
function SensorJammerPack::onPickup(%this, %obj, %shape, %amount)
|
||||
{
|
||||
//Nope
|
||||
}
|
||||
// z0dd - ZOD, 5/18/03. Removed functions, created parent. Streamline.
|
||||
//function SensorJammerPack::onPickup(%this, %obj, %shape, %amount)
|
||||
//{
|
||||
// created to prevent console errors
|
||||
//}
|
||||
|
|
|
|||
|
|
@ -1085,8 +1085,8 @@ datablock ParticleData(LightPuff)
|
|||
textureName = "particleTest";
|
||||
colors[0] = "0.46 0.36 0.26 0.4";
|
||||
colors[1] = "0.46 0.46 0.36 0.0";
|
||||
sizes[0] = 0.8; //was 0.4
|
||||
sizes[1] = 1.4; //was 1.0
|
||||
sizes[0] = 0.4;
|
||||
sizes[1] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(LightPuffEmitter)
|
||||
|
|
@ -1123,9 +1123,9 @@ datablock ParticleData(LiftoffDust)
|
|||
colors[0] = "0.46 0.36 0.26 0.0";
|
||||
colors[1] = "0.46 0.46 0.36 0.4";
|
||||
colors[2] = "0.46 0.46 0.36 0.0";
|
||||
sizes[0] = 0.6; //was 0.2
|
||||
sizes[1] = 1.0; //was 0.6
|
||||
sizes[2] = 1.4; //was 1.0
|
||||
sizes[0] = 0.2;
|
||||
sizes[1] = 0.6;
|
||||
sizes[2] = 1.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
|
|
@ -1765,7 +1765,7 @@ datablock PlayerData(HeavyMaleHumanArmor) : HeavyPlayerDamageProfile
|
|||
//Value changed halfway between base and classic.
|
||||
//Classic is 54, Base is 75
|
||||
//Shield breaks right at two mine-disc
|
||||
energyPerDamagePoint = 60.0; // shield energy required to block one point of damage
|
||||
energyPerDamagePoint = 54.0; // shield energy required to block one point of damage
|
||||
|
||||
rechargeRate = 0.256;
|
||||
jetForce = 29.58 * 180;
|
||||
|
|
|
|||
|
|
@ -235,7 +235,7 @@ datablock HoverVehicleData(AssaultVehicle) : TankDamageProfile
|
|||
|
||||
isShielded = true;
|
||||
rechargeRate = 1.0;
|
||||
energyPerDamagePoint = 142; //was 135
|
||||
energyPerDamagePoint = 135;
|
||||
maxEnergy = 400;
|
||||
minJetEnergy = 15;
|
||||
jetEnergyDrain = 2.0;
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ datablock ItemData(FlashGrenadeThrown)
|
|||
radiusDamageType = $DamageType::Grenade;
|
||||
kickBackStrength = 1000;
|
||||
computeCRC = true;
|
||||
maxWhiteout = 0.78; // z0dd - ZOD, 9/8/02. Was 1.2 //Reduced. Was 0.9 Choco
|
||||
maxWhiteout = 0.9; // z0dd - ZOD, 9/8/02. Was 1.2
|
||||
};
|
||||
|
||||
datablock ItemData(FlashGrenade)
|
||||
|
|
|
|||
|
|
@ -2,6 +2,37 @@
|
|||
// Missile launcher
|
||||
//--------------------------------------
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Force-Feedback Effects
|
||||
//--------------------------------------
|
||||
datablock EffectProfile(MissileSwitchEffect)
|
||||
{
|
||||
effectname = "weapons/missile_launcher_activate";
|
||||
minDistance = 2.5;
|
||||
maxDistance = 2.5;
|
||||
};
|
||||
|
||||
datablock EffectProfile(MissileFireEffect)
|
||||
{
|
||||
effectname = "weapons/missile_fire";
|
||||
minDistance = 2.5;
|
||||
maxDistance = 5.0;
|
||||
};
|
||||
|
||||
datablock EffectProfile(MissileDryFireEffect)
|
||||
{
|
||||
effectname = "weapons/missile_launcher_dryfire";
|
||||
minDistance = 2.5;
|
||||
maxDistance = 2.5;
|
||||
};
|
||||
|
||||
datablock EffectProfile(MissileExplosionEffect)
|
||||
{
|
||||
effectname = "explosions/explosion.xpl23";
|
||||
minDistance = 10;
|
||||
maxDistance = 30;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Sounds
|
||||
//--------------------------------------
|
||||
|
|
@ -10,6 +41,7 @@ datablock AudioProfile(MissileSwitchSound)
|
|||
filename = "fx/weapons/missile_launcher_activate.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
effect = MissileSwitchEffect;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MissileFireSound)
|
||||
|
|
@ -17,6 +49,7 @@ datablock AudioProfile(MissileFireSound)
|
|||
filename = "fx/weapons/missile_fire.WAV";
|
||||
description = AudioDefault3d;
|
||||
preload = true;
|
||||
effect = MissileFireEffect;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MissileProjectileSound)
|
||||
|
|
@ -45,6 +78,7 @@ datablock AudioProfile(MissileExplosionSound)
|
|||
filename = "fx/explosions/explosion.xpl23.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
effect = MissileExplosionEffect;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MissileDryFireSound)
|
||||
|
|
@ -52,6 +86,7 @@ datablock AudioProfile(MissileDryFireSound)
|
|||
filename = "fx/weapons/missile_launcher_dryfire.wav";
|
||||
description = AudioClose3d;
|
||||
preload = true;
|
||||
effect = MissileDryFireEffect;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -727,9 +762,9 @@ datablock ShapeBaseImageData(MissileLauncherImage)
|
|||
stateSequence[0] = "Activate";
|
||||
stateSound[0] = MissileSwitchSound;
|
||||
|
||||
stateName[1] = "ActivateReady";
|
||||
stateTransitionOnAmmo[1] = "Ready";
|
||||
stateTransitionOnNoAmmo[1] = "FirstLoad";
|
||||
stateName[1] = "ActivateReady";
|
||||
stateTransitionOnLoaded[1] = "Ready";
|
||||
stateTransitionOnNoAmmo[1] = "NoAmmo";
|
||||
|
||||
stateName[2] = "Ready";
|
||||
stateTransitionOnNoAmmo[2] = "NoAmmo";
|
||||
|
|
@ -792,9 +827,6 @@ datablock ShapeBaseImageData(MissileLauncherImage)
|
|||
stateSequence[10] = "Fire";
|
||||
stateScript[10] = "onDumbFire";
|
||||
stateSound[10] = MissileFireSound;
|
||||
|
||||
stateName[11] = "FirstLoad";
|
||||
stateTransitionOnAmmo[11] = "Ready";
|
||||
};
|
||||
|
||||
function MissileLauncherImage::onDumbFire(%data,%obj,%slot)
|
||||
|
|
@ -815,42 +847,3 @@ function MissileLauncherImage::onDumbFire(%data,%obj,%slot)
|
|||
%obj.decInventory(%data.ammo, 1);
|
||||
return %p;
|
||||
}
|
||||
function MissileLauncherImage::onUnmount(%this,%obj,%slot){
|
||||
parent::onUnmount(%this,%obj,%slot);
|
||||
if(isEventPending(%obj.reloadDelaySch))
|
||||
cancel(%obj.reloadDelaySch);
|
||||
}
|
||||
function MissileLauncherImage::onMount(%this,%obj,%slot){
|
||||
|
||||
if(%obj.getClassName() !$= "Player")
|
||||
return;
|
||||
|
||||
if (%this.armthread $= "")
|
||||
%obj.setArmThread(look);
|
||||
else
|
||||
%obj.setArmThread(%this.armThread);
|
||||
|
||||
if(%obj.getMountedImage($WeaponSlot).ammo !$= ""){
|
||||
if (%obj.getInventory(%this.ammo)){
|
||||
|
||||
%fireAndReloadTime = mFloor((%this.stateTimeoutValue[4] + %this.stateTimeoutValue[3]) * 1000);
|
||||
|
||||
if(%obj.lfireTime[%this.getName()] && (getSimTime() - %obj.lfireTime[%this.getName()]) < %fireAndReloadTime){
|
||||
if(isEventPending(%obj.reloadDelaySch)){
|
||||
cancel(%obj.reloadDelaySch);
|
||||
}
|
||||
%time = mFloor(%fireAndReloadTime - (getSimTime() - %obj.lfireTime[%this.getName()]));
|
||||
%obj.reloadDelaySch = schedule(%time, 0, "ammoStateDelay", %obj, %slot, true);
|
||||
}
|
||||
else{
|
||||
%obj.setImageAmmo(%slot,true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
%obj.client.setWeaponsHudActive(%this.item);
|
||||
if(%obj.getMountedImage($WeaponSlot).ammo !$= "")
|
||||
%obj.client.setAmmoHudCount(%obj.getInventory(%this.ammo));
|
||||
else
|
||||
%obj.client.setAmmoHudCount(-1);
|
||||
}
|
||||
|
|
@ -2,6 +2,44 @@
|
|||
// Mortar
|
||||
//--------------------------------------
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Force-Feedback Effects
|
||||
//--------------------------------------
|
||||
datablock EffectProfile(MortarSwitchEffect)
|
||||
{
|
||||
effectname = "weapons/mortar_activate";
|
||||
minDistance = 2.5;
|
||||
maxDistance = 2.5;
|
||||
};
|
||||
|
||||
datablock EffectProfile(MortarFireEffect)
|
||||
{
|
||||
effectname = "weapons/mortar_fire";
|
||||
minDistance = 2.5;
|
||||
maxDistance = 5.0;
|
||||
};
|
||||
|
||||
datablock EffectProfile(MortarReloadEffect)
|
||||
{
|
||||
effectname = "weapons/mortar_reload";
|
||||
minDistance = 2.5;
|
||||
maxDistance = 2.5;
|
||||
};
|
||||
|
||||
datablock EffectProfile(MortarDryFireEffect)
|
||||
{
|
||||
effectname = "weapons/mortar_dryfire";
|
||||
minDistance = 2.5;
|
||||
maxDistance = 2.5;
|
||||
};
|
||||
|
||||
datablock EffectProfile(MortarExplosionEffect)
|
||||
{
|
||||
effectname = "explosions/explosion.xpl03";
|
||||
minDistance = 30;
|
||||
maxDistance = 65;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Sounds
|
||||
//--------------------------------------
|
||||
|
|
@ -10,6 +48,7 @@ datablock AudioProfile(MortarSwitchSound)
|
|||
filename = "fx/weapons/mortar_activate.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
effect = MortarSwitchEffect;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MortarReloadSound)
|
||||
|
|
@ -17,6 +56,7 @@ datablock AudioProfile(MortarReloadSound)
|
|||
filename = "fx/weapons/mortar_reload.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
effect = MortarReloadEffect;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MortarIdleSound)
|
||||
|
|
@ -25,6 +65,7 @@ datablock AudioProfile(MortarIdleSound)
|
|||
filename = "fx/weapons/plasma_rifle_idle.wav";
|
||||
description = ClosestLooping3d;
|
||||
preload = true;
|
||||
effect = PlasmaIdleEffect;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MortarFireSound)
|
||||
|
|
@ -32,6 +73,7 @@ datablock AudioProfile(MortarFireSound)
|
|||
filename = "fx/weapons/mortar_fire.wav";
|
||||
description = AudioDefault3d;
|
||||
preload = true;
|
||||
effect = MortarFireEffect;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MortarProjectileSound)
|
||||
|
|
@ -46,6 +88,7 @@ datablock AudioProfile(MortarExplosionSound)
|
|||
filename = "fx/weapons/mortar_explode.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
effect = MortarExplosionEffect;
|
||||
};
|
||||
|
||||
datablock AudioProfile(UnderwaterMortarExplosionSound)
|
||||
|
|
@ -53,6 +96,7 @@ datablock AudioProfile(UnderwaterMortarExplosionSound)
|
|||
filename = "fx/weapons/mortar_explode_UW.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
effect = MortarExplosionEffect;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MortarDryFireSound)
|
||||
|
|
@ -60,6 +104,7 @@ datablock AudioProfile(MortarDryFireSound)
|
|||
filename = "fx/weapons/mortar_dryfire.wav";
|
||||
description = AudioClose3d;
|
||||
preload = true;
|
||||
effect = MortarDryFireEffect;
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
|
@ -740,8 +785,8 @@ datablock ShapeBaseImageData(MortarImage)
|
|||
stateSound[0] = MortarSwitchSound;
|
||||
|
||||
stateName[1] = "ActivateReady";
|
||||
stateTransitionOnAmmo[1] = "Ready";
|
||||
stateTransitionOnNoAmmo[1] = "FirstLoad";
|
||||
stateTransitionOnLoaded[1] = "Ready";
|
||||
stateTransitionOnNoAmmo[1] = "NoAmmo";
|
||||
|
||||
stateName[2] = "Ready";
|
||||
stateTransitionOnNoAmmo[2] = "NoAmmo";
|
||||
|
|
@ -775,50 +820,4 @@ datablock ShapeBaseImageData(MortarImage)
|
|||
stateSound[6] = MortarDryFireSound;
|
||||
stateTimeoutValue[6] = 1.5;
|
||||
stateTransitionOnTimeout[6] = "NoAmmo";
|
||||
|
||||
stateName[7] = "FirstLoad";
|
||||
stateTransitionOnAmmo[7] = "Ready";
|
||||
};
|
||||
|
||||
function MortarImage::onUnmount(%this,%obj,%slot){
|
||||
parent::onUnmount(%this,%obj,%slot);
|
||||
if(isEventPending(%obj.reloadDelaySch))
|
||||
cancel(%obj.reloadDelaySch);
|
||||
}
|
||||
function MortarImage::onMount(%this,%obj,%slot){
|
||||
|
||||
if(%obj.getClassName() !$= "Player")
|
||||
return;
|
||||
|
||||
if (%this.armthread $= "")
|
||||
%obj.setArmThread(look);
|
||||
else
|
||||
%obj.setArmThread(%this.armThread);
|
||||
|
||||
if(%obj.getMountedImage($WeaponSlot).ammo !$= ""){
|
||||
if (%obj.getInventory(%this.ammo)){
|
||||
%fireAndReloadTime = mFloor((%this.stateTimeoutValue[4] + %this.stateTimeoutValue[3]) * 1000);
|
||||
if(%obj.lfireTime[%this.getName()] && (getSimTime() - %obj.lfireTime[%this.getName()]) < %fireAndReloadTime){
|
||||
if(isEventPending(%obj.reloadDelaySch)){
|
||||
cancel(%obj.reloadDelaySch);
|
||||
}
|
||||
%time = mFloor(%fireAndReloadTime - (getSimTime() - %obj.lfireTime[%this.getName()]));
|
||||
%obj.reloadDelaySch = schedule(%time, 0, "ammoStateDelay", %obj, %slot, true);
|
||||
}
|
||||
else{
|
||||
%obj.setImageAmmo(%slot,true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
%obj.client.setWeaponsHudActive(%this.item);
|
||||
if(%obj.getMountedImage($WeaponSlot).ammo !$= "")
|
||||
%obj.client.setAmmoHudCount(%obj.getInventory(%this.ammo));
|
||||
else
|
||||
%obj.client.setAmmoHudCount(-1);
|
||||
}
|
||||
|
||||
function ammoStateDelay(%obj, %slot, %state){
|
||||
if(isObject(%obj) && %obj.getState() !$= "Dead")
|
||||
%obj.setImageAmmo(%slot, %state);
|
||||
}
|
||||
25
README.md
25
README.md
|
|
@ -45,19 +45,20 @@ Discord: [Tribes 2 Discord](https://playt2.com/discord)
|
|||
---
|
||||
|
||||
### Important Gameplay Changes over stock classic
|
||||
- OG blaster buffed for Heavy Armors
|
||||
- No Vehicle Zone around flag is bigger 5 >> 15
|
||||
- Heavy Shield Nerfed (54 to block 1 DMG, is now 60)
|
||||
- OG blaster buffed against Heavy Armors (Not Tournament Mode Only)
|
||||
- Max FOV 120 >> 138 (For Wide Screens)
|
||||
- Item respawn time can be changed (default 30)
|
||||
- Cloak Sound 50m >> 55m
|
||||
- Bigger ground dust puffs (For cloak) 0.4 larger
|
||||
- Sensor Jammer jam radius is buffed to jam cloaks 30 >> 45
|
||||
- Sensor Jammer can passively see cloaker's triangle
|
||||
- Mortor reload rework (Player can throw, but must wait until reload time has passed)
|
||||
- Tank Shield Nerf (135 to block 1 DMG, is now 142)
|
||||
- Whiteout grenades are less seizurely (Due to spamming) 0.9 >> 0.78
|
||||
- All water viscosity follows a global preset
|
||||
- Item respawn time can be changed (Optional)
|
||||
- All water viscosity follows a global preset (3)
|
||||
- <del>No Vehicle Zone around flag is bigger 5 >> 15</del>
|
||||
- <del>Heavy Shield Nerfed (54 to block 1 DMG, is now 60)</del>
|
||||
- <del>Cloak Sound 50m >> 55m</del>
|
||||
- <del>Bigger ground dust puffs (For cloak) 0.4 larger</del>
|
||||
- <del>Sensor Jammer jam radius is buffed to jam cloaks 30 >> 45</del>
|
||||
- <del>Sensor Jammer can passively see cloaker's triangle</del>
|
||||
- <del>Mortor reload rework (Player can throw, but must wait until reload time has passed)</del>
|
||||
- <del>Tank Shield Nerf (135 to block 1 DMG, is now 142)</del>
|
||||
- <del>Whiteout grenades are less seizurely (Due to spamming) 0.9 >> 0.78</del>
|
||||
- <del>Spawn fade-in effect</del>
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue