Code:
#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <cstrike>
#define MAX_NAME_LENGTH 32
#define MAX_ID_LENGTH 32
#define MAX_VAR_LENGTH 64
#define SHORT_TERM 0
#define HEADSHOT_BONUS 15
new bool:bFreezeTime = false;
new bool:changingrace[33] = false;
new gmsgStatusText;
new xplevel[11] = {0,100,300,600,1000,1500,2100,2800,3600,4500,5500};
new xpgiven[11] = {60,80,100,120,140,160,180,200,220,240,260};
#if SHORT_TERM
new Float:xpmultiplier = 0.8;
#else
new Float:xpmultiplier = 0.4;
#endif
new p_skills[33][5];
new playerxp[33];
new p_level[33];
new racename[6][] = {"No Race", "Bounty Hunter", "Clone Trooper", "Droid", "Jedi", "Wookie"};
new race1skills[4][] = {"Armor Upgrade", "Flamethrower", "Jetpack", "Radar Scan"};
new race2skills[4] []= {"Stacked Weapons", "Ammo Restock", "", "Respawn"};
new race3skills[4][] = {"Armor Repair", "Shield", "", ""};
new race4skills[4][] = {"Speed","Heal","Mind Trick","Lightsaber"};
new race5skills[4][] = {"Strength", "Stamina", "", "Berserker"};
// Bounty Hunter Skills
new p_armor_upgrade[4] = {0, 100, 150, 200};
// Droid Skills
new p_armor_repair[4] = {0,1,2,4};
public plugin_init() {
gmsgStatusText = get_user_msgid("StatusText");
register_plugin("StarwarsMod", "1.0", "Snipa-of-Death");
register_menucmd(register_menuid("\ySelect Race:"),(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<9),"set_race");
register_menucmd(register_menuid("\ySelect Skill:"), (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<9), "set_skill");
register_clcmd("changerace","change_race",-1,"changerace")
register_clcmd("say /changerace","say_changerace")
register_clcmd("say_team /changerace", "say_changerace")
register_srvcmd("display_race_select","display_race_select")
register_event("DeathMsg", "death", "a");
register_event("ResetHUD", "new_round", "b");
register_logevent("start_round", 2, "1=Round_Start");
register_logevent("end_round", 2, "1=Round_End")
register_logevent("end_round", 2, "1&Restart_Round_")
}
public plugin_precache() {
precache_sound("starwarsmod/impresive.wav");
}
public droid_repair(parm[2]) {
if (p_skills[parm[0]][0] == 3 && p_skills[parm[0]][1] != 0 && is_user_alive(parm[0]) && is_user_connected(parm[0])) {
new player_armor = get_user_armor(parm[0]);
if (player_armor < 100) {
player_armor += p_armor_repair[p_skills[parm[0]][1]];
if (player_armor > 100) {
player_armor = 100;
}
set_user_armor(parm[0], player_armor);
}
}
}
public client_connect(id) {
if (is_user_bot(id)) {
#if !SHORT_TERM
playerxp[id] = 300;
#else
#endif
}
}
public say_changerace(id)
{
change_race(id,1)
return PLUGIN_CONTINUE
}
public end_round() {
#if !SHORT_TERM
write_all();
#endif
}
public write_all() {
new players[32], numofplayers, id;
get_players(players, numofplayers);
for (new i=0; i<numofplayers; i++){
id = players[i];
if (p_skills[id][0]>0 && playerxp[id])
write_xp_to_file(id,"");
}
}
public write_xp_to_file(id,givenline[128]){
if (is_user_bot(id))
return PLUGIN_CONTINUE
new playerid[MAX_ID_LENGTH], playername[MAX_NAME_LENGTH], currentrace[2];
if (id){
get_user_name(id,playername,MAX_NAME_LENGTH-1)
format(currentrace,1,"%d",p_skills[id][0])
get_user_authid(id,playerid,MAX_ID_LENGTH-1);
}
if (id && playerxp[id] && p_skills[id][0]) {
new vaultkey[64], vaultdata[128], index[32]
format(vaultkey, 63, "StarWars_%s_%s", playerid, currentrace)
format(vaultdata, 127, "%d %d %d %d %d %d",playerxp[id],p_skills[id][0], p_skills[id][1],p_skills[id][2],p_skills[id][3],p_skills[id][4])
set_vaultdata(vaultkey,vaultdata);
// Prune Information Setup
format(vaultkey, 63,"StarWars_%s",playerid);
if(!vaultdata_exists(vaultkey)) {
get_vaultdata("StarWars_starwarsindex", index, 31);
format(vaultdata,127,"%d ^"%s^" %d",str_to_num(index),playername,get_systime())
set_vaultdata(vaultkey,vaultdata)
format(vaultkey,63,"StarWars_pruneindex_%d",str_to_num(index))
set_vaultdata(vaultkey,playerid)
format(index,31,"%d",(str_to_num(index)+1))
set_vaultdata("StarWars_starwarsindex",index)
} else {
get_vaultdata(vaultkey,vaultdata,127)
parse(vaultdata,index,31)
format(vaultdata,127,"%d ^"%s^" %d",str_to_num(index),playername,get_systime())
set_vaultdata(vaultkey,vaultdata)
}
}
return PLUGIN_CONTINUE
}
public get_xp_from_file(id,returnrace){
if (!id)
return PLUGIN_CONTINUE
new playerid[MAX_ID_LENGTH], playername[MAX_NAME_LENGTH]
new xp[8], race[2], skill1[2], skill2[2], skill3[2], skill4[2]
new racexp[5]={0,0,0,0,0}
get_user_name(id,playername,MAX_NAME_LENGTH-1)
get_user_authid(id,playerid,MAX_ID_LENGTH-1)
new vaultkey[64], vaultdata[128], currentrace[2]
format(currentrace,1,"%d",p_skills[id][0])
if(returnrace) {
for(new i=1;i < 6; i++) {
format(vaultkey, 63, "StarWars_%s_%d", playerid, i)
if (vaultdata_exists(vaultkey)) {
get_vaultdata(vaultkey, vaultdata,127)
parse(vaultdata,xp,7,race,1,skill1,1,skill2,1,skill3,1,skill4,1)
racexp[i-1] = str_to_num(xp)
} else {
racexp[i-1] = 0
}
if (p_skills[id][0])
racexp[p_skills[id][0]-1]=playerxp[id]
server_cmd("display_race_select %d %d %d %d %d %d",id, racexp[0], racexp[1], racexp[2], racexp[3], racexp[4])
}
} else {
format(vaultkey, 63, "StarWars_%s_%s", playerid, currentrace)
if(vaultdata_exists(vaultkey)) {
get_vaultdata(vaultkey, vaultdata, 127)
parse(vaultdata,xp,7,race,1,skill1,1,skill2,1,skill3,1,skill4,1)
playerxp[id]=str_to_num(xp)
p_skills[id][1]=str_to_num(skill1)
p_skills[id][2]=str_to_num(skill2)
p_skills[id][3]=str_to_num(skill3)
p_skills[id][4]=str_to_num(skill4)
display_level(id)
} else {
playerxp[id]=0
p_skills[id][1]=0
p_skills[id][2]=0
p_skills[id][3]=0
p_skills[id][4]=0
display_level(id)
}
}
return PLUGIN_CONTINUE
}
public death() {
new killer = read_data(1);
new victim = read_data(2);
new headshot = read_data(3);
new xp;
if (!(killer == victim) && !(p_skills[killer][0] == 0)) {
xp = floatround(xpgiven[p_level[victim]]*xpmultiplier);
if (headshot) {
xp += HEADSHOT_BONUS;
}
playerxp[killer] += xp;
new msg[128];
format(msg, 128, "[StarwarsMod] You have killed an enemy and gained %d XP.", xp);
client_print(killer, print_chat, msg);
display_level(killer);
}
}
public display_level(id) {
if (playerxp[id]<0)
playerxp[id]=0
new oldlevel = p_level[id];
for (new i=0; i<=10; i++){
if (playerxp[id]>=xplevel[i])
p_level[id]=i;
else
break;
}
new xpstring[128];
if (p_skills[id][0] == 0) {
format (xpstring, 128, "%s XP: %d/%d", racename[p_skills[id][0]], playerxp[id], xplevel[p_level[id]+1]);
} else if (p_level[id] < 10) {
format (xpstring, 128, "%s Level: %d XP: %d/%d", racename[p_skills[id][0]], p_level[id], playerxp[id], xplevel[p_level[id]+1]);
} else {
format (xpstring, 128, "%s XP: %d", racename[p_skills[id][0]], playerxp[id]);
}
message_begin( MSG_ONE, gmsgStatusText, {0,0,0}, id);
write_byte(0);
write_string(xpstring);
message_end();
if (p_level[id] > oldlevel && is_user_alive(id)){ // Level Gained
set_hudmessage(200, 100, 0, -1.0, 0.25, 0, 1.0, 2.0, 0.1, 0.2, 2);
show_hudmessage(id,"You gained a Level");
if (file_exists("sound/starwarsmod/impresive.wav")==1)
emit_sound(id,CHAN_STATIC, "starwarsmod/impresive.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
}
return PLUGIN_CONTINUE;
}
public change_race(id,saychat){
#if SHORT_TERM
select_race(id)
return PLUGIN_CONTINUE
#endif
if (is_user_alive(id) && !bFreezeTime) {
if (saychat==1){
set_hudmessage(200, 100, 0, -1.0, 0.3, 0, 1.0, 5.0, 0.1, 0.2, 3)
show_hudmessage(id,"You can only change your race when you are dead or at the beginning of the round!")
} else {
client_cmd(id,"echo You can only change your race when you are dead or at the beginning of the round!")
}
return PLUGIN_CONTINUE
}
if ( p_skills[id][0]>=0){
#if !SHORT_TERM
if (!changingrace[id]){
write_xp_to_file(id, "")
changingrace[id]=true
get_xp_from_file(id,1)
} else if (saychat==1) {
set_hudmessage(200, 100, 0, -1.0, 0.3, 0, 1.0, 5.0, 0.1, 0.2, 3)
show_hudmessage(id,"You can't change race more than once per round!")
} else {
client_cmd(id,"echo You can't change race more than once per round!")
}
#else
if (!changingrace[id]){
select_race(id)
} else if (saychat==1) {
set_hudmessage(200, 100, 0, -1.0, 0.3, 0, 1.0, 5.0, 0.1, 0.2, 3)
show_hudmessage(id,"You can't change race more than once per round!")
} else {
client_cmd(id,"echo You can't change race more than once per round!")
}
#endif
}
if (saychat==1)
return PLUGIN_CONTINUE
return PLUGIN_HANDLED
}
public select_skill(id) {
new menu_msg[256];
new temp[128];
new skillsused = p_skills[id][1] + p_skills[id][2] + p_skills[id][3] + p_skills[id][4];
if (skillsused >= p_level[id]) {
client_print(id, print_chat, "[StarwarsMod] You have already used all of your skill points.");
}
format(menu_msg, 256, "\ySelect Skill:\w^n^n");
new skillcounter = 0
new skillcurrentrace[4][64]
while (skillcounter < 4){
if (p_skills[id][0] == 1){
copy(skillcurrentrace[skillcounter],63,race1skills[skillcounter])
}
else if (p_skills[id][0] == 2){
copy(skillcurrentrace[skillcounter],63,race2skills[skillcounter])
}
else if (p_skills[id][0] == 3){
copy(skillcurrentrace[skillcounter],63,race3skills[skillcounter])
}
else if (p_skills[id][0] == 4){
copy(skillcurrentrace[skillcounter],63,race4skills[skillcounter])
}
else if (p_skills[id][0] == 5){
copy(skillcurrentrace[skillcounter],63,race5skills[skillcounter])
}
skillcounter++;
}
skillcounter = 1
while (skillcounter< 4){
if (p_skills[id][skillcounter]!=3){
if (p_level[id]<=2*p_skills[id][skillcounter]){
format(temp,127,"\d")
add(menu_msg,255,temp)
}
format(temp,127,"^n%d. %s Level %d\w",skillcounter,skillcurrentrace[skillcounter-1],p_skills[id][skillcounter]+1)
add(menu_msg,255,temp);
}
skillcounter++;
}
if (p_skills[id][4]==0){
if (p_level[id] < 7) {
format(temp, 127, "\d");
add(menu_msg, 255, temp);
}
format(temp,127,"^n4. Ultimate: %s\w",skillcurrentrace[3]);
add(menu_msg, 255, temp);
}
new keys = (1<<9)
if (p_skills[id][1]!=3 && p_level[id]>2*p_skills[id][1] && skillsused<p_level[id])
keys |= (1<<0)
if (p_skills[id][2]!=3 && p_level[id]>2*p_skills[id][2] && skillsused<p_level[id])
keys |= (1<<1)
if (p_skills[id][3]!=3 && p_level[id]>2*p_skills[id][3] && skillsused<p_level[id])
keys |= (1<<2)
if (p_skills[id][4]==0 && p_level[id]>=6 && skillsused<p_level[id])
keys |= (1<<3)
format(temp, 127, "\w^n0. Cancel");
add(menu_msg, 255, temp);
show_menu(id, keys, menu_msg, -1);
}
public set_skill(id,key){
new skillsused = p_skills[id][1]+p_skills[id][2]+p_skills[id][3]+p_skills[id][4]
if (key == 0 && p_skills[id][1]!=3 && p_level[id]>2*p_skills[id][1] && skillsused<p_level[id])
++p_skills[id][1]
else if (key == 1 && p_skills[id][2]!=3 && p_level[id]>2*p_skills[id][2] && skillsused<p_level[id])
++p_skills[id][2]
else if (key == 2 && p_skills[id][3]!=3 && p_level[id]>2*p_skills[id][3] && skillsused<p_level[id])
++p_skills[id][3]
else if (key == 3 && p_skills[id][4]==0 && p_level[id]>=6 && skillsused<p_level[id])
p_skills[id][4]=1
else if (key == 9)
return PLUGIN_HANDLED
skillsused = p_skills[id][1]+p_skills[id][2]+p_skills[id][3]+p_skills[id][4]
if (skillsused < p_level[id])
select_skill(id)
else
display_level(id)
return PLUGIN_HANDLED
}
public display_race_select(){
new id, idtext[3], menu_msg[384]
new racexp1[8], racexp2[8], racexp3[8], racexp4[8], racexp5[8]
read_argv(1,idtext,2)
read_argv(2,racexp1,7)
read_argv(3,racexp2,7)
read_argv(4,racexp3,7)
read_argv(5,racexp4,7)
read_argv(6,racexp5,7)
id = str_to_num(idtext)
format(menu_msg,255,"\ySelect Race:\RExperience^n^n\w1. %s\y\R%s^n\w2. %s\y\R%s^n\w3. %s\y\R%s^n\w4. %s\y\R%s^n\w5. %s\y\R%s^n^n\w6. Auto-select", racename[1], racexp1, racename[2], racexp2, racename[3], racexp3, racename[4], racexp4, racename[5], racexp5)
show_menu(id,(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5),menu_msg,-1)
return PLUGIN_HANDLED
}
public select_race(id) {
if (is_user_bot(id)) {
p_skills[id][0] = random_num(1,5);
}
new menu_msg[256];
format(menu_msg,256,"\ySelect Race:\w^n^n1. %s^n2. %s^n3. %s^n4. %s^n5. %s^n^n6. Auto-select^n0. Cancel", racename[1], racename[2], racename[3], racename[4], racename[5]);
show_menu(id, (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<9), menu_msg, -1);
return PLUGIN_CONTINUE;
}
public set_race(id, key) {
if (is_user_alive(id) && !bFreezeTime) {
changingrace[id] = false;
client_print(id, print_chat, "[StarwarsMod] You cannot change race unless you are dead or during freeztime.");
return PLUGIN_CONTINUE;
}
if (key == 0) {
p_skills[id][0] = 1;
} else if (key == 1) {
p_skills[id][0] = 2;
} else if (key == 2) {
p_skills[id][0] = 3;
} else if (key == 3) {
p_skills[id][0] = 4;
} else if (key == 4) {
p_skills[id][0] = 5;
} else if (key == 5) {
p_skills[id][0] = random_num(1, 5);
}
p_skills[id][1] = 0;
p_skills[id][2] = 0;
p_skills[id][3] = 0;
p_skills[id][4] = 0;
#if !SHORT_TERM
playerxp[id] = 0
p_level[id] = 0
get_xp_from_file(id,0)
#endif
new msg[256];
format(msg, 256, "[StarwarsMod] You have selected the %s race.", racename[p_skills[id][0]]);
client_print(id, print_chat, msg);
display_level(id);
return PLUGIN_CONTINUE;
}
public new_round(id) {
bFreezeTime = true;
changingrace[id] = false;
if (p_skills[id][0] == 0) {
#if SHORT_TERM
select_race(id);
#else
get_xp_from_file(id, 1)
#endif
}
if (is_user_alive(id)) {
display_level(id);
new skillsused = p_skills[id][1]+p_skills[id][2]+p_skills[id][3]+p_skills[id][4] ;
if (skillsused < p_level[id]) {
select_skill(id);
}
// Bounty Hunter
if (p_skills[id][0] == 1) {
if (p_skills[id][1] > 0) {
cs_set_user_armor(id, p_armor_upgrade[p_skills[id][1]], CS_ARMOR_VESTHELM);
}
}
//Droid
if (p_skills[id][0] == 3) {
if (p_skills[id][1] > 0) {
new parm[2];
parm[0] = id;
parm[1] = 0;
set_task(2.0, "droid_repair", 50 + id,parm, 2, "b");
}
}
}
}
public start_round() {
bFreezeTime = false;
}