Witajcie.
Znalazłem klasę zombie na rosyjskim forum, spolszczyłem ją i przerobiłem, aby była dla vipa na flagę t, zamiast tylko dla admina. Jednak po wgraniu na serwer nie działa. Pliki wszystkie są, jednakże przy wyborze nie pojawia się. Nie pobiera też wyżej wspomnianych plików.
Sma:
/*================================================================================
-----------------------------------
-*- [ZP] Zombie Class: Oxidation Zombie -*-
-----------------------------------
~~~~~~~~~~~~~~~
- Description -
~~~~~~~~~~~~~~~
New zombie Class Oxidation
[RU]
Зомби клаŃŃ, который имеет ŃпоŃобноŃти ОкŃидная атака, когда он иŃĐżŃŃкает направленный поток газа, и Разложение на окŃиды, когда он разлагаетŃŃŹ,
ĐľŃтавляя вмеŃто Ńебя облако газа. Đ’ любой момент он может вновь Ńтать таким каким был Đ´Đľ разложения.
~~~~~~~~~~~~~~~
- Changelog -
~~~~~~~~~~~~~~~
v. 1.0 - First Released. Full Testing plugin
v. 1.1 - Added Cvars is from plugin
v. 1.2 - Used effects to abilities + fix reset control ability
v. 1.3 - Fix bug Gravity abilitly
v. 1.4 - Added new effects & sprites
v. 1.5 - Fixed bug 0 damage for humans and statusicon added
v. 1.6 - Fix bug & optimizated animation sprites. Version released.
v. 1.7 - Fix bug Gas Ability No reset countdown & save posiition is Gas Ability
v. 1.8 - Added Knockback & fix speed bug is gas ability, added new sound
================================================================================*/
#include <amxmodx>
#include <engine>
#include <fakemeta_util>
#include <hamsandwich>
#include <zombieplague>
#define PLUGIN "[ZP] Zombie Class: Oxidation"
#define VERSION "1.8"
#define AUTHOR "Re.Act!ve"
enum (+= 100)
{
TASK_ATTACK = 3200,
TASK_GAS,
TASK_RESET_A,
TASK_RESET_G,
TASK_GAS_PUFF,
}
#define ID_TASK_ATTACK (taskid - TASK_ATTACK)
#define ID_TASK_GAS (taskid - TASK_GAS)
#define ID_TASK_RESET_ATTACK (taskid - TASK_RESET_A)
#define ID_TASK_RESET_GAS (taskid - TASK_RESET_G)
#define ID_TASK_GAS_PUFF (taskid - TASK_GAS_PUFF)
new const zclassT_name[] = { "[PREMIUM]Oxidation" }
new const zclassT_info[] = { "Ma skille: F1 i G"}
new const zclassT_model[] = { "diablo" }
new const zclassT_clawmodel[] = { "v_knife_zombie_hunter.mdl" }
const zclassT_health = 3000
const zclassT_speed = 265
const Float:zclassT_gravity = 0.7
const Float:zclassT_knockback = 1.2
new oxi_ability[] = { "zm/gas_ability.wav" } // ЗвŃĐş ОкŃидной атаки
new oxi_gas[] = { "zm/gas_form.wav" } // ЗвŃĐş разлагания на газы
new oxi_gas_form[] = { "controller/con_attack2.wav" } // ЗвŃĐş возврата
new g_Oxi, g_MaxPlayers, g_cdown_attack, g_damage_attack, g_cdown_gas, g_damage_gas, gas_sprite, g_Sprite, g_msgSayText, Float:Time_Attack[33], g_Slow[33]
new bool:g_countdown[33], bool:a_countdown[33], g_msgStatusIcon, g_msgScreenShake, g_msgDamage, g_Cdown[32], a_Cdown[32], bool:g_GasForm[33], g_Sprite_exp, Float:g_gravity[32]
const Float:g_attack_sec = 3.4 // Время дейŃтвия ОкŃидной атаки
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
g_cdown_attack = register_cvar("zp_oxi_attack_cdown", "40") // Перезарядка ŃпоŃобноŃти ОкŃидная атака
g_damage_attack = register_cvar("zp_oxi_attack_dmg", "0,5") // ОкŃидный Ńрон в 0.1 Ńек
g_cdown_gas = register_cvar("zp_oxi_gas_cdown", "60") // Перезарядка ŃпоŃобноŃти разложения на газы
g_damage_gas = register_cvar("zp_oxi_gas_dmg", "1.0") // Урон наноŃимый в газовой воронке каждŃŃŽ ŃекŃндŃ
g_MaxPlayers = get_maxplayers( )
RegisterHam(Ham_Player_Duck, "player", "Player_Duck", 1);
register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
register_forward(FM_CmdStart, "fw_CmdStart")
register_clcmd( "buy", "AttackBeginAbility" )
register_clcmd( "radio2", "AttackBeginAbility" )
register_clcmd( "+attack2", "AttackBeginAbility" )
register_clcmd("drop", "GasBeginAbility" )
register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0");
// Messages in amxmodx
g_msgStatusIcon = get_user_msgid("StatusIcon")
g_msgScreenShake = get_user_msgid("ScreenShake")
g_msgDamage = get_user_msgid("Damage")
g_msgSayText = get_user_msgid("SayText")
}
public plugin_precache()
{
// Register Class
g_Oxi = zp_register_zombie_class(zclassT_name, zclassT_info, zclassT_model, zclassT_clawmodel, zclassT_health, zclassT_speed, zclassT_gravity, zclassT_knockback)
gas_sprite = engfunc(EngFunc_PrecacheModel,"sprites/gas_puff_01.spr") // Спрайт Ńамого газового иŃточника
g_Sprite = engfunc(EngFunc_PrecacheModel,"sprites/gun_smoke_add.spr") // ОкŃидная атака
g_Sprite_exp = engfunc(EngFunc_PrecacheModel,"sprites/skull.spr") // Спрайт ОкŃидное разложение
precache_sound(oxi_ability)
precache_sound(oxi_gas)
precache_sound(oxi_gas_form)
}
public Event_NewRound()
{
for ( new id = 1; id < g_MaxPlayers; id++ )
{
if(g_GasForm[id] && is_user_connected(id))
{
if(task_exists(id+TASK_GAS)) remove_task(id+TASK_GAS)
set_task(0.1, "OriginalForm", id+TASK_GAS)
}
g_Slow[id] = false;
if(task_exists(id+TASK_ATTACK)) remove_task(id+TASK_ATTACK)
if(task_exists(id+TASK_GAS_PUFF)) remove_task(id+TASK_GAS_PUFF)
}
}
public zp_user_infected_post(id, infector)
{
if( (zp_get_user_zombie_class(id) == g_Oxi) && !zp_get_user_nemesis(id) )
{
a_countdown[id] = true;
g_countdown[id] = true;
ChatColor(id, "[ZP] Grasz jako Oxidation")
client_cmd(id, "bind T ability1");
}
}
public zp_user_infected_pre(id)
{
if(!(get_user_flags(id) & ADMIN_LEVEL_H))
{
if (zp_get_user_next_class(id) == g_Oxi)
{
zp_set_user_zombie_class(id, 0)
client_print(id, print_chat, "Ta klasa jest premium. Wpisz /premium")
}
}
}
public zp_user_humanized_post(id, survivor)
{
if(g_GasForm[id])
{
if(task_exists(id+TASK_GAS)) remove_task(id+TASK_GAS)
set_task(0.1, "OriginalForm", id+TASK_GAS)
}
}
public fw_PlayerPreThink(id)
{
if(g_Slow[id] && !zp_get_user_zombie(id))
set_pev( id, pev_maxspeed, 140.0 )
if (!is_user_alive(id) || !zp_get_user_zombie(id) )
return;
if ((zp_get_user_zombie_class(id) == g_Oxi) && !zp_get_user_nemesis(id) && g_GasForm[id])
{
set_pev(id, pev_view_ofs, {0.0, 0.0, -10.0})
if (pev(id, pev_flags) & FL_ONGROUND)
set_pev(id, pev_gravity, 999999.9) // set really high
else
set_pev(id, pev_gravity, 0.000001) // no gravity
set_pev( id, pev_maxspeed, 1.0 )
set_pev(id, pev_velocity, Float:{0.0,0.0,0.0}) // stop motion
}
}
public AttackBeginAbility(id)
{
if((zp_get_user_zombie_class(id) == g_Oxi) && !zp_get_user_nemesis(id) && a_countdown[id] && is_user_alive(id))
{
a_Cdown[id] = get_pcvar_num(g_cdown_attack);
Time_Attack[id] = g_attack_sec;
a_countdown[id] = false;
emit_sound( id, CHAN_STREAM, oxi_ability, 1.0, ATTN_NORM, 0, PITCH_HIGH )
set_task(1.0, "ResetAttackAbility", id+TASK_RESET_A)
set_task(0.1, "OxidAttack", id+TASK_ATTACK, _, _, "a",floatround(Time_Attack[id])*10)
}
}
public OxidAttack(taskid)
{
new id = ID_TASK_ATTACK
if((Time_Attack[id] > 0.0) && zp_get_user_zombie(id) && is_user_alive(id))
{
new vec[ 3 ], aimvec[ 3 ], velocityvec[ 3 ]
new length
get_user_origin( id, vec )
get_user_origin( id, aimvec, 2 )
velocityvec[ 0 ] = aimvec[ 0 ] - vec[ 0 ]
velocityvec[ 1 ] = aimvec[ 1 ] - vec[ 1 ]
velocityvec[ 2 ] = aimvec[ 2 ] - vec[ 2 ]
length = sqrt( velocityvec[ 0 ] * velocityvec[ 0 ] + velocityvec[ 1 ] * velocityvec[ 1 ] + velocityvec[ 2 ] * velocityvec[ 2 ] )
velocityvec[ 0 ] =velocityvec[ 0 ] * 10 / length
velocityvec[ 1 ] = velocityvec[ 1 ] * 10 / length
velocityvec[ 2 ] = velocityvec[ 2 ] * 10 / length
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte( 120 )
write_coord( vec[ 0 ] )
write_coord( vec[ 1 ] )
write_coord( vec[ 2 ] )
write_coord( velocityvec[ 0 ] )
write_coord( velocityvec[ 1 ] )
write_coord( velocityvec[ 2 ] )
write_short( g_Sprite )
write_byte( 5 )
write_byte( 70 )
write_byte( 100 )
write_byte( 5 )
message_end( )
Time_Attack[id]-=0.1
DamageBegin(id, vec, aimvec)
}
else
{
remove_task(ID_TASK_ATTACK)
}
}
DamageBegin(id, vec[3], Aimvec[3])
{
static victim, Float:originAim[3], Float:originF[3]
new Float:damage; damage = get_pcvar_float(g_damage_attack);
victim = -1; IVecFVec(Aimvec, originAim); IVecFVec(vec, originF)
new Float:flDistance = get_distance_f (originAim, originF )
if(flDistance <= 400.0)
{
while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, originAim, 38.0)) != 0)
{
if (!is_user_alive(victim) || zp_get_user_zombie(victim) || zp_get_user_nemesis(victim))
continue
do_screen_fade(victim, 0.2, 0.1, 200, 200, 200, 120);
user_screen_shake(victim, 4, 2, 5)
ExecuteHam(Ham_TakeDamage, victim, 0, id, damage, DMG_BULLET)
message_begin(MSG_ONE_UNRELIABLE, g_msgDamage, _, victim)
write_byte(0) // damage save
write_byte(0) // damage take
write_long(DMG_DROWN) // Freeze
write_coord(0) // x
write_coord(0) // y
write_coord(0) // z
message_end()
static Float:flSpeed, Float:vOrigin[3]
flSpeed = 450.0
pev(victim, pev_origin, vOrigin)
static Float:flVelocity [3]
get_speed_vector(originF, vOrigin, flSpeed, flVelocity)
set_pev(victim, pev_velocity,flVelocity)
if(!g_Slow[victim])
{
g_Slow[victim] = true;
set_task(3.0, "ResetSlow", victim);
}
}
}
}
public ResetSlow(id)
{
g_Slow[id] = false;
remove_task(id);
}
stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
{
new_velocity[0] = origin2[0] - origin1[0]
new_velocity[1] = origin2[1] - origin1[1]
new_velocity[2] = origin2[2] - origin1[2]
new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
new_velocity[0] *= num
new_velocity[1] *= num
new_velocity[2] *= num
return 1;
}
public ResetAttackAbility(taskid)
{
new id = ID_TASK_RESET_ATTACK
if(a_Cdown[id] > 0 && zp_get_user_zombie(id))
{
set_hudmessage(200, 100, 0, 0.7, 0.91, 0, 1.0, 1.1, 0.0, 0.0, -1)
show_hudmessage(id, "Umiejetnosc gotowa za: %d",a_Cdown[id])
a_Cdown[id]-=1
set_task(1.0, "ResetAttackAbility", id+TASK_RESET_A)
}
else
{
if(zp_get_user_zombie(id))
{
a_countdown[id] = true;
ChatColor( id, "[ZP] Mozesz uzyc umiejetnosci!")
}
remove_task(ID_TASK_RESET_ATTACK)
}
}
public ResetGasAbility(taskid)
{
new id = ID_TASK_RESET_GAS
if(g_Cdown[id] > 0 && zp_get_user_zombie(id))
{
set_hudmessage(200, 100, 0, 0.7, 0.93, 0, 1.0, 1.1, 0.0, 0.0, -1)
show_hudmessage(id, "Umiejetnosc gotowa za : %d",g_Cdown[id])
g_Cdown[id]-=1
set_task(1.0, "ResetGasAbility", id+TASK_RESET_G)
}
else
{
if(zp_get_user_zombie(id))
{
g_countdown[id] = true;
ChatColor( id, "[ZP] Mozesz uzyc umiejetnosci!")
}
remove_task(ID_TASK_RESET_GAS)
}
}
public client_putinserver(id)
fm_set_user_godmode(id,0)
public GasBeginAbility(id)
{
if((zp_get_user_zombie_class(id) == g_Oxi) && !zp_get_user_nemesis(id) && g_countdown[id] && is_user_alive(id) && zp_get_user_zombie(id))
{
if(!g_GasForm[id])
{
new Origin[3]; get_user_origin(id, Origin)
g_Cdown[id] = get_pcvar_num(g_cdown_gas);
g_gravity[id] = fm_get_user_gravity(id)
g_GasForm[id] = true;
fm_strip_user_weapons(id)
fm_set_user_godmode(id, 1)
set_pev(id, pev_view_ofs, {0.0, 0.0, 0.0})
fm_set_user_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 0)
message_begin(MSG_PVS, SVC_TEMPENTITY, Origin)
write_byte(TE_SPRITE) // TE id
write_coord(Origin[0]) // x
write_coord(Origin[1]) // y
write_coord(Origin[2]+5) // z
write_short(g_Sprite_exp) // sprite
write_byte(8) // scale
write_byte(200) // brightness
message_end()
emit_sound( id, CHAN_STREAM, oxi_gas, 1.0, ATTN_NORM, 0, PITCH_HIGH )
if(task_exists(id+TASK_GAS_PUFF)) remove_task(id+TASK_GAS_PUFF)
set_task(1.0, "AbilityGasPlayed", id+TASK_GAS_PUFF, "", 0, "b")
set_task(25.0, "OriginalForm", id+TASK_GAS)
}
else
{
if(task_exists(id+TASK_GAS)) remove_task(id+TASK_GAS)
set_task(0.1, "OriginalForm", id+TASK_GAS)
}
}
}
public AbilityGasPlayed(taskid)
{
new id = ID_TASK_GAS_PUFF
if(g_GasForm[id] && zp_get_user_zombie(id))
{
static Float:originF[3]
pev(id, pev_origin, originF)
// Get some cvars
static radius, radius2
radius = 200 //150
radius2 = radius-20
//message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
write_byte( TE_FIREFIELD );
engfunc( EngFunc_WriteCoord, originF[ 0 ] );
engfunc( EngFunc_WriteCoord, originF[ 1 ] );
engfunc( EngFunc_WriteCoord, originF[ 2 ] + 50.0 );
write_short( radius2 );
write_short( gas_sprite );
write_byte( 100 );
write_byte( TEFIRE_FLAG_ALPHA | TEFIRE_FLAG_SOMEFLOAT | TEFIRE_FLAG_LOOP );
write_byte( 20 );
message_end();
//message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
write_byte( TE_FIREFIELD );
engfunc( EngFunc_WriteCoord, originF[ 0 ] );
engfunc( EngFunc_WriteCoord, originF[ 1 ] );
engfunc( EngFunc_WriteCoord, originF[ 2 ] + 50.0 );
write_short( radius );
write_short( gas_sprite );
write_byte( 10 );
write_byte( TEFIRE_FLAG_ALPHA | TEFIRE_FLAG_SOMEFLOAT | TEFIRE_FLAG_LOOP );
write_byte( 20 );
message_end( );
new Float:flVictimOrigin [ 3 ], Float:damage
for ( new victim = 1; victim < g_MaxPlayers; victim++ )
{
pev ( victim, pev_origin, flVictimOrigin )
new Float:flDistance = get_distance_f (originF, flVictimOrigin )
if ( flDistance <= 240.0 && !zp_get_user_zombie(victim))
{
if (!is_user_alive(victim))
continue;
g_Slow[victim] = true;
damage = get_pcvar_float(g_damage_gas)
fm_fakedamage(victim, "player", damage, DMG_BLAST)
}
else g_Slow[victim] = false;
}
}
else
{
for ( new victim = 1; victim < get_maxplayers(); victim++ )
g_Slow[victim] = false;
remove_task(ID_TASK_GAS_PUFF)
}
}
public OriginalForm(taskid)
{
new id = ID_TASK_GAS;
if(g_GasForm[id])
{
g_GasForm[id] = false;
fm_give_item(id, "weapon_knife")
set_pev(id, pev_view_ofs, {0.0, 0.0, 26.0})
fm_set_user_godmode(id, 0)
fm_set_rendering( id, 0, 0, 0, 0, kRenderNormal, 25 )
emit_sound( id, CHAN_STREAM, oxi_gas_form, 1.0, ATTN_NORM, 0, PITCH_HIGH )
fm_set_user_gravity(id, g_gravity[id])
g_countdown[id] = false;
set_task(1.0, "ResetGasAbility", id+TASK_RESET_G)
remove_task(ID_TASK_GAS)
}
else remove_task(ID_TASK_GAS)
}
public fw_CmdStart(id, uc_handle, seed)
{
if (!is_user_alive(id)) return FMRES_IGNORED
if (zp_get_user_zombie(id) && zp_get_user_zombie_class(id) == g_Oxi)
{
if (!g_countdown[id] || !a_countdown[id])
StatusIcon(id, 2)
else
StatusIcon(id, 1)
}
else
{
StatusIcon(id, 0)
}
return FMRES_IGNORED;
}
public Player_Duck(id)
{
if (g_GasForm[id] && zp_get_user_zombie(id) && zp_get_user_zombie_class(id) == g_Oxi)
{
static button, ducking
button = pev(id, pev_button)
ducking = pev(id, pev_flags) & (FL_DUCKING | FL_ONGROUND) == (FL_DUCKING | FL_ONGROUND)
if (button & IN_DUCK || ducking)
{
set_pev(id, pev_view_ofs, {0.0, 0.0, 0.0})
}
}
}
StatusIcon(id, run)
{
if (!is_user_connected(id) || zp_get_user_nemesis(id)) return;
message_begin(MSG_ONE, g_msgStatusIcon, {0,0,0}, id);
write_byte(run); // status (0=hide, 1=show, 2=flash)
write_string("dmg_drown"); // sprite name
write_byte(110) // red
write_byte(110) // green
write_byte(110) // blue
message_end();
}
ChatColor(target, const message[], any:...)
{
static buffer[512], i, argscount
argscount = numargs()
// Send to everyone
if (!target)
{
static player
for (player = 1; player <= g_MaxPlayers; player++)
{
// Not connected
if (!is_user_connected(player))
continue;
// Remember changed arguments
static changed[5], changedcount // [5] = max LANG_PLAYER occurencies
changedcount = 0
// Replace LANG_PLAYER with player id
for (i = 2; i < argscount; i++)
{
if (getarg(i) == LANG_PLAYER)
{
setarg(i, 0, player)
changed[changedcount] = i
changedcount++
}
}
// Format message for player
vformat(buffer, charsmax(buffer), message, 3)
// Send it
message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, player)
write_byte(player)
write_string(buffer)
message_end()
// Replace back player id's with LANG_PLAYER
for (i = 0; i < changedcount; i++)
setarg(changed[i], 0, LANG_PLAYER)
}
}
// Send to specific target
else
{
// Format message for player
vformat(buffer, charsmax(buffer), message, 3)
// Send it
message_begin(MSG_ONE, g_msgSayText, _, target)
write_byte(target)
write_string(buffer)
message_end()
}
}
stock do_screen_fade( id, Float:fadeTime, Float:holdTime, red, green, blue, alpha, type = 0x0000 )
{
static msgScreenFade;
if ( !msgScreenFade ) { msgScreenFade = get_user_msgid( "ScreenFade" ); }
new fade, hold;
fade = clamp( floatround( fadeTime * float(1<<12)), 0, 0xFFFF );
hold = clamp( floatround( holdTime * float(1<<12)), 0, 0xFFFF );
message_begin( MSG_ONE_UNRELIABLE, msgScreenFade, _, id );
write_short( fade );
write_short( hold );
write_short( type );
write_byte( red );
write_byte( green );
write_byte( blue );
write_byte( alpha );
message_end( );
}
user_screen_shake(id, amplitude = 4, duration = 2, frequency = 10)
{
message_begin(MSG_ONE_UNRELIABLE, g_msgScreenShake, _, id)
write_short((1<<12)*amplitude) // ??
write_short((1<<12)*duration) // ??
write_short((1<<12)*frequency) // ??
message_end()
}
public sqrt( num )
{
new div = num
new result = 1
while( div > result )
{
div = ( div + result ) / 2
result = num / div
}
return div
}


Dodatki SourceMod



Temat jest zamknięty









