Guest User

[C++/Quest] Gelişmiş Koordinat Bazlı Mob Spawn

a guest
Feb 25th, 2026
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.04 KB | None | 0 0
  1. service.h ekle
  2.  
  3. #define ENABLE_MAPINDEX_MOB_SPAWN_SYSTEM             // Haritada istenilen kordinata npc çagirma fonksiyonu
  4.  
  5.  
  6.  
  7. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  8. quest fonksiyonu'da ekledim lazım olabilur :) questlua_pc.cpp
  9.  
  10. arat üzerine ekle
  11.  
  12. void RegisterPCFunctionTable()
  13.     {
  14.    
  15. #ifdef ENABLE_MAPINDEX_MOB_SPAWN_SYSTEM
  16. int pc_spawn_mob_at(lua_State* L)
  17. {
  18.     if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3))
  19.         return 0;
  20.  
  21.     uint32_t dwVnum = (uint32_t)lua_tonumber(L, 1);
  22.     long x = (long)lua_tonumber(L, 2);
  23.     long y = (long)lua_tonumber(L, 3);
  24.  
  25.     LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
  26.     if (!ch) return 0;
  27.  
  28.     LPSECTREE_MAP pkMap = SECTREE_MANAGER::instance().GetMap(ch->GetMapIndex());
  29.     if (pkMap)
  30.     {
  31.         CHARACTER_MANAGER::instance().SpawnMob(dwVnum, ch->GetMapIndex(), pkMap->m_setting.iBaseX + (x * 100), pkMap->m_setting.iBaseY + (y * 100), 0, false, -1);
  32.     }
  33.  
  34.     return 0;
  35. }
  36. #endif
  37.  
  38. arat müsait yere ekle
  39.  
  40. void RegisterPCFunctionTable()
  41.     {
  42.    
  43. #ifdef ENABLE_MAPINDEX_MOB_SPAWN_SYSTEM
  44.             { "spawn_mob_at",                                   pc_spawn_mob_at                         },
  45. #endif
  46.  
  47. quest_functions ekle
  48.  
  49. pc.spawn_mob_at
  50.  
  51. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  52. cmd.cpp ekle
  53.  
  54. #ifdef ENABLE_MAPINDEX_MOB_SPAWN_SYSTEM
  55. ACMD(do_npc_map);
  56. #endif
  57.  
  58. #ifdef ENABLE_MAPINDEX_MOB_SPAWN_SYSTEM
  59.     { "npc_map",                        do_npc_map,                     0,                      POS_DEAD,           GM_IMPLEMENTOR  },
  60. #endif
  61.  
  62. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  63. #ifdef ENABLE_MAPINDEX_MOB_SPAWN_SYSTEM
  64. ACMD(do_npc_map)
  65. {
  66.     char arg1[256], arg2[256], arg3[256];
  67.     three_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2), arg3, sizeof(arg3));
  68.  
  69.     if (!*arg1 || !*arg2 || !*arg3)
  70.     {
  71.         ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim: /npc_map <npc_vnum> <x> <y>");
  72.         return;
  73.     }
  74.  
  75.     uint32_t dwVnum = strtoul(arg1, NULL, 10);
  76.     long x = atol(arg2);
  77.     long y = atol(arg3);
  78.  
  79.     LPSECTREE_MAP pkMap = SECTREE_MANAGER::instance().GetMap(ch->GetMapIndex());
  80.     if (pkMap)
  81.     {
  82.         long real_x = pkMap->m_setting.iBaseX + (x * 100);
  83.         long real_y = pkMap->m_setting.iBaseY + (y * 100);
  84.  
  85.         // HATA VEREN YERI BURAYLA DEGISTIR:
  86.         // GM ile NPC arasindaki açiyi manuel hesapliyoruz (atan2 kullanarak)
  87.         float fDegree = 0.0f;
  88.         float fDeltaX = (float)(ch->GetX() - real_x);
  89.         float fDeltaY = (float)(ch->GetY() - real_y);
  90.  
  91.         if (fDeltaX != 0.0f || fDeltaY != 0.0f)
  92.         {
  93.             fDegree = atan2f(-fDeltaX, fDeltaY) * (180.0f / 3.1415926535f);
  94.         }
  95.  
  96.         if (fDegree < 0)
  97.             fDegree += 360.0f;
  98.  
  99.         // NPC'yi dogur (Hesapladigimiz fDegree açisiyla)
  100.         LPCHARACTER npc_obj = CHARACTER_MANAGER::instance().SpawnMob(dwVnum, ch->GetMapIndex(), real_x, real_y, (int)fDegree, false, -1);
  101.        
  102.         if (npc_obj)
  103.         {
  104.             ch->ChatPacket(CHAT_TYPE_INFO, "NPC %d çagrildi. Sana dönük açisi: %d", dwVnum, (int)fDegree);
  105.         }
  106.         else
  107.         {
  108.             ch->ChatPacket(CHAT_TYPE_INFO, "HATA: NPC çagrilamadi!");
  109.         }
  110.     }
  111. }
  112. #endif
  113. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  114. örnek quest lua
  115.  
  116. quest koordinat_test begin
  117.     state start begin
  118.         when 40004.use begin
  119.             say_title("Spawn Sistemi Testi:")
  120.             say("Şu an bulunduğun haritada bir koordinat gir.")
  121.             say("Örnek: 150 200")
  122.            
  123.             say_reward("X Koordinatı:")
  124.             local test_x = input_number()
  125.            
  126.             say_reward("Y Koordinatı:")
  127.             local test_y = input_number()
  128.            
  129.             if test_x > 0 and test_y > 0 then
  130.                 -- Fonksiyonun: pc.spawn_mob_at(vnum, x, y)
  131.                 pc.spawn_mob_at(9003, test_x, test_y)
  132.                
  133.                 syschat("Vnum: 9003 Market | Koordinat: "..test_x..", "..test_y.." noktasına gönderildi.")
  134.             else
  135.                 syschat("Geçersiz koordinat.")
  136.             end
  137.         end
  138.     end
  139. end
Advertisement
Add Comment
Please, Sign In to add comment