Zplague
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Zplague Entrar

Seu portal de Zombie Plague no Brasil


[Plugin] Oberon Boss

power_settings_newInicie sessão para responder
+5
hackingzm
Lucas157
Feelipe::
Sergio #
[P]erfec[T] [S]cr[@]s[H]
9 participantes

description[Plugin] Oberon Boss Empty[Plugin] Oberon Boss

more_horiz
Bom pessoal eu tava pensando em vender esse plugin mas eu vô posta então pegue a SMA. E este esta sem o bug das bolinhas (Pelo menos eu acho que esta):

Código:

#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include < xs >
#include <zombieplague>

#define OBERON_CLASSNAME "oberon"

// Flag De Acesso (Atualmente ta na flag F)
#define FLAG_ACESS                   ADMIN_LEVEL_F

#define OBERON_HEALTH                  150000.0
#define MONEY_DMG                  1000.0
#define MONEY_REWARD                  1000
#define CLASS_NAME                  "npc_oberon"
#define CLASS_TIP                  "Oberon Boss"
#define OBERON_ATTACK_WAITIME                3.0

#define TASK_SKILL 123123123
#define TASK_HOOKINGUP 123312312
#define TASK_HOOKINGDOWN 123312313

new const oberon_model[] = "models/oberon/zbs_bossl_big02.mdl"
new const oberon_knife_effect[] = "models/oberon/ef_knife.mdl"
new const oberon_hole_effect[] = "models/oberon/ef_hole.mdl"
new const oberon_bomb_model[] = "models/oberon/zbs_bossl_big02_bomb.mdl"

new const oberon_appear_sound[] = "oberon/appear.wav"
new const oberon_death_sound[] = "oberon/death.wav"
new const oberon_evolution_sound[] = "oberon/knife.wav"
new const oberon_attack_sound[8][] =
{
   "oberon/attack1.wav",
   "oberon/attack2.wav",
   "oberon/attack3_jump.wav",
   "oberon/attack3.wav",
   "oberon/knife_attack1.wav",
   "oberon/knife_attack2.wav",
   "oberon/knife_attack3_jump.wav",
   "oberon/knife_attack3.wav"
}
new const oberon_hole_sound[] = "oberon/hole.wav"
new const oberon_bomb_sound[] = "oberon/attack_bomb.wav"

new oberon_model_id, g_reg, m_iBlood[2], exp_spr_id
new Float:g_cur_origin[3], Float:g_cur_angles[3], Float:g_cur_v_angle[3]
new g_evolution, g_evoluting, g_doing_other, g_attacking3, Float:g_attacking3_origin[3], g_damagedealt[33] , g_boss_exists[33], g_position_created[33]
new cvar_dmg_ap_allow, cvar_ammodamage, cvar_ammo_quantity

public plugin_init()
{
   register_plugin("[ZP] Addon: Oberon Boss", "1.0", "Dias | [P]erfec[T] [S]cr[@]s[H]")
   
   register_event("HLTV", "event_newround", "a", "1=0", "2=0")
   register_touch(OBERON_CLASSNAME, "*", "fw_touch")
   
   register_clcmd("say /get_origin", "get_origin")
   register_clcmd("say /make", "create_oberon")
   register_clcmd("say get_origin", "get_origin")
   register_clcmd("say make", "create_oberon")
   register_clcmd("say .get_origin", "get_origin")
   register_clcmd("say .make", "create_oberon")
   
   cvar_dmg_ap_allow = register_cvar("zp_oberon_dmg_ap_reward_allow", "1")      // Ganhar Ammo Packs Por Dano
   cvar_ammodamage = register_cvar("zp_oberon_dmg_for_reward", "250")       // Dmg Necessario Para Ganhar Ammo Packs
   cvar_ammo_quantity  = register_cvar("zp_oberom_reward_ap_quantity", "2")    // Quantia de Ammo Packs que ira ganhar
}

public plugin_precache()
{
   oberon_model_id = precache_model(oberon_model)
   precache_model(oberon_knife_effect)
   precache_model(oberon_hole_effect)
   precache_model(oberon_bomb_model)
   
   precache_sound(oberon_appear_sound)
   precache_sound(oberon_death_sound)
   precache_sound(oberon_evolution_sound)
   for(new i = 0; i < sizeof(oberon_attack_sound); i++)
   {
      precache_sound(oberon_attack_sound[i])
   }
   precache_sound(oberon_hole_sound)
   precache_sound(oberon_bomb_sound)
   
   m_iBlood[0] = precache_model("sprites/blood.spr")
   m_iBlood[1] = precache_model("sprites/bloodspray.spr")   
   exp_spr_id = precache_model("sprites/zerogxplode.spr")
}

public event_newround()
{
   static ent
   ent = find_ent_by_class(-1, OBERON_CLASSNAME)
   
   if(task_exists(ent+TASK_SKILL)) remove_task(ent+TASK_SKILL)
}

public get_origin(id)
{
   if(get_user_flags(id) & FLAG_ACESS)
   {
      pev(id, pev_origin, g_cur_origin)
      pev(id, pev_angles, g_cur_angles)
      pev(id, pev_v_angle, g_cur_v_angle)
      
      g_position_created[id]++
      
      client_printcolor(id, "!g[ZP Oberon]!y Posicao do Nascimento do Oberon Salva Com Sucesso. Para Invocar digite !t^"say /make^"")
   }
   else
   {
      client_printcolor(id,"!g[ZP Oberon]!y Voce Nao Tem Acesso a esse Comando")
   }
}

public create_oberon(id)
{
   if(get_user_flags(id) & FLAG_ACESS)
   {
   
      if(g_position_created[id] == 0)
      {
         client_printcolor(id, "!g[ZP Oberon]!y Voce Tem que Defenir a Posicao de Nascimento Primeiro !g(Digitando:!t say /get_origin!g)")
         return;
      }
      
      if(g_boss_exists[id] >= 1)
      {
         client_printcolor(id, "!g[ZP Oberon]!y Ja Existe um Oberon no Jogo Nao Pode Criar Mais")
         return;
      }
      
      new ent = create_entity("info_target")
      
      entity_set_origin(ent, g_cur_origin)
      entity_set_vector(ent, EV_VEC_angles, g_cur_angles)
      //entity_set_vector(ent, EV_VEC_v_angle, g_cur_v_angle)
      
      entity_set_float(ent, EV_FL_takedamage, 1.0)
      entity_set_float(ent, EV_FL_health, OBERON_HEALTH + 1000.0)
      
      entity_set_string(ent,EV_SZ_classname, OBERON_CLASSNAME)
      entity_set_model(ent, oberon_model)
      entity_set_int(ent, EV_INT_solid, SOLID_SLIDEBOX)
      entity_set_int(ent, EV_INT_movetype, MOVETYPE_STEP)
      
      new Float:maxs[3] = {100.0, 100.0, 100.0}
      new Float:mins[3] = {-100.0, -100.0, -30.0}
      entity_set_size(ent, mins, maxs)
      entity_set_int(ent, EV_INT_modelindex, oberon_model_id)
      
      set_entity_anim(ent, 1)
      
      set_pev(ent, pev_iuser4, 0)
      
      entity_set_float(ent, EV_FL_nextthink, halflife_time() + 6.0)
      set_task(5.0, "start_oberon", ent)
      g_boss_exists[id]++
      set_task(15.0, "do_random_skill", ent, _, _, "b")
      set_task(5.0, "creditos", id)
      
      set_hudmessage(255, 0, 0, -1.0, 0.17, 1, 0.0, 5.0, 1.0, 1.0, -1)
      show_hudmessage(id, "O Oberon Foi Solto. Fuja ou Se Esconda !!")
      
      if(!g_reg)
      {
         RegisterHamFromEntity(Ham_TakeDamage, ent, "fw_takedmg", 1)
         RegisterHamFromEntity(Ham_Think, ent, "fw_think")
         g_reg = 1
      }   
      
      g_boss_exists[id]++
      g_boss_exists[id]++
      g_evolution = 0
      g_evoluting = 0
      g_doing_other = 0
      
      drop_to_floor(ent)
      emit_sound(ent, CHAN_BODY, oberon_appear_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
   }
   else
   {
      client_printcolor(id, "!g[ZP Oberon]!y Voce Nao Tem Acesso a esse Comando")
   }

}

public start_oberon(ent)
{
   set_entity_anim(ent, 2)
}

public fw_think(ent)
{
   if(!is_valid_ent(ent))
      return HAM_IGNORED
      
   if(pev(ent, pev_iuser4) == 1) // Oberon is dead
      return HAM_IGNORED
      
   if(g_evoluting || g_doing_other)
      return HAM_IGNORED
      
   if(pev(ent, pev_health) - 1000.0 <= 0.0)
   {
      set_pev(ent, pev_iuser4, 1)
      set_entity_anim(ent, 20)
      set_task(15.0, "move_entity", ent)
      entity_set_int(ent, EV_INT_solid, SOLID_NOT)
      entity_set_float(ent, EV_FL_takedamage, 0.0)
      
      emit_sound(ent, CHAN_BODY, oberon_death_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
      
      return HAM_IGNORED
   }
   if((pev(ent, pev_health) - 1000.0 <= OBERON_HEALTH / 2.0) && !g_evolution)
   {
      g_evoluting = 1
      set_entity_anim(ent, 11)
      
      emit_sound(ent, CHAN_BODY, oberon_evolution_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
      set_task(8.0, "set_new_idle", ent)
      
      return HAM_IGNORED
   }   
   
   static victim
   static Float:Origin[3], Float:VicOrigin[3], Float:distance
   
   victim = FindClosesEnemy(ent)
   pev(ent, pev_origin, Origin)
   pev(victim, pev_origin, VicOrigin)
   
   distance = get_distance_f(Origin, VicOrigin)
   
   if(is_user_alive(victim))
   {
      if(distance <= 250.0)
      {
         if(!is_valid_ent(ent))
            return FMRES_IGNORED   
      
         new Float:Ent_Origin[3], Float:Vic_Origin[3]
         
         pev(ent, pev_origin, Ent_Origin)
         pev(victim, pev_origin, Vic_Origin)         
      
         npc_turntotarget(ent, Ent_Origin, victim, Vic_Origin)
         
         static Attack_Type, attack_anim, attack_sound
         Attack_Type = random_num(1, 2)
         
         if(Attack_Type == 1)
         {
            if(g_evolution)
            {
               attack_anim = 14
               attack_sound = 4
            } else {
               attack_anim = 6
               attack_sound = 0
            }
            
            set_entity_anim(ent, attack_anim)
            emit_sound(ent, CHAN_BODY, oberon_attack_sound[attack_sound], 1.0, ATTN_NORM, 0, PITCH_NORM)
            
            set_task(1.0, "do_takedmg", ent)
            
            entity_set_float(ent, EV_FL_nextthink, get_gametime() + 3.0)
         } else {
            if(g_evolution)
            {
               attack_anim = 15
               attack_sound = 5
            } else {
               attack_anim = 7
               attack_sound = 1
            }
               
            set_entity_anim(ent, attack_anim)   
            emit_sound(ent, CHAN_BODY, oberon_attack_sound[attack_sound], 1.0, ATTN_NORM, 0, PITCH_NORM)
            
            set_task(0.5, "do_takedmg", ent)         
            
            entity_set_float(ent, EV_FL_nextthink, get_gametime() + 3.0)
         }
         
      } else {
         static moving_anim
         
         if(g_evolution)
            moving_anim = 13
         else
            moving_anim = 3      
      
         if(pev(ent, pev_sequence) != moving_anim)
         {
            entity_set_float(ent, EV_FL_animtime, get_gametime())
            entity_set_float(ent, EV_FL_framerate, 1.0)
            entity_set_int(ent, EV_INT_sequence, moving_anim)
         }
            
         new Float:Ent_Origin[3], Float:Vic_Origin[3]
         
         pev(ent, pev_origin, Ent_Origin)
         pev(victim, pev_origin, Vic_Origin)
         
         npc_turntotarget(ent, Ent_Origin, victim, Vic_Origin)
         hook_ent(ent, victim, 100.0)
         
         entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.1)
      }
   } else {
      static idle_anim
      
      if(g_evolution)
         idle_anim = 12
      else
         idle_anim = 2
         
      if(pev(ent, pev_sequence) != idle_anim)
      {
         set_entity_anim(ent, idle_anim)
      }   
         
      entity_set_float(ent, EV_FL_nextthink, get_gametime() + 1.0)
   }   
      
   return HAM_HANDLED
}

public do_random_skill(ent)
{
   if(!pev_valid(ent))
      return PLUGIN_HANDLED
      
   if(g_evoluting)
      return PLUGIN_HANDLED
      
   if(pev(ent, pev_health) - 1000.0 <= 0.0)
      return PLUGIN_HANDLED
   
   static random_skill
   random_skill = random_num(0, 100)
   
   g_doing_other = 1
   
   switch(random_skill)
   {
      case 0..37: {
         do_attack3(ent)
         
      }
      case 38..72: {
         do_hole(ent)
      }
      case 73..100: {
         do_bomb(ent)
      }      
   }   
   
   return PLUGIN_CONTINUE
}

public do_bomb(oberon)
{
   g_doing_other = 1
   
   static bomb_anim
   if(g_evolution)
      bomb_anim = 18
   else
      bomb_anim = 9
      
   set_entity_anim(oberon, bomb_anim)
   
   set_task(3.0, "do_skill_bomb", oberon+2015, _, _, "b")
   set_task(10.0, "stop_skill_bomb", oberon)
}

public stop_skill_bomb(oberon)
{
   remove_task(oberon+2015)
   
   static idle_anim
   
   if(g_evolution)
      idle_anim = 12
   else
      idle_anim = 2
      
   set_entity_anim(oberon, idle_anim)
   set_task(2.0, "reset_think", oberon)
}

public do_skill_bomb(oberon)
{
   oberon -= 2015
   static Float:StartOrigin[3], Float:TempOrigin[6][3], Float:VicOrigin[6][3], Float:Random1
   
   pev(oberon, pev_origin, StartOrigin)
   emit_sound(oberon, CHAN_BODY, oberon_bomb_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
   
   // 1st Bomb
   Random1 = random_float(100.0, 500.0)
   VicOrigin[0][0] = StartOrigin[0] + Random1
   VicOrigin[0][1] = StartOrigin[1]
   VicOrigin[0][2] = StartOrigin[2]
   
   TempOrigin[0][0] = VicOrigin[0][0] - (Random1 / 2.0)
   TempOrigin[0][1] = VicOrigin[0][1]
   TempOrigin[0][2] = VicOrigin[0][2] + 500.0
   
   // 2nd Bomb
   Random1 = random_float(100.0, 500.0)
   VicOrigin[1][0] = StartOrigin[0]
   VicOrigin[1][1] = StartOrigin[1] + Random1
   VicOrigin[1][2] = StartOrigin[2]
   
   TempOrigin[1][0] = VicOrigin[1][0]
   TempOrigin[1][1] = VicOrigin[1][1] - (Random1 / 2.0)
   TempOrigin[1][2] = VicOrigin[1][2] + 500.0   
   
   // 3rd Bomb
   Random1 = random_float(100.0, 500.0)
   VicOrigin[2][0] = StartOrigin[0] - Random1
   VicOrigin[2][1] = StartOrigin[1]
   VicOrigin[2][2] = StartOrigin[2]
   
   TempOrigin[2][0] = VicOrigin[2][0] - (Random1 / 2.0)
   TempOrigin[2][1] = VicOrigin[2][1]
   TempOrigin[2][2] = VicOrigin[2][2] + 500.0   
   
   // 4th Bomb
   VicOrigin[3][0] = StartOrigin[0]
   VicOrigin[3][1] = StartOrigin[1] - Random1
   VicOrigin[3][2] = StartOrigin[2]
   
   TempOrigin[3][0] = VicOrigin[3][0]
   TempOrigin[3][1] = VicOrigin[3][1] - (Random1 / 2.0)
   TempOrigin[3][2] = VicOrigin[3][2] + 500.0
   
   // 5th Bomb
   VicOrigin[4][0] = StartOrigin[0] + Random1
   VicOrigin[4][1] = StartOrigin[1] + Random1
   VicOrigin[4][2] = StartOrigin[2]
   
   TempOrigin[4][0] = VicOrigin[4][0] - (Random1 / 2.0)
   TempOrigin[4][1] = VicOrigin[4][1] - (Random1 / 2.0)
   TempOrigin[4][2] = VicOrigin[4][2] + 500.0
   
   // 6th Bomb
   VicOrigin[5][0] = StartOrigin[0] + Random1
   VicOrigin[5][1] = StartOrigin[1] - Random1
   VicOrigin[5][2] = StartOrigin[2]
   
   TempOrigin[5][0] = VicOrigin[5][0] + (Random1 / 2.0)
   TempOrigin[5][1] = VicOrigin[5][1] - (Random1 / 2.0)
   TempOrigin[5][2] = VicOrigin[5][2] + 500.0   
   
   for(new i = 0; i < 6; i++)
   {
      make_bomb(StartOrigin, TempOrigin[i], VicOrigin[i])
   }   
}

public make_bomb(Float:StartOrigin[3], Float:TempOrigin[3], Float:VicOrigin[3])
{
   new ent = create_entity("info_target")
   
   StartOrigin[2] += 20.0
   
   entity_set_origin(ent, StartOrigin)
   
   entity_set_string(ent,EV_SZ_classname, "oberon_bomb")
   entity_set_model(ent, oberon_bomb_model)
   entity_set_int(ent, EV_INT_solid, SOLID_NOT)
   entity_set_int(ent, EV_INT_movetype, MOVETYPE_BOUNCE)
   
   new Float:maxs[3] = {10.0,10.0,10.0}
   new Float:mins[3] = {-10.0,-10.0,-5.0}
   entity_set_size(ent, mins, maxs)
   
   entity_set_float(ent, EV_FL_animtime, get_gametime())
   entity_set_float(ent, EV_FL_framerate, 1.0)   
   entity_set_int(ent, EV_INT_sequence, 0)      
   
   static arg[4], arg2[4]
   
   arg[0] = ent
   arg[1] = floatround(TempOrigin[0])
   arg[2] = floatround(TempOrigin[1])
   arg[3] = floatround(TempOrigin[2])

   arg2[0] = ent
   arg2[1] = floatround(VicOrigin[0])
   arg2[2] = floatround(VicOrigin[1])
   arg2[3] = floatround(VicOrigin[2])   
   
   set_task(0.01, "do_hook_bomb_up", TASK_HOOKINGUP, arg, sizeof(arg), "b")
   set_task(1.0, "do_hook_bomb_down", _, arg2, sizeof(arg2))
   set_task(2.0, "bomb_explode", ent)
}

public bomb_explode(ent)
{
   remove_task(TASK_HOOKINGUP)
   remove_task(TASK_HOOKINGDOWN)
   
   static Float:Origin[3]
   pev(ent, pev_origin, Origin)
   
   message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
   write_byte(TE_EXPLOSION)
   engfunc(EngFunc_WriteCoord, Origin[0])
   engfunc(EngFunc_WriteCoord, Origin[1])
   engfunc(EngFunc_WriteCoord, Origin[2])
   write_short(exp_spr_id)   // sprite index
   write_byte(20)   // scale in 0.1's
   write_byte(30)   // framerate
   write_byte(0)   // flags
   message_end()   
   
   for(new i = 1; i < get_maxplayers(); i++)
   {
      if(is_user_alive(i) && entity_range(i, ent) <= 300.0)
      {
         static Float:Damage
         Damage = random_float(10.0, 30.0)
         
         if(g_evolution)
            Damage *= 5.0
            
         ExecuteHam(Ham_TakeDamage, i, 300, i, Damage, DMG_BLAST)
         hit_screen(i)
      }
   }   
   
   remove_entity(ent)
   remove_entity_name("oberon_bomb")
   
   set_task(1.0, "remove_bomb", ent)
}

public remove_bomb(ent)
{
   remove_entity(ent)
   remove_entity_name("oberon_bomb")
}

public do_hook_bomb_down(arg[4])
{
   remove_task(TASK_HOOKINGUP)
   set_task(0.01, "do_hook_bomb_down2", TASK_HOOKINGDOWN, arg, sizeof(arg), "b")
}

public do_hook_bomb_down2(arg[4])
{
   static ent, Float:VicOrigin[3]
   
   ent = arg[0]
   VicOrigin[0] = float(arg[1])
   VicOrigin[1] = float(arg[2])
   VicOrigin[2] = float(arg[3])   
   
   hook_ent2(ent, VicOrigin, 500.0)
}

public do_hook_bomb_up(arg[4])
{
   static ent, Float:TempOrigin[3]
   
   ent = arg[0]
   TempOrigin[0] = float(arg[1])
   TempOrigin[1] = float(arg[2])
   TempOrigin[2] = float(arg[3])
   
   hook_ent2(ent, TempOrigin, 500.0)
}

public do_hole(oberon)
{
   static hole_anim
   
   if(g_evolution)
      hole_anim = 19
   else
      hole_anim = 10
      
   set_entity_anim(oberon, hole_anim)
   emit_sound(oberon, CHAN_BODY, oberon_hole_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
   
   new ent = create_entity("info_target")
   
   static Float:Origin[3]
   pev(oberon, pev_origin, Origin)
   
   Origin[2] -= 10.0
   
   entity_set_origin(ent, Origin)
   
   entity_set_string(ent,EV_SZ_classname, "hole_hook")
   entity_set_model(ent, oberon_hole_effect)
   entity_set_int(ent, EV_INT_solid, SOLID_NOT)
   entity_set_int(ent, EV_INT_movetype, MOVETYPE_NONE)
   
   new Float:maxs[3] = {1.0,1.0,1.0}
   new Float:mins[3] = {-1.0,-1.0,-1.0}
   entity_set_size(ent, mins, maxs)
   
   entity_set_float(ent, EV_FL_animtime, get_gametime())
   entity_set_float(ent, EV_FL_framerate, 1.0)   
   entity_set_int(ent, EV_INT_sequence, 0)   
   
   set_pev(ent, pev_rendermode, kRenderTransAdd)
   set_pev(ent, pev_renderamt, 255.0)   
   
   drop_to_floor(ent)
   
   for(new i = 0; i < get_maxplayers(); i++)
   {
      if(is_user_alive(i) && entity_range(oberon, i) <= 1000.0)
      {
         static arg[2]
         arg[0] = oberon
         arg[1] = i
         
         set_task(0.01, "do_hook_player", 512512, arg, sizeof(arg), "b")
      }
   }
   
   set_task(5.0, "stop_hook", oberon+2012)   
}

public do_hook_player(arg[2])
{
   static Float:Origin[3], Float:Speed
   pev(arg[0], pev_origin, Origin)
   
   Speed = (1000.0 / entity_range(arg[0], arg[1])) * 75.0
   
   hook_ent2(arg[1], Origin, Speed)
}

public stop_hook(oberon)
{
   oberon -= 2012
   
   static ent
   ent = find_ent_by_class(-1, "hole_hook")
   
   remove_entity(ent)
   remove_task(512512)
   
   do_takedmg(oberon)
   set_task(1.0, "reset_think", oberon)
}

public do_attack3(ent)
{
   static attack3_anim, attack3_sound
   
   if(g_evolution)
   {
      attack3_anim = 16
      attack3_sound = 6
   } else {
      attack3_anim = 8
      attack3_sound = 2
   }   
   
   g_attacking3 = 1
   
   set_entity_anim(ent, attack3_anim)
   
   emit_sound(ent, CHAN_BODY, oberon_attack_sound[attack3_sound], 1.0, ATTN_NORM, 0, PITCH_NORM)
   set_task(0.1, "attack3_jump", ent)
}

public attack3_jump(ent)
{
   set_task(0.01, "hookingup", ent+TASK_HOOKINGUP, _, _, "b")
   set_task(1.0, "hookingdown", ent+TASK_HOOKINGDOWN)   
   
   static Enemy
   Enemy = FindClosesEnemy(ent)   
   
   pev(Enemy, pev_origin, g_attacking3_origin)
}

public hookingup(ent)
{
   ent -= TASK_HOOKINGUP
   
   static Float:Origin[3]
   pev(ent, pev_origin, Origin)
   
   Origin[2] += 1000.0
   
   hook_ent2(ent, Origin, 1000.0)
   
   static Enemy
   Enemy = FindClosesEnemy(ent)   
   
   new Float:Ent_Origin[3], Float:Vic_Origin[3]
   
   pev(ent, pev_origin, Ent_Origin)
   pev(Enemy, pev_origin, Vic_Origin)
   
   npc_turntotarget(ent, Ent_Origin, Enemy, Vic_Origin)   
}

public hookingdown(ent)
{
   ent -= TASK_HOOKINGDOWN
   
   remove_task(ent+TASK_HOOKINGUP)
   set_task(0.5, "set_func1", ent)
   
   set_task(0.01, "hookingdown2", ent+TASK_HOOKINGDOWN, _, _, "b")
}

public set_func1(ent)
{
   set_pev(ent, pev_iuser3, 1)
}

public hookingdown2(ent)
{
   ent -= TASK_HOOKINGDOWN
   
   static Enemy
   Enemy = FindClosesEnemy(ent)
   
   hook_ent2(ent, g_attacking3_origin, 1000.0)
   
   new Float:Ent_Origin[3], Float:Vic_Origin[3]
   
   pev(ent, pev_origin, Ent_Origin)
   pev(Enemy, pev_origin, Vic_Origin)
   
   npc_turntotarget(ent, Ent_Origin, Enemy, Vic_Origin)      
}

public fw_touch(ent, touch)
{
   if(!pev_valid(ent))
      return FMRES_IGNORED
      
   if(g_attacking3 && pev(ent, pev_iuser3) == 1)
   {
      remove_task(ent+TASK_HOOKINGDOWN)
      
      if(is_user_alive(touch))
         user_kill(touch)
         
      g_attacking3 = 0
      set_pev(ent, pev_iuser3, 0)
      
      set_task(0.75, "reset_think", ent)
      
      for(new i = 1; i < get_maxplayers(); i++)
      {
         if(is_user_alive(i) && entity_range(ent, i) <= 300.0)
         {
            hit_screen(i)
            
            static Float:Damage
            Damage = random_float(10.0, 25.0)
            
            if(g_evolution)
               Damage *= 1.5
            
            ExecuteHam(Ham_TakeDamage, i, 0, i, Damage, DMG_BLAST)
         }
      }   
      
      static attack3_sound
      if(g_evolution)
         attack3_sound = 7
      else
         attack3_sound = 3
      
      emit_sound(ent, CHAN_BODY, oberon_attack_sound[attack3_sound], 1.0, ATTN_NORM, 0, PITCH_NORM)      
         
      drop_to_floor(ent)
   }
      
   return FMRES_HANDLED
}

public do_takedmg(ent2)
{
   if(g_evolution)
   {
      new ent = create_entity("info_target")
   
      static Float:Origin[3], Float:Angles[3]
      pev(ent2, pev_origin, Origin)
      pev(ent2, pev_angles, Angles)
      
      entity_set_origin(ent, Origin)
      entity_set_vector(ent, EV_VEC_angles, Angles)
      
      entity_set_string(ent,EV_SZ_classname, "knife_effect")
      entity_set_model(ent, oberon_knife_effect)
      entity_set_int(ent, EV_INT_solid, SOLID_NOT)
      entity_set_int(ent, EV_INT_movetype, MOVETYPE_NONE)
      
      new Float:maxs[3] = {40.0, 40.0, 1.0}
      new Float:mins[3] = {-40.0, -40.0, -1.0}
      entity_set_size(ent, mins, maxs)
      
      drop_to_floor(ent)
      
      set_task(1.0, "remove_knife_effect", ent)
   }
   
   for(new i = 1; i < get_maxplayers(); i++)
   {
      if(is_user_alive(i) && entity_range(ent2, i) <= 300.0)
      {
         hit_screen(i)
         
         static Float:Damage
         Damage = random_float(7.5, 15.0)
         
         if(g_evolution)
            Damage *= 2.0
         
         ExecuteHam(Ham_TakeDamage, i, 0, i, Damage, DMG_BLAST)
      }
   }   
}

public remove_knife_effect(ent)
{
   remove_entity(ent)
}

public set_new_idle(ent)
{
   g_evoluting = 0
   g_evolution = 1
   set_entity_anim(ent, 12)
   
   entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.1)
}

public move_entity(ent)
{
   static Float:Origin[3]
   
   Origin[0] = 4290.0
   Origin[1] = 4290.0
   Origin[2] = 4290.0
   
   set_pev(ent, pev_origin, Origin)
   entity_set_float(ent, EV_FL_nextthink, halflife_time() + 99999999.0)
}

public fw_takedmg(victim, inflictor, attacker, Float:damage, damagebits)
{
   static Float:Origin[3]
   fm_get_aimorigin(attacker, Origin)
   
   client_print(attacker, print_center, "Vida do Oberon: %i", floatround(pev(victim, pev_health) - 1000.0))
   
   create_blood(Origin)
   
   if(get_pcvar_num(cvar_dmg_ap_allow))
   {
      // Store damage dealt
      g_damagedealt[attacker] += floatround(damage)
         
      // Reward ammo packs for every [ammo damage] dealt
      while (g_damagedealt[attacker] > get_pcvar_num(cvar_ammodamage))
      {
         g_damagedealt[attacker] -= get_pcvar_num(cvar_ammodamage)
         zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + get_pcvar_num(cvar_ammo_quantity))
      }
   }
}

stock set_entity_anim(ent, anim)
{
   entity_set_float(ent, EV_FL_animtime, get_gametime())
   entity_set_float(ent, EV_FL_framerate, 1.0)
   entity_set_int(ent, EV_INT_sequence, anim)   
}

stock create_blood(const Float:origin[3])
{
   // Show some blood :)
   message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
   write_byte(TE_BLOODSPRITE)
   engfunc(EngFunc_WriteCoord, origin[0])
   engfunc(EngFunc_WriteCoord, origin[1])
   engfunc(EngFunc_WriteCoord, origin[2])
   write_short(m_iBlood[1])
   write_short(m_iBlood[0])
   write_byte(75)
   write_byte(5)
   message_end()
}

stock fm_get_aimorigin(index, Float:origin[3])
{
   new Float:start[3], Float:view_ofs[3];
   pev(index, pev_origin, start);
   pev(index, pev_view_ofs, view_ofs);
   xs_vec_add(start, view_ofs, start);
   
   new Float:dest[3];
   pev(index, pev_v_angle, dest);
   engfunc(EngFunc_MakeVectors, dest);
   global_get(glb_v_forward, dest);
   xs_vec_mul_scalar(dest, 9999.0, dest);
   xs_vec_add(start, dest, dest);
   
   engfunc(EngFunc_TraceLine, start, dest, 0, index, 0);
   get_tr2(0, TR_vecEndPos, origin);
   
   return 1;
}  

public FindClosesEnemy(entid)
{
   new Float:Dist
   new Float:maxdistance=4000.0
   new indexid=0   
   for(new i=1;i<=get_maxplayers();i++){
      if(is_user_alive(i) && is_valid_ent(i) && can_see_fm(entid, i))
      {
         Dist = entity_range(entid, i)
         if(Dist <= maxdistance)
         {
            maxdistance=Dist
            indexid=i
            
            return indexid
         }
      }   
   }   
   return 0
}

public npc_turntotarget(ent, Float:Ent_Origin[3], target, Float:Vic_Origin[3])
{
   if(target)
   {
      new Float:newAngle[3]
      entity_get_vector(ent, EV_VEC_angles, newAngle)
      new Float:x = Vic_Origin[0] - Ent_Origin[0]
      new Float:z = Vic_Origin[1] - Ent_Origin[1]

      new Float:radians = floatatan(z/x, radian)
      newAngle[1] = radians * (180 / 3.14)
      if (Vic_Origin[0] < Ent_Origin[0])
         newAngle[1] -= 180.0
        
      entity_set_vector(ent, EV_VEC_angles, newAngle)
   }
}

public bool:can_see_fm(entindex1, entindex2)
{
   if (!entindex1 || !entindex2)
      return false

   if (pev_valid(entindex1) && pev_valid(entindex1))
   {
      new flags = pev(entindex1, pev_flags)
      if (flags & EF_NODRAW || flags & FL_NOTARGET)
      {
         return false
      }

      new Float:lookerOrig[3]
      new Float:targetBaseOrig[3]
      new Float:targetOrig[3]
      new Float:temp[3]

      pev(entindex1, pev_origin, lookerOrig)
      pev(entindex1, pev_view_ofs, temp)
      lookerOrig[0] += temp[0]
      lookerOrig[1] += temp[1]
      lookerOrig[2] += temp[2]

      pev(entindex2, pev_origin, targetBaseOrig)
      pev(entindex2, pev_view_ofs, temp)
      targetOrig[0] = targetBaseOrig [0] + temp[0]
      targetOrig[1] = targetBaseOrig [1] + temp[1]
      targetOrig[2] = targetBaseOrig [2] + temp[2]

      engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) //  checks the had of seen player
      if (get_tr2(0, TraceResult:TR_InOpen) && get_tr2(0, TraceResult:TR_InWater))
      {
         return false
      }
      else
      {
         new Float:flFraction
         get_tr2(0, TraceResult:TR_flFraction, flFraction)
         if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
         {
            return true
         }
         else
         {
            targetOrig[0] = targetBaseOrig [0]
            targetOrig[1] = targetBaseOrig [1]
            targetOrig[2] = targetBaseOrig [2]
            engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) //  checks the body of seen player
            get_tr2(0, TraceResult:TR_flFraction, flFraction)
            if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
            {
               return true
            }
            else
            {
               targetOrig[0] = targetBaseOrig [0]
               targetOrig[1] = targetBaseOrig [1]
               targetOrig[2] = targetBaseOrig [2] - 17.0
               engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) //  checks the legs of seen player
               get_tr2(0, TraceResult:TR_flFraction, flFraction)
               if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
               {
                  return true
               }
            }
         }
      }
   }
   return false
}

public hook_ent(ent, victim, Float:speed)
{
   static Float:fl_Velocity[3]
   static Float:VicOrigin[3], Float:EntOrigin[3]

   pev(ent, pev_origin, EntOrigin)
   pev(victim, pev_origin, VicOrigin)
   
   static Float:distance_f
   distance_f = get_distance_f(EntOrigin, VicOrigin)

   if (distance_f > 60.0)
   {
      new Float:fl_Time = distance_f / speed

      fl_Velocity[0] = (VicOrigin[0] - EntOrigin[0]) / fl_Time
      fl_Velocity[1] = (VicOrigin[1] - EntOrigin[1]) / fl_Time
      fl_Velocity[2] = (VicOrigin[2] - EntOrigin[2]) / fl_Time
   } else
   {
      fl_Velocity[0] = 0.0
      fl_Velocity[1] = 0.0
      fl_Velocity[2] = 0.0
   }

   entity_set_vector(ent, EV_VEC_velocity, fl_Velocity)
}

public hook_ent2(ent, Float:VicOrigin[3], Float:speed)
{
   static Float:fl_Velocity[3]
   static Float:EntOrigin[3]

   pev(ent, pev_origin, EntOrigin)
   
   static Float:distance_f
   distance_f = get_distance_f(EntOrigin, VicOrigin)

   if (distance_f > 60.0)
   {
      new Float:fl_Time = distance_f / speed

      fl_Velocity[0] = (VicOrigin[0] - EntOrigin[0]) / fl_Time
      fl_Velocity[1] = (VicOrigin[1] - EntOrigin[1]) / fl_Time
      fl_Velocity[2] = (VicOrigin[2] - EntOrigin[2]) / fl_Time
   } else
   {
      fl_Velocity[0] = 0.0
      fl_Velocity[1] = 0.0
      fl_Velocity[2] = 0.0
   }

   entity_set_vector(ent, EV_VEC_velocity, fl_Velocity)
}

public hit_screen(id)
{
   message_begin(MSG_ONE, get_user_msgid("ScreenShake"),{0,0,0}, id)
   write_short(1<<14)
   write_short(1<<13)
   write_short(1<<13)
   message_end()   
}

public reset_think(ent)
{
   g_doing_other = 0
   entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.1)
}

public creditos(id)
{
   set_hudmessage(0, 255, 255, -1.0, 0.89, 1, 0.0, 5.0, 1.0, 1.0, -1)
   show_hudmessage(id, "Plugin de Boss Editado Por: [P]erfec[T] [S]cr[@]s[H]")
}
   

stock client_printcolor(const id, const input[], any:...)
{
        new count = 1, players[32]
        static msg[191]
        vformat(msg, 190, input, 3)

        replace_all(msg, 190, "!g", "^4")  // Chat Verde
        replace_all(msg, 190, "!y", "^1")  // Chat Normal
        replace_all(msg, 190, "!t", "^3")  // Chat Do Time Tr=Vermelho Ct=Azul Spec=Branco

        if (id) players[0] = id; else get_players(players, count, "ch")
        {
                for (new i = 0; i < count; i++)
                {
                        if (is_user_connected(players[i]))
                        {
                                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
                                write_byte(players[i]);
                                write_string(msg);
                                message_end();
                        }
                }
        }
}

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
Quando ele se move, não se meche só faz o movimento das pernas e depois aparece na minha frente, é só aqui ou é assim mesmo?

Obs: ele não se move igual esse:

Pelo menos aqui Zplague9

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
 ><

esse e o meu ele e diferente desse. Esse e o video que fizeram do meu server quando soltei ele.

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
Video antigo ou vc boto coisas novas ?

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
Scripter fico feliz de ver um plugin legal desse, mais poderia adicionar 1 comando que remove o boss?

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
responde scripter

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
hackingzm escreveu:
responde scripter
@Cuidado com double post.

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
Testa ai: O comando é say /remove_oberon

Código:

#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include < xs >
#include <zombieplague>

#define OBERON_CLASSNAME "oberon"

// Flag De Acesso (Atualmente ta na flag F)
#define FLAG_ACESS                   ADMIN_LEVEL_F

#define OBERON_HEALTH                  15000.0
#define MONEY_DMG                  1000.0
#define MONEY_REWARD                  1000
#define CLASS_NAME                  "npc_oberon"
#define CLASS_TIP                  "Oberon Boss"
#define OBERON_ATTACK_WAITIME                3.0

#define TASK_SKILL 123123123
#define TASK_HOOKINGUP 123312312
#define TASK_HOOKINGDOWN 123312313

new const oberon_model[] = "models/oberon/zbs_bossl_big02.mdl"
new const oberon_knife_effect[] = "models/oberon/ef_knife.mdl"
new const oberon_hole_effect[] = "models/oberon/ef_hole.mdl"
new const oberon_bomb_model[] = "models/oberon/zbs_bossl_big02_bomb.mdl"

new const oberon_appear_sound[] = "oberon/appear.wav"
new const oberon_death_sound[] = "oberon/death.wav"
new const oberon_evolution_sound[] = "oberon/knife.wav"
new const oberon_attack_sound[8][] =
{
   "oberon/attack1.wav",
   "oberon/attack2.wav",
   "oberon/attack3_jump.wav",
   "oberon/attack3.wav",
   "oberon/knife_attack1.wav",
   "oberon/knife_attack2.wav",
   "oberon/knife_attack3_jump.wav",
   "oberon/knife_attack3.wav"
}
new const oberon_hole_sound[] = "oberon/hole.wav"
new const oberon_bomb_sound[] = "oberon/attack_bomb.wav"

new oberon_model_id, g_reg, m_iBlood[2], exp_spr_id
new Float:g_cur_origin[3], Float:g_cur_angles[3], Float:g_cur_v_angle[3]
new g_evolution, g_evoluting, g_doing_other, g_attacking3, Float:g_attacking3_origin[3], g_damagedealt[33] , g_boss_exists[33], g_position_created[33]
new cvar_dmg_ap_allow, cvar_ammodamage, cvar_ammo_quantity

public plugin_init()
{
   register_plugin("[ZP] Addon: Oberon Boss", "1.0", "Dias | [P]erfec[T] [S]cr[@]s[H]")
   
   register_event("HLTV", "event_newround", "a", "1=0", "2=0")
   register_touch(OBERON_CLASSNAME, "*", "fw_touch")
   
   register_clcmd("say /get_origin", "get_origin")
   register_clcmd("say /make", "create_oberon")
   register_clcmd("say get_origin", "get_origin")
   register_clcmd("say make", "create_oberon")
   register_clcmd("say .get_origin", "get_origin")
   register_clcmd("say .make", "create_oberon")
   register_clcmd("say /remove_oberon", "remove_oberon")
   register_clcmd("say remove_oberon", "remove_oberon")
   register_clcmd("say .remove_oberon", "remove_oberon")
   
   cvar_dmg_ap_allow = register_cvar("zp_oberon_dmg_ap_reward_allow", "1")      // Ganhar Ammo Packs Por Dano
   cvar_ammodamage = register_cvar("zp_oberon_dmg_for_reward", "250")       // Dmg Necessario Para Ganhar Ammo Packs
   cvar_ammo_quantity  = register_cvar("zp_oberon_reward_ap_quantity", "2")    // Quantia de Ammo Packs que ira ganhar
}

public plugin_precache()
{
   oberon_model_id = precache_model(oberon_model)
   precache_model(oberon_knife_effect)
   precache_model(oberon_hole_effect)
   precache_model(oberon_bomb_model)
   
   precache_sound(oberon_appear_sound)
   precache_sound(oberon_death_sound)
   precache_sound(oberon_evolution_sound)
   for(new i = 0; i < sizeof(oberon_attack_sound); i++)
   {
      precache_sound(oberon_attack_sound[i])
   }
   precache_sound(oberon_hole_sound)
   precache_sound(oberon_bomb_sound)
   
   m_iBlood[0] = precache_model("sprites/blood.spr")
   m_iBlood[1] = precache_model("sprites/bloodspray.spr")   
   exp_spr_id = precache_model("sprites/zerogxplode.spr")
}

public event_newround()
{
   static ent
   ent = find_ent_by_class(-1, OBERON_CLASSNAME)
   
   if(task_exists(ent+TASK_SKILL)) remove_task(ent+TASK_SKILL)
}

public get_origin(id)
{
   if(get_user_flags(id) & FLAG_ACESS)
   {
      pev(id, pev_origin, g_cur_origin)
      pev(id, pev_angles, g_cur_angles)
      pev(id, pev_v_angle, g_cur_v_angle)
      
      g_position_created[id]++
      
      client_printcolor(id, "!g[ZP Oberon]!y Posicao do Nascimento do Oberon Salva Com Sucesso. Para Invocar digite !t^"say /make^"")
   }
   else
   {
      client_printcolor(id,"!g[ZP Oberon]!y Voce Nao Tem Acesso a esse Comando")
   }
}

public create_oberon(id)
{
   if(get_user_flags(id) & FLAG_ACESS)
   {
   
      if(g_position_created[id] == 0)
      {
         client_printcolor(id, "!g[ZP Oberon]!y Voce Tem que Defenir a Posicao de Nascimento Primeiro !g(Digitando:!t say /get_origin!g)")
         return;
      }
      
      if(g_boss_exists[id] >= 1)
      {
         client_printcolor(id, "!g[ZP Oberon]!y Ja Existe um Oberon no Jogo Nao Pode Criar Mais")
         return;
      }
      
      new ent = create_entity("info_target")
      
      entity_set_origin(ent, g_cur_origin)
      entity_set_vector(ent, EV_VEC_angles, g_cur_angles)
      //entity_set_vector(ent, EV_VEC_v_angle, g_cur_v_angle)
      
      entity_set_float(ent, EV_FL_takedamage, 1.0)
      entity_set_float(ent, EV_FL_health, OBERON_HEALTH + 1000.0)
      
      entity_set_string(ent,EV_SZ_classname, OBERON_CLASSNAME)
      entity_set_model(ent, oberon_model)
      entity_set_int(ent, EV_INT_solid, SOLID_SLIDEBOX)
      entity_set_int(ent, EV_INT_movetype, MOVETYPE_STEP)
      
      new Float:maxs[3] = {100.0, 100.0, 100.0}
      new Float:mins[3] = {-100.0, -100.0, -30.0}
      entity_set_size(ent, mins, maxs)
      entity_set_int(ent, EV_INT_modelindex, oberon_model_id)
      
      set_entity_anim(ent, 1)
      
      set_pev(ent, pev_iuser4, 0)
      
      entity_set_float(ent, EV_FL_nextthink, halflife_time() + 6.0)
      set_task(5.0, "start_oberon", ent)
      set_task(15.0, "do_random_skill", ent, _, _, "b")
      set_task(5.0, "creditos", id)
      
      set_hudmessage(255, 0, 0, -1.0, 0.17, 1, 0.0, 5.0, 1.0, 1.0, -1)
      show_hudmessage(id, "O Oberon Foi Solto. Fuja ou Se Esconda !!")
      
      if(!g_reg)
      {
         RegisterHamFromEntity(Ham_TakeDamage, ent, "fw_takedmg", 1)
         RegisterHamFromEntity(Ham_Think, ent, "fw_think")
         g_reg = 1
      }   
      
      g_boss_exists[id]++
      g_evolution = 0
      g_evoluting = 0
      g_doing_other = 0
      
      drop_to_floor(ent)
      emit_sound(ent, CHAN_BODY, oberon_appear_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
   }
   else
   {
      client_printcolor(id, "!g[ZP Oberon]!y Voce Nao Tem Acesso a esse Comando")
   }

}

public remove_oberon(id)
{
   if(get_user_flags(id) & FLAG_ACESS)
   {
      remove_entity(id)
      remove_entity_name(OBERON_CLASSNAME)
      client_printcolor(id, "!g[ZP Oberon]!y Oberon Removido com Sucesso")
      g_boss_exists[id] = 0
   }
   else
   {
      client_printcolor(id, "!g[ZP Oberon]!y Voce Nao Tem Acesso a esse Comando")
   }
}

public start_oberon(ent)
{
   set_entity_anim(ent, 2)
}

public fw_think(ent, attacker)
{
   if(!is_valid_ent(ent))
      return HAM_IGNORED
      
   if(pev(ent, pev_iuser4) == 1) // Oberon is dead
      return HAM_IGNORED
      
   if(g_evoluting || g_doing_other)
      return HAM_IGNORED
      
   if(pev(ent, pev_health) - 1000.0 <= 0.0)
   {
      set_pev(ent, pev_iuser4, 1)
      set_entity_anim(ent, 20)
      set_task(15.0, "move_entity", ent)
      entity_set_int(ent, EV_INT_solid, SOLID_NOT)
      entity_set_float(ent, EV_FL_takedamage, 0.0)
      
      emit_sound(ent, CHAN_BODY, oberon_death_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
   
      return HAM_IGNORED
   }
   if((pev(ent, pev_health) - 1000.0 <= OBERON_HEALTH / 2.0) && !g_evolution)
   {
      g_evoluting = 1
      set_entity_anim(ent, 11)
      
      emit_sound(ent, CHAN_BODY, oberon_evolution_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
      set_task(8.0, "set_new_idle", ent)
      
      return HAM_IGNORED
   }   
   
   static victim
   static Float:Origin[3], Float:VicOrigin[3], Float:distance
   
   victim = FindClosesEnemy(ent)
   pev(ent, pev_origin, Origin)
   pev(victim, pev_origin, VicOrigin)
   
   distance = get_distance_f(Origin, VicOrigin)
   
   if(is_user_alive(victim))
   {
      if(distance <= 250.0)
      {
         if(!is_valid_ent(ent))
            return FMRES_IGNORED   
      
         new Float:Ent_Origin[3], Float:Vic_Origin[3]
         
         pev(ent, pev_origin, Ent_Origin)
         pev(victim, pev_origin, Vic_Origin)         
      
         npc_turntotarget(ent, Ent_Origin, victim, Vic_Origin)
         
         static Attack_Type, attack_anim, attack_sound
         Attack_Type = random_num(1, 2)
         
         if(Attack_Type == 1)
         {
            if(g_evolution)
            {
               attack_anim = 14
               attack_sound = 4
            } else {
               attack_anim = 6
               attack_sound = 0
            }
            
            set_entity_anim(ent, attack_anim)
            emit_sound(ent, CHAN_BODY, oberon_attack_sound[attack_sound], 1.0, ATTN_NORM, 0, PITCH_NORM)
            
            set_task(1.0, "do_takedmg", ent)
            
            entity_set_float(ent, EV_FL_nextthink, get_gametime() + 3.0)
         } else {
            if(g_evolution)
            {
               attack_anim = 15
               attack_sound = 5
            } else {
               attack_anim = 7
               attack_sound = 1
            }
               
            set_entity_anim(ent, attack_anim)   
            emit_sound(ent, CHAN_BODY, oberon_attack_sound[attack_sound], 1.0, ATTN_NORM, 0, PITCH_NORM)
            
            set_task(0.5, "do_takedmg", ent)         
            
            entity_set_float(ent, EV_FL_nextthink, get_gametime() + 3.0)
         }
         
      } else {
         static moving_anim
         
         if(g_evolution)
            moving_anim = 13
         else
            moving_anim = 3      
      
         if(pev(ent, pev_sequence) != moving_anim)
         {
            entity_set_float(ent, EV_FL_animtime, get_gametime())
            entity_set_float(ent, EV_FL_framerate, 1.0)
            entity_set_int(ent, EV_INT_sequence, moving_anim)
         }
            
         new Float:Ent_Origin[3], Float:Vic_Origin[3]
         
         pev(ent, pev_origin, Ent_Origin)
         pev(victim, pev_origin, Vic_Origin)
         
         npc_turntotarget(ent, Ent_Origin, victim, Vic_Origin)
         hook_ent(ent, victim, 100.0)
         
         entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.1)
      }
   } else {
      static idle_anim
      
      if(g_evolution)
         idle_anim = 12
      else
         idle_anim = 2
         
      if(pev(ent, pev_sequence) != idle_anim)
      {
         set_entity_anim(ent, idle_anim)
      }   
         
      entity_set_float(ent, EV_FL_nextthink, get_gametime() + 1.0)
   }   
      
   return HAM_HANDLED
}

public do_random_skill(ent)
{
   if(!pev_valid(ent))
      return PLUGIN_HANDLED
      
   if(g_evoluting)
      return PLUGIN_HANDLED
      
   if(pev(ent, pev_health) - 1000.0 <= 0.0)
      return PLUGIN_HANDLED
   
   static random_skill
   random_skill = random_num(0, 100)
   
   g_doing_other = 1
   
   switch(random_skill)
   {
      case 0..37: {
         do_attack3(ent)
         
      }
      case 38..72: {
         do_hole(ent)
      }
      case 73..100: {
         do_bomb(ent)
      }      
   }   
   
   return PLUGIN_CONTINUE
}

public do_bomb(oberon)
{
   g_doing_other = 1
   
   static bomb_anim
   if(g_evolution)
      bomb_anim = 18
   else
      bomb_anim = 9
      
   set_entity_anim(oberon, bomb_anim)
   
   set_task(3.0, "do_skill_bomb", oberon+2015, _, _, "b")
   set_task(10.0, "stop_skill_bomb", oberon)
}

public stop_skill_bomb(oberon)
{
   remove_task(oberon+2015)
   
   static idle_anim
   
   if(g_evolution)
      idle_anim = 12
   else
      idle_anim = 2
      
   set_entity_anim(oberon, idle_anim)
   set_task(2.0, "reset_think", oberon)
}

public do_skill_bomb(oberon)
{
   oberon -= 2015
   static Float:StartOrigin[3], Float:TempOrigin[6][3], Float:VicOrigin[6][3], Float:Random1
   
   pev(oberon, pev_origin, StartOrigin)
   emit_sound(oberon, CHAN_BODY, oberon_bomb_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
   
   // 1st Bomb
   Random1 = random_float(100.0, 500.0)
   VicOrigin[0][0] = StartOrigin[0] + Random1
   VicOrigin[0][1] = StartOrigin[1]
   VicOrigin[0][2] = StartOrigin[2]
   
   TempOrigin[0][0] = VicOrigin[0][0] - (Random1 / 2.0)
   TempOrigin[0][1] = VicOrigin[0][1]
   TempOrigin[0][2] = VicOrigin[0][2] + 500.0
   
   // 2nd Bomb
   Random1 = random_float(100.0, 500.0)
   VicOrigin[1][0] = StartOrigin[0]
   VicOrigin[1][1] = StartOrigin[1] + Random1
   VicOrigin[1][2] = StartOrigin[2]
   
   TempOrigin[1][0] = VicOrigin[1][0]
   TempOrigin[1][1] = VicOrigin[1][1] - (Random1 / 2.0)
   TempOrigin[1][2] = VicOrigin[1][2] + 500.0   
   
   // 3rd Bomb
   Random1 = random_float(100.0, 500.0)
   VicOrigin[2][0] = StartOrigin[0] - Random1
   VicOrigin[2][1] = StartOrigin[1]
   VicOrigin[2][2] = StartOrigin[2]
   
   TempOrigin[2][0] = VicOrigin[2][0] - (Random1 / 2.0)
   TempOrigin[2][1] = VicOrigin[2][1]
   TempOrigin[2][2] = VicOrigin[2][2] + 500.0   
   
   // 4th Bomb
   VicOrigin[3][0] = StartOrigin[0]
   VicOrigin[3][1] = StartOrigin[1] - Random1
   VicOrigin[3][2] = StartOrigin[2]
   
   TempOrigin[3][0] = VicOrigin[3][0]
   TempOrigin[3][1] = VicOrigin[3][1] - (Random1 / 2.0)
   TempOrigin[3][2] = VicOrigin[3][2] + 500.0
   
   // 5th Bomb
   VicOrigin[4][0] = StartOrigin[0] + Random1
   VicOrigin[4][1] = StartOrigin[1] + Random1
   VicOrigin[4][2] = StartOrigin[2]
   
   TempOrigin[4][0] = VicOrigin[4][0] - (Random1 / 2.0)
   TempOrigin[4][1] = VicOrigin[4][1] - (Random1 / 2.0)
   TempOrigin[4][2] = VicOrigin[4][2] + 500.0
   
   // 6th Bomb
   VicOrigin[5][0] = StartOrigin[0] + Random1
   VicOrigin[5][1] = StartOrigin[1] - Random1
   VicOrigin[5][2] = StartOrigin[2]
   
   TempOrigin[5][0] = VicOrigin[5][0] + (Random1 / 2.0)
   TempOrigin[5][1] = VicOrigin[5][1] - (Random1 / 2.0)
   TempOrigin[5][2] = VicOrigin[5][2] + 500.0   
   
   for(new i = 0; i < 6; i++)
   {
      make_bomb(StartOrigin, TempOrigin[i], VicOrigin[i])
   }   
}

public make_bomb(Float:StartOrigin[3], Float:TempOrigin[3], Float:VicOrigin[3])
{
   new ent = create_entity("info_target")
   
   StartOrigin[2] += 20.0
   
   entity_set_origin(ent, StartOrigin)
   
   entity_set_string(ent,EV_SZ_classname, "oberon_bomb")
   entity_set_model(ent, oberon_bomb_model)
   entity_set_int(ent, EV_INT_solid, SOLID_NOT)
   entity_set_int(ent, EV_INT_movetype, MOVETYPE_BOUNCE)
   
   new Float:maxs[3] = {10.0,10.0,10.0}
   new Float:mins[3] = {-10.0,-10.0,-5.0}
   entity_set_size(ent, mins, maxs)
   
   entity_set_float(ent, EV_FL_animtime, get_gametime())
   entity_set_float(ent, EV_FL_framerate, 1.0)   
   entity_set_int(ent, EV_INT_sequence, 0)      
   
   static arg[4], arg2[4]
   
   arg[0] = ent
   arg[1] = floatround(TempOrigin[0])
   arg[2] = floatround(TempOrigin[1])
   arg[3] = floatround(TempOrigin[2])

   arg2[0] = ent
   arg2[1] = floatround(VicOrigin[0])
   arg2[2] = floatround(VicOrigin[1])
   arg2[3] = floatround(VicOrigin[2])   
   
   set_task(0.01, "do_hook_bomb_up", TASK_HOOKINGUP, arg, sizeof(arg), "b")
   set_task(1.0, "do_hook_bomb_down", _, arg2, sizeof(arg2))
   set_task(2.0, "bomb_explode", ent)
}

public bomb_explode(ent)
{
   remove_task(TASK_HOOKINGUP)
   remove_task(TASK_HOOKINGDOWN)
   
   static Float:Origin[3]
   pev(ent, pev_origin, Origin)
   
   message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
   write_byte(TE_EXPLOSION)
   engfunc(EngFunc_WriteCoord, Origin[0])
   engfunc(EngFunc_WriteCoord, Origin[1])
   engfunc(EngFunc_WriteCoord, Origin[2])
   write_short(exp_spr_id)   // sprite index
   write_byte(20)   // scale in 0.1's
   write_byte(30)   // framerate
   write_byte(0)   // flags
   message_end()   
   
   for(new i = 1; i < get_maxplayers(); i++)
   {
      if(is_user_alive(i) && entity_range(i, ent) <= 300.0)
      {
         static Float:Damage
         Damage = random_float(10.0, 30.0)
         
         if(g_evolution)
            Damage *= 5.0
            
         ExecuteHam(Ham_TakeDamage, i, 300, i, Damage, DMG_BLAST)
         hit_screen(i)
      }
   }   
   
   remove_entity(ent)
   remove_entity_name("oberon_bomb")
   
   set_task(1.0, "remove_bomb", ent)
}

public remove_bomb(ent)
{
   remove_entity(ent)
   remove_entity_name("oberon_bomb")
}

public do_hook_bomb_down(arg[4])
{
   remove_task(TASK_HOOKINGUP)
   set_task(0.01, "do_hook_bomb_down2", TASK_HOOKINGDOWN, arg, sizeof(arg), "b")
}

public do_hook_bomb_down2(arg[4])
{
   static ent, Float:VicOrigin[3]
   
   ent = arg[0]
   VicOrigin[0] = float(arg[1])
   VicOrigin[1] = float(arg[2])
   VicOrigin[2] = float(arg[3])   
   
   hook_ent2(ent, VicOrigin, 500.0)
}

public do_hook_bomb_up(arg[4])
{
   static ent, Float:TempOrigin[3]
   
   ent = arg[0]
   TempOrigin[0] = float(arg[1])
   TempOrigin[1] = float(arg[2])
   TempOrigin[2] = float(arg[3])
   
   hook_ent2(ent, TempOrigin, 500.0)
}

public do_hole(oberon)
{
   static hole_anim
   
   if(g_evolution)
      hole_anim = 19
   else
      hole_anim = 10
      
   set_entity_anim(oberon, hole_anim)
   emit_sound(oberon, CHAN_BODY, oberon_hole_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
   
   new ent = create_entity("info_target")
   
   static Float:Origin[3]
   pev(oberon, pev_origin, Origin)
   
   Origin[2] -= 10.0
   
   entity_set_origin(ent, Origin)
   
   entity_set_string(ent,EV_SZ_classname, "hole_hook")
   entity_set_model(ent, oberon_hole_effect)
   entity_set_int(ent, EV_INT_solid, SOLID_NOT)
   entity_set_int(ent, EV_INT_movetype, MOVETYPE_NONE)
   
   new Float:maxs[3] = {1.0,1.0,1.0}
   new Float:mins[3] = {-1.0,-1.0,-1.0}
   entity_set_size(ent, mins, maxs)
   
   entity_set_float(ent, EV_FL_animtime, get_gametime())
   entity_set_float(ent, EV_FL_framerate, 1.0)   
   entity_set_int(ent, EV_INT_sequence, 0)   
   
   set_pev(ent, pev_rendermode, kRenderTransAdd)
   set_pev(ent, pev_renderamt, 255.0)   
   
   drop_to_floor(ent)
   
   for(new i = 0; i < get_maxplayers(); i++)
   {
      if(is_user_alive(i) && entity_range(oberon, i) <= 1000.0)
      {
         static arg[2]
         arg[0] = oberon
         arg[1] = i
         
         set_task(0.01, "do_hook_player", 512512, arg, sizeof(arg), "b")
      }
   }
   
   set_task(5.0, "stop_hook", oberon+2012)   
}

public do_hook_player(arg[2])
{
   static Float:Origin[3], Float:Speed
   pev(arg[0], pev_origin, Origin)
   
   Speed = (1000.0 / entity_range(arg[0], arg[1])) * 75.0
   
   hook_ent2(arg[1], Origin, Speed)
}

public stop_hook(oberon)
{
   oberon -= 2012
   
   static ent
   ent = find_ent_by_class(-1, "hole_hook")
   
   remove_entity(ent)
   remove_task(512512)
   
   do_takedmg(oberon)
   set_task(1.0, "reset_think", oberon)
}

public do_attack3(ent)
{
   static attack3_anim, attack3_sound
   
   if(g_evolution)
   {
      attack3_anim = 16
      attack3_sound = 6
   } else {
      attack3_anim = 8
      attack3_sound = 2
   }   
   
   g_attacking3 = 1
   
   set_entity_anim(ent, attack3_anim)
   
   emit_sound(ent, CHAN_BODY, oberon_attack_sound[attack3_sound], 1.0, ATTN_NORM, 0, PITCH_NORM)
   set_task(0.1, "attack3_jump", ent)
}

public attack3_jump(ent)
{
   set_task(0.01, "hookingup", ent+TASK_HOOKINGUP, _, _, "b")
   set_task(1.0, "hookingdown", ent+TASK_HOOKINGDOWN)   
   
   static Enemy
   Enemy = FindClosesEnemy(ent)   
   
   pev(Enemy, pev_origin, g_attacking3_origin)
}

public hookingup(ent)
{
   ent -= TASK_HOOKINGUP
   
   static Float:Origin[3]
   pev(ent, pev_origin, Origin)
   
   Origin[2] += 1000.0
   
   hook_ent2(ent, Origin, 1000.0)
   
   static Enemy
   Enemy = FindClosesEnemy(ent)   
   
   new Float:Ent_Origin[3], Float:Vic_Origin[3]
   
   pev(ent, pev_origin, Ent_Origin)
   pev(Enemy, pev_origin, Vic_Origin)
   
   npc_turntotarget(ent, Ent_Origin, Enemy, Vic_Origin)   
}

public hookingdown(ent)
{
   ent -= TASK_HOOKINGDOWN
   
   remove_task(ent+TASK_HOOKINGUP)
   set_task(0.5, "set_func1", ent)
   
   set_task(0.01, "hookingdown2", ent+TASK_HOOKINGDOWN, _, _, "b")
}

public set_func1(ent)
{
   set_pev(ent, pev_iuser3, 1)
}

public hookingdown2(ent)
{
   ent -= TASK_HOOKINGDOWN
   
   static Enemy
   Enemy = FindClosesEnemy(ent)
   
   hook_ent2(ent, g_attacking3_origin, 1000.0)
   
   new Float:Ent_Origin[3], Float:Vic_Origin[3]
   
   pev(ent, pev_origin, Ent_Origin)
   pev(Enemy, pev_origin, Vic_Origin)
   
   npc_turntotarget(ent, Ent_Origin, Enemy, Vic_Origin)      
}

public fw_touch(ent, touch)
{
   if(!pev_valid(ent))
      return FMRES_IGNORED
      
   if(g_attacking3 && pev(ent, pev_iuser3) == 1)
   {
      remove_task(ent+TASK_HOOKINGDOWN)
      
      if(is_user_alive(touch))
         user_kill(touch)
         
      g_attacking3 = 0
      set_pev(ent, pev_iuser3, 0)
      
      set_task(0.75, "reset_think", ent)
      
      for(new i = 1; i < get_maxplayers(); i++)
      {
         if(is_user_alive(i) && entity_range(ent, i) <= 300.0)
         {
            hit_screen(i)
            
            static Float:Damage
            Damage = random_float(10.0, 25.0)
            
            if(g_evolution)
               Damage *= 1.5
            
            ExecuteHam(Ham_TakeDamage, i, 0, i, Damage, DMG_BLAST)
         }
      }   
      
      static attack3_sound
      if(g_evolution)
         attack3_sound = 7
      else
         attack3_sound = 3
      
      emit_sound(ent, CHAN_BODY, oberon_attack_sound[attack3_sound], 1.0, ATTN_NORM, 0, PITCH_NORM)      
         
      drop_to_floor(ent)
   }
      
   return FMRES_HANDLED
}

public do_takedmg(ent2)
{
   if(g_evolution)
   {
      new ent = create_entity("info_target")
   
      static Float:Origin[3], Float:Angles[3]
      pev(ent2, pev_origin, Origin)
      pev(ent2, pev_angles, Angles)
      
      entity_set_origin(ent, Origin)
      entity_set_vector(ent, EV_VEC_angles, Angles)
      
      entity_set_string(ent,EV_SZ_classname, "knife_effect")
      entity_set_model(ent, oberon_knife_effect)
      entity_set_int(ent, EV_INT_solid, SOLID_NOT)
      entity_set_int(ent, EV_INT_movetype, MOVETYPE_NONE)
      
      new Float:maxs[3] = {40.0, 40.0, 1.0}
      new Float:mins[3] = {-40.0, -40.0, -1.0}
      entity_set_size(ent, mins, maxs)
      
      drop_to_floor(ent)
      
      set_task(1.0, "remove_knife_effect", ent)
   }
   
   for(new i = 1; i < get_maxplayers(); i++)
   {
      if(is_user_alive(i) && entity_range(ent2, i) <= 300.0)
      {
         hit_screen(i)
         
         static Float:Damage
         Damage = random_float(7.5, 15.0)
         
         if(g_evolution)
            Damage *= 2.0
         
         ExecuteHam(Ham_TakeDamage, i, 0, i, Damage, DMG_BLAST)
      }
   }   
}

public remove_knife_effect(ent)
{
   remove_entity(ent)
}

public set_new_idle(ent)
{
   g_evoluting = 0
   g_evolution = 1
   set_entity_anim(ent, 12)
   
   entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.1)
}

public move_entity(ent)
{
   static Float:Origin[3]
   
   Origin[0] = 4290.0
   Origin[1] = 4290.0
   Origin[2] = 4290.0
   
   set_pev(ent, pev_origin, Origin)
   entity_set_float(ent, EV_FL_nextthink, halflife_time() + 99999999.0)
}

public fw_takedmg(victim, inflictor, attacker, Float:damage, damagebits)
{
   static Float:Origin[3]
   fm_get_aimorigin(attacker, Origin)
   
   client_print(attacker, print_center, "Vida do Oberon: %i", floatround(pev(victim, pev_health) - 1000.0))
   
   create_blood(Origin)
   
   if(get_pcvar_num(cvar_dmg_ap_allow))
   {
      // Store damage dealt
      g_damagedealt[attacker] += floatround(damage)
         
      // Reward ammo packs for every [ammo damage] dealt
      while (g_damagedealt[attacker] > get_pcvar_num(cvar_ammodamage))
      {
         g_damagedealt[attacker] -= get_pcvar_num(cvar_ammodamage)
         zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + get_pcvar_num(cvar_ammo_quantity))
      }
   }
}

stock set_entity_anim(ent, anim)
{
   entity_set_float(ent, EV_FL_animtime, get_gametime())
   entity_set_float(ent, EV_FL_framerate, 1.0)
   entity_set_int(ent, EV_INT_sequence, anim)   
}

stock create_blood(const Float:origin[3])
{
   // Show some blood :)
   message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
   write_byte(TE_BLOODSPRITE)
   engfunc(EngFunc_WriteCoord, origin[0])
   engfunc(EngFunc_WriteCoord, origin[1])
   engfunc(EngFunc_WriteCoord, origin[2])
   write_short(m_iBlood[1])
   write_short(m_iBlood[0])
   write_byte(75)
   write_byte(5)
   message_end()
}

stock fm_get_aimorigin(index, Float:origin[3])
{
   new Float:start[3], Float:view_ofs[3];
   pev(index, pev_origin, start);
   pev(index, pev_view_ofs, view_ofs);
   xs_vec_add(start, view_ofs, start);
   
   new Float:dest[3];
   pev(index, pev_v_angle, dest);
   engfunc(EngFunc_MakeVectors, dest);
   global_get(glb_v_forward, dest);
   xs_vec_mul_scalar(dest, 9999.0, dest);
   xs_vec_add(start, dest, dest);
   
   engfunc(EngFunc_TraceLine, start, dest, 0, index, 0);
   get_tr2(0, TR_vecEndPos, origin);
   
   return 1;
}  

public FindClosesEnemy(entid)
{
   new Float:Dist
   new Float:maxdistance=4000.0
   new indexid=0   
   for(new i=1;i<=get_maxplayers();i++){
      if(is_user_alive(i) && is_valid_ent(i) && can_see_fm(entid, i))
      {
         Dist = entity_range(entid, i)
         if(Dist <= maxdistance)
         {
            maxdistance=Dist
            indexid=i
            
            return indexid
         }
      }   
   }   
   return 0
}

public npc_turntotarget(ent, Float:Ent_Origin[3], target, Float:Vic_Origin[3])
{
   if(target)
   {
      new Float:newAngle[3]
      entity_get_vector(ent, EV_VEC_angles, newAngle)
      new Float:x = Vic_Origin[0] - Ent_Origin[0]
      new Float:z = Vic_Origin[1] - Ent_Origin[1]

      new Float:radians = floatatan(z/x, radian)
      newAngle[1] = radians * (180 / 3.14)
      if (Vic_Origin[0] < Ent_Origin[0])
         newAngle[1] -= 180.0
        
      entity_set_vector(ent, EV_VEC_angles, newAngle)
   }
}

public bool:can_see_fm(entindex1, entindex2)
{
   if (!entindex1 || !entindex2)
      return false

   if (pev_valid(entindex1) && pev_valid(entindex1))
   {
      new flags = pev(entindex1, pev_flags)
      if (flags & EF_NODRAW || flags & FL_NOTARGET)
      {
         return false
      }

      new Float:lookerOrig[3]
      new Float:targetBaseOrig[3]
      new Float:targetOrig[3]
      new Float:temp[3]

      pev(entindex1, pev_origin, lookerOrig)
      pev(entindex1, pev_view_ofs, temp)
      lookerOrig[0] += temp[0]
      lookerOrig[1] += temp[1]
      lookerOrig[2] += temp[2]

      pev(entindex2, pev_origin, targetBaseOrig)
      pev(entindex2, pev_view_ofs, temp)
      targetOrig[0] = targetBaseOrig [0] + temp[0]
      targetOrig[1] = targetBaseOrig [1] + temp[1]
      targetOrig[2] = targetBaseOrig [2] + temp[2]

      engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) //  checks the had of seen player
      if (get_tr2(0, TraceResult:TR_InOpen) && get_tr2(0, TraceResult:TR_InWater))
      {
         return false
      }
      else
      {
         new Float:flFraction
         get_tr2(0, TraceResult:TR_flFraction, flFraction)
         if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
         {
            return true
         }
         else
         {
            targetOrig[0] = targetBaseOrig [0]
            targetOrig[1] = targetBaseOrig [1]
            targetOrig[2] = targetBaseOrig [2]
            engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) //  checks the body of seen player
            get_tr2(0, TraceResult:TR_flFraction, flFraction)
            if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
            {
               return true
            }
            else
            {
               targetOrig[0] = targetBaseOrig [0]
               targetOrig[1] = targetBaseOrig [1]
               targetOrig[2] = targetBaseOrig [2] - 17.0
               engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) //  checks the legs of seen player
               get_tr2(0, TraceResult:TR_flFraction, flFraction)
               if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
               {
                  return true
               }
            }
         }
      }
   }
   return false
}

public hook_ent(ent, victim, Float:speed)
{
   static Float:fl_Velocity[3]
   static Float:VicOrigin[3], Float:EntOrigin[3]

   pev(ent, pev_origin, EntOrigin)
   pev(victim, pev_origin, VicOrigin)
   
   static Float:distance_f
   distance_f = get_distance_f(EntOrigin, VicOrigin)

   if (distance_f > 60.0)
   {
      new Float:fl_Time = distance_f / speed

      fl_Velocity[0] = (VicOrigin[0] - EntOrigin[0]) / fl_Time
      fl_Velocity[1] = (VicOrigin[1] - EntOrigin[1]) / fl_Time
      fl_Velocity[2] = (VicOrigin[2] - EntOrigin[2]) / fl_Time
   } else
   {
      fl_Velocity[0] = 0.0
      fl_Velocity[1] = 0.0
      fl_Velocity[2] = 0.0
   }

   entity_set_vector(ent, EV_VEC_velocity, fl_Velocity)
}

public hook_ent2(ent, Float:VicOrigin[3], Float:speed)
{
   static Float:fl_Velocity[3]
   static Float:EntOrigin[3]

   pev(ent, pev_origin, EntOrigin)
   
   static Float:distance_f
   distance_f = get_distance_f(EntOrigin, VicOrigin)

   if (distance_f > 60.0)
   {
      new Float:fl_Time = distance_f / speed

      fl_Velocity[0] = (VicOrigin[0] - EntOrigin[0]) / fl_Time
      fl_Velocity[1] = (VicOrigin[1] - EntOrigin[1]) / fl_Time
      fl_Velocity[2] = (VicOrigin[2] - EntOrigin[2]) / fl_Time
   } else
   {
      fl_Velocity[0] = 0.0
      fl_Velocity[1] = 0.0
      fl_Velocity[2] = 0.0
   }

   entity_set_vector(ent, EV_VEC_velocity, fl_Velocity)
}

public hit_screen(id)
{
   message_begin(MSG_ONE, get_user_msgid("ScreenShake"),{0,0,0}, id)
   write_short(1<<14)
   write_short(1<<13)
   write_short(1<<13)
   message_end()   
}

public reset_think(ent)
{
   g_doing_other = 0
   entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.1)
}

public creditos(id)
{
   set_hudmessage(0, 255, 255, -1.0, 0.89, 1, 0.0, 5.0, 1.0, 1.0, -1)
   show_hudmessage(id, "Plugin de Boss Editado Por: [P]erfec[T] [S]cr[@]s[H]")
}
   

stock client_printcolor(const id, const input[], any:...)
{
        new count = 1, players[32]
        static msg[191]
        vformat(msg, 190, input, 3)

        replace_all(msg, 190, "!g", "^4")  // Chat Verde
        replace_all(msg, 190, "!y", "^1")  // Chat Normal
        replace_all(msg, 190, "!t", "^3")  // Chat Do Time Tr=Vermelho Ct=Azul Spec=Branco

        if (id) players[0] = id; else get_players(players, count, "ch")
        {
                for (new i = 0; i < count; i++)
                {
                        if (is_user_connected(players[i]))
                        {
                                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
                                write_byte(players[i]);
                                write_string(msg);
                                message_end();
                        }
                }
        }
}

@ hackingzm não faça double post cara se não eu mesmo excluo o meu tópico e ninguem mais terá esse oberon.

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
[P]erfec[T] [S]cr[@]s[H] escreveu:
Testa ai: O comando é say /remove_oberon

Código:

#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include <  xs >
#include <zombieplague>

#define OBERON_CLASSNAME "oberon"

// Flag De Acesso (Atualmente ta na flag F)
#define FLAG_ACESS                   ADMIN_LEVEL_F

#define OBERON_HEALTH                  15000.0
#define MONEY_DMG                  1000.0
#define MONEY_REWARD                  1000
#define CLASS_NAME                  "npc_oberon"
#define CLASS_TIP                  "Oberon Boss"
#define OBERON_ATTACK_WAITIME                3.0

#define TASK_SKILL 123123123
#define TASK_HOOKINGUP 123312312
#define TASK_HOOKINGDOWN 123312313

new const oberon_model[] = "models/oberon/zbs_bossl_big02.mdl"
new const oberon_knife_effect[] = "models/oberon/ef_knife.mdl"
new const oberon_hole_effect[] = "models/oberon/ef_hole.mdl"
new const oberon_bomb_model[] = "models/oberon/zbs_bossl_big02_bomb.mdl"

new const oberon_appear_sound[] = "oberon/appear.wav"
new const oberon_death_sound[] = "oberon/death.wav"
new const oberon_evolution_sound[] = "oberon/knife.wav"
new const oberon_attack_sound[8][] =
{
   "oberon/attack1.wav",
   "oberon/attack2.wav",
   "oberon/attack3_jump.wav",
   "oberon/attack3.wav",
   "oberon/knife_attack1.wav",
   "oberon/knife_attack2.wav",
   "oberon/knife_attack3_jump.wav",
   "oberon/knife_attack3.wav"
}
new const oberon_hole_sound[] = "oberon/hole.wav"
new const oberon_bomb_sound[] = "oberon/attack_bomb.wav"

new oberon_model_id, g_reg, m_iBlood[2], exp_spr_id
new Float:g_cur_origin[3], Float:g_cur_angles[3], Float:g_cur_v_angle[3]
new g_evolution, g_evoluting, g_doing_other, g_attacking3, Float:g_attacking3_origin[3], g_damagedealt[33] , g_boss_exists[33], g_position_created[33]
new cvar_dmg_ap_allow, cvar_ammodamage, cvar_ammo_quantity

public plugin_init()
{
   register_plugin("[ZP] Addon: Oberon Boss", "1.0", "Dias | [P]erfec[T] [S]cr[@]s[H]")
   
   register_event("HLTV", "event_newround", "a", "1=0", "2=0")
   register_touch(OBERON_CLASSNAME, "*", "fw_touch")
   
   register_clcmd("say /get_origin", "get_origin")
   register_clcmd("say /make", "create_oberon")
   register_clcmd("say get_origin", "get_origin")
   register_clcmd("say make", "create_oberon")
   register_clcmd("say .get_origin", "get_origin")
   register_clcmd("say .make", "create_oberon")
   register_clcmd("say /remove_oberon", "remove_oberon")
   register_clcmd("say remove_oberon", "remove_oberon")
   register_clcmd("say .remove_oberon", "remove_oberon")
   
   cvar_dmg_ap_allow = register_cvar("zp_oberon_dmg_ap_reward_allow", "1")      // Ganhar Ammo Packs Por Dano
   cvar_ammodamage = register_cvar("zp_oberon_dmg_for_reward", "250")       // Dmg Necessario Para Ganhar Ammo Packs
   cvar_ammo_quantity  = register_cvar("zp_oberon_reward_ap_quantity", "2")    // Quantia de Ammo Packs que ira ganhar
}

public plugin_precache()
{
   oberon_model_id = precache_model(oberon_model)
   precache_model(oberon_knife_effect)
   precache_model(oberon_hole_effect)
   precache_model(oberon_bomb_model)
   
   precache_sound(oberon_appear_sound)
   precache_sound(oberon_death_sound)
   precache_sound(oberon_evolution_sound)
   for(new i = 0; i < sizeof(oberon_attack_sound); i++)
   {
      precache_sound(oberon_attack_sound[i])
   }
   precache_sound(oberon_hole_sound)
   precache_sound(oberon_bomb_sound)
   
   m_iBlood[0] = precache_model("sprites/blood.spr")
   m_iBlood[1] = precache_model("sprites/bloodspray.spr")   
   exp_spr_id = precache_model("sprites/zerogxplode.spr")
}

public event_newround()
{
   static ent
   ent = find_ent_by_class(-1, OBERON_CLASSNAME)
   
   if(task_exists(ent+TASK_SKILL)) remove_task(ent+TASK_SKILL)
}

public get_origin(id)
{
   if(get_user_flags(id) & FLAG_ACESS)
   {
      pev(id, pev_origin, g_cur_origin)
      pev(id, pev_angles, g_cur_angles)
      pev(id, pev_v_angle, g_cur_v_angle)
      
      g_position_created[id]++
      
      client_printcolor(id, "!g[ZP Oberon]!y Posicao do Nascimento do Oberon Salva Com Sucesso. Para Invocar digite !t^"say /make^"")
   }
   else
   {
      client_printcolor(id,"!g[ZP Oberon]!y Voce Nao Tem Acesso a esse Comando")
   }
}

public create_oberon(id)
{
   if(get_user_flags(id) & FLAG_ACESS)
   {
   
      if(g_position_created[id] == 0)
      {
         client_printcolor(id, "!g[ZP Oberon]!y Voce Tem que Defenir a Posicao de Nascimento Primeiro !g(Digitando:!t say /get_origin!g)")
         return;
      }
      
      if(g_boss_exists[id] >= 1)
      {
         client_printcolor(id, "!g[ZP Oberon]!y Ja Existe um Oberon no Jogo Nao Pode Criar Mais")
         return;
      }
      
      new ent = create_entity("info_target")
      
      entity_set_origin(ent, g_cur_origin)
      entity_set_vector(ent, EV_VEC_angles, g_cur_angles)
      //entity_set_vector(ent, EV_VEC_v_angle, g_cur_v_angle)
      
      entity_set_float(ent, EV_FL_takedamage, 1.0)
      entity_set_float(ent, EV_FL_health, OBERON_HEALTH + 1000.0)
      
      entity_set_string(ent,EV_SZ_classname, OBERON_CLASSNAME)
      entity_set_model(ent, oberon_model)
      entity_set_int(ent, EV_INT_solid, SOLID_SLIDEBOX)
      entity_set_int(ent, EV_INT_movetype, MOVETYPE_STEP)
      
      new Float:maxs[3] = {100.0, 100.0, 100.0}
      new Float:mins[3] = {-100.0, -100.0, -30.0}
      entity_set_size(ent, mins, maxs)
      entity_set_int(ent, EV_INT_modelindex, oberon_model_id)
      
      set_entity_anim(ent, 1)
      
      set_pev(ent, pev_iuser4, 0)
      
      entity_set_float(ent, EV_FL_nextthink, halflife_time() + 6.0)
      set_task(5.0, "start_oberon", ent)
      set_task(15.0, "do_random_skill", ent, _, _, "b")
      set_task(5.0, "creditos", id)
      
      set_hudmessage(255, 0, 0, -1.0, 0.17, 1, 0.0, 5.0, 1.0, 1.0, -1)
      show_hudmessage(id, "O Oberon Foi Solto. Fuja ou Se Esconda !!")
      
      if(!g_reg)
      {
         RegisterHamFromEntity(Ham_TakeDamage, ent, "fw_takedmg", 1)
         RegisterHamFromEntity(Ham_Think, ent, "fw_think")
         g_reg = 1
      }   
      
      g_boss_exists[id]++
      g_evolution = 0
      g_evoluting = 0
      g_doing_other = 0
      
      drop_to_floor(ent)
      emit_sound(ent, CHAN_BODY, oberon_appear_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
   }
   else
   {
      client_printcolor(id, "!g[ZP Oberon]!y Voce Nao Tem Acesso a esse Comando")
   }

}

public remove_oberon(id)
{
   if(get_user_flags(id) & FLAG_ACESS)
   {
      remove_entity(id)
      remove_entity_name(OBERON_CLASSNAME)
      client_printcolor(id, "!g[ZP Oberon]!y Oberon Removido com Sucesso")
      g_boss_exists[id] = 0
   }
   else
   {
      client_printcolor(id, "!g[ZP Oberon]!y Voce Nao Tem Acesso a esse Comando")
   }
}

public start_oberon(ent)
{
   set_entity_anim(ent, 2)
}

public fw_think(ent, attacker)
{
   if(!is_valid_ent(ent))
      return HAM_IGNORED
      
   if(pev(ent, pev_iuser4) == 1) // Oberon is dead
      return HAM_IGNORED
      
   if(g_evoluting || g_doing_other)
      return HAM_IGNORED
      
   if(pev(ent, pev_health) - 1000.0 <= 0.0)
   {
      set_pev(ent, pev_iuser4, 1)
      set_entity_anim(ent, 20)
      set_task(15.0, "move_entity", ent)
      entity_set_int(ent, EV_INT_solid, SOLID_NOT)
      entity_set_float(ent, EV_FL_takedamage, 0.0)
      
      emit_sound(ent, CHAN_BODY, oberon_death_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
   
      return HAM_IGNORED
   }
   if((pev(ent, pev_health) - 1000.0 <= OBERON_HEALTH / 2.0) && !g_evolution)
   {
      g_evoluting = 1
      set_entity_anim(ent, 11)
      
      emit_sound(ent, CHAN_BODY, oberon_evolution_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
      set_task(8.0, "set_new_idle", ent)
      
      return HAM_IGNORED
   }   
   
   static victim
   static Float:Origin[3], Float:VicOrigin[3], Float:distance
   
   victim = FindClosesEnemy(ent)
   pev(ent, pev_origin, Origin)
   pev(victim, pev_origin, VicOrigin)
   
   distance = get_distance_f(Origin, VicOrigin)
   
   if(is_user_alive(victim))
   {
      if(distance <= 250.0)
      {
         if(!is_valid_ent(ent))
            return FMRES_IGNORED   
      
         new Float:Ent_Origin[3], Float:Vic_Origin[3]
         
         pev(ent, pev_origin, Ent_Origin)
         pev(victim, pev_origin, Vic_Origin)         
      
         npc_turntotarget(ent, Ent_Origin, victim, Vic_Origin)
         
         static Attack_Type, attack_anim, attack_sound
         Attack_Type = random_num(1, 2)
         
         if(Attack_Type == 1)
         {
            if(g_evolution)
            {
               attack_anim = 14
               attack_sound = 4
            } else {
               attack_anim = 6
               attack_sound = 0
            }
            
            set_entity_anim(ent, attack_anim)
            emit_sound(ent, CHAN_BODY, oberon_attack_sound[attack_sound], 1.0, ATTN_NORM, 0, PITCH_NORM)
            
            set_task(1.0, "do_takedmg", ent)
            
            entity_set_float(ent, EV_FL_nextthink, get_gametime() + 3.0)
         } else {
            if(g_evolution)
            {
               attack_anim = 15
               attack_sound = 5
            } else {
               attack_anim = 7
               attack_sound = 1
            }
               
            set_entity_anim(ent, attack_anim)   
            emit_sound(ent, CHAN_BODY, oberon_attack_sound[attack_sound], 1.0, ATTN_NORM, 0, PITCH_NORM)
            
            set_task(0.5, "do_takedmg", ent)         
            
            entity_set_float(ent, EV_FL_nextthink, get_gametime() + 3.0)
         }
         
      } else {
         static moving_anim
         
         if(g_evolution)
            moving_anim = 13
         else
            moving_anim = 3      
      
         if(pev(ent, pev_sequence) != moving_anim)
         {
            entity_set_float(ent, EV_FL_animtime, get_gametime())
            entity_set_float(ent, EV_FL_framerate, 1.0)
            entity_set_int(ent, EV_INT_sequence, moving_anim)
         }
            
         new Float:Ent_Origin[3], Float:Vic_Origin[3]
         
         pev(ent, pev_origin, Ent_Origin)
         pev(victim, pev_origin, Vic_Origin)
         
         npc_turntotarget(ent, Ent_Origin, victim, Vic_Origin)
         hook_ent(ent, victim, 100.0)
         
         entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.1)
      }
   } else {
      static idle_anim
      
      if(g_evolution)
         idle_anim = 12
      else
         idle_anim = 2
         
      if(pev(ent, pev_sequence) != idle_anim)
      {
         set_entity_anim(ent, idle_anim)
      }   
         
      entity_set_float(ent, EV_FL_nextthink, get_gametime() + 1.0)
   }   
      
   return HAM_HANDLED
}

public do_random_skill(ent)
{
   if(!pev_valid(ent))
      return PLUGIN_HANDLED
      
   if(g_evoluting)
      return PLUGIN_HANDLED
      
   if(pev(ent, pev_health) - 1000.0 <= 0.0)
      return PLUGIN_HANDLED
   
   static random_skill
   random_skill = random_num(0, 100)
   
   g_doing_other = 1
   
   switch(random_skill)
   {
      case 0..37: {
         do_attack3(ent)
         
      }
      case 38..72: {
         do_hole(ent)
      }
      case 73..100: {
         do_bomb(ent)
      }      
   }   
   
   return PLUGIN_CONTINUE
}

public do_bomb(oberon)
{
   g_doing_other = 1
   
   static bomb_anim
   if(g_evolution)
      bomb_anim = 18
   else
      bomb_anim = 9
      
   set_entity_anim(oberon, bomb_anim)
   
   set_task(3.0, "do_skill_bomb", oberon+2015, _, _, "b")
   set_task(10.0, "stop_skill_bomb", oberon)
}

public stop_skill_bomb(oberon)
{
   remove_task(oberon+2015)
   
   static idle_anim
   
   if(g_evolution)
      idle_anim = 12
   else
      idle_anim = 2
      
   set_entity_anim(oberon, idle_anim)
   set_task(2.0, "reset_think", oberon)
}

public do_skill_bomb(oberon)
{
   oberon -= 2015
   static Float:StartOrigin[3], Float:TempOrigin[6][3], Float:VicOrigin[6][3], Float:Random1
   
   pev(oberon, pev_origin, StartOrigin)
   emit_sound(oberon, CHAN_BODY, oberon_bomb_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
   
   // 1st Bomb
   Random1 = random_float(100.0, 500.0)
   VicOrigin[0][0] = StartOrigin[0] + Random1
   VicOrigin[0][1] = StartOrigin[1]
   VicOrigin[0][2] = StartOrigin[2]
   
   TempOrigin[0][0] = VicOrigin[0][0] - (Random1 / 2.0)
   TempOrigin[0][1] = VicOrigin[0][1]
   TempOrigin[0][2] = VicOrigin[0][2] + 500.0
   
   // 2nd Bomb
   Random1 = random_float(100.0, 500.0)
   VicOrigin[1][0] = StartOrigin[0]
   VicOrigin[1][1] = StartOrigin[1] + Random1
   VicOrigin[1][2] = StartOrigin[2]
   
   TempOrigin[1][0] = VicOrigin[1][0]
   TempOrigin[1][1] = VicOrigin[1][1] - (Random1 / 2.0)
   TempOrigin[1][2] = VicOrigin[1][2] + 500.0   
   
   // 3rd Bomb
   Random1 = random_float(100.0, 500.0)
   VicOrigin[2][0] = StartOrigin[0] - Random1
   VicOrigin[2][1] = StartOrigin[1]
   VicOrigin[2][2] = StartOrigin[2]
   
   TempOrigin[2][0] = VicOrigin[2][0] - (Random1 / 2.0)
   TempOrigin[2][1] = VicOrigin[2][1]
   TempOrigin[2][2] = VicOrigin[2][2] + 500.0   
   
   // 4th Bomb
   VicOrigin[3][0] = StartOrigin[0]
   VicOrigin[3][1] = StartOrigin[1] - Random1
   VicOrigin[3][2] = StartOrigin[2]
   
   TempOrigin[3][0] = VicOrigin[3][0]
   TempOrigin[3][1] = VicOrigin[3][1] - (Random1 / 2.0)
   TempOrigin[3][2] = VicOrigin[3][2] + 500.0
   
   // 5th Bomb
   VicOrigin[4][0] = StartOrigin[0] + Random1
   VicOrigin[4][1] = StartOrigin[1] + Random1
   VicOrigin[4][2] = StartOrigin[2]
   
   TempOrigin[4][0] = VicOrigin[4][0] - (Random1 / 2.0)
   TempOrigin[4][1] = VicOrigin[4][1] - (Random1 / 2.0)
   TempOrigin[4][2] = VicOrigin[4][2] + 500.0
   
   // 6th Bomb
   VicOrigin[5][0] = StartOrigin[0] + Random1
   VicOrigin[5][1] = StartOrigin[1] - Random1
   VicOrigin[5][2] = StartOrigin[2]
   
   TempOrigin[5][0] = VicOrigin[5][0] + (Random1 / 2.0)
   TempOrigin[5][1] = VicOrigin[5][1] - (Random1 / 2.0)
   TempOrigin[5][2] = VicOrigin[5][2] + 500.0   
   
   for(new i = 0; i < 6; i++)
   {
      make_bomb(StartOrigin, TempOrigin[i], VicOrigin[i])
   }   
}

public make_bomb(Float:StartOrigin[3], Float:TempOrigin[3], Float:VicOrigin[3])
{
   new ent = create_entity("info_target")
   
   StartOrigin[2] += 20.0
   
   entity_set_origin(ent, StartOrigin)
   
   entity_set_string(ent,EV_SZ_classname, "oberon_bomb")
   entity_set_model(ent, oberon_bomb_model)
   entity_set_int(ent, EV_INT_solid, SOLID_NOT)
   entity_set_int(ent, EV_INT_movetype, MOVETYPE_BOUNCE)
   
   new Float:maxs[3] = {10.0,10.0,10.0}
   new Float:mins[3] = {-10.0,-10.0,-5.0}
   entity_set_size(ent, mins, maxs)
   
   entity_set_float(ent, EV_FL_animtime, get_gametime())
   entity_set_float(ent, EV_FL_framerate, 1.0)   
   entity_set_int(ent, EV_INT_sequence, 0)      
   
   static arg[4], arg2[4]
   
   arg[0] = ent
   arg[1] = floatround(TempOrigin[0])
   arg[2] = floatround(TempOrigin[1])
   arg[3] = floatround(TempOrigin[2])

   arg2[0] = ent
   arg2[1] = floatround(VicOrigin[0])
   arg2[2] = floatround(VicOrigin[1])
   arg2[3] = floatround(VicOrigin[2])   
   
   set_task(0.01, "do_hook_bomb_up", TASK_HOOKINGUP, arg, sizeof(arg), "b")
   set_task(1.0, "do_hook_bomb_down", _, arg2, sizeof(arg2))
   set_task(2.0, "bomb_explode", ent)
}

public bomb_explode(ent)
{
   remove_task(TASK_HOOKINGUP)
   remove_task(TASK_HOOKINGDOWN)
   
   static Float:Origin[3]
   pev(ent, pev_origin, Origin)
   
   message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
   write_byte(TE_EXPLOSION)
   engfunc(EngFunc_WriteCoord, Origin[0])
   engfunc(EngFunc_WriteCoord, Origin[1])
   engfunc(EngFunc_WriteCoord, Origin[2])
   write_short(exp_spr_id)   // sprite index
   write_byte(20)   // scale in 0.1's
   write_byte(30)   // framerate
   write_byte(0)   // flags
   message_end()   
   
   for(new i = 1; i < get_maxplayers(); i++)
   {
      if(is_user_alive(i) && entity_range(i, ent) <= 300.0)
      {
         static Float:Damage
         Damage = random_float(10.0, 30.0)
         
         if(g_evolution)
            Damage *= 5.0
            
         ExecuteHam(Ham_TakeDamage, i, 300, i, Damage, DMG_BLAST)
         hit_screen(i)
      }
   }   
   
   remove_entity(ent)
   remove_entity_name("oberon_bomb")
   
   set_task(1.0, "remove_bomb", ent)
}

public remove_bomb(ent)
{
   remove_entity(ent)
   remove_entity_name("oberon_bomb")
}

public do_hook_bomb_down(arg[4])
{
   remove_task(TASK_HOOKINGUP)
   set_task(0.01, "do_hook_bomb_down2", TASK_HOOKINGDOWN, arg, sizeof(arg), "b")
}

public do_hook_bomb_down2(arg[4])
{
   static ent, Float:VicOrigin[3]
   
   ent = arg[0]
   VicOrigin[0] = float(arg[1])
   VicOrigin[1] = float(arg[2])
   VicOrigin[2] = float(arg[3])   
   
   hook_ent2(ent, VicOrigin, 500.0)
}

public do_hook_bomb_up(arg[4])
{
   static ent, Float:TempOrigin[3]
   
   ent = arg[0]
   TempOrigin[0] = float(arg[1])
   TempOrigin[1] = float(arg[2])
   TempOrigin[2] = float(arg[3])
   
   hook_ent2(ent, TempOrigin, 500.0)
}

public do_hole(oberon)
{
   static hole_anim
   
   if(g_evolution)
      hole_anim = 19
   else
      hole_anim = 10
      
   set_entity_anim(oberon, hole_anim)
   emit_sound(oberon, CHAN_BODY, oberon_hole_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
   
   new ent = create_entity("info_target")
   
   static Float:Origin[3]
   pev(oberon, pev_origin, Origin)
   
   Origin[2] -= 10.0
   
   entity_set_origin(ent, Origin)
   
   entity_set_string(ent,EV_SZ_classname, "hole_hook")
   entity_set_model(ent, oberon_hole_effect)
   entity_set_int(ent, EV_INT_solid, SOLID_NOT)
   entity_set_int(ent, EV_INT_movetype, MOVETYPE_NONE)
   
   new Float:maxs[3] = {1.0,1.0,1.0}
   new Float:mins[3] = {-1.0,-1.0,-1.0}
   entity_set_size(ent, mins, maxs)
   
   entity_set_float(ent, EV_FL_animtime, get_gametime())
   entity_set_float(ent, EV_FL_framerate, 1.0)   
   entity_set_int(ent, EV_INT_sequence, 0)   
   
   set_pev(ent, pev_rendermode, kRenderTransAdd)
   set_pev(ent, pev_renderamt, 255.0)   
   
   drop_to_floor(ent)
   
   for(new i = 0; i < get_maxplayers(); i++)
   {
      if(is_user_alive(i) && entity_range(oberon, i) <= 1000.0)
      {
         static arg[2]
         arg[0] = oberon
         arg[1] = i
         
         set_task(0.01, "do_hook_player", 512512, arg, sizeof(arg), "b")
      }
   }
   
   set_task(5.0, "stop_hook", oberon+2012)   
}

public do_hook_player(arg[2])
{
   static Float:Origin[3], Float:Speed
   pev(arg[0], pev_origin, Origin)
   
   Speed = (1000.0 / entity_range(arg[0], arg[1])) * 75.0
   
   hook_ent2(arg[1], Origin, Speed)
}

public stop_hook(oberon)
{
   oberon -= 2012
   
   static ent
   ent = find_ent_by_class(-1, "hole_hook")
   
   remove_entity(ent)
   remove_task(512512)
   
   do_takedmg(oberon)
   set_task(1.0, "reset_think", oberon)
}

public do_attack3(ent)
{
   static attack3_anim, attack3_sound
   
   if(g_evolution)
   {
      attack3_anim = 16
      attack3_sound = 6
   } else {
      attack3_anim = 8
      attack3_sound = 2
   }   
   
   g_attacking3 = 1
   
   set_entity_anim(ent, attack3_anim)
   
   emit_sound(ent, CHAN_BODY, oberon_attack_sound[attack3_sound], 1.0, ATTN_NORM, 0, PITCH_NORM)
   set_task(0.1, "attack3_jump", ent)
}

public attack3_jump(ent)
{
   set_task(0.01, "hookingup", ent+TASK_HOOKINGUP, _, _, "b")
   set_task(1.0, "hookingdown", ent+TASK_HOOKINGDOWN)   
   
   static Enemy
   Enemy = FindClosesEnemy(ent)   
   
   pev(Enemy, pev_origin, g_attacking3_origin)
}

public hookingup(ent)
{
   ent -= TASK_HOOKINGUP
   
   static Float:Origin[3]
   pev(ent, pev_origin, Origin)
   
   Origin[2] += 1000.0
   
   hook_ent2(ent, Origin, 1000.0)
   
   static Enemy
   Enemy = FindClosesEnemy(ent)   
   
   new Float:Ent_Origin[3], Float:Vic_Origin[3]
   
   pev(ent, pev_origin, Ent_Origin)
   pev(Enemy, pev_origin, Vic_Origin)
   
   npc_turntotarget(ent, Ent_Origin, Enemy, Vic_Origin)   
}

public hookingdown(ent)
{
   ent -= TASK_HOOKINGDOWN
   
   remove_task(ent+TASK_HOOKINGUP)
   set_task(0.5, "set_func1", ent)
   
   set_task(0.01, "hookingdown2", ent+TASK_HOOKINGDOWN, _, _, "b")
}

public set_func1(ent)
{
   set_pev(ent, pev_iuser3, 1)
}

public hookingdown2(ent)
{
   ent -= TASK_HOOKINGDOWN
   
   static Enemy
   Enemy = FindClosesEnemy(ent)
   
   hook_ent2(ent, g_attacking3_origin, 1000.0)
   
   new Float:Ent_Origin[3], Float:Vic_Origin[3]
   
   pev(ent, pev_origin, Ent_Origin)
   pev(Enemy, pev_origin, Vic_Origin)
   
   npc_turntotarget(ent, Ent_Origin, Enemy, Vic_Origin)      
}

public fw_touch(ent, touch)
{
   if(!pev_valid(ent))
      return FMRES_IGNORED
      
   if(g_attacking3 && pev(ent, pev_iuser3) == 1)
   {
      remove_task(ent+TASK_HOOKINGDOWN)
      
      if(is_user_alive(touch))
         user_kill(touch)
         
      g_attacking3 = 0
      set_pev(ent, pev_iuser3, 0)
      
      set_task(0.75, "reset_think", ent)
      
      for(new i = 1; i < get_maxplayers(); i++)
      {
         if(is_user_alive(i) && entity_range(ent, i) <= 300.0)
         {
            hit_screen(i)
            
            static Float:Damage
            Damage = random_float(10.0, 25.0)
            
            if(g_evolution)
               Damage *= 1.5
            
            ExecuteHam(Ham_TakeDamage, i, 0, i, Damage, DMG_BLAST)
         }
      }   
      
      static attack3_sound
      if(g_evolution)
         attack3_sound = 7
      else
         attack3_sound = 3
      
      emit_sound(ent, CHAN_BODY, oberon_attack_sound[attack3_sound], 1.0, ATTN_NORM, 0, PITCH_NORM)      
         
      drop_to_floor(ent)
   }
      
   return FMRES_HANDLED
}

public do_takedmg(ent2)
{
   if(g_evolution)
   {
      new ent = create_entity("info_target")
   
      static Float:Origin[3], Float:Angles[3]
      pev(ent2, pev_origin, Origin)
      pev(ent2, pev_angles, Angles)
      
      entity_set_origin(ent, Origin)
      entity_set_vector(ent, EV_VEC_angles, Angles)
      
      entity_set_string(ent,EV_SZ_classname, "knife_effect")
      entity_set_model(ent, oberon_knife_effect)
      entity_set_int(ent, EV_INT_solid, SOLID_NOT)
      entity_set_int(ent, EV_INT_movetype, MOVETYPE_NONE)
      
      new Float:maxs[3] = {40.0, 40.0, 1.0}
      new Float:mins[3] = {-40.0, -40.0, -1.0}
      entity_set_size(ent, mins, maxs)
      
      drop_to_floor(ent)
      
      set_task(1.0, "remove_knife_effect", ent)
   }
   
   for(new i = 1; i < get_maxplayers(); i++)
   {
      if(is_user_alive(i) && entity_range(ent2, i) <= 300.0)
      {
         hit_screen(i)
         
         static Float:Damage
         Damage = random_float(7.5, 15.0)
         
         if(g_evolution)
            Damage *= 2.0
         
         ExecuteHam(Ham_TakeDamage, i, 0, i, Damage, DMG_BLAST)
      }
   }   
}

public remove_knife_effect(ent)
{
   remove_entity(ent)
}

public set_new_idle(ent)
{
   g_evoluting = 0
   g_evolution = 1
   set_entity_anim(ent, 12)
   
   entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.1)
}

public move_entity(ent)
{
   static Float:Origin[3]
   
   Origin[0] = 4290.0
   Origin[1] = 4290.0
   Origin[2] = 4290.0
   
   set_pev(ent, pev_origin, Origin)
   entity_set_float(ent, EV_FL_nextthink, halflife_time() + 99999999.0)
}

public fw_takedmg(victim, inflictor, attacker, Float:damage, damagebits)
{
   static Float:Origin[3]
   fm_get_aimorigin(attacker, Origin)
   
   client_print(attacker, print_center, "Vida do Oberon: %i", floatround(pev(victim, pev_health) - 1000.0))
   
   create_blood(Origin)
   
   if(get_pcvar_num(cvar_dmg_ap_allow))
   {
      // Store damage dealt
      g_damagedealt[attacker] += floatround(damage)
         
      // Reward ammo packs for every [ammo damage] dealt
      while (g_damagedealt[attacker] > get_pcvar_num(cvar_ammodamage))
      {
         g_damagedealt[attacker] -= get_pcvar_num(cvar_ammodamage)
         zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + get_pcvar_num(cvar_ammo_quantity))
      }
   }
}

stock set_entity_anim(ent, anim)
{
   entity_set_float(ent, EV_FL_animtime, get_gametime())
   entity_set_float(ent, EV_FL_framerate, 1.0)
   entity_set_int(ent, EV_INT_sequence, anim)   
}

stock create_blood(const Float:origin[3])
{
   // Show some blood :)
   message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
   write_byte(TE_BLOODSPRITE)
   engfunc(EngFunc_WriteCoord, origin[0])
   engfunc(EngFunc_WriteCoord, origin[1])
   engfunc(EngFunc_WriteCoord, origin[2])
   write_short(m_iBlood[1])
   write_short(m_iBlood[0])
   write_byte(75)
   write_byte(5)
   message_end()
}

stock fm_get_aimorigin(index, Float:origin[3])
{
   new Float:start[3], Float:view_ofs[3];
   pev(index, pev_origin, start);
   pev(index, pev_view_ofs, view_ofs);
   xs_vec_add(start, view_ofs, start);
   
   new Float:dest[3];
   pev(index, pev_v_angle, dest);
   engfunc(EngFunc_MakeVectors, dest);
   global_get(glb_v_forward, dest);
   xs_vec_mul_scalar(dest, 9999.0, dest);
   xs_vec_add(start, dest, dest);
   
   engfunc(EngFunc_TraceLine, start, dest, 0, index, 0);
   get_tr2(0, TR_vecEndPos, origin);
   
   return 1;
}  

public FindClosesEnemy(entid)
{
   new Float:Dist
   new Float:maxdistance=4000.0
   new indexid=0   
   for(new i=1;i<=get_maxplayers();i++){
      if(is_user_alive(i) && is_valid_ent(i) && can_see_fm(entid, i))
      {
         Dist = entity_range(entid, i)
         if(Dist <= maxdistance)
         {
            maxdistance=Dist
            indexid=i
            
            return indexid
         }
      }   
   }   
   return 0
}

public npc_turntotarget(ent, Float:Ent_Origin[3], target, Float:Vic_Origin[3])
{
   if(target)
   {
      new Float:newAngle[3]
      entity_get_vector(ent, EV_VEC_angles, newAngle)
      new Float:x = Vic_Origin[0] - Ent_Origin[0]
      new Float:z = Vic_Origin[1] - Ent_Origin[1]

      new Float:radians = floatatan(z/x, radian)
      newAngle[1] = radians * (180 / 3.14)
      if (Vic_Origin[0] < Ent_Origin[0])
         newAngle[1] -= 180.0
        
      entity_set_vector(ent, EV_VEC_angles, newAngle)
   }
}

public bool:can_see_fm(entindex1, entindex2)
{
   if (!entindex1 || !entindex2)
      return false

   if (pev_valid(entindex1) && pev_valid(entindex1))
   {
      new flags = pev(entindex1, pev_flags)
      if (flags & EF_NODRAW || flags & FL_NOTARGET)
      {
         return false
      }

      new Float:lookerOrig[3]
      new Float:targetBaseOrig[3]
      new Float:targetOrig[3]
      new Float:temp[3]

      pev(entindex1, pev_origin, lookerOrig)
      pev(entindex1, pev_view_ofs, temp)
      lookerOrig[0] += temp[0]
      lookerOrig[1] += temp[1]
      lookerOrig[2] += temp[2]

      pev(entindex2, pev_origin, targetBaseOrig)
      pev(entindex2, pev_view_ofs, temp)
      targetOrig[0] = targetBaseOrig [0] + temp[0]
      targetOrig[1] = targetBaseOrig [1] + temp[1]
      targetOrig[2] = targetBaseOrig [2] + temp[2]

      engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) //  checks the had of seen player
      if (get_tr2(0, TraceResult:TR_InOpen) && get_tr2(0, TraceResult:TR_InWater))
      {
         return false
      }
      else
      {
         new Float:flFraction
         get_tr2(0, TraceResult:TR_flFraction, flFraction)
         if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
         {
            return true
         }
         else
         {
            targetOrig[0] = targetBaseOrig [0]
            targetOrig[1] = targetBaseOrig [1]
            targetOrig[2] = targetBaseOrig [2]
            engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) //  checks the body of seen player
            get_tr2(0, TraceResult:TR_flFraction, flFraction)
            if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
            {
               return true
            }
            else
            {
               targetOrig[0] = targetBaseOrig [0]
               targetOrig[1] = targetBaseOrig [1]
               targetOrig[2] = targetBaseOrig [2] - 17.0
               engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) //  checks the legs of seen player
               get_tr2(0, TraceResult:TR_flFraction, flFraction)
               if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
               {
                  return true
               }
            }
         }
      }
   }
   return false
}

public hook_ent(ent, victim, Float:speed)
{
   static Float:fl_Velocity[3]
   static Float:VicOrigin[3], Float:EntOrigin[3]

   pev(ent, pev_origin, EntOrigin)
   pev(victim, pev_origin, VicOrigin)
   
   static Float:distance_f
   distance_f = get_distance_f(EntOrigin, VicOrigin)

   if (distance_f > 60.0)
   {
      new Float:fl_Time = distance_f / speed

      fl_Velocity[0] = (VicOrigin[0] - EntOrigin[0]) / fl_Time
      fl_Velocity[1] = (VicOrigin[1] - EntOrigin[1]) / fl_Time
      fl_Velocity[2] = (VicOrigin[2] - EntOrigin[2]) / fl_Time
   } else
   {
      fl_Velocity[0] = 0.0
      fl_Velocity[1] = 0.0
      fl_Velocity[2] = 0.0
   }

   entity_set_vector(ent, EV_VEC_velocity, fl_Velocity)
}

public hook_ent2(ent, Float:VicOrigin[3], Float:speed)
{
   static Float:fl_Velocity[3]
   static Float:EntOrigin[3]

   pev(ent, pev_origin, EntOrigin)
   
   static Float:distance_f
   distance_f = get_distance_f(EntOrigin, VicOrigin)

   if (distance_f > 60.0)
   {
      new Float:fl_Time = distance_f / speed

      fl_Velocity[0] = (VicOrigin[0] - EntOrigin[0]) / fl_Time
      fl_Velocity[1] = (VicOrigin[1] - EntOrigin[1]) / fl_Time
      fl_Velocity[2] = (VicOrigin[2] - EntOrigin[2]) / fl_Time
   } else
   {
      fl_Velocity[0] = 0.0
      fl_Velocity[1] = 0.0
      fl_Velocity[2] = 0.0
   }

   entity_set_vector(ent, EV_VEC_velocity, fl_Velocity)
}

public hit_screen(id)
{
   message_begin(MSG_ONE, get_user_msgid("ScreenShake"),{0,0,0}, id)
   write_short(1<<14)
   write_short(1<<13)
   write_short(1<<13)
   message_end()   
}

public reset_think(ent)
{
   g_doing_other = 0
   entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.1)
}

public creditos(id)
{
   set_hudmessage(0, 255, 255, -1.0, 0.89, 1, 0.0, 5.0, 1.0, 1.0, -1)
   show_hudmessage(id, "Plugin de Boss Editado Por: [P]erfec[T] [S]cr[@]s[H]")
}
   

stock client_printcolor(const id, const input[], any:...)
{
        new count = 1, players[32]
        static msg[191]
        vformat(msg, 190, input, 3)

        replace_all(msg, 190, "!g", "^4")  // Chat Verde
        replace_all(msg, 190, "!y", "^1")  // Chat Normal
        replace_all(msg, 190, "!t", "^3")  // Chat Do Time Tr=Vermelho Ct=Azul Spec=Branco

        if (id) players[0] = id; else get_players(players, count, "ch")
        {
                for (new i = 0; i < count; i++)
                {
                        if (is_user_connected(players[i]))
                        {
                                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
                                write_byte(players[i]);
                                write_string(msg);
                                message_end();
                        }
                }
        }
}
@ hackingzm não faça double post cara se não eu mesmo excluo o meu tópico e ninguem mais terá esse oberon.


vlw (=

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
muito bom Zplague12 

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
achei 1 erro al digita /remove_oberon esta dando erro olha:
[Plugin] Oberon Boss 0BBsbec

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
Feelipe:: escreveu:
 ><

esse e o meu ele e diferente desse. Esse e o video que fizeram do meu server quando soltei ele.
AHAHA MEU BOSS TAMBEM

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
Lucas157 escreveu:
Feelipe:: escreveu:
 ><

esse e o meu ele e diferente desse. Esse e o video que fizeram do meu server quando soltei ele.
AHAHA MEU BOSS TAMBEM
passa pra nois (=

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
Lucas157 escreveu:
Feelipe:: escreveu:
 ><

esse e o meu ele e diferente desse. Esse e o video que fizeram do meu server quando soltei ele.
AHAHA MEU BOSS TAMBEM
O seu e igual ao meu Me diga se vc conseguio tira o bug dele travar os players quando mata ele  e vc conseguio  tira o bug dele dar RR sozinho ??

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
Affs ta dando erroo quando digita /remove_oberon
olhaa
[Plugin] Oberon Boss 0BBsbec

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
arruma essa porra ae krl

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
hackingzm escreveu:
arruma essa porra ae krl
fika queto
ele n e obrigado a ajeita plugin pra vc

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
Dexter escreveu:
hackingzm escreveu:
arruma essa porra ae krl
fika queto
ele n e obrigado a ajeita plugin pra vc
fica queto vc lixo , ninguem te chamo aqui fica ae com essa merda de site lixo seu se tem 10 anos mlk seu bosta tudo para zm kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk 10 visualizaçao vo ser obrigado a derruba esse blogspot de merda

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
'-'

Última edição por Dexter em 8/6/2014, 6:00 pm, editado 1 vez(es)

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
vlw aee perfect scrash tava precisando muito desse plugin :D

Levou meu rep+

_________________________
[Plugin] Oberon Boss Sing2210

description[Plugin] Oberon Boss EmptyRe: [Plugin] Oberon Boss

more_horiz
privacy_tip Permissões neste sub-fórum
Não podes responder a tópicos
power_settings_newInicie sessão para responder