Advertisement
dann1s

NPC SYSTEM

Feb 3rd, 2020
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 3.96 KB | None | 0 0
  1. //na vrh moda
  2. #define MAX_NPCOVA 100
  3. enum NPC_ENUM
  4. {
  5.     NPC_ID,
  6.     NPC_AktivnaMeta,
  7.     NPC_Heist,
  8.     NPC_Misija,
  9.     bool:NPC_Mrtav
  10. }
  11. new NPCInfo[MAX_NPCOVA][NPC_ENUM];
  12. new
  13.     Iterator: NPCS<MAX_NPCOVA>;
  14.  
  15. Stvori_NPC(Float:NPC_X, Float:NPC_Y, Float:NPC_Z, NPC_skin = 60, heistid = -1, misijaid = -1, meta = INVALID_PLAYER_ID, bool:npc_Vojnik = true) {
  16.  
  17.     new id = Iter_Free(NPCS), npcid;
  18.     if(id == -1) return 1;
  19.     new npcime[24];
  20.     format(npcime, sizeof(npcime), "NPC_I%d", id);
  21.     npcid = FCNPC_Create(npcime);
  22.     FCNPC_Spawn(npcid, NPC_skin, NPC_X, NPC_Y, NPC_Z);
  23.     NPCInfo[id][NPC_ID] = npcid;
  24.     NPCInfo[id][NPC_AktivnaMeta] = meta;
  25.     NPCInfo[id][NPC_Heist] = heistid;
  26.     NPCInfo[id][NPC_Misija] = misijaid;
  27.     NPCInfo[id][NPC_Mrtav] = false;
  28.     if(npc_Vojnik) {
  29.         switch(random(6)) {
  30.             case 0: FCNPC_SetWeapon(npcid, 24);
  31.             case 1: FCNPC_SetWeapon(npcid, 25);
  32.             case 2: FCNPC_SetWeapon(npcid, 28);
  33.             case 3: FCNPC_SetWeapon(npcid, 29);
  34.             case 4: FCNPC_SetWeapon(npcid, 30);
  35.             case 5: FCNPC_SetWeapon(npcid, 31);
  36.         }
  37.         FCNPC_SetAmmo(npcid, 300);
  38.         FCNPC_ToggleReloading(npcid, true);
  39.         FCNPC_SetInvulnerable(npcid, false);
  40.     }
  41.     Iter_Add(NPCS, id);
  42.     return npcid;
  43. }
  44.  
  45. Unisti_NPC(npcid) {
  46.  
  47.     for(new id; id < sizeof(NPCInfo); id++) {
  48.         if(NPCInfo[id][NPC_ID] == npcid && FCNPC_IsValid(npcid)
  49.         && Iter_Contains(NPCS, id)) {
  50.             NPCInfo[id][NPC_ID] = -1;
  51.             Iter_Remove(NPCS, id);
  52.             break;
  53.         }
  54.     }
  55.     FCNPC_Destroy(npcid);
  56.     return true;
  57. }
  58.  
  59. NPC_UzmiID(npcid) {
  60.     new n_id;
  61.     n_id = -1;
  62.     for(new id; id < sizeof(NPCInfo); id++) {
  63.         if(NPCInfo[id][NPC_ID] == npcid && FCNPC_IsValid(npcid)
  64.         && Iter_Contains(NPCS, id)) {
  65.             n_id = id;
  66.             break;
  67.         }
  68.     }
  69.     return n_id;
  70. }
  71.  
  72. CMD:kreirajnpc(playerid,params[]) {
  73.  
  74.     new Float:x, Float:y, Float:z;
  75.     GetPlayerPos(playerid,x,y,z);
  76.     Stvori_NPC(x+1,y+2,z,105);
  77.     return true;
  78. }
  79.  
  80. CMD:pucajteme(playerid, params[]) {
  81.     for(new id; id < sizeof(NPCInfo); id++) {
  82.         if(FCNPC_IsValid(NPCInfo[id][NPC_ID]) && Iter_Contains(NPCS, id)) {
  83.             NPC_PucajNa(NPCInfo[id][NPC_ID], playerid);
  84.         }
  85.     }
  86.     return true;
  87. }
  88.  
  89. forward NPC_PucajNa(npcid, target);
  90. public NPC_PucajNa(npcid, target)
  91. {
  92.     if(FCNPC_IsValid(npcid)) {
  93.         if(NPCInfo[NPC_UzmiID(npcid)][NPC_Mrtav]) {
  94.             NPCInfo[NPC_UzmiID(npcid)][NPC_AktivnaMeta] = INVALID_PLAYER_ID;
  95.             return 1;
  96.         }
  97.         NPCInfo[NPC_UzmiID(npcid)][NPC_AktivnaMeta] = target;
  98.         new Float:x, Float:y, Float:z, Float: tempdist;
  99.         FCNPC_GetPosition(npcid, x,y,z);
  100.         new Float:PPX, PPY, PPZ;
  101.         GetPlayerPos(target, PPX, PPY, PPZ);
  102.         tempdist = GetPlayerDistanceFromPoint(target, x, y, z);
  103.         if(tempdist < 20) {
  104.             new time, chance;
  105.             switch(FCNPC_GetWeapon(npcid)) {
  106.                 case 25, 26, 27: time = 400, chance = 35;
  107.                 case 33, 34: time = 500, chance = 50;
  108.                 case 24: time = 700, chance = 40;
  109.                 default: time = 200, chance = 40;
  110.             }
  111.             FCNPC_AimAtPlayer(npcid, target, false);
  112.             SetTimerEx("NPC_PucajNa", time, false, "ii", playerid, target);
  113.             if(random(100) < chance) {
  114.                 DamagePlayer(target, 5.0, INVALID_PLAYER_ID, FCNPC_GetWeapon(npcid));
  115.                 FCNPC_TriggerWeaponShot(npcid, FCNPC_GetWeapon(npcid), BULLET_HIT_TYPE_PLAYER, target, PPX,PPY,PPZ);
  116.             }
  117.             else {
  118.                 FCNPC_TriggerWeaponShot(npcid, FCNPC_GetWeapon(npcid), BULLET_HIT_TYPE_PLAYER, target, PPX+0.5,PPY+0.5,PPZ);
  119.             }
  120.             FCNPC_GiveAmmo(npcid, 1);
  121.         }
  122.         else {
  123.             FCNPC_StopAim(npcid);
  124.             NPCInfo[NPC_UzmiID(npcid)][NPC_AktivnaMeta] = INVALID_PLAYER_ID;
  125.         }
  126.     }
  127.     return 1;
  128. }
  129.  
  130. //u onplayerdeath
  131. for(new id; id < sizeof(NPCInfo); id++) {
  132.     if(FCNPC_IsValid(NPCInfo[id][NPC_ID]) && Iter_Contains(NPCS, id) && PCInfo[id][NPC_AktivnaMeta] == playerid) {
  133.         FCNPC_StopAim(NPCInfo[id][NPC_ID]);
  134.         NPCInfo[id][NPC_AktivnaMeta] = INVALID_PLAYER_ID;
  135.     }
  136. }
  137.  
  138. //novi callback
  139. public FCNPC_OnDeath(npcid, killerid, reason)
  140. {
  141.     NPCInfo[NPC_UzmiID(npcid)][NPC_Mrtav] = true;
  142.     return 1;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement