Advertisement
Guest User

Untitled

a guest
Mar 4th, 2020
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.47 KB | None | 0 0
  1. #include "stdafx.h"
  2.  
  3. #include "utils.h"
  4.  
  5. #include "config.h"
  6.  
  7. #include "questmanager.h"
  8.  
  9. #include "char.h"
  10. #include "char_manager.h"
  11.  
  12. #include "party.h"
  13.  
  14. #include "xmas_event.h"
  15.  
  16. #include "shop_manager.h"
  17.  
  18. #include "guild.h"
  19.  
  20. namespace quest
  21. {
  22.     //
  23.     // "npc" lua functions
  24.     //
  25.     ALUA(npc_open_shop)
  26.     {
  27.         CQuestManager & q = CQuestManager::instance();
  28.  
  29.         int iShopVnum = 0;
  30.  
  31.         if (lua_gettop(L) == 1)
  32.         {
  33.             if (lua_isnumber(L, 1))
  34.                 iShopVnum = (int) lua_tonumber(L, 1);
  35.         }
  36.  
  37.         if (q.GetCurrentCharacterPtr() && q.GetCurrentNPCCharacterPtr())
  38.             CShopManager::instance().StartShopping(q.GetCurrentCharacterPtr(), q.GetCurrentNPCCharacterPtr(), iShopVnum);
  39.  
  40.         return 0;
  41.     }
  42.  
  43.     ALUA(npc_is_pc)
  44.     {
  45.         CQuestManager & q = CQuestManager::instance();
  46.  
  47.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  48.  
  49.         lua_pushboolean(L, npc && npc->IsPC());
  50.  
  51.         return 1;
  52.     }
  53.  
  54.     ALUA(npc_get_empire)
  55.     {
  56.         CQuestManager & q = CQuestManager::instance();
  57.  
  58.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  59.  
  60.         lua_pushnumber(L, npc ? npc->GetEmpire() : 0);
  61.  
  62.         return 1;
  63.     }
  64.  
  65.     ALUA(npc_get_race)
  66.     {
  67.         CQuestManager & q = CQuestManager::instance();
  68.  
  69.         lua_pushnumber(L, q.GetCurrentNPCRace());
  70.  
  71.         return 1;
  72.     }
  73.  
  74.     ALUA(npc_get_guild)
  75.     {
  76.         CQuestManager & q = CQuestManager::instance();
  77.  
  78.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  79.  
  80.         CGuild * pGuild = npc ? npc->GetGuild() : NULL;
  81.  
  82.         if (npc)
  83.             pGuild = npc->GetGuild();
  84.  
  85.         lua_pushnumber(L, pGuild ? pGuild->GetID() : 0);
  86.  
  87.         return 1;
  88.     }
  89.  
  90.     ALUA(npc_is_quest)
  91.     {
  92.         CQuestManager & q = CQuestManager::instance();
  93.  
  94.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  95.  
  96.         if (npc)
  97.         {
  98.             const std::string & r_st = q.GetCurrentQuestName();
  99.  
  100.             if (q.GetQuestIndexByName(r_st) == npc->GetQuestBy())
  101.             {
  102.                 lua_pushboolean(L, 1);
  103.  
  104.                 return 1;
  105.             }
  106.         }
  107.  
  108.         lua_pushboolean(L, 0);
  109.  
  110.         return 1;
  111.     }
  112.  
  113.     ALUA(npc_kill)
  114.     {
  115.         CQuestManager & q = CQuestManager::instance();
  116.  
  117.         LPCHARACTER ch = q.GetCurrentCharacterPtr();
  118.  
  119.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  120.  
  121.         ch->SetQuestNPCID(0);
  122.  
  123.         if (npc)
  124.             npc->Dead();
  125.  
  126.         return 0;
  127.     }
  128.  
  129.     ALUA(npc_purge)
  130.     {
  131.         CQuestManager & q = CQuestManager::instance();
  132.  
  133.         LPCHARACTER ch = q.GetCurrentCharacterPtr();
  134.  
  135.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  136.  
  137.         ch->SetQuestNPCID(0);
  138.  
  139.         if (npc)
  140.             M2_DESTROY_CHARACTER(npc);
  141.  
  142.         return 0;
  143.     }
  144.  
  145.     ALUA(npc_is_near)
  146.     {
  147.         CQuestManager & q = CQuestManager::instance();
  148.  
  149.         LPCHARACTER ch = q.GetCurrentCharacterPtr();
  150.  
  151.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  152.  
  153.         lua_Number dist = 10;
  154.  
  155.         if (lua_isnumber(L, 1))
  156.             dist = lua_tonumber(L, 1);
  157.  
  158.         lua_pushboolean(L, ch && npc && DISTANCE_APPROX(ch->GetX() - npc->GetX(), ch->GetY() - npc->GetY()) < dist * 100);
  159.  
  160.         return 1;
  161.     }
  162.  
  163.     ALUA(npc_is_near_vid)
  164.     {
  165.         if (!lua_isnumber(L, 1))
  166.         {
  167.             sys_err("invalid vid");
  168.  
  169.             lua_pushboolean(L, 0);
  170.  
  171.             return 1;
  172.         }
  173.  
  174.         CQuestManager & q = CQuestManager::instance();
  175.  
  176.         LPCHARACTER ch = CHARACTER_MANAGER::instance().Find((DWORD)lua_tonumber(L, 1));
  177.  
  178.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  179.  
  180.         lua_Number dist = 10;
  181.  
  182.         if (lua_isnumber(L, 2))
  183.             dist = lua_tonumber(L, 2);
  184.  
  185.         lua_pushboolean(L, ch && npc && DISTANCE_APPROX(ch->GetX() - npc->GetX(), ch->GetY() - npc->GetY()) < dist * 100);
  186.  
  187.         return 1;
  188.     }
  189.  
  190.     ALUA(npc_unlock)
  191.     {
  192.         CQuestManager & q = CQuestManager::instance();
  193.  
  194.         LPCHARACTER ch = q.GetCurrentCharacterPtr();
  195.  
  196.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  197.  
  198.         if (npc != NULL)
  199.         {
  200.             if (npc->IsPC())
  201.                 return 0;
  202.  
  203.             if (npc->GetQuestNPCID() == ch->GetPlayerID())
  204.                 npc->SetQuestNPCID(0);
  205.         }
  206.  
  207.         return 0;
  208.     }
  209.  
  210.     ALUA(npc_lock)
  211.     {
  212.         CQuestManager & q = CQuestManager::instance();
  213.  
  214.         LPCHARACTER ch = q.GetCurrentCharacterPtr();
  215.  
  216.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  217.  
  218.         if (!npc || npc->IsPC())
  219.         {
  220.             lua_pushboolean(L, TRUE);
  221.             return 1;
  222.         }
  223.  
  224.         if (npc->GetQuestNPCID() == 0 || npc->GetQuestNPCID() == ch->GetPlayerID())
  225.         {
  226.             npc->SetQuestNPCID(ch->GetPlayerID());
  227.  
  228.             lua_pushboolean(L, TRUE);
  229.         }
  230.         else
  231.             lua_pushboolean(L, FALSE);
  232.  
  233.         return 1;
  234.     }
  235.  
  236.     ALUA(npc_get_leader_vid)
  237.     {
  238.         CQuestManager & q = CQuestManager::instance();
  239.  
  240.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  241.  
  242.         LPPARTY party = npc ? npc->GetParty() : NULL;
  243.  
  244.         LPCHARACTER leader = party ? party->GetLeader() : NULL;
  245.  
  246.         lua_pushnumber(L, leader ? leader->GetVID() : 0);
  247.  
  248.         return 1;
  249.     }
  250.  
  251.     ALUA(npc_get_vid)
  252.     {
  253.         CQuestManager & q = CQuestManager::instance();
  254.  
  255.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  256.  
  257.         lua_pushnumber(L, npc ? npc->GetVID() : 0);
  258.  
  259.         return 1;
  260.     }
  261.  
  262.     ALUA(npc_get_vid_attack_mul)
  263.     {
  264.         if (!lua_isnumber(L, 1))
  265.         {
  266.             sys_err("unkown argument");
  267.  
  268.             return 0;
  269.         }
  270.  
  271.         lua_Number vid = lua_tonumber(L, 1);
  272.  
  273.         LPCHARACTER targetChar = CHARACTER_MANAGER::instance().Find(vid);
  274.  
  275.         lua_pushnumber(L, targetChar ? targetChar->GetAttMul() : 0.0f);
  276.  
  277.         return 1;
  278.     }
  279.  
  280.     ALUA(npc_set_vid_attack_mul)
  281.     {
  282.         if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2))
  283.         {
  284.             sys_err("unkown argument");
  285.  
  286.             return 0;
  287.         }
  288.  
  289.         lua_Number vid = lua_tonumber(L, 1);
  290.  
  291.         lua_Number attack_mul = lua_tonumber(L, 2);
  292.  
  293.         LPCHARACTER targetChar = CHARACTER_MANAGER::instance().Find(vid);
  294.  
  295.         if (targetChar)
  296.             targetChar->SetAttMul(attack_mul);
  297.  
  298.         return 0;
  299.     }
  300.  
  301.     ALUA(npc_get_vid_damage_mul)
  302.     {
  303.         if (!lua_isnumber(L, 1))
  304.         {
  305.             sys_err("unkown argument");
  306.             return 0;
  307.         }
  308.  
  309.         lua_Number vid = lua_tonumber(L, 1);
  310.  
  311.         LPCHARACTER targetChar = CHARACTER_MANAGER::instance().Find(vid);
  312.  
  313.         lua_pushnumber(L, targetChar ? targetChar->GetDamMul() : 0.0f);
  314.  
  315.         return 1;
  316.     }
  317.  
  318.     ALUA(npc_set_vid_damage_mul)
  319.     {
  320.         if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2))
  321.         {
  322.             sys_err("unkown argument");
  323.             return 0;
  324.         }
  325.  
  326.         lua_Number vid = lua_tonumber(L, 1);
  327.  
  328.         lua_Number damage_mul = lua_tonumber(L, 2);
  329.  
  330.         LPCHARACTER targetChar = CHARACTER_MANAGER::instance().Find(vid);
  331.  
  332.         if (targetChar)
  333.             targetChar->SetDamMul(damage_mul);
  334.  
  335.         return 0;
  336.     }
  337.  
  338. #ifdef ENABLE_NEWSTUFF
  339.     ALUA(npc_get_level0)
  340.     {
  341.         CQuestManager & q = CQuestManager::instance();
  342.  
  343.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  344.  
  345.         lua_pushnumber(L, npc->GetLevel());
  346.  
  347.         return 1;
  348.     }
  349.  
  350.     ALUA(npc_get_name0)
  351.     {
  352.         CQuestManager & q = CQuestManager::instance();
  353.  
  354.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  355.  
  356.         lua_pushstring(L, npc->GetName());
  357.  
  358.         return 1;
  359.     }
  360.  
  361.     ALUA(npc_get_pid0)
  362.     {
  363.         CQuestManager & q = CQuestManager::instance();
  364.  
  365.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  366.  
  367.         lua_pushnumber(L, npc->GetPlayerID());
  368.  
  369.         return 1;
  370.     }
  371.  
  372.     ALUA(npc_get_vnum0)
  373.     {
  374.         CQuestManager & q = CQuestManager::instance();
  375.  
  376.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  377.  
  378.         lua_pushnumber(L, npc->GetRaceNum());
  379.  
  380.         return 1;
  381.     }
  382.  
  383.     ALUA(npc_is_available0)
  384.     {
  385.         CQuestManager & q = CQuestManager::instance();
  386.  
  387.         LPCHARACTER npc = q.GetCurrentNPCCharacterPtr();
  388.  
  389.         lua_pushboolean(L, npc != NULL);
  390.  
  391.         return 1;
  392.     }
  393.  
  394. #endif
  395.  
  396.     void RegisterNPCFunctionTable()
  397.     {
  398.         luaL_reg npc_functions[] =
  399.         {
  400.             { "getrace",                            npc_get_race                },
  401.             { "get_race",                           npc_get_race                },
  402.  
  403.             { "open_shop",                          npc_open_shop               },
  404.  
  405.             { "get_empire",                         npc_get_empire              },
  406.  
  407.             { "is_pc",                              npc_is_pc                   },
  408.  
  409.             { "is_quest",                           npc_is_quest                },
  410.  
  411.             { "kill",                               npc_kill                    },
  412.  
  413.             { "purge",                              npc_purge                   },
  414.  
  415.             { "is_near",                            npc_is_near                 },
  416.             { "is_near_vid",                        npc_is_near_vid             },
  417.  
  418.             { "lock",                               npc_lock                    },
  419.             { "unlock",                             npc_unlock                  },
  420.  
  421.             { "get_guild",                          npc_get_guild               },
  422.  
  423.             { "get_leader_vid",                     npc_get_leader_vid          },
  424.  
  425.             { "get_vid",                            npc_get_vid                 },
  426.  
  427.             { "get_vid_attack_mul",                 npc_get_vid_attack_mul      },
  428.             { "set_vid_attack_mul",                 npc_set_vid_attack_mul      },
  429.  
  430.             { "get_vid_damage_mul",                 npc_get_vid_damage_mul      },
  431.             { "set_vid_damage_mul",                 npc_set_vid_damage_mul      },
  432.  
  433. #ifdef ENABLE_NEWSTUFF
  434.             { "get_level0",                         npc_get_level0              }// [return lua number]
  435.             { "get_name0",                          npc_get_name0               }// [return lua string]
  436.             { "get_pid0",                           npc_get_pid0                }// [return lua number]
  437.             { "get_vnum0",                          npc_get_vnum0               }// [return lua number]
  438.  
  439.             { "is_available0",                      npc_is_available0           }// [return lua boolean]
  440. #endif
  441.  
  442.             { NULL,                                 NULL                        }
  443.         };
  444.  
  445.         CQuestManager::instance().AddLuaFunctionTable("npc", npc_functions);
  446.     }
  447. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement