13.10.2012, 08:08
Vlw pela ateзгo aqui o fs do zombie e tambem tava bota esse codigo no sistema de registor do lladmin
Код:
/* Timers por player: 1* Timer por Zombie: 3* *Rodando constantemente. ===================================================================================================== Este й o Filterscript de Zombies feito por Wafffllesss ( Henrique Pauli ). Este й meu primeiro Filterscript e meu primeiro trabalho com NPC's. Espero que goste do filterscript e que traga muita diversгo para seu servidos. Por favor nгo remova os crйditos. *Vocк pode modificar este filterscript como quiser. *Vocк pode usar este filterscript onde quiser. ===================================================================================================== */ // O Skin do Zombie. // -1: Vai alterar entre os definidos na variбvel abaixo. // -2: Randomiza qualquer um dos skins validos do jogo. // Qualquer outro numero farб o skin ser o numero definido. static Zombie_Skin = -2; //Se tiver Zombie no nome, serб um Zombie. ( altere a seu gosto ). #define ZOMBIE_NAME "Zombie" #include <a_samp> #include <foreach> // By ****** Itter_Create(Vehicle, MAX_VEHICLES); #define COLOR_GREY 0xAFAFAFAA #define COLOR_GREEN 0x33AA33AA #define COLOR_RED 0xAA3333AA #define COLOR_YELLOW 0xFFFF00AA #define COLOR_WHITE 0xFFFFFFAA forward CheckCloserPlayers(playerid); forward NovaPos(playerid); forward CheckHP(playerid); forward KilledBy(playerid,killer); forward KickZombie(playerid); forward Atirando(playerid); forward Float:GetDistanceToPlayer(playerid,playerid2); forward Float:GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance); forward Float:GetPlayerSpeed(playerid); forward Float:GetXYInFrontOfVehicle(vehicleid, &Float:x, &Float:y, Float:distance); // Se o Zombie_Skin for igual a -1, defina os skins abaixo: new ZombieSkins[]={ 1, 7, 9, 10, 45 // Atenзгo, o ultimo skin nгo leva vнrgula. }; enum ZombieEnum{ ZombieSpawned, ZombieTarget, ZombieRunning, ZombieKilling, NPTIMER, Ztimers, Float:LastZombieHealth, Morrendo, HPtimer } new Zombies[200][ZombieEnum]; new AtirandoTimer[200]; new AtirandoClick[200]; new ZombieKill[200]; new Caller; new LastAdded = 0; new WeaponDamage[] = { 1, 2, 4, 4, 5, 4, 4, 4, 6, 15, -5, -5, -5, -5, -100, 4, 13, 2, 13, 0, 0, 0, 8, 9, 11, 15, 17, 15, 8, 9, 13, 13, 6, 45, 55, 40, 40, 27, 35, 0, 0, 0, 0, 0, 0, 0 }; new Float:WeaponRanges[] = { 1.0, 1.0, 1.2, 1.2, 1.1, 1.2, 1.2, 1.3, 1.2, 1.3, 0.5, 0.5, 0.5, 0.5, 0.5, 1.4, 12.0, 12.0, 12.0, 0.0, 0.0, 0.0, 28.0, 29.0, 30.0, 26.0, 25.0, 27.0, 28.0, 31.0, 35.0, 35.0, 26.0, 38.0, 65.0, 40.0, 40.0, 23.0, 37.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; public OnFilterScriptInit() { // Cria as variбveis Itter para o Foreach quando o script inicia ( se tiverem players/npcs online ) for(new i =0; i<= MAX_PLAYERS;i++){ if(IsPlayerConnected(i) && !IsPlayerNPC(i)){ Itter_Add(Player,i); AtirandoTimer[i] = SetTimerEx("Atirando",250,1,"i",i); ZombieKill[i] = -1; } else if(IsPlayerConnected(i) && IsPlayerNPC(i)){ Itter_Add(Bot,i); //Se For Zombie, ativa ele. if(!strfind(PlayerName(i),ZOMBIE_NAME,true)){ SetupZombie(i); } } } new Float:h; for(new v=0;v<MAX_VEHICLES;v++){ GetVehicleHealth(v,h); if(h)Itter_Add(Vehicle,v); } print("\n====================================="); print(" Zombie Filterscript por Wafffllesss "); print("=====================================\n"); return 1; } //=======================================[ Timers ]=========================================// public Atirando(playerid){ new up_dw,lf_rg,o_keys,weapon; new Float:x,Float:y,Float:z; weapon = GetPlayerWeapon(playerid); GetPlayerKeys(playerid,o_keys,up_dw,lf_rg); if(o_keys == KEY_FIRE || o_keys == (KEY_FIRE+128) ){ if(!AtirandoClick[playerid] || Automatic(weapon)) { AtirandoClick[playerid] = true; GetPlayerPos(playerid,x,y,z); foreach(Bot,b){ if(IsPlayerFacingPlayer(playerid,b,5.0)){ if(IsPlayerInRangeOfPoint(b,WeaponRanges[weapon],x,y,z)){ Zombies[b][LastZombieHealth] -= float(WeaponDamage[weapon]); if(Zombies[b][LastZombieHealth] <= 0.0 && !Zombies[b][Morrendo]){ SendDeathMessage(playerid,b,weapon); Zombies[b][Morrendo] = true; } } } } } }else{ AtirandoClick[playerid] = false; } } public KickZombie(playerid){ Kick(playerid); Zombies[playerid][Morrendo]=false; KillTimer(Zombies[playerid][HPtimer]); Zombies[playerid][HPtimer] = false; KillTimer(Zombies[playerid][Ztimers]); Zombies[playerid][Ztimers] = false; if(Zombies[playerid][NPTIMER]){ KillTimer(Zombies[playerid][NPTIMER]); Zombies[playerid][NPTIMER] = false; } } public CheckHP(playerid){ // Checka o HP do Zombie. new Float:x,Float:y,Float:z; new cp = GetClosestPlayer(playerid); if(IsPlayerInAnyVehicle(cp)){ new cpc = GetPlayerVehicleID(cp); GetVehiclePos(cpc,x,y,z); GetXYInFrontOfVehicle(cpc,x,y,1.5); if(IsPlayerInRangeOfPoint(playerid,2.0,x,y,z) && GetPlayerSpeed(cp) > 10.0){ Zombies[playerid][LastZombieHealth] -= (GetPlayerSpeed(cp)*2); } } if( Zombies[playerid][LastZombieHealth] <= 0.0 && Zombies[playerid][ZombieSpawned]){ ApplyAnimation(playerid,"Knife","KILL_Knife_Ped_Die",1,0,1,0,0,0); SetTimerEx("KickZombie",1500,0,"i",playerid); Zombies[playerid][Morrendo] = true; } } public NovaPos(playerid){ // Faz com que o zombie Caminhe / Corra if( Zombies[playerid][LastZombieHealth] > 0.0 ){ new Float:x,Float:y,Float:z; new Float:ax,Float:ay,Float:az,Float:dif; GetPlayerPos(Zombies[playerid][ZombieTarget],ax,ay,az); GetPlayerPos(playerid,x,y,z); if( az <= (z+3.0) && az >= (z-3.0)){ if(Zombies[playerid][ZombieRunning] == 1){ ApplyAnimation(playerid,"Muscular","MuscleRun",1,1,1,0,0,0); GetXYInFrontOfPlayer(playerid,x,y,2.0); } else if(Zombies[playerid][ZombieRunning] == 2){ ApplyAnimation(playerid,"Muscular","MuscleSprint",1,1,1,0,0,0); GetXYInFrontOfPlayer(playerid,x,y,2.8); } dif = az; SetPlayerPos(playerid,x,y,dif); }else{ if(Zombies[playerid][ZombieRunning]) Parar(playerid); GetPlayerPos(playerid,x,y,z); SetPlayerPosFindZ(playerid,x,y,z); } } } public CheckCloserPlayers(playerid){ // Detecta player mais perto e vai atras if( Zombies[playerid][LastZombieHealth] > 0.0 ){ new cp = GetClosestPlayer(playerid); new Float:MinDistance = 3.0; if(IsPlayerInAnyVehicle(cp)){ MinDistance = 5.0; } Zombies[playerid][ZombieTarget] = cp; if(GetDistanceToPlayer(playerid,cp) <= 70.0 && GetDistanceToPlayer(playerid,cp) > 15.0){ IrParaPlayer(1,playerid,cp); }else if(GetDistanceToPlayer(playerid,cp) <= 15.0 && GetDistanceToPlayer(playerid,cp) > MinDistance){ IrParaPlayer(0,playerid,cp); }else if(GetDistanceToPlayer(playerid,cp) <= MinDistance){ Parar(playerid); } if(GetDistanceToPlayer(playerid,cp) <= MinDistance){ new Float:h; if(IsPlayerInAnyVehicle(cp)){ new cpc = GetPlayerVehicleID(cp); GetVehicleHealth(cpc,h); if(GetDistanceToPlayer(playerid,cp) < MinDistance){ SetVehicleHealth(cpc,h-80.0); ApplyAnimation(playerid,"Gangs","shake_carSH",1,1,1,0,0,0); } }else{ GetPlayerHealth(cp,h); if(GetDistanceToPlayer(playerid,cp) > 1.5){ SetPlayerHealth(cp,h-5.0); }else{ if(Zombies[playerid][ZombieKilling]==-1){ if(!EstaMorrendo(cp)){ FinishHim(playerid,cp); } } } } } } } public KilledBy(playerid,killer){ // Aplica animaзгo 'Morrendo' e mata player. if(Zombies[killer][ZombieKilling] == playerid){ ApplyAnimation(playerid,"Knife","KILL_Knife_Ped_Die",1,0,1,0,0,0); TogglePlayerControllable(playerid,true); SetPlayerHealth(playerid,0.0); ClearAnimations(killer); ZombieKill[playerid] = killer; } } //=======================================[ Funзхes ]=========================================// stock Automatic(weaponid){ switch(weaponid){ case 9,22,23,24,27,28,29,30,31,32,37,38: return true; } return false; } stock EstaMorrendo(playerid){ // Verifica se algum zombie esta executando o golpe final no player foreach(Bot,b){ if(Zombies[b][ZombieKilling] == playerid) return true; } return false; } stock SetupZombie(playerid){ // Ativa o zombie. new Float:px,Float:py,Float:pz; Zombies[playerid][HPtimer] = SetTimerEx("CheckHP",100,1,"i",playerid); Zombies[playerid][Ztimers] = SetTimerEx("CheckCloserPlayers",1000,1,"i",playerid); GetPlayerPos(Caller,px,py,pz); SetPlayerPos(playerid,px,py,pz); Zombies[playerid][ZombieRunning] = false; SendClientMessageToAll(COLOR_RED,"Um Zombie Entrou!"); new Zskin=1; if(Zombie_Skin == -1){ new rd = random(sizeof(ZombieSkins)); if(IsValidSkin(ZombieSkins[rd])){ Zskin = ZombieSkins[rd]; } }else if(Zombie_Skin == -2){ new rd = random(299); if(IsValidSkin(rd)){ Zskin = rd; } }else if(IsValidSkin(Zombie_Skin)){ Zskin = Zombie_Skin; } SetPlayerSkin(playerid,Zskin); Zombies[playerid][ZombieKilling]= -1; Zombies[playerid][ZombieSpawned] = true; Zombies[playerid][LastZombieHealth] = 100.0; } stock FinishHim(playerid,target){ // Inicia o golpe final do Zombie Zombies[playerid][ZombieKilling] = target; TogglePlayerControllable(target,false); SetPlayerToFacePlayer(playerid,target); SetPlayerToFacePlayer(target,playerid); ApplyAnimation(target,"Knife","KILL_Knife_Ped_Damage",1,0,1,0,0,0); ApplyAnimation(playerid,"Knife","KILL_Knife_Player",1,0,1,0,0,0); SetTimerEx("KilledBy",1500,0,"ii",target,playerid); } stock Parar(playerid){ // Faz o zombie parar de andar if(Zombies[playerid][ZombieRunning]){ if(Zombies[playerid][NPTIMER]){ KillTimer(Zombies[playerid][NPTIMER]); Zombies[playerid][NPTIMER] = false; } Zombies[playerid][ZombieRunning] = false; ClearAnimations(playerid); } } stock IrParaPlayer(modo,playerid,paraid){ //Faz o zombie ir para o player designado. modo: 1- Caminha | 2- Corre SetPlayerToFacePlayer(playerid,paraid); if(modo == 0 && Zombies[playerid][ZombieRunning] != 1) Caminhar(playerid); else if(modo == 1 && Zombies[playerid][ZombieRunning] != 2) Correr(playerid); } stock Caminhar(playerid){ //Caminhar para frente. Zombies[playerid][ZombieRunning] = 1; Zombies[playerid][NPTIMER] = SetTimerEx("NovaPos",400,1,"i",playerid); } stock Correr(playerid){ //Correr para frente. Zombies[playerid][ZombieRunning] = 2; Zombies[playerid][NPTIMER] = SetTimerEx("NovaPos",300,1,"i",playerid); } stock AlvoDeAlguem(alvoid){ // Checka se o player й alvo de algum Zombie foreach(Bot,b){ if(Zombies[b][ZombieTarget] == alvoid) return b; } return false; } stock KickZombies(){ //Kicka os Zombies. foreach(Bot,b){ if(!strfind(PlayerName(b),ZOMBIE_NAME,true)) Kick(b); } } stock SetPlayerToFacePlayer(playerid, targetid) // De a_angles.inc ( Tannz0rz ) { new Float:pX, Float:pY, Float:pZ, Float:X, Float:Y, Float:Z, Float:ang; if(!IsPlayerConnected(playerid) || !IsPlayerConnected(targetid)) return 0; GetPlayerPos(targetid, X, Y, Z); GetPlayerPos(playerid, pX, pY, pZ); if( Y > pY ) ang = (-acos((X - pX) / floatsqroot((X - pX)*(X - pX) + (Y - pY)*(Y - pY))) - 90.0); else if( Y < pY && X < pX ) ang = (acos((X - pX) / floatsqroot((X - pX)*(X - pX) + (Y - pY)*(Y - pY))) - 450.0); else if( Y < pY ) ang = (acos((X - pX) / floatsqroot((X - pX)*(X - pX) + (Y - pY)*(Y - pY))) - 90.0); if(X > pX) ang = (floatabs(floatabs(ang) + 180.0)); else ang = (floatabs(ang) - 180.0); SetPlayerFacingAngle(playerid, ang); return 0; } stock PlayerName(playerid){ new pname[MAX_PLAYER_NAME]; GetPlayerName(playerid,pname,MAX_PLAYER_NAME); return pname; } stock Float:GetDistanceToPlayer(playerid,playerid2) { new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2; if (!IsPlayerConnected(playerid) || !IsPlayerConnected(playerid2)) { return -1.00; } GetPlayerPos(playerid,x1,y1,z1); GetPlayerPos(playerid2,x2,y2,z2); return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2)); } stock GetClosestPlayer(p1){ new Float:dis,Float:dis2,playerid; playerid = -1; dis = 99999.99; foreach(Player,x){ dis2 = GetDistanceToPlayer(p1,x); if (dis2 < dis && dis2 != -1.00) { dis = dis2; playerid = x; } } return playerid; } stock Float:GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance) { new Float:a; GetPlayerPos(playerid, x, y, a); if (IsPlayerInAnyVehicle(playerid)) GetVehicleZAngle(GetPlayerVehicleID(playerid), a); else GetPlayerFacingAngle(playerid, a); x += (distance * floatsin(-a, degrees)); y += (distance * floatcos(-a, degrees)); return a; } stock IsValidSkin(skinid) // Nгo й minha. Nгo lembro o criador.. { #define MAX_BAD_SKINS 22 new badSkins[MAX_BAD_SKINS] = { 3, 4, 5, 6, 8, 42, 65, 74, 86, 119, 149, 208, 268, 273, 289 }; if (skinid < 0 || skinid > 299) return false; for (new i = 0; i < MAX_BAD_SKINS; i++) { if (skinid == badSkins[i]) return false; } #undef MAX_BAD_SKINS return 1; } stock Float:GetPlayerSpeed(playerid) // Nгo й minha. Nгo lembro o criador.. (Nгo da a velocidade certa, mais serve para o que eu preciso.) { new Float:vX, Float:vY, Float:vZ; if (!IsPlayerInAnyVehicle(playerid)) { GetPlayerVelocity(playerid, vX, vY, vZ); } else { GetVehicleVelocity(GetPlayerVehicleID(playerid), vX, vY, vZ); } return floatsqroot(vX*vX + vY*vY + vZ*vZ)*100; } stock Float:GetXYInFrontOfVehicle(vehicleid, &Float:x, &Float:y, Float:distance) { new Float:a; GetVehiclePos(vehicleid, x, y, a); GetVehicleZAngle(vehicleid, a); x += (distance * floatsin(-a, degrees)); y += (distance * floatcos(-a, degrees)); return a; } stock IsPlayerFacingPlayer(playerid, playerid2, Float:dOffset) // De a_angles.inc ( Tannz0rz ) { new Float:X, Float:Y, Float:Z, Float:pX, Float:pY, Float:pZ, Float:pA, Float:ang; if(!IsPlayerConnected(playerid)) return 0; if(IsPlayerNPC(playerid)) return true; GetPlayerPos(playerid2, pX, pY, pZ); GetPlayerPos(playerid, X, Y, Z); GetPlayerFacingAngle(playerid, pA); if( Y > pY ) ang = (-acos((X - pX) / floatsqroot((X - pX)*(X - pX) + (Y - pY)*(Y - pY))) - 90.0); else if( Y < pY && X < pX ) ang = (acos((X - pX) / floatsqroot((X - pX)*(X - pX) + (Y - pY)*(Y - pY))) - 450.0); else if( Y < pY ) ang = (acos((X - pX) / floatsqroot((X - pX)*(X - pX) + (Y - pY)*(Y - pY))) - 90.0); if(AngleInRangeOfAngle(-ang, pA, dOffset)) return true; return false; } stock AngleInRangeOfAngle(Float:a1, Float:a2, Float:range) // De a_angles.inc ( Tannz0rz ) { a1 -= a2; if((a1 < range) && (a1 > -range)) return true; return false; } //=======================================[ Callbacks ]=========================================// public OnFilterScriptExit() { KickZombies(); return 1; } public OnPlayerConnect(playerid) { if(IsPlayerNPC(playerid)){ SpawnPlayer(playerid); } else{ AtirandoTimer[playerid] = SetTimerEx("Atirando",250,1,"i",playerid);} return 1; } public OnPlayerDisconnect(playerid, reason) { if(!IsPlayerNPC(playerid)){ KillTimer(AtirandoTimer[playerid]); } return 1; } public OnPlayerSpawn(playerid) { if(IsPlayerNPC(playerid)){ if(!strfind(PlayerName(playerid),ZOMBIE_NAME,true)){ SetupZombie(playerid); } } if(ZombieKill[playerid] != -1){ Zombies[ZombieKill[playerid]][ZombieKilling] = -1; ZombieKill[playerid] = -1; return 1; } return 1; } public OnPlayerDeath(playerid, killerid, reason) { if(ZombieKill[playerid] != -1){ SendDeathMessage(ZombieKill[playerid],playerid,reason); return 1; } return 1; } public OnVehicleSpawn(vehicleid) { return 1; } public OnVehicleDeath(vehicleid, killerid) { return 1; } public OnPlayerText(playerid, text[]) { return 1; } public OnPlayerCommandText(playerid, cmdtext[]) { if(strcmp(cmdtext, "/zombie", true) == 0) { if(!IsPlayerAdmin(playerid)) return false; Caller = playerid; new novonome[64]; format(novonome,sizeof(novonome),"%s_%d",ZOMBIE_NAME,LastAdded); ConnectNPC(novonome,"zombie"); LastAdded++; return 1; } return 0; } public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) { return 1; } public OnPlayerExitVehicle(playerid, vehicleid) { return 1; } public OnPlayerStateChange(playerid, newstate, oldstate) { return 1; } public OnPlayerEnterCheckpoint(playerid) { return 1; } public OnPlayerLeaveCheckpoint(playerid) { return 1; } public OnPlayerEnterRaceCheckpoint(playerid) { return 1; } public OnPlayerLeaveRaceCheckpoint(playerid) { return 1; } public OnRconCommand(cmd[]) { return 1; } public OnPlayerRequestSpawn(playerid) { return 1; } public OnObjectMoved(objectid) { return 1; } public OnPlayerObjectMoved(playerid, objectid) { return 1; } public OnPlayerPickUpPickup(playerid, pickupid) { return 1; } public OnVehicleMod(playerid, vehicleid, componentid) { return 1; } public OnVehiclePaintjob(playerid, vehicleid, paintjobid) { return 1; } public OnVehicleRespray(playerid, vehicleid, color1, color2) { return 1; } public OnPlayerSelectedMenuRow(playerid, row) { return 1; } public OnPlayerExitedMenu(playerid) { return 1; } public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) { return 1; } public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { return 1; } public OnRconLoginAttempt(ip[], password[], success) { return 1; } public OnPlayerUpdate(playerid) { return 1; } public OnPlayerStreamIn(playerid, forplayerid) { return 1; } public OnPlayerStreamOut(playerid, forplayerid) { return 1; } public OnVehicleStreamIn(vehicleid, forplayerid) { return 1; } public OnVehicleStreamOut(vehicleid, forplayerid) { return 1; } public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { return 1; } public OnPlayerClickPlayer(playerid, clickedplayerid, source) { return 1; } //=======================================[ Fim do Documento ]=========================================//