Author Topic: Reducing Lag  (Read 1597 times)

People complained about my edited firefight script lagging.
Code: [Select]
$fireScorchTime=6000;
$fireSpreadTime=4000;
$fireDestroyTime=30000;
$minWaterToExtinguish=1;

AddDamageType("Fire",   '<bitmap:add-ons/ci/fire> %1',    '%2 <bitmap:add-ons/ci/fire> %1',0.5,1);

function servercmdStartFire(%client,%brick)
{
  if(!isobject(%client.minigame)) //If they are not in a mini
{
  messageclient(%client,'',"You are not in a minigame.");
  return;
  }

startFire(%client,%brick);
startFireDamageTest(%client.minigame);
}


function startfire(%client,%brick)
{
  %brick.fireclient=%client;
  %brick.fireminigame=%client.minigame;
  %brick.setemitter(burnemittera);
  %brick.setlight(FireFightLight);
  %brick.fireSpreadSched=schedule($fireSpreadTime,0,spreadFire,%brick);
  %brick.scorchSched=schedule($fireScorchTime,0,scorchBrick,%brick);
  %brick.fireDestroySched=schedule($fireDestroyTime,0,fireDestroy,%brick);
}

function scorchBrick(%obj)
{
  if(!isObject(%obj) || !%obj.fireminigame)
  return;
  %obj.setcolor(16);
}

function spreadFire(%obj)
{
  if(!isObject(%obj) || %obj.isdead() || !%obj.fireminigame)
  return;

  InitContainerRadiusSearch(%obj.gettransform(),1,$typemasks::fxbrickobjecttype);
  while((%target=containerSearchNext())!=0)
{
  if(%target.getclassname()$=fxdtsbrick)
{
    if(getRandom(0,1) && isobject(%target) && !%target.fireclient)
{
    startfire(%obj.fireclient,%target);
}
  }
  }
}

function fireDestroy(%obj)
{
  if(!isObject(%obj) || !%obj.fireminigame)
  return;
  %obj.setemitter(jeepExplosionEmitter);
  schedule(100,0,deletebrick,%obj);
}

function deletebrick(%obj)
{
%obj.killbrick();
}

function startFireDamageTest(%mini)
{
 %total=ClientGroup.getCount();
 for(%i=0;%i<%total;%i++)
{
  %cl=ClientGroup.getObject(%i);
  if(%cl.minigame==%mini && !%cl.firedamagetest)
{
    %cl.firedamagetest=1;
    firedamagetest(%cl);
  }
  }
}

function firedamagetest(%cl)
{
if(!isObject(%cl) || !%cl.minigame)
{
  %cl.firedamagetest=0;
  return;
  }
if(isObject(%cl.player))
{
  InitContainerRadiusSearch(%cl.player.gettransform(),1,$typemasks::fxbrickobjecttype);
  while((%target=containerSearchNext())!=0)
{
  if(%target.fireminigame$=%cl.minigame && !%target.isdead())
{
    %cl.player.damage(%target,%target,getRandom(5,15));
  }
  }
  }
  schedule(1000,0,firedamagetest,%cl);
}

package firefight
{
function servercmdjoinminigame(%client,%minigame,%a,%b,%c)
{
  Parent::servercmdjoinminigame(%client,%minigame,%a,%b,%c);
  echo("ENTER MINIGAME "@%client.name SPC %minigame);
}
};
ActivatePackage(firefight);

datablock fxLightData(FireFightLight)
{
uiName = "Fire Light";

LightOn = true;
radius = 1;
brightness = 9;
color = "1 0.5 0 1";

flareOn = false;
flarebitmap = "base/lighting/corona";
NearSize = 2;
FarSize = 1;
};

function firewandProjectile::onCollision(%this,%obj,%col,%fade,%pos,%normal)
{

  if(isobject(%obj.client.minigame))
{
    if(%col.getclassname()$=fxDTSbrick && !%col.fireclient)
{
    servercmdstartfire(%obj.client,%col);
    }
else if(%col.getclassname()$="Player")
{
    startFirePlayer(%col);
    }
  }
else
{
    messageclient(%obj.client,'',"You are not in a minigame.");
  }


}


//players on FIRE!!
datablock ShapeBaseImageData(playerOnFireImage)
{
    shapeFile = "base/data/shapes/empty.dts";
emap = false;

mountPoint = $HeadSlot;
offset = "0 0 -2";

stateName[0] = "Ready";
stateTransitionOnTimeout[0] = "FireA";
stateTimeoutValue[0] = 0.01;

stateName[1] = "FireA";
stateTransitionOnTimeout[1] = "Done";
stateWaitForTimeout[1] = True;
stateTimeoutValue[1] = 1.0;
stateEmitter[1] = burnemittera;
stateEmitterTime[1] = 1.0;

stateName[2] = "Done";
stateTransitionOnTimeout[2] = "FireA";
stateTimeoutValue[2] = 0.01;
};

function startfireplayer(%obj)
{
  if(%obj.fireminigame)
  return;
  %obj.fireminigame=%obj.client.minigame;
  %obj.emote(playeronfireimage);
  %obj.damage(%obj,%obj,getrandom(10,20));
  schedule(1000,0,continuefireplayer,%obj);
}

function continuefireplayer(%obj)
{
  if(!%obj.fireminigame || !isobject(%obj))
  return;
  if(!getrandom(0,4))
{
  %obj.fireminigame=0;
  return;
  }
 %obj.emote(playeronfireimage);
 %obj.damage(%obj,%obj,getrandom(10,20));
 schedule(1000,0,continuefireplayer,%obj);
}

function firehoseProjectile::onCollision(%this,%obj,%col,%pos,%fade)
{
if(%col.getclassname()$="Player" && %col.fireminigame)
{
  %col.fireminigame=0;
  }
else
if(%col.fireminigame$=%obj.client.minigame)
{
  %col.water++;
  if(%col.water>=$minWaterToExtinguish)
{
    if(isobject(%col.emitter))
    %col.emitter.delete();
    %col.setlight(0);
    %col.fireclient=0;
    %col.fireminigame=0;
    %obj.client.incscore(1);
  }
  }
 Parent::onCollision(%this,%obj,%col,%pos,%fade);
}
What could I do to reduce the lag?

The script doesn't lag, 5000 fire emitters/lights do.


With a lot of bricks, the script is terribly laggy. I solved this on my server by searching from bricks for players instead of searching from players for bricks. Although a bunch of emitters + lights makes massive client lag.

I am going to add a randomize so it gets a random chance of applying lights.


Heed, you got any IM program? Like Msn, or X-Fire.

Heed, you got any IM program? Like Msn, or X-Fire.
Live messenger which works with msn. Steam as well.

Ok, Pm me your address and I'll add you on msn.