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


description[Ajuda] Oberon Boss Empty[Ajuda] Oberon Boss

more_horiz
Ola queria saber como eu fasso pra ver quem matou o oberon boss se alguem saber coloca na sma me deixa os comando ou se tem outra forma de saber

description[Ajuda] Oberon Boss EmptyRe: [Ajuda] Oberon Boss

more_horiz
O Boss não é um jogador, ele não ocupa slot no servidor como um jogador normal, acho que não da para fazer isso... se eu estiver errado que alguém me corrija..

description[Ajuda] Oberon Boss EmptyRe: [Ajuda] Oberon Boss

more_horiz
Sergio # escreveu:
O Boss não é um jogador, ele não ocupa slot no servidor como um jogador normal, acho que não da para fazer isso... se eu estiver errado que alguém me corrija..
nem no console aparece quem mato ;s

description[Ajuda] Oberon Boss EmptyRe: [Ajuda] Oberon Boss

more_horiz
Eu acho q nao aparece o nome mesmo porque e tipo uma maquina q esta jogando quando vc matar ele nao vai aparecer o nome de quem matou mesmo !

description[Ajuda] Oberon Boss EmptyRe: [Ajuda] Oberon Boss

more_horiz
Posta sma

description[Ajuda] Oberon Boss EmptyRe: [Ajuda] Oberon Boss

more_horiz
Eu Acho q a sma dele é essa aqui o

https://zplague.forumeiro.com/t5510-plugin-oberon-boss?highlight=Oberon

description[Ajuda] Oberon Boss EmptyRe: [Ajuda] Oberon Boss

more_horiz
Leozinho escreveu:
Posta sma
ae leozinho sma

Código:

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

#define OBERON_CLASSNAME "oberon"

#define FLAG_ACESS                  ADMIN_LEVEL_F

#define OBERON_HEALTH                  100000.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 /salvar_local_do_oberon", "get_origin")
  register_clcmd("say /criar_oberon", "create_oberon")
  register_clcmd("say salvar_local_do_oberon", "get_origin")
  register_clcmd("say salvar_local_do_oberon", "create_oberon")
  register_clcmd("say .salvar_local_do_oberon", "get_origin")
  register_clcmd("say .salvar_local_do_oberon", "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", "1000")      // Dmg Necessario Para Ganhar Ammo Packs
  cvar_ammo_quantity  = register_cvar("zp_oberom_reward_ap_quantity", "50")    // 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 /criar_oberon^"")
  }
  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 /salvar_local_do_oberon!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[Ajuda] Oberon Boss EmptyRe: [Ajuda] 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