PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fakemeta>
#include <engine>
#include <fun>
#include <gunxpmod>
#define OWNER_PRESENT_SPAWN ADMIN_RCON // Access level for gxm_ps_spawn command
#define OWNER_PRESENT_REMOVE ADMIN_RCON // Access level for gxm_ps_remove command
#define OWNER_PRESENT_STOP ADMIN_RCON // Access level for gxm_ps_stop command
#define OWNER_PRESENT_START ADMIN_RCON // Access level for gxm_ps_start command
#define PRESENT_LIMIT 100 // Maximum amount of presents
new const present_model[] = "models/presents/usercs_present.mdl"
new const sound_spawn[] = "supplyboxes/presents_respawn.wav"
new const sound_get[] = "supplyboxes/presents_get.wav"
enum Color {
NORMAL = 1,
GREEN,
TEAM_COLOR,
GREY,
RED,
BLUE,
}
new TeamName[][] = {
"",
"TERRORIST",
"CT",
"SPECTATOR"
}
new file[78],total_presents, Float:present_data[PRESENT_LIMIT + 1][3],
present_glow,present_light,present_light_radius,present_rot,
spawn_time,min_presents,max_presents
new g_RecievedReward[33]
public plugin_init()
{
register_plugin("[GunXP] Addon: Presents Supply Boxes","1.0","DeXTeR / Alliedmodders")
register_cvar("gxm_supply_boxes_version","1.0",FCVAR_SERVER | FCVAR_SPONLY)
present_glow = register_cvar("gxm_ps_present_glow","1")
present_light = register_cvar("gxm_ps_present_light","1")
present_light_radius = register_cvar("gxm_ps_present_light_radius","8")
present_rot = register_cvar("gxm_ps_present_rotate","1")
spawn_time = register_cvar("gxm_ps_spawn_presents_time","30.0")
min_presents = register_cvar("gxm_ps_min_spawn_presents","5")
max_presents = register_cvar("gxm_ps_max_spawn_presents","10")
register_concmd("gxm_ps_spawn","Owner_Present_Spawn",OWNER_PRESENT_SPAWN)
register_concmd("gxm_ps_remove","Owner_Present_Remove",OWNER_PRESENT_REMOVE)
register_concmd("gxm_ps_stop","Owner_Present_Stop",OWNER_PRESENT_STOP)
register_concmd("gxm_ps_start","Owner_Present_Start",OWNER_PRESENT_START)
register_touch("info_present","player","present_touch")
register_think("info_present","present_think")
register_logevent("round_end",2,"1=Round_End")
register_logevent("round_start",2,"1=Round_Start")
new mapname[32]
get_mapname(mapname,31)
format(file,77,"addons/amxmodx/configs/presents/%s.ini",mapname)
load_presents()
}
public plugin_precache()
{
precache_model(present_model)
precache_sound(sound_spawn)
precache_sound(sound_get)
}
public Owner_Present_Spawn(id,level,cid)
{
if(!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED
if(total_presents == PRESENT_LIMIT)
{
console_print(id,"[GunXP] Present limit exceeded! Maximum amount of presents is %i.",PRESENT_LIMIT)
return PLUGIN_HANDLED
}
new Float:origin[3]
entity_get_vector(id,EV_VEC_origin,origin)
origin[2] -= 30.0
save_present(id,origin)
return PLUGIN_HANDLED
}
public Owner_Present_Remove(id,level,cid)
{
if(!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED
remove_all_presents()
console_print(id,"[GunXP] All presents were removed for this round.")
return PLUGIN_HANDLED
}
public Owner_Present_Stop(id,level,cid)
{
if(!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED
remove_all_presents()
total_presents = 0
console_print(id,"[GunXP] All presents were removed for this map.")
return PLUGIN_HANDLED
}
public Owner_Present_Start(id,level,cid)
{
if(!cmd_access(id,level,cid,1) || total_presents > 0) return PLUGIN_HANDLED
remove_all_presents()
load_presents()
console_print(id,"[GunXP] All presents were loaded for this map.")
return PLUGIN_HANDLED
}
public round_end()
{
if(!total_presents) return
remove_all_presents()
}
public round_start()
{
if(!total_presents) return
remove_task(1337)
set_task(get_pcvar_float(spawn_time), "spawn_random_presents", 1337, _, _, "b")
}
public spawn_random_presents()
{
new num = random_num(get_pcvar_num(min_presents),get_pcvar_num(max_presents))
if(num != 0) for(new ii=0;ii<num;ii++) spawn_present(present_data[random(total_presents)])
}
public present_touch(ent,id)
{
if(g_RecievedReward[id]) return 0;
g_RecievedReward[id] = true
give_random_present(ent, id);
return 0;
}
public give_random_present(ent,id)
{
new xp = 0;
xp = random_num(1, 500);
set_user_xp(id, get_user_xp(id) + xp);
ColorChat(id,GREEN,"^x04[^x03GunXP^x04]^x01 You Found^x04 %i^x01 XP!", xp);
emit_sound(ent,CHAN_AUTO,"supplyboxes/presents_get.wav",VOL_NORM,ATTN_NORM,0,PITCH_NORM);
remove_entity(ent)
g_RecievedReward[id] = false
}
public present_think(ent)
{
if(get_pcvar_num(present_light))
{
static Float:origin[3]
entity_get_vector(ent,EV_VEC_origin,origin)
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0)
write_byte(TE_DLIGHT)
engfunc(EngFunc_WriteCoord, origin[0])
engfunc(EngFunc_WriteCoord, origin[1])
engfunc(EngFunc_WriteCoord, origin[2])
write_byte(get_pcvar_num(present_light_radius))
write_byte(entity_get_int(ent,EV_INT_iuser1))
write_byte(entity_get_int(ent,EV_INT_iuser2))
write_byte(entity_get_int(ent,EV_INT_iuser3))
write_byte(2)
write_byte(0)
message_end()
}
if(get_pcvar_num(present_rot))
{
static Float:angles[3]
entity_get_vector(ent,EV_VEC_angles,angles)
angles[1]--
entity_set_vector(ent,EV_VEC_angles,angles)
}
entity_set_float(ent,EV_FL_nextthink,halflife_time() + 0.01)
}
public remove_all_presents() remove_entity_name("info_present")
public load_presents()
{
total_presents = 0
new buffer[128], x[12],y[12],z[12]
if(file_exists(file))
{
new save = fopen(file,"rt")
if(!save) return
while(!feof(save))
{
fgets(save,buffer,127)
if(buffer[0] == ';' || !buffer[0]) continue
parse(buffer, x,11, y,11, z,11)
present_data[total_presents][0] = str_to_float(x)
present_data[total_presents][1] = str_to_float(y)
present_data[total_presents][2] = str_to_float(z)
total_presents++
}
fclose(save)
}
}
public spawn_present(Float:origin[3])
{
new ent = create_entity("info_target")
if(ent)
{
entity_set_string(ent,EV_SZ_classname,"info_present")
entity_set_model(ent,present_model)
entity_set_int(ent,EV_INT_solid,SOLID_TRIGGER)
entity_set_int(ent,EV_INT_movetype,MOVETYPE_TOSS)
entity_set_float(ent,EV_FL_gravity,1.0)
if(get_pcvar_num(present_glow))
{
entity_set_int(ent,EV_INT_iuser1,random(255))
entity_set_int(ent,EV_INT_iuser2,random(255))
entity_set_int(ent,EV_INT_iuser3,random(255))
set_rendering(ent,kRenderFxGlowShell,entity_get_int(ent,EV_INT_iuser1),entity_get_int(ent,EV_INT_iuser2),entity_get_int(ent,EV_INT_iuser3),kRenderNormal,60)
}
entity_set_origin(ent,origin)
entity_set_float(ent,EV_FL_nextthink,halflife_time() + 0.01)
emit_sound(ent,CHAN_AUTO,"supplyboxes/presents_respawn.wav",VOL_NORM,ATTN_NORM,0,PITCH_NORM)
}
}
public save_present(id,Float:origin[3])
{
new save = fopen(file,"at")
if(save)
{
fprintf(save,"%.2f %.2f %.2f^n",origin[0],origin[1],origin[2])
fclose(save)
console_print(id,"[GunXP] Present Spawn: successfully added at x:y:z(%.2f : %.2f : %.2f).",origin[0],origin[1],origin[2])
load_presents()
}
}
ColorChat(id, Color:type, const msg[], {Float, Sql, Result,_}:...) {
new message[256]
switch(type) {
case NORMAL: message[0] = 0x01
case GREEN: message[0] = 0x04
default: message[0] = 0x03
}
vformat(message[1], 251, msg, 4)
message[192] = '^0'
new team, ColorChange, index, MSG_Type
if(id) {
MSG_Type = MSG_ONE
index = id
} else {
index = FindPlayer()
MSG_Type = MSG_ALL
}
team = get_user_team(index)
ColorChange = ColorSelection(index, MSG_Type, type)
ShowColorMessage(index, MSG_Type, message)
if(ColorChange)
Team_Info(index, MSG_Type, TeamName[team])
}
ShowColorMessage(id, type, message[]) {
static bool:saytext_used
static get_user_msgid_saytext
if(!saytext_used) {
get_user_msgid_saytext = get_user_msgid("SayText")
saytext_used = true
}
message_begin(type, get_user_msgid_saytext, _, id)
write_byte(id)
write_string(message)
message_end()
}
Team_Info(id, type, team[]) {
static bool:teaminfo_used
static get_user_msgid_teaminfo
if(!teaminfo_used) {
get_user_msgid_teaminfo = get_user_msgid("TeamInfo")
teaminfo_used = true
}
message_begin(type, get_user_msgid_teaminfo, _, id)
write_byte(id)
write_string(team)
message_end()
return 1
}
ColorSelection(index, type, Color:Type) {
switch(Type) {
case RED: return Team_Info(index, type, TeamName[1])
case BLUE: return Team_Info(index, type, TeamName[2])
case GREY: return Team_Info(index, type, TeamName[0])
}
return 0
}
FindPlayer() {
new i = -1
while(i <= get_maxplayers()) {
if(is_user_connected(++i))
return i
}
return -1
}