PHP Code:
#include <amxmodx>
#include <hamsandwich>
#include <Vexd_Utilities>
#include <fakemeta>
#include <engine>
#include <fun>
#include <csx>
//Max levels
#define MAXLEVELS 9
#define OFFSET_MONEY 115
#define OFFSET_TEAM 114
#define OFFSET_MONEY 115
#define OFFSET_DEATH 444
#define h1_dam 600 // head
#define h2_dam 400 // body
#define h3_dam 350 // stomach
#define h4_dam 100 // arm
#define h6_dam 100 // leg
#define ARMOR_RATIO 0.2 // Armor Takes 80% of the damage (0.2 in the SDK)
#define ARMOR_BONUS 0.5 // Each Point of Armor is worth 1/x points of health (0.5 in the SDK)
#define get_user_money(%1) get_offset_value(%1,OFFSET_MONEY)
#define set_user_money(%1,%2) set_offset_value(%1,OFFSET_MONEY,%2)
//Heer you can add more levels
new const LEVELS[MAXLEVELS] = {
200,
300,
400,
500,
600,
700,
800,
900,
1000
}
// Plugin Version
#define VERSION "1.3"
/* Thunder sound */
new const thunder_sound[] = "ambience/thunder_clap.wav";
//Variables that store the players lv xp
new PlayerXP[33],PlayerLevel[33], Porcentagem[33], gXPGiven[33], movel[33], checkCount[33], blinkSpot[33][3], origBlinkSpot[33][3], g_lastPosition[33][3];
//Pcvars
new XP_Kill, XP_Knife, XP_Hs, XP_Perfect, XP, XP_Defuse, XP_Plant;
// Sprites
new gSpriteSmoke, gSpriteFire, gSpriteBurning, gSpriteLightning, g_smoke, g_lightning, g_msgStatusText, g_msgclcorpse,
g_msgDeathMsg, gmsgScoreInfo, g_msgMoney, gmsgDamage, beam;
// Constantes para verificar Players existentes em caso de linux
const OFFSET_LINUX = 5
const OFFSET_CSTEAMS = 114
public plugin_init()
{
register_plugin("Real XP Mod |*-*|", VERSION, "Alliedmods Forum / Yokil SpyWare")
// Amx_load para ADM AJuda para jogador
register_concmd("amx_load" , "darxp")
register_clcmd("say" , "cl_say")
//events
register_event("DeathMsg", "eDeath", "a")
register_event("DeathMsg", "level3_death", "a")
register_cvar("xp_version", VERSION, FCVAR_SERVER|FCVAR_SPONLY);
set_cvar_string("xp_version", VERSION);
RegisterHam(Ham_Spawn,"player","fwHamPlayerSpawnPost", 1)
register_event("Damage", "lvl2_damage", "b", "2!0")
register_event("Damage", "lvl5_damage", "b", "2!0")
register_event("Damage", "lvl8_damage", "b", "2!0")
// Msg's
g_msgStatusText = get_user_msgid("StatusText");
g_msgclcorpse = get_user_msgid( "ClCorpse" );
gmsgScoreInfo = get_user_msgid("ScoreInfo");
g_msgDeathMsg = get_user_msgid("DeathMsg");
gmsgDamage = get_user_msgid("Damage");
g_msgMoney = get_user_msgid("Money");
// Comandos
register_srvcmd("xp_extradamage" , "svrExtraDamage")
//cvars
XP = register_cvar("amx_xp","0")
XP_Kill = register_cvar("XP_per_kill", "10")
XP_Hs = register_cvar("XP_hs_bonus","10")
XP_Knife = register_cvar("XP_knife_bonus","10")
XP_Defuse = register_cvar("XP_defuse","10")
XP_Perfect = register_cvar("XP_perfect","10")
XP_Plant = register_cvar("XP_plant","10")
// Forwards
register_forward(FM_PlayerPreThink, "fwd_PreThink");
}
public plugin_precache()
{
g_lightning = precache_model( "sprites/lgtning.spr" );
g_smoke = precache_model( "sprites/steam1.spr" );
gSpriteLightning = precache_model("sprites/lgtning.spr");
gSpriteSmoke = precache_model("sprites/steam1.spr");
gSpriteFire = precache_model("sprites/lgtning.spr");
gSpriteBurning = precache_model("sprites/blue_flame_big.spr");
precache_sound("lightnin.wav");
precache_sound("weapons/xbow_hitbod2.wav");
precache_model("models/shell.mdl")
precache_sound("weapons/electro5.wav")
beam = precache_model("sprites/zbeam4.spr")
}
public cl_say(id)
{
if(get_pcvar_num(XP) == 1)
{
if(!is_user_connected(id))
return PLUGIN_HANDLED
static said[192]
read_args(said, 191)
remove_quotes(said)
new pos
if ( said[pos] == '/' ) pos++
if ( equali(said[pos], "ajuda") ) {
func_ajuda(id)
return PLUGIN_CONTINUE
}
else if ( equali(said[pos], "jogadores") ) {
func_lista(id)
return PLUGIN_CONTINUE
}
}
return PLUGIN_CONTINUE
}
public func_ajuda(id)
{
if(get_pcvar_num(XP) == 0)
return PLUGIN_HANDLED
show_motd(id,"xpmod.txt","Real XP Mod")
return PLUGIN_HANDLED
}
public func_lista(id)
{
new len = 1500
new buffer[1501]
new n = 0
n += copy(buffer[n],len-n,"<html><head><style type=^"text/css^">pre{color:#FFB000;}body{background:#000000;margin-left:8px;margin-top:0px;}</style></head><body><pre>^n")
n += copy(buffer[n],len-n,"Players XP:^n^n")
new pid, name[32], teamName[5]
for ( new team = 2; team >= 0; team-- )
{
for ( new x = 0; x < get_maxplayers(); x++ )
{
pid = x
if ( get_user_team(pid) != team ) continue
if(is_user_connected(pid))
{
get_user_name(pid, name, 31)
teamName[0] = '^0'
if ( get_user_team(pid) == 1 ) copy(teamName, 4, "TR :")
else if ( get_user_team(pid) == 2 ) copy(teamName, 4, "CT :")
else copy(teamName, 4, "SPEC :")
n += formatex(buffer[n], len-n, "%s - %s (Level %d)(XP = %d)^n^n", teamName, name, PlayerLevel[pid], PlayerXP[pid])
}
}
}
n += copy(buffer[n], len-n, "</pre></body></html>")
show_motd(id, buffer, "Xp de todos os jogadores")
return PLUGIN_HANDLED
}
public darxp(id)
{
if (!(get_user_flags(id)&ADMIN_SLAY) || get_pcvar_num(XP) == 0) {
return PLUGIN_HANDLED
}
new cmd[32], arg[32]
read_argv(0,cmd,31)
read_argv(1,arg,31)
Porcentagem[id] = 1500
new lvl = str_to_num(arg)
PlayerLevel[id] = lvl
ShowHud(id)
return PLUGIN_CONTINUE
}
// Example
public fwHamPlayerSpawnPost(id)
{
if (is_user_alive(id) && get_pcvar_num(XP) == 1)
{
Porcentagem[id] = 1500
ShowHud(id)
set_user_gravity(id, 1.0)
}
}
public eDeath( )
{
if(get_pcvar_num(XP) == 0) return PLUGIN_HANDLED
//Get attacker ,weapon and hs
new headshot,attacker = read_data( 1 )
if(attacker)
{
new weapon = get_user_weapon(attacker,headshot,headshot)
headshot = read_data( 3 )
new health = get_user_health(attacker)
//Increase xp
PlayerXP[attacker] += get_pcvar_num(XP_Kill)
//Give bonus xp if he got hs
if(headshot)
PlayerXP[attacker] += get_pcvar_num(XP_Hs)
// Gives bonus if attacker has full hp
if(health == 100)
PlayerXP[attacker] += get_pcvar_num(XP_Perfect)
//Give bonus xp if the gun is a knife
if(weapon == CSW_KNIFE)
PlayerXP[attacker] += get_pcvar_num(XP_Knife)
//Lv up if he have enugh xp
if(PlayerLevel[attacker] != 9)
{
while(PlayerXP[attacker] >= LEVELS[PlayerLevel[attacker]])
{
PlayerLevel[attacker] += 1
client_print(attacker, print_chat, "[Real Experience Mod] Voce passou para o level %i!",PlayerLevel[attacker])
}
}
//Show the hud and saves his data
ShowHud(attacker)
}
return PLUGIN_CONTINUE
}
public fwd_PreThink(id)
{
if(get_pcvar_num(XP) == 0)
{
set_pev(id, pev_maxspeed, 250.0)
set_pev(id, pev_gravity, 1.0)
return PLUGIN_HANDLED
}
new player_min = get_user_time(id,1);
player_min = player_min / 60
if ( Porcentagem[id] < 1500 )
{
Porcentagem[id] += 1
ShowHud(id)
}
detector(id)
if(PlayerLevel[id] == 0 && movel[id] == 0 || PlayerLevel[id] == 9 && movel[id] == 0)
{
set_pev(id, pev_maxspeed, 320.0)
set_pev(id, pev_gravity, 0.9)
}
if(PlayerLevel[id] == 4 && movel[id] == 0 || PlayerLevel[id] == 6 && movel[id] == 0)
{
set_pev(id, pev_maxspeed, 240.0)
set_pev(id, pev_gravity, 0.6)
}
if(PlayerLevel[id] == 9 && movel[id] == 0)
{
set_pev(id, pev_maxspeed, 340.0)
set_pev(id, pev_gravity, 0.7)
}
if (pev(id,pev_button) & IN_USE)
{
if (is_user_alive(id) && Porcentagem[id] >= 1500)
{
if (PlayerLevel[id] == 4)
{
new aimvec[3]
new tid, tbody
// Get weapon to saving
new clip, ammo, weaponID = get_user_weapon(id, clip, ammo)
// Get position from eyes
get_user_origin(id, aimvec, 3)
// Get targeted player
get_user_aiming(id, tid, tbody)
if(is_user_alive(tid) && fm_get_user_team(id) != fm_get_user_team(tid))
{
if(weaponID != CSW_KNIFE) {
// Switch weapon on knife
engclient_cmd(id,"weapon_knife")
}
// Throw blue lightnings
lightningEffects(id, aimvec)
emit_sound(tid,CHAN_BODY, "weapons/xbow_hitbod2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
new damage
switch(tbody) {
case 1: damage = h1_dam
case 2: damage = h2_dam
case 3: damage = h3_dam
case 4: damage = h4_dam
case 5: damage = h4_dam
case 6: damage = h6_dam
case 7: damage = h6_dam
}
// Make damage to target
shExtraDamage(tid, id, damage, "Meteoro")
//Increase xp
PlayerXP[id] += get_pcvar_num(XP_Kill)
Porcentagem[id] = 0
ShowHud(id)
}
}
if (PlayerLevel[id] == 5)
{
// Pegar origem
get_user_origin(id,blinkSpot[id],3)
// Botar cordenadas
origBlinkSpot[id][0] = blinkSpot[id][0]
origBlinkSpot[id][1] = blinkSpot[id][1]
origBlinkSpot[id][2] = blinkSpot[id][2]
// Botar configuração
blinkSpot[id][2] += 45
// Botar nova origem
set_user_origin(id,blinkSpot[id])
// Determina a origem padrão
checkCount[id] = 1
// Checa a posição
positionChangeTimer(id)
// evitar que use novamente
Porcentagem[id] = 0
ShowHud(id)
}
if (PlayerLevel[id] == 6)
{
new tid, tbody
// Get targeted player
get_user_aiming(id, tid, tbody)
// if looking at something
if(is_user_alive(tid))
{
// Get weapon to saving
new clip, ammo, weaponID = get_user_weapon(id, clip, ammo)
if(weaponID != CSW_KNIFE) {
// Switch weapon on knife
engclient_cmd(id,"weapon_knife")
}
if(fm_get_user_team(id) != fm_get_user_team(tid))
{
// get target's origin
new vorigin[ 3 ], pos[ 3 ];
get_user_origin( tid, vorigin );
// modify origins
vorigin[ 2 ] -= 26;
pos[ 0 ] = vorigin[ 0 ] + 150;
pos[ 1 ] = vorigin[ 1 ] + 150;
pos[ 2 ] = vorigin[ 2 ] + 800;
// block ClCorpse
set_msg_block( g_msgclcorpse, BLOCK_ONCE );
new damage
switch(tbody) {
case 1: damage = h1_dam
case 2: damage = h2_dam
case 3: damage = h3_dam
case 4: damage = h4_dam
case 5: damage = h4_dam
case 6: damage = h6_dam
case 7: damage = h6_dam
}
// Make damage to target
shExtraDamage(tid, id, damage, "Raio")
// create lightning bolt
Thunder( pos, vorigin );
// create smoke
Smoke( vorigin, 10, 10 );
// create blood
Blood( vorigin );
//Increase xp
PlayerXP[id] += get_pcvar_num(XP_Kill)
Porcentagem[id] = 0
ShowHud(id)
}
}
}
if (PlayerLevel[id] == 7)
{
new tid, tbody
// Get targeted player
get_user_aiming(id, tid, tbody)
// if looking at something
if(is_user_alive(tid))
{
// Get weapon to saving
new clip, ammo, weaponID = get_user_weapon(id, clip, ammo)
if(weaponID != CSW_KNIFE) {
// Switch weapon on knife
engclient_cmd(id,"weapon_knife")
}
if(fm_get_user_team(id) != fm_get_user_team(tid))
{
new Float:vOrigin[3]
new Float:vAngles[3]
entity_get_vector(id, EV_VEC_origin, vOrigin)
vOrigin[2] = vOrigin[2] + 12
entity_get_vector(id, EV_VEC_v_angle, vAngles)
new NewEnt = create_entity("info_target")
entity_set_string(NewEnt, EV_SZ_classname, "RubberBullet")
entity_set_model(NewEnt, "models/shell.mdl")
entity_set_vector(NewEnt, EV_VEC_origin, vOrigin)
entity_set_vector(NewEnt, EV_VEC_angles, vAngles)
entity_set_vector(NewEnt, EV_VEC_v_angle, vAngles)
entity_set_vector(NewEnt, EV_VEC_oldorigin, vOrigin)
entity_set_int(NewEnt, EV_INT_solid, 2)
entity_set_int(NewEnt, EV_INT_movetype, 5)
entity_set_edict(NewEnt, EV_ENT_owner, id)
new Float:MinBox[3] = {-1.0, -1.0, -1.0}
new Float:MaxBox[3] = {1.0, 1.0, 1.0}
entity_set_vector(NewEnt, EV_VEC_mins, MinBox)
entity_set_vector(NewEnt, EV_VEC_maxs, MaxBox)
new Float:fNewVelocity[3]
VelocityByAim(id, 3000, fNewVelocity)
entity_set_vector(NewEnt, EV_VEC_velocity, fNewVelocity)
// Trail on entity. It's flawed by not being removable, so make it last long.
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(22) // TE_BEAMFOLLOW
write_short(NewEnt) // entity:attachment to follow
write_short(beam) // sprite index
write_byte(3) // life in 0.1's
write_byte(1) // line width in 0.1's
write_byte(200) //r,g,b
write_byte(200)
write_byte(70)
write_byte(120) // brightness
message_end()
new damage
switch(tbody) {
case 1: damage = h1_dam
case 2: damage = h2_dam
case 3: damage = h3_dam
case 4: damage = h4_dam
case 5: damage = h4_dam
case 6: damage = h6_dam
case 7: damage = h6_dam
}
// som
emit_sound(tid,CHAN_BODY, "weapons/deagle-1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
// Make damage to target
shExtraDamage(tid, id, damage, "Bola de fogo")
set_task(30.0, "remove_bullet", NewEnt)
//Increase xp
PlayerXP[id] += get_pcvar_num(XP_Kill)
// evitar que use novamente
Porcentagem[id] = 0
ShowHud(id)
}
}
}
if (PlayerLevel[id] == 9)
{
new rdm = random(2)
if (rdm == 0)
{
new aimvec[3]
new tid, tbody
// Get weapon to saving
new clip, ammo, weaponID = get_user_weapon(id, clip, ammo)
// Get position from eyes
get_user_origin(id, aimvec, 3)
// Get targeted player
get_user_aiming(id, tid, tbody)
if(is_user_alive(tid) && fm_get_user_team(id) != fm_get_user_team(tid))
{
if(weaponID != CSW_KNIFE) {
// Switch weapon on knife
engclient_cmd(id,"weapon_knife")
}
// Throw blue lightnings
lightningEffects(id, aimvec)
emit_sound(tid,CHAN_BODY, "weapons/xbow_hitbod2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
new damage
switch(tbody) {
case 1: damage = h1_dam
case 2: damage = h2_dam
case 3: damage = h3_dam
case 4: damage = h4_dam
case 5: damage = h4_dam
case 6: damage = h6_dam
case 7: damage = h6_dam
}
// Make damage to target
shExtraDamage(tid, id, damage, "Meteoro")
//Increase xp
PlayerXP[id] += get_pcvar_num(XP_Kill)
Porcentagem[id] = 0
ShowHud(id)
}
}
if (rdm == 1)
{
new tid, tbody
// Get targeted player
get_user_aiming(id, tid, tbody)
// if looking at something
if(is_user_alive(tid))
{
// Get weapon to saving
new clip, ammo, weaponID = get_user_weapon(id, clip, ammo)
if(weaponID != CSW_KNIFE) {
// Switch weapon on knife
engclient_cmd(id,"weapon_knife")
}
if(fm_get_user_team(id) != fm_get_user_team(tid))
{
// get target's origin
new vorigin[ 3 ], pos[ 3 ];
get_user_origin( tid, vorigin );
// modify origins
vorigin[ 2 ] -= 26;
pos[ 0 ] = vorigin[ 0 ] + 150;
pos[ 1 ] = vorigin[ 1 ] + 150;
pos[ 2 ] = vorigin[ 2 ] + 800;
// block ClCorpse
set_msg_block( g_msgclcorpse, BLOCK_ONCE );
new damage
switch(tbody) {
case 1: damage = h1_dam
case 2: damage = h2_dam
case 3: damage = h3_dam
case 4: damage = h4_dam
case 5: damage = h4_dam
case 6: damage = h6_dam
case 7: damage = h6_dam
}
// Make damage to target
shExtraDamage(tid, id, damage, "Raio")
// create lightning bolt
Thunder( pos, vorigin );
// create smoke
Smoke( vorigin, 10, 10 );
// create blood
Blood( vorigin );
//Increase xp
PlayerXP[id] += get_pcvar_num(XP_Kill)
Porcentagem[id] = 0
ShowHud(id)
}
}
}
if (rdm == 2)
{
new tid, tbody
// Get targeted player
get_user_aiming(id, tid, tbody)
// if looking at something
if(is_user_alive(tid))
{
// Get weapon to saving
new clip, ammo, weaponID = get_user_weapon(id, clip, ammo)
if(weaponID != CSW_KNIFE) {
// Switch weapon on knife
engclient_cmd(id,"weapon_knife")
}
if(fm_get_user_team(id) != fm_get_user_team(tid))
{
new Float:vOrigin[3]
new Float:vAngles[3]
entity_get_vector(id, EV_VEC_origin, vOrigin)
vOrigin[2] = vOrigin[2] + 12
entity_get_vector(id, EV_VEC_v_angle, vAngles)
new NewEnt = create_entity("info_target")
entity_set_string(NewEnt, EV_SZ_classname, "RubberBullet")
entity_set_model(NewEnt, "models/shell.mdl")
entity_set_vector(NewEnt, EV_VEC_origin, vOrigin)
entity_set_vector(NewEnt, EV_VEC_angles, vAngles)
entity_set_vector(NewEnt, EV_VEC_v_angle, vAngles)
entity_set_vector(NewEnt, EV_VEC_oldorigin, vOrigin)
entity_set_int(NewEnt, EV_INT_solid, 2)
entity_set_int(NewEnt, EV_INT_movetype, 5)
entity_set_edict(NewEnt, EV_ENT_owner, id)
new Float:MinBox[3] = {-1.0, -1.0, -1.0}
new Float:MaxBox[3] = {1.0, 1.0, 1.0}
entity_set_vector(NewEnt, EV_VEC_mins, MinBox)
entity_set_vector(NewEnt, EV_VEC_maxs, MaxBox)
new Float:fNewVelocity[3]
VelocityByAim(id, 3000, fNewVelocity)
entity_set_vector(NewEnt, EV_VEC_velocity, fNewVelocity)
// Trail on entity. It's flawed by not being removable, so make it last long.
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(22) // TE_BEAMFOLLOW
write_short(NewEnt) // entity:attachment to follow
write_short(beam) // sprite index
write_byte(3) // life in 0.1's
write_byte(1) // line width in 0.1's
write_byte(200) //r,g,b
write_byte(200)
write_byte(70)
write_byte(120) // brightness
message_end()
new damage
switch(tbody) {
case 1: damage = h1_dam
case 2: damage = h2_dam
case 3: damage = h3_dam
case 4: damage = h4_dam
case 5: damage = h4_dam
case 6: damage = h6_dam
case 7: damage = h6_dam
}
// som
emit_sound(tid,CHAN_BODY, "weapons/deagle-1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
// Make damage to target
shExtraDamage(tid, id, damage, "Bola de fogo")
set_task(30.0, "remove_bullet", NewEnt)
//Increase xp
PlayerXP[id] += get_pcvar_num(XP_Kill)
// evitar que use novamente
Porcentagem[id] = 0
ShowHud(id)
}
}
}
}
}
}
return PLUGIN_CONTINUE
}
public detector(id) //maybe client prethink()
{
new target, body, distance = 999999;
get_user_aiming(id, target, body, distance);
if(is_user_connected(target) || !is_user_connected(target) && is_user_alive(id))
{
ShowHud(id)
}
}
public positionChangeTimer(id)
{
if (!is_user_alive(id)) return
new Float:velocity[3]
get_user_origin(id, g_lastPosition[id])
entity_get_vector(id, EV_VEC_velocity, velocity)
if ( velocity[0] == 0.0 && velocity[1] == 0.0 && velocity[2] ) {
velocity[0] = 50.0
velocity[1] = 50.0
entity_set_vector(id, EV_VEC_velocity, velocity)
}
set_task(0.1,"positionChangeCheck",id)
}
public positionChangeCheck(id)
{
if (!is_user_alive(id)) return
new origin[3]
get_user_origin(id, origin)
if ( g_lastPosition[id][0] == origin[0] && g_lastPosition[id][1] == origin[1] && g_lastPosition[id][2] == origin[2]) {
switch(checkCount[id]) {
case 0 : blink_movecheck(id, 0, 0, 0) // Original
case 1 : blink_movecheck(id, 0, 0, 80) // Up
case 2 : blink_movecheck(id, 0, 0, -110) // Down
case 3 : blink_movecheck(id, 0, 30, 0) // Forward
case 4 : blink_movecheck(id, 0, -30, 0) // Back
case 5 : blink_movecheck(id, -30, 0, 0) // Left
case 6 : blink_movecheck(id, 30, 0, 0) // Right
case 7 : blink_movecheck(id, -30, 30, 0) // Forward-Left
case 8 : blink_movecheck(id, 30, 30, 0) // Forward-Right
case 9 : blink_movecheck(id, -30, -30, 0) // Back-Left
case 10: blink_movecheck(id, 30, -30, 0) // Back-Right
case 11: blink_movecheck(id, 0, 30, 60) // Up-Forward
case 12: blink_movecheck(id, 0, 30, -110) // Down-Forward
case 13: blink_movecheck(id, 0, -30, 60) // Up-Back
case 14: blink_movecheck(id, 0, -30, -110) // Down-Back
case 15: blink_movecheck(id, -30, 0, 60) // Up-Left
case 16: blink_movecheck(id, 30, 0, 60) // Up-Right
case 17: blink_movecheck(id, -30, 0, -110) // Down-Left
case 18: blink_movecheck(id, 30, 0, -110) // Down-Right
default: user_kill(id)
}
return
}
}
public blink_movecheck(id, mX, mY, mZ)
{
blinkSpot[id][0] = origBlinkSpot[id][0] + mX
blinkSpot[id][1] = origBlinkSpot[id][1] + mY
blinkSpot[id][2] = origBlinkSpot[id][2] + mZ
set_user_origin(id,blinkSpot[id])
checkCount[id]++
positionChangeTimer(id)
}
public bomb_defused(defuser)
{
PlayerXP[defuser] += get_pcvar_num(XP_Defuse)
ShowHud(defuser)
}
public bomb_planted(planter)
{
PlayerXP[planter] += get_pcvar_num(XP_Plant)
ShowHud(planter)
}
public level3_death()
{
if(get_pcvar_num(XP) == 0) return PLUGIN_HANDLED
// Indexes (killer and victim)
new killer = read_data(1)
new victim = read_data(2)
new headshot = read_data(3)
if (PlayerLevel[killer] == 3 && killer != victim)
{
// Health sets
if(is_user_connected(killer) && headshot)
{
PlayerXP[killer] += 10
PlayerXP[victim] -= 5
}
if(is_user_connected(killer) && !headshot)
{
PlayerXP[killer] += 7
PlayerXP[victim] -= 3
}
}
return PLUGIN_CONTINUE
}
public lvl2_damage(id)
{
if(get_pcvar_num(XP) == 0) return PLUGIN_HANDLED
new attacker = get_user_attacker(id)
new damage = read_data(2)
if ( PlayerLevel[attacker] == 2 && is_user_alive(attacker) && id != attacker )
{
new rdm = random(10)
if(rdm == 0 || rdm == 1 || rdm == 4 || rdm == 6 || rdm == 10)
{
// do extra damage
new returnDamage = floatround( 5.0 * damage )
if (returnDamage > 0)
{
shExtraDamage( id, attacker, returnDamage, "shockwave" )
new iRed,iGreen,iBlue,iWidth,iNoise
iRed = random_num(0,100)
iGreen = random_num(0,100)
iBlue = random_num(100,255)
iWidth = random_num(10,40)
iNoise = random_num(10,40)
if(iRed > iBlue) iBlue = (iRed + 10)
if(iGreen > iBlue) iBlue = (iGreen + 10)
if(iBlue > 255) iBlue = 255
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte( 8 )
write_short(attacker) // start entity
write_short(id) // entity
write_short(gSpriteLightning ) // model
write_byte( 0 ) // starting frame
write_byte( 15 ) // frame rate
write_byte( 10 ) // life
write_byte( iWidth ) // line width
write_byte( iNoise ) // noise amplitude
write_byte( iRed ) // r, g, b
write_byte( iGreen ) // r, g, b
write_byte( iBlue ) // r, g, b
write_byte( 255 ) // brightness
write_byte( 0 ) // scroll speed
message_end()
}
}
}
return PLUGIN_CONTINUE
}
public lvl5_damage(id)
{
if(get_pcvar_num(XP) == 0) return PLUGIN_HANDLED
new weapon, bodypart, attacker = get_user_attacker(id, weapon, bodypart)
if(id && PlayerLevel[attacker] == 5 || id && PlayerLevel[attacker] == 9)
{
if ( !is_user_alive(id) || attacker <= 0 || attacker > 32) return PLUGIN_HANDLED
new headshot = (bodypart == 1) ? 1 : 0
if ( weapon == CSW_KNIFE && is_user_alive(id) )
{
// do extra damage
shExtraDamage( id, attacker, 150, "knife", headshot)
}
}
return PLUGIN_CONTINUE
}
public lvl8_damage(id)
{
if(get_pcvar_num(XP) == 0) return PLUGIN_HANDLED
if(id)
{
new attacker = get_user_attacker(id)
if(PlayerLevel[attacker] == 8 && id != attacker)
{
set_user_gravity(id, 0.1)
client_cmd(id,"+jump")
client_cmd(id,"-jump")
movel[id] = 1
new parm[2]
parm[0] = id
parm[1] = attacker
set_task(0.1,"verificar",0 , parm, 2, "b")
}
}
return PLUGIN_CONTINUE
}
public verificar(parm[])
{
new vitima = parm[0]
new attacker = parm[1]
if(!is_user_alive(attacker))
{
movel[vitima] = 0
return PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
public remove_bullet(bullet)
{
if(is_valid_ent(bullet))
remove_entity(bullet)
}
// Evento de morte
public EnviarDeathMsg(attacker, victim, const nome[])
{
message_begin(MSG_BROADCAST, g_msgDeathMsg)
write_byte(attacker)
write_byte(victim)
write_byte(1)
write_string(nome)
message_end()
}
stock shExtraDamage(id, attacker, damage, weaponDescription[], headshot = 0 )
{
server_cmd("xp_extradamage ^"%d^" ^"%d^" ^"%d^" ^"%s^" ^"%d^"", id, attacker, damage, weaponDescription, headshot )
}
//Our hud message
public ShowHud(id)
{
if(get_pcvar_num(XP) == 0) return PLUGIN_HANDLED
new ammo[64]
if(PlayerLevel[id] < 8)
formatex(ammo, 63, "Level:(%d/%d | XP:%d/%d | Karma:%d%s) ", PlayerLevel[id], MAXLEVELS, PlayerXP[id], LEVELS[PlayerLevel[id]], Porcentagem[id] / 15, "%%")
if(PlayerLevel[id] > 8)
formatex(ammo, 63, "Level:(Completo | Karma:%d%s) ", Porcentagem[id] / 15, "%%")
if(!id || !is_user_connected(id))
return PLUGIN_HANDLED;
engfunc(EngFunc_MessageBegin,MSG_ONE_UNRELIABLE, g_msgStatusText, {0,0,0}, id)
write_byte(0)
write_string(ammo)
message_end();
return PLUGIN_HANDLED;
}
//When someone leaves cheek if the xp cvar if on savexp
public client_disconnect(id)
{
if(get_pcvar_num(XP) == 0) return PLUGIN_HANDLED
//After we saved we sets his values to 0 so the guy
//ho joins later dont get his stuff
PlayerXP[id] = 0
PlayerLevel[id] = 0
return PLUGIN_CONTINUE
}
// Publics/ Stocks para os poderes
Thunder( start[ 3 ], end[ 3 ] )
{
message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
write_byte( TE_BEAMPOINTS );
write_coord( start[ 0 ] );
write_coord( start[ 1 ] );
write_coord( start[ 2 ] );
write_coord( end[ 0 ] );
write_coord( end[ 1 ] );
write_coord( end[ 2 ] );
write_short( g_lightning );
write_byte( 1 );
write_byte( 5 );
write_byte( 7 );
write_byte( 20 );
write_byte( 30 );
write_byte( 200 );
write_byte( 200 );
write_byte( 200 );
write_byte( 200 );
write_byte( 200 );
message_end();
message_begin( MSG_PVS, SVC_TEMPENTITY, end );
write_byte( TE_SPARKS );
write_coord( end[ 0 ] );
write_coord( end[ 1 ]);
write_coord( end[ 2 ] );
message_end();
emit_sound( 0 ,CHAN_ITEM, thunder_sound, 1.0, ATTN_NORM, 0, PITCH_NORM );
}
Smoke( iorigin[ 3 ], scale, framerate )
{
message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
write_byte( TE_SMOKE );
write_coord( iorigin[ 0 ] );
write_coord( iorigin[ 1 ] );
write_coord( iorigin[ 2 ] );
write_short( g_smoke );
write_byte( scale );
write_byte( framerate );
message_end();
}
Blood( iorigin[ 3 ] )
{
message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
write_byte( TE_LAVASPLASH );
write_coord( iorigin[ 0 ] );
write_coord( iorigin[ 1 ] );
write_coord( iorigin[ 2 ] );
message_end();
}
public localAddXP(id, xp)
{
if (xp > 0 && PlayerXP[id] + xp < PlayerXP[id]) {
PlayerXP[id] = 2147483647
}
else if (xp < 0 && (PlayerXP[id] + xp < -250000 || PlayerXP[id] + xp > PlayerXP[id])) {
PlayerXP[id] = -250000
}
else {
PlayerXP[id] += xp
}
}
public svrExtraDamage()
{
new szid[4],szattacker[4],szdamage[6],weaponDescription[32], szheadshot[4]
read_argv(1,szid,3)
read_argv(2,szattacker,3)
read_argv(3,szdamage,5)
read_argv(4,weaponDescription,31)
read_argv(5,szheadshot,3)
new id = str_to_num(szid)
new attacker = str_to_num(szattacker)
new damage = str_to_num(szdamage)
new headshot = str_to_num(szheadshot)
if ( !is_user_alive(id) || !is_user_connected(attacker) ) return
if ( get_user_godmode(id) ) return
if ( damage <= 0 ) return
// *** Damage calculation due to armor from: multiplayer/dlls/player.cpp ***
new Float:flNewDamage = float(damage) * ARMOR_RATIO
new Float:flArmor = (float(damage) - flNewDamage) * ARMOR_BONUS
new plrArmor = get_user_armor(id)
// Does this use more armor than we have figured for?
if ( flArmor > float(plrArmor) ) {
flArmor = float(plrArmor)
flArmor *= (1/ARMOR_BONUS)
flNewDamage = float(damage) - flArmor
plrArmor = 0
}
else {
plrArmor = floatround(plrArmor - flArmor)
}
//Commenting this out so it does the orginal ammount of damage still
//damage = floatround(flNewDamage)
//*** End of damage-armor calculations ***
new userHealth = get_user_health(id)
new FFon = get_cvar_num("mp_friendlyfire")
if (userHealth - damage <= 0 ) {
new bool:kill = false
if (id == attacker) {
kill = true
}
else if (FFon && get_user_team(id) == get_user_team(attacker)) {
kill = true
localAddXP(attacker, -gXPGiven[ PlayerLevel[id] ] )
set_user_frags(attacker, get_user_frags(attacker) - 1)
client_print(attacker,print_center,"You killed a teammate")
new money = get_user_money(attacker)
if (money != 0) set_user_money(attacker,money - 150)
}
else if (get_user_team(id) != get_user_team(attacker)) {
kill = true
localAddXP(attacker, gXPGiven[ PlayerLevel[id] ] )
set_user_frags(attacker, get_user_frags(attacker) + 1)
new money = get_user_money(attacker)
if (money < 16000) set_user_money(attacker,money + 300)
}
if (!kill) return
//Log the Kill
logKill(attacker, id, weaponDescription)
//Kill the victim and block the messages
MessageBlock(g_msgDeathMsg,BLOCK_ONCE)
MessageBlock(gmsgScoreInfo,BLOCK_ONCE)
user_kill(id)
//user_kill removes a frag, this gives it back
set_user_frags(id,get_user_frags(id) + 1)
//Replaced HUD death message
message_begin(MSG_ALL,g_msgDeathMsg,{0,0,0},0)
write_byte(attacker)
write_byte(id)
write_byte(headshot)
write_string(weaponDescription)
message_end()
//Update killers scorboard with new info
message_begin(MSG_ALL,gmsgScoreInfo)
write_byte(attacker)
write_short(get_user_frags(attacker))
write_short(get_user_deaths(attacker))
write_short(0)
write_short(get_user_team(attacker))
message_end()
//Update victims scoreboard with correct info
message_begin(MSG_ALL,gmsgScoreInfo)
write_byte(id)
write_short(get_user_frags(id))
write_short(get_user_deaths(id))
write_short(0)
write_short(get_user_team(id))
message_end()
}
else {
new bool:hurt = false
if (id == attacker) {
hurt = true
}
else if (FFon && get_user_team(id) == get_user_team(attacker)) {
hurt = true
new name[33]
get_user_name(attacker,name,32)
client_print(0,print_chat,"%s attacked a teammate",name)
}
else if (get_user_team(id) != get_user_team(attacker)) {
hurt = true
}
if (!hurt) return
set_user_health(id, userHealth - damage)
set_user_armor(id, plrArmor)
new aOrigin[3]
get_user_origin(attacker, aOrigin)
//Damage message
message_begin(MSG_ONE, gmsgDamage, {0,0,0}, id)
write_byte(0) // dmg_save
write_byte(damage) // dmg_take
write_long(0) // visibleDamageBits
write_coord(aOrigin[0]) // damageOrigin.x
write_coord(aOrigin[1]) // damageOrigin.y
write_coord(aOrigin[2]) // damageOrigin.z
message_end()
}
}
public lightningEffects(id, aimvec[3])
{
emit_sound(id, CHAN_ITEM, "lightnin.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
new origin[3]
get_user_origin(id, origin)
// Height + 10 (From a stomach on hands)
origin[2] = origin[2] + 10
// DELIGHT
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(27)
write_coord(origin[0])
write_coord(origin[1])
write_coord(origin[2])
write_byte(10)
write_byte(19) // r, g, b
write_byte(97) // r, g, b
write_byte(255) // r, g, b
write_byte(3) // life
write_byte(1) // decay
message_end()
for(new i = 1; i <= 5; i++)
{
// BEAMENTPOINTS
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(0) // TE_BEAMENTPOINTS 0
if(i == 1) {
write_coord(origin[0])
} else if(i == 2 || i == 4) {
write_coord(origin[0] + (i * 2))
} else {
write_coord(origin[0] - (i * 2))
}
write_coord(origin[1])
write_coord(origin[2])
write_coord(aimvec[0])
write_coord(aimvec[1])
write_coord(aimvec[2])
write_short(gSpriteFire)
write_byte(1) // framestart
write_byte(10) // framerate
write_byte(3) // life
write_byte(50) // width
write_byte(50) // noise
write_byte(19) // r, g, b
write_byte(97) // r, g, b
write_byte(255) // r, g, b
write_byte(200) // brightness
write_byte(200) // speed
message_end()
}
// Sparks
message_begin(MSG_PVS, SVC_TEMPENTITY)
write_byte(9)
write_coord(aimvec[0])
write_coord(aimvec[1])
write_coord(aimvec[2])
message_end()
// Fire
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(3)
write_coord(aimvec[0])
write_coord(aimvec[1])
write_coord(aimvec[2])
write_short(gSpriteBurning)
write_byte(22)
write_byte(10)
write_byte(0)
message_end()
// Smoke
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(5)
write_coord(aimvec[0])
write_coord(aimvec[1])
write_coord(aimvec[2])
write_short(gSpriteSmoke)// short (sprite index)
write_byte(60) // byte (scale in 0.1's)
write_byte(15) // byte (framerate)
message_end()
// TE_GUNSHOTDECAL
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(109) // decal and ricochet sound
write_coord(aimvec[0]) // pos
write_coord(aimvec[1])
write_coord(aimvec[2])
write_short(0) // I have no idea what thats supposed to be
write_byte(random_num(28, 30)) // decal
message_end()
}
// Gets offset data
get_offset_value(id, type)
{
new key = -1
switch(type)
{
case OFFSET_TEAM: key = OFFSET_TEAM
case OFFSET_MONEY:
{
key = OFFSET_MONEY
}
case OFFSET_DEATH: key = OFFSET_DEATH
}
if(key != -1)
{
if(is_amd64_server()) key += 25
return get_pdata_int(id, key, OFFSET_LINUX)
}
return -1
}
// Sets offset data
set_offset_value(id, type, value)
{
new key = -1
switch(type)
{
case OFFSET_TEAM: key = OFFSET_TEAM
case OFFSET_MONEY:
{
key = OFFSET_MONEY
// Send Money message to update player's HUD
message_begin(MSG_ONE_UNRELIABLE, g_msgMoney, {0,0,0}, id)
write_long(value)
write_byte(1) // Flash (difference between new and old money)
message_end()
}
case OFFSET_DEATH: key = OFFSET_DEATH
}
if(key != -1)
{
if(is_amd64_server()) key += 25
set_pdata_int(id, key, value, OFFSET_LINUX)
}
return PLUGIN_CONTINUE
}
stock logKill(id, victim, weaponDescription[] )
{
new namea[32],namev[32],authida[35],authidv[35],teama[16],teamv[16]
//Info On Attacker
get_user_name(id,namea,31)
get_user_team(id,teama,15)
get_user_authid(id,authida,34)
//Info On Victim
get_user_name(victim,namev,31)
get_user_team(victim,teamv,15)
get_user_authid(victim,authidv,34)
//Log This Kill
if(id != victim)
{
log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"",
namea,get_user_userid(id),authida,teama,namev,get_user_userid(victim),authidv,teamv, weaponDescription )
}
else
{
log_message("^"%s<%d><%s><%s>^" committed suicide with ^"%s^"",
namea,get_user_userid(id),authida,teama, weaponDescription )
}
}
// Get User Team
stock fm_get_user_team(id)
{
return get_pdata_int(id, OFFSET_CSTEAMS, OFFSET_LINUX);
}