PDA

View Full Version : Ranking-when you shot somebody you got some xp



Rocky
5th October 2013, 13:31
init()
{
level._rank = [];
level.xpsize = 640;
thread strings();
thread bombs();
if(getcvar("g_multiplier") == "") setcvar("g_multiplier", "1.0");
level.xpmultiplier = getcvarfloat("g_multiplier");
}

playerinit()
{
self endon("disconnect");
self.pers["streak"] = 0;
if(!isDefined(self.pers["lvl"]))
{
self.pers["lvl"] = 1;
self.pers["xp"] = 0;
self.pers["totalxp"] = 0;
self.pers["xpforlvl"] = level._rank[1].xp;
self.pers["xpsize"] = 0;
}
self hud();
self thread monitorxp();
checkrank();
}
xpForLevel(lvl)
{
if(!isDefined(level._rank[lvl])) return 0;
return level._rank[lvl].xp - level._rank[lvl-1].xp;
}
checkrank()
{
lvl = self.pers["lvl"];
if(lvl == level._rank.size) return;
total = self.pers["totalxp"];
next = level._rank[lvl].xp;
diff = next - total;

promoted = false;
while(diff <= 0) // promoted
{
promoted = true;
self.pers["lvl"]++;
lvl = self.pers["lvl"];
self.pers["xp"] = total - level._rank[lvl-1].xp;
next = level._rank[lvl].xp;
diff = next - total;
}

xp = xpForLevel(lvl);
if(xp != 0)
{
self.pers["xpsize"] = int(self.pers["xp"] / xp * level.xpsize);
self.hud_xpbar setShader("color_red", self.pers["xpsize"], 4);
}
else
self.hud_xpbar setShader("color_red", self.pers["xpsize"], 4);

self.hud_lvlimg setShader(level._rank[lvl-1].shader, 32, 32);
// self.hud_lvl setText(level._rank[self.pers["lvl"]-1].string);
// self.hud_xp setValue(self.pers["xp"]);
// self.hud_xpleft setValue(next);

if(promoted) self thread promote();
}
promote()
{
self iprintlnbold("You have been promoted to ", level._rank[self.pers["lvl"]-1].string, "!!");
}

hud()
{
self endon("disconnect");
self thread hudUpdate();
// self.hud_lvl = newClientHudElem(self);
// self.hud_lvl.vertalign = "bottom";
// self.hud_lvl.horzalign = "left";
// self.hud_lvl.alignx = "left";
// self.hud_lvl.aligny = "bottom";
// self.hud_lvl.x = 140;
// self.hud_lvl.y = -25;
// self.hud_lvl setText(level._rank[self.pers["lvl"]-1].string);
// self.hud_lvl setValue(self.pers["lvl"]);

self.hud_lvlimg = newClientHudElem(self);
self.hud_lvlimg.vertalign = "bottom";
self.hud_lvlimg.horzalign = "left";
self.hud_lvlimg.alignx = "left";
self.hud_lvlimg.aligny = "bottom";
self.hud_lvlimg.x = 140;
self.hud_lvlimg.y = -40;
self.hud_lvlimg.alpha = 0;
self.hud_lvlimg setShader(level._rank[self.pers["lvl"]-1].shader, 32, 32);

self.hud_xpbar = newClientHudElem(self);
self.hud_xpbar.vertalign = "bottom";
self.hud_xpbar.horzalign = "fullscreen";
self.hud_xpbar.alignx = "left";
self.hud_xpbar.aligny = "bottom";
// self.hud_xpbar.y = 1;
self.hud_xpbar.alpha = 0;
if(self.pers["xpsize"]>0)
self.hud_xpbar setShader("color_red", self.pers["xpsize"], 4);

// self.hud_xp = newClientHudElem(self);
// self.hud_xp.vertalign = "middle";
// self.hud_xp.horzalign = "right";
// self.hud_xp.alignx = "right";
// self.hud_xp.aligny = "middle";
// self.hud_xp.x = -30;
// self.hud_xp.y = 39;
// self.hud_xp.alpha = 0;
// self.hud_xp.label = &"^9";
// self.hud_xp setValue(self.pers["xp"]);

// self.hud_xpleft = newClientHudElem(self);
// self.hud_xpleft.vertalign = "middle";
// self.hud_xpleft.horzalign = "right";
// self.hud_xpleft.alignx = "right";
// self.hud_xpleft.aligny = "middle";
// self.hud_xpleft.x = -30;
// self.hud_xpleft.y = 14;
// self.hud_xpleft.alpha = 0;
// self.hud_xpleft.label = &"^9";
// self.hud_xpleft setValue(xpForLevel(self.pers["lvl"]));

self.hud_xpup = newClientHudElem(self);
self.hud_xpup.horzalign = "center";
self.hud_xpup.alignx = "center";
self.hud_xpup.y = 60;
self.hud_xpup.fontScale = 1.2;
self.hud_xpup.label = &"^2+^7&&1";
self.hud_xpup.alpha = 0;

}
hudUpdate()
{
self endon("disconnect");
self thread updateKilled();
// oldalive = isAlive(self);
while(1)
{
self waittill("spawned_player");
// self.hud_lvl.alpha = 1;
self.hud_lvlimg.alpha = 1;
self.hud_xpbar.alpha = 0.5;
// self.hud_xp.alpha = 1;
// self.hud_xpleft.alpha = 1;
/*if(isAlive(self) && !oldalive)
{
self.hud_lvl.alpha = 1;
self.hud_lvlimg.alpha = 1;
self.hud_xpbar.alpha = 1;
self.hud_xp.alpha = 1;
self.hud_xpleft.alpha = 1;
}
else if(oldalive)
{
self.hud_lvl.alpha = 0;
self.hud_lvlimg.alpha = 0;
self.hud_xpbar.alpha = 0;
self.hud_xp.alpha = 0;
self.hud_xpleft.alpha = 0;
}
oldalive = isAlive(self);
wait 0.1;*/
}
}
updateKilled()
{
self endon("disconnect");
while(1)
{
self waittill("killed_player");
// self.hud_lvl.alpha = 0;
self.hud_lvlimg.alpha = 0;
self.hud_xpbar.alpha = 0;
// self.hud_xp.alpha = 0;
// self.hud_xpleft.alpha = 0;
}
}

playerKilled(attacker, MOD, sHitLoc)
{
if(attacker == self || attacker == level || self.sessionteam == "spectator") return;

if(sHitLoc == "head" && MOD != "MOD_MELEE") MOD = "MOD_HEAD_SHOT";

attacker.pers["streak"]++;
self.pers["streak"] = 0;

if(MOD == "MOD_HEAD_SHOT")
{
if(isDefined(attacker.score)) attacker.score++;
if(isDefined(attacker.pers["score"])) attacker.pers["score"]++;
}

attacker xpup(MOD);
}

strings()
{
addlevel("gnnr_rank_private", &"Private");
addlevel("gnnr_rank_lcpl1", &"LanceCorporal");
addlevel("gnnr_rank_cpl1", &"Corporal");
addlevel("gnnr_rank_sgt1", &"Sergeant");
addlevel("gnnr_rank_ssgt1", &"StaffSergeant");
addlevel("gnnr_rank_gysgt1", &"GunnerySergeant");
addlevel("gnnr_rank_msgt1", &"MasterSergeant");
addlevel("gnnr_rank_mgysgt1", &"MasterGunnerySergeant");
addlevel("gnnr_rank_lieutenant", &"Lieutenant");
addlevel("gnnr_rank_capt1", &"Captain");
addlevel("gnnr_rank_major", &"Major");
addlevel("gnnr_rank_ltcol1", &"LieutenantColonel");
addlevel("gnnr_rank_col1", &"Colonel");
addlevel("gnnr_rank_bgen1", &"BrigadierGeneral");
addlevel("gnnr_rank_majgen1", &"MajorGeneral");
addlevel("gnnr_rank_ltgen1", &"LieutenantGeneral");
addlevel("gnnr_rank_gen1", &"General");
addlevel("gnnr_rank_comm", &"Commander");

precacheString(&"^9");
precacheString(&"^2+^7&&1");
precacheShader("color_red");
}
addlevel(shader, string)
{
lvl = spawnstruct();
lvl.shader = shader;
lvl.string = string;
lvl.cvar = "lvl" + (level._rank.size+1);
lvl.xp = getcvarint(lvl.cvar);
precacheShader(lvl.shader);
precacheString(lvl.string);
level._rank[level._rank.size] = lvl;
}

bombs()
{
thread defuse();
while(1)
{
level waittill("bomb_planted", player);
player givexp(xpFromMOD("BOMB_PLANTED"));
}
}
defuse()
{
while(1)
{
level waittill("bomb_defused", player);
player givexp(xpFromMOD("BOMB_DEFUSED"));
}
}

givexp(num)
{
num *= level.xpmultiplier;
self.pers["xp"] += num;
self.pers["totalxp"] += num;
self.xpup += num;
self checkRank();
}
xpup(MOD)
{
xp = xpFromMOD(MOD) + self.pers["streak"]*2;
givexp(xp);
}
xpFromMOD(MOD)
{
switch(MOD)
{
case "MOD_MELEE":
return 60;
case "MOD_HEAD_SHOT":
return 50;
default:
case "MOD_RIFLE_BULLET":
case "MOD_PISTOL_BULLET":
return 40;
case "BOMB_PLANTED":
case "BOMB_DEFUSED":
return 50;
}
}
monitorxp()
{
self endon("disconnect");
self thread monitorxpFrame();
oldtime = gettime();
xpup = 0;
while(1)
{
self waittill("gotxp", xp);
time = gettime();

diff = time-oldtime;
if(diff > 3000)
xpup = xp;
else
xpup += xp;

self.hud_xpup thread fade();
self.hud_xpup setValue(xpup);
oldtime = time;
}
}
monitorxpFrame()
{
self endon("disconnect");
self.xpup = 0;
while(1)
{
while(self.xpup == 0) wait 0.05;
self notify("gotxp", self.xpup);
self.xpup = 0;
}
}
fade()
{
self.alpha = 1;
self fadeovertime(3);
self.alpha = 0;
}

How to create when you shot somebody you got xp?And he dont die.

Rocky
5th October 2013, 13:32
When somebody other kill him.You got xp's.But you shot him.

Loveboy
5th October 2013, 13:48
I don't think nobody will read it.

How will somebody read it and help you?:
1. Do scripts with code [.code] SCRIPT HERE [./code] if you write it dont forget delete the point!
2. What is your problem? Please tell us it!
3. Do not write the script complete. Only that which didn't work.

Loveboy
5th October 2013, 14:10
If you look at the tdm.gsc (Call of Duty 2/main/iw_07.iwd), you will see in Callback_PlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration)
somewhere down (look for it)



else
{
attacker.score++;
teamscore = getTeamScore(attacker.pers["team"]);
teamscore++;
setTeamScore(attacker.pers["team"], teamscore);
checkScoreLimit();
}


under the attcker.score++ you should add your variable with xp
example:


attacker.score++;
attcker.stats["xp"] =+ 1; //it will give 1 xp more

Ni3ls
7th October 2013, 13:29
he wants to have assists xp i guess :/

Loveboy
7th October 2013, 14:45
hmmm maybe you are right Ni3ls, I never tried it, but I have to look for it.

IzNoGoD
7th October 2013, 15:12
http://www.modbase.be/forum/61-cod-2-tutorials-goedkeuring/4538-assists.html

Ni3ls
7th October 2013, 18:10
Script isnt correct as I said :P

Rocky
7th October 2013, 20:12
Ty all..but assist xp's..not in score..or it will add xp's?

Rocky
7th October 2013, 20:14
ah,ah i read post.. ty IzNoGoD :)

Rocky
7th October 2013, 20:17
Translate at english? :D

IzNoGoD
7th October 2013, 20:34
init()
{
level.assist_plusscore = 2;
if(getcvar("g_gametype") == "dm")
level.dm_style = true;
else
level.dm_style = false;
thread waitforconnect();
thread hijack_callbacks();
}

hijack_callbacks()
{
wait .1;
level.old_callbackPlayerDamage = level.callbackPlayerDamage;
level.callbackPlayerdamage = ::playerdamage;
level.old_callbackPlayerKilled = level.callbackPlayerKilled;
level.callbackPlayerKilled = ::playerkilled;
}

playerdamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset)
{
if(isdefined(eAttacker) && isplayer(eAttacker) && eAttacker != self && (level.dm_style || eAttacker.pers["team"] != self.pers["team"]))
{
found = false;
for(i = 0; i < self.assist; i++)
{
if(isdefined(self.assist[i]) && self.assist[i] == eAttacker)
{
found = true;
break;
}
}
if(!found)
self.assist[self.assist.size] = eAttacker;
}
self [[level.old_callbackPlayerDamage]](eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset);
}

playerkilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration)
{
for(i = 0; i < self.assist.size; i++)
{
if(isdefined(self.assist[i]) && (!isdefined(eAttacker) || self.assist[i] != eAttacker) && (level.dm_style || self.assist[i].pers["team"] != self.pers["team"]))
{
self.assist[i].score += level.assist_plusscore;
self.assist maps\mp\gametypes\__damagefeedback::updateDamageFe edback();
}
self [[level.old_callbackPlayerKilled]](eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration);
}

waitforconnect()
{
while(true)
{
level waittill("connecting", player);
player thread waitforspawn();
}
}

waitforspawn()
{
self endon("disconnect");
while(true)
{
self waittill("spawned_player");
self.assist = [];
}
}

Just wrote an updated version of the code, should only require a call to init() instead of that much calls as in the tutorial i linked.

Untested.

Ni3ls
8th October 2013, 06:49
I will test it after my college

Ni3ls
8th October 2013, 13:04
if(isdefined(self.assist[i]) && (!isdefined(eAttacker) || self.assist[i] != eAttacker) && (level.dm_style || self.assist[i].pers["team"] != self.pers["team"]))
{
self.assist[i].score += level.assist_plusscore;
self.assist maps\mp\gametypes\__damagefeedback::updateDamageFe edback();

Missing "}"


self.assist maps\mp\gametypes\__damagefeedback::updateDamageFe edback();

1 "_" to much and some potentional infinite loops in the for and while.

But server crash

pair '0' and 'array' has unmatching types 'int' and 'object': (file 'niels/_assist.gsc', line 26)
for(i = 0; i < self.assist; i++)


playerdamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset)
{
if(isdefined(eAttacker) && isplayer(eAttacker) && eAttacker != self && (level.dm_style || eAttacker.pers["team"] != self.pers["team"]))
{
found = false;
for(i = 0; i < self.assist; i++)
{
if(isdefined(self.assist[i]) && self.assist[i] == eAttacker)
{
found = true;
break;
}
wait 1;
}
if(!found)
self.assist[self.assist.size] = eAttacker;
}
self [[level.old_callbackPlayerDamage]](eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset);
}

PatmanSan
8th October 2013, 13:47
Just add .size like in playerkilled():

for(i = 0; i < self.assist.size; i++)

Ni3ls
8th October 2013, 14:57
it has some lagg of killing. You kill a player and you see the hitmarker. Then there is the wait of 1 second. After that you see the player death anmation and you get the notify You killed bot0. And sometimes the model of the player who got killed is still there. Looks like ClonePlayer().

IzNoGoD
8th October 2013, 15:20
How did you "fix" the "potential inf loop", as i fail to see where it becomes an inf loop. If you added a wait in the for() loop, then ofc it hangs. Do not add any waits.

PatmanSan
8th October 2013, 16:57
self.assist maps\mp\gametypes\_damagefeedback::updateDamageFee dback();

that should be


self.assist[i] maps\mp\gametypes\_damagefeedback::updateDamageFee dback();

IzNoGoD
8th October 2013, 17:04
Thanks patman, but it should also have been threaded, which probably is causing the delay.

As i said before, code was untested xD

PatmanSan
8th October 2013, 17:38
Wouldn't hurt to thread it, but his delay is definitely coming from the "wait 1;" in his loop (see his code above).

Ni3ls
9th October 2013, 08:26
Well first it gave me potential infinite loop error. Now it works perfect!

Rocky
9th October 2013, 09:55
1 more..It will add xp's? or just in score?

Ni3ls
9th October 2013, 11:26
Score. Read the code

Sense
9th October 2013, 13:28
As long as the for( ;; ) has an end, than its not infinite loop. so dont add a wait.
Look for another mistake.

Replace this:

for(i = 0; i < self.assist; i++)
With this:

for(i = 0; i < self.assist.size; i++)

EDIT: Didnt realize that the answer already been posted.