- 0
-
-
Flux d'Activité
-
-
6
problème de connexion à mon serveur local (je suis débutant dans ce genre d'entreprise )
Salut, si ton serveur démarre correctement mais que ton client reste sur « erreur lors de la connexion au serveur », je regarderais d’abord la partie IP/ports. Si ton serveur tourne dans une VM, vérifie que l’IP renseignée dans ton serverinfo.py correspond bien à l’IP de la VM et pas forcément à 127.0.0.1. Vérifie aussi que les ports indiqués côté client correspondent bien à ceux de tes CONFIG (auth + channels). Regarde également les syserr/syslog du serveur au moment où tu essayes de te connecter, ainsi que le syserr du client, ça permettra de voir si la connexion arrive jusqu’au serveur ou non. Si tu peux, poste ton serverinfo.py, les ports de tes CONFIG et les dernières lignes du syserr après une tentative de connexion. On pourra sûrement repérer rapidement ce qui bloque. -
2
problème de lancement serveur
Salut, d’après ta capture les connexions MySQL ont l’air de fonctionner : PLAYER, ACCOUNT, COMMON et HOTBACKUP passent en Success. Donc à première vue ce n’est pas ton IP qui empêche les channels de démarrer. Le process semble plutôt s’arrêter juste après, au moment du chargement des protos, puisqu’on voit item_proto_test.txt juste avant le retour au shell. Regarde surtout le fichier syserr du channel qui ne démarre pas, par exemple dans le dossier channel1/core1 ou équivalent, et poste les dernières lignes. Vérifie aussi que item_proto_test.txt est bien présent, au bon emplacement et compatible avec tes sources/files 2016. Si les files et les sources ne correspondent pas exactement, une différence dans le format de l’item_proto peut aussi faire fermer le game au démarrage. Envoie le syserr, ce sera beaucoup plus simple pour identifier l’erreur exacte. -
26
Metin2 40250 / 2014 Serverfiles + Client + SRC [ 15 Langues ]
Merci beaucoup pour les files -
9
-
0
[PVM/PVP] ATLAX2 - EASY PLAY
ATLAX L’ESSENCE CLASSIQUE DE METIN2, PRÉPARÉE POUR UNE NOUVELLE GÉNÉRATION. NIVEAU 120 • CHAMPION 30 • YOHARA INTERNATIONAL • SANS PAY-TO-WIN ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SERVEUR EN LIGNE Ouvert officiellement depuis le 31 juillet 2026 SITE WEB https://atlax2.com/ PRÉSENTATION COMPLÈTE https://welcome.atlax2.com/ DISCORD https://discord.com/invite/rd62BJC6Yj ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BIENVENUE SUR ATLAX ATLAX a été conçu pour offrir une expérience Metin2 équilibrée, authentique et durable, inspirée de l’essence classique du jeu tout en profitant des améliorations modernes. Que vous soyez un ancien joueur de Metin2 ou que vous recherchiez simplement une nouvelle aventure à long terme, ATLAX vous propose une progression basée sur votre activité, votre connaissance du jeu et votre investissement. Aucun Pay-to-Win. Commencez votre aventure au niveau 1, progressez jusqu’au niveau 120, débloquez le Champion 30 et découvrez les terres de Yohara. De nouveaux systèmes, des défis élémentaires, la Volonté Sung Ma et un véritable contenu end-game vous attendent. GUERRIER • NINJA • SURA • CHAMANE • LYCAN ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SERVEUR INTERNATIONAL ATLAX accueille des joueurs du monde entier. Português • English • Français • Español Deutsch • Italiano • Türkçe ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ COMMENCEZ VOTRE AVENTURE Chaque joueur commence avec un équipement équilibré permettant de rendre le début du jeu plus agréable sans supprimer le plaisir de la progression. ÉQUIPEMENT DE DÉPART • Arme niveau 1 +9 • Armure, accessoires et chaussures +9 • Cheval armé — Niveau 11 • Monture de départ • Familier de départ • Costume et coiffure temporaires • Coffre d’apprenti • Langues en M1 • Appel du cheval au niveau 10 PROGRESSION DÉBUTANT AMÉLIORÉE • Armes gratuites tous les 10 niveaux jusqu’au niveau 70 • Missions de chasse améliorées • Objectifs plus clairs • Meilleures récompenses • Progression plus fluide • Moins d’attente inutile ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ PROGRESSION & SYSTÈMES MISSIONS DU BIOLOGISTE Les missions du Biologiste vous accompagnent du niveau 30 jusqu’au Champion 30. Elles permettent d’obtenir des bonus permanents importants : • Valeur d’attaque et Défense • PV maximum • Dégâts et Résistance contre les Boss • Force contre les pierres Metin • Dégâts de compétence • Dégâts moyens • Résistance contre toutes les classes • Puissance élémentaire • Valeurs de Volonté Sung Ma SYSTÈMES PRINCIPAUX • Progression du cheval jusqu’au niveau 40 • 6e et 7e bonus • Alchimie des Pierres-Dragon améliorée • Raffinage automatique • Talismans et puissance élémentaire • Système de titres • Effets de set permanents • Reliques d’âme • Familiers évolutifs • Système Aura • Écharpes d’épaule • Pierres spirituelles pour chaussures • World Boss toutes les 8 heures ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ CONFORT DE JEU ATLAX conserve l’identité de Metin2 tout en réduisant les tâches répétitives grâce à plusieurs fonctionnalités modernes. • Inventaire avancé divisé par catégories • Barre de compétences étendue • Auto-Chasse configurable • Filtre de butin • Système de courrier • Recherche de boutiques intégrée • Map de commerce réorganisée • Aperçu des coffres • Ouverture multiple de coffres • Vente rapide de plusieurs objets • Démantèlement rapide d’équipement • Anti-EXP • Informations détaillées des donjons • Aperçu direct des drops • Wiki intégré • Aperçu 3D des costumes, familiers et montures • Taille du texte ajustable • Code PIN de sécurité RACCOURCIS F8 — Biologiste F9 — Wiki K — Auto-Chasse P — Familier ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ MAPS & EXPLORATION Votre aventure commence dans les terres classiques de Metin2 avant de vous conduire vers des régions beaucoup plus dangereuses. ANCIEN CONTINENT Seungryong Valley • Temple Hwang • Mont Sohan Désert Yongbi • Doyyumhwan • Forêt Fantôme Forêt Rouge • Grottes des Araignées • Grotte de l’Exil NIVEAUX 90 — 120 Cape Dragon Fire • Baie de Nephrite Montagnes du Tonnerre • Falaise Gautama Temple Ochao • Forêt Enchantée MONDE ÉLÉMENTAIRE Domaine Élémentaire de la Foudre Domaine Élémentaire du Feu Domaine Élémentaire des Ténèbres Plateau des Forces Anciennes ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ YOHARA Atteindre le système Champion ouvre un tout nouveau chapitre de votre aventure. Explorez Yohara, développez votre Volonté Sung Ma et préparez-vous à affronter certains des contenus les plus avancés d’ATLAX. • Forteresse Abandonnée • Plaine de Dong Gwang • Terres Désolées de Seo Gwang • Gouffre de Nam Gwang • Passage de Yilad • Ravin du Vent du Nord • Gorge des Âmes • Temple du Serpent De nouvelles maps et de nouveaux contenus Yohara continueront d’être ajoutés au fur et à mesure de l’évolution d’ATLAX. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ DONJONS ZODIAQUE Niveau 20+ TOUR DES DÉMONS Niveau 40+ ANTRE DE LA BARONNE ARAIGNÉE Niveau 50+ CATACOMBES DU DIABLE Niveau 75+ DRAGON BERAN-SETAOU Niveau 75+ REPAIRE DE MELEY Niveau 75+ / 90+ DÉFENSE DU NAVIRE Niveau 90+ EREBUS Niveau 95+ FORTERESSE DU DRAGON ROUGE Niveau 100+ TOUR DE NEMERE Niveau 100+ PLATEAU DE L’ILLUSION Niveau 110+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ FAILLES TEMPORELLES & ÉVEIL À partir du niveau 110, des défis familiers reviennent dans des versions plus difficiles avec des ennemis renforcés et des récompenses avancées. DONJONS DE YOHARA • Tour Sung Mahi • Profondeurs du Vent du Nord • Temple du Serpent ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ CONTENU DE GUILDE Rassemblez les membres de votre guilde et entrez dans le PALAIS DU ROI DRAGON À mesure que votre guilde progresse, de nouveaux Boss deviennent disponibles. AKZADUR Guilde Niveau 21+ NAFAROTH Guilde Niveau 24+ EXEDYAR Guilde Niveau 27+ RUILITH Guilde Niveau 30+ TYOLDURAN Guilde Niveau 35+ Préparation, coordination et maîtrise des puissances élémentaires seront indispensables. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ÉVÉNEMENTS & ACTIVITÉS AU MOINS UN ÉVÉNEMENT ACTIF CHAQUE JOUR • World Boss • Jeu de cartes Okey • Attrapez le Roi • Yut Nori • Trio de Monstres • Duel du Voyant • Rituel du Sang • Puzzle de Pêche • Flower Power • Boss Reaper • Chasse au Trésor • Fièvre des Metins • Otherworld • Événements de Noël • Événements de Pâques • Événements du Ramadan • Tournois PvP • Événements communautaires Tous les événements programmés sont visibles directement dans le Calendrier d’Événements en jeu. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ UN SERVEUR CONSTRUIT AVEC SA COMMUNAUTÉ ATLAX est conçu comme un projet à long terme. De nouveaux contenus, systèmes, événements et améliorations seront régulièrement ajoutés. Des sondages seront également organisés afin que les suggestions et les retours de la communauté participent réellement à l’évolution du serveur. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ÊTES-VOUS PRÊT À COMMENCER ? ATLAX EST EN LIGNE SITE WEB https://atlax2.com/ PRÉSENTATION https://welcome.atlax2.com/ REJOINDRE LE DISCORD https://discord.com/invite/rd62BJC6Yj ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ATLAX LA LÉGENDE COMMENCE AVEC VOUS. -
2
problème de lancement serveur
Wow ! Tu déterres des reliques qui devraient rester enfouis ! Sinon, quand tu est rendu a l'étape comme sur ton screenshot, si tu fais la commande ps est ce que le serveur est lancé ? L'ip que tu dois configurer dans ton fichier serverinfo.py c'est l'ip de ta machine que tu peux avoir en utilisant la commande ifconfig -
6
problème de connexion à mon serveur local (je suis débutant dans ce genre d'entreprise )
Bonjour j'ai le même soucis je n'arrive pas a le réglé -
32
-

Question
MacDonarty 10
Bonjour à tous !
Aujourd'hui j'essaye d'installer un système sur mon serveur. Cependant lorsque je me décide de compilé j'ai cette erreur la :
questlua_global.cpp: In function 'int quest::_mysql_direct_query(lua_State*)':
questlua_global.cpp:1348: error: 'DBManager' has not been declared
gmake: *** [OBJDIR/questlua_global.o] Error 1
Voila le fichier :
#include "stdafx.h" #include #include "constants.h" #include "char.h" #include "char_manager.h" #include "log.h" #include "questmanager.h" #include "questlua.h" #include "questevent.h" #include "config.h" #include "mining.h" #include "fishing.h" #include "priv_manager.h" #include "utils.h" #include "p2p.h" #include "item_manager.h" #include "mob_manager.h" #include "start_position.h" #include "over9refine.h" #include "OXEvent.h" #include "regen.h" #include "cmd.h" #include "guild.h" #include "guild_manager.h" #include "sectree_manager.h" #undef sys_err #ifndef __WIN32__ #define sys_err(fmt, args...) quest::CQuestManager::instance().QuestError(__FUNCTION__, __LINE__, fmt, ##args) #else #define sys_err(fmt, ...) quest::CQuestManager::instance().QuestError(__FUNCTION__, __LINE__, fmt, __VA_ARGS__) #endif extern ACMD(do_block_chat); namespace quest { int _get_locale(lua_State* L) { lua_pushstring(L, g_stLocale.c_str()); return 1; } int _number(lua_State* L) { if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2)) lua_pushnumber(L, 0); else lua_pushnumber(L, number((int)lua_tonumber(L, 1), (int)lua_tonumber(L, 2))); return 1; } int _time_to_str(lua_State* L) { time_t curTime = (time_t)lua_tonumber(L, -1); lua_pushstring(L, asctime(gmtime(&curTime))); return 1; } int _say(lua_State* L) { ostringstream s; combine_lua_string(L, s); CQuestManager::Instance().AddScript(s.str() + "[ENTER]"); return 0; } int _chat(lua_State* L) { ostringstream s; combine_lua_string(L, s); CQuestManager::Instance().GetCurrentCharacterPtr()->ChatPacket(CHAT_TYPE_TALKING, "%s", s.str().c_str()); return 0; } int _cmdchat(lua_State* L) { ostringstream s; combine_lua_string(L, s); CQuestManager::Instance().GetCurrentCharacterPtr()->ChatPacket(CHAT_TYPE_COMMAND, "%s", s.str().c_str()); return 0; } int _syschat(lua_State* L) { ostringstream s; combine_lua_string(L, s); CQuestManager::Instance().GetCurrentCharacterPtr()->ChatPacket(CHAT_TYPE_INFO, "%s", s.str().c_str()); return 0; } int _notice(lua_State* L) { ostringstream s; combine_lua_string(L, s); CQuestManager::Instance().GetCurrentCharacterPtr()->ChatPacket(CHAT_TYPE_NOTICE, "%s", s.str().c_str()); return 0; } int _left_image(lua_State* L) { if (lua_isstring(L, -1)) { string s = lua_tostring(L,-1); CQuestManager::Instance().AddScript("[leftIMAGE src;"+s+"]"); } return 0; } int _top_image(lua_State* L) { if (lua_isstring(L, -1)) { string s = lua_tostring(L,-1); CQuestManager::Instance().AddScript("[TOPIMAGE src;"+s+"]"); } return 0; } int _set_skin(lua_State* L) // Quest UI style { if (lua_isnumber(L, -1)) { CQuestManager::Instance().SetSkinStyle((int)rint(lua_tonumber(L,-1))); } else { sys_err("QUEST wrong skin index"); } return 0; } int _set_server_timer(lua_State* L) { int n = lua_gettop(L); if ((n != 2 || !lua_isnumber(L, 2) || !lua_isstring(L, 1)) && (n != 3 || !lua_isstring(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3))) { sys_err("QUEST set_server_timer argument count wrong."); return 0; } const char * name = lua_tostring(L, 1); double t = lua_tonumber(L, 2); DWORD arg = 0; CQuestManager & q = CQuestManager::instance(); if (lua_isnumber(L, 3)) arg = (DWORD) lua_tonumber(L, 3); int timernpc = q.LoadTimerScript(name); LPEVENT event = quest_create_server_timer_event(name, t, timernpc, false, arg); q.AddServerTimer(name, arg, event); return 0; } int _set_server_loop_timer(lua_State* L) { int n = lua_gettop(L); if ((n != 2 || !lua_isnumber(L, 2) || !lua_isstring(L, 1)) && (n != 3 || !lua_isstring(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3))) { sys_err("QUEST set_server_timer argument count wrong."); return 0; } const char * name = lua_tostring(L, 1); double t = lua_tonumber(L, 2); DWORD arg = 0; CQuestManager & q = CQuestManager::instance(); if (lua_isnumber(L, 3)) arg = (DWORD) lua_tonumber(L, 3); int timernpc = q.LoadTimerScript(name); LPEVENT event = quest_create_server_timer_event(name, t, timernpc, true, arg); q.AddServerTimer(name, arg, event); return 0; } int _clear_server_timer(lua_State* L) { CQuestManager & q = CQuestManager::instance(); const char * name = lua_tostring(L, 1); DWORD arg = (DWORD) lua_tonumber(L, 2); q.ClearServerTimer(name, arg); return 0; } int _set_named_loop_timer(lua_State* L) { int n = lua_gettop(L); if (n != 2 || !lua_isnumber(L, -1) || !lua_isstring(L, -2)) sys_err("QUEST set_timer argument count wrong."); else { const char * name = lua_tostring(L, -2); double t = lua_tonumber(L, -1); CQuestManager & q = CQuestManager::instance(); int timernpc = q.LoadTimerScript(name); q.GetCurrentPC()->AddTimer(name, quest_create_timer_event(name, q.GetCurrentCharacterPtr()->GetPlayerID(), t, timernpc, true)); } return 0; } int _get_server_timer_arg(lua_State* L) { lua_pushnumber(L, CQuestManager::instance().GetServerTimerArg()); return 1; } int _set_timer(lua_State* L) { if (lua_gettop(L) != 1 || !lua_isnumber(L, -1)) sys_err("QUEST invalid argument."); else { double t = lua_tonumber(L, -1); CQuestManager& q = CQuestManager::instance(); quest_create_timer_event("", q.GetCurrentCharacterPtr()->GetPlayerID(), t); } return 0; } int _set_named_timer(lua_State* L) { int n = lua_gettop(L); if (n != 2 || !lua_isnumber(L, -1) || !lua_isstring(L, -2)) { sys_err("QUEST set_timer argument count wrong."); } else { const char * name = lua_tostring(L,-2); double t = lua_tonumber(L, -1); CQuestManager & q = CQuestManager::instance(); int timernpc = q.LoadTimerScript(name); q.GetCurrentPC()->AddTimer(name, quest_create_timer_event(name, q.GetCurrentCharacterPtr()->GetPlayerID(), t, timernpc)); } return 0; } int _timer(lua_State * L) { if (lua_gettop(L) == 1) return _set_timer(L); else return _set_named_timer(L); } int _clear_named_timer(lua_State* L) { int n = lua_gettop(L); if (n != 1 || !lua_isstring(L, -1)) sys_err("QUEST set_timer argument count wrong."); else { CQuestManager & q = CQuestManager::instance(); q.GetCurrentPC()->RemoveTimer(lua_tostring(L, -1)); } return 0; } int _getnpcid(lua_State * L) { const char * name = lua_tostring(L, -1); CQuestManager & q = CQuestManager::instance(); lua_pushnumber(L, q.FindNPCIDByName(name)); return 1; } int _is_test_server(lua_State * L) { lua_pushboolean(L, test_server); return 1; } int _is_speed_server(lua_State * L) { lua_pushboolean(L, speed_server); return 1; } int _raw_script(lua_State* L) { if ( test_server ) sys_log ( 0, "_raw_script : %s ", lua_tostring(L,-1)); if (lua_isstring(L, -1)) CQuestManager::Instance().AddScript(lua_tostring(L,-1)); else sys_err("QUEST wrong argument: questname: %s", CQuestManager::instance().GetCurrentQuestName().c_str()); return 0; } int _char_log(lua_State * L) { CQuestManager& q = CQuestManager::instance(); LPCHARACTER ch = q.GetCurrentCharacterPtr(); DWORD what = 0; const char* how = ""; const char* hint = ""; if (lua_isnumber(L, 1)) what = (DWORD)lua_tonumber(L, 1); if (lua_isstring(L, 2)) how = lua_tostring(L, 2); if (lua_tostring(L, 3)) hint = lua_tostring(L, 3); LogManager::instance().CharLog(ch, what, how, hint); return 0; } int _item_log(lua_State* L) { CQuestManager& q = CQuestManager::instance(); LPCHARACTER ch = q.GetCurrentCharacterPtr(); DWORD dwItemID = 0; const char* how = ""; const char* hint = ""; if ( lua_isnumber(L, 1) ) dwItemID = (DWORD)lua_tonumber(L, 1); if ( lua_isstring(L, 2) ) how = lua_tostring(L, 2); if ( lua_tostring(L, 3) ) hint = lua_tostring(L, 3); LPITEM item = ITEM_MANAGER::instance().Find(dwItemID); if (item) LogManager::instance().ItemLog(ch, item, how, hint); return 0; } int _syslog(lua_State* L) { if (!lua_isnumber(L, 1) || !lua_isstring(L, 2)) return 0; if (lua_tonumber(L, 1) >= 1) { if (!test_server) return 0; } PC* pc = CQuestManager::instance().GetCurrentPC(); if (!pc) return 0; LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (!ch) return 0; sys_log(0, "QUEST: quest: %s player: %s : %s", pc->GetCurrentQuestName().c_str(), ch->GetName(), lua_tostring(L, 2)); if (true == test_server) { ch->ChatPacket(CHAT_TYPE_INFO, "QUEST_SYSLOG %s", lua_tostring(L, 2)); } return 0; } int _syserr(lua_State* L) { if (!lua_isstring(L, 1)) return 0; PC* pc = CQuestManager::instance().GetCurrentPC(); if (!pc) return 0; LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (!ch) return 0; sys_err("QUEST: quest: %s player: %s : %s", pc->GetCurrentQuestName().c_str(), ch->GetName(), lua_tostring(L, 1)); ch->ChatPacket(CHAT_TYPE_INFO, "QUEST_SYSERR %s", lua_tostring(L, 1)); return 0; } // LUA_ADD_BGM_INFO int _set_bgm_volume_enable(lua_State* L) { CHARACTER_SetBGMVolumeEnable(); return 0; } int _add_bgm_info(lua_State* L) { if (!lua_isnumber(L, 1) || !lua_isstring(L, 2)) return 0; int mapIndex = (int)lua_tonumber(L, 1); const char* bgmName = lua_tostring(L, 2); if (!bgmName) return 0; float bgmVol = lua_isnumber(L, 3) ? lua_tonumber(L, 3) : (1.0f/5.0f)*0.1f; CHARACTER_AddBGMInfo(mapIndex, bgmName, bgmVol); return 0; } // END_OF_LUA_ADD_BGM_INFO // LUA_ADD_GOTO_INFO int _add_goto_info(lua_State* L) { const char* name = lua_tostring(L, 1); int empire = (int)lua_tonumber(L, 2); int mapIndex = (int)lua_tonumber(L, 3); int x = (int)lua_tonumber(L, 4); int y = (int)lua_tonumber(L, 5); if (!name) return 0; CHARACTER_AddGotoInfo(name, empire, mapIndex, x, y); return 0; } // END_OF_LUA_ADD_GOTO_INFO // REFINE_PICK int _refine_pick(lua_State* L) { BYTE bCell = (BYTE) lua_tonumber(L,-1); CQuestManager& q = CQuestManager::instance(); LPCHARACTER ch = q.GetCurrentCharacterPtr(); LPITEM item = ch->GetInventoryItem(bCell); int ret = mining::RealRefinePick(ch, item); lua_pushnumber(L, ret); return 1; } // END_OF_REFINE_PICK int _fish_real_refine_rod(lua_State* L) { BYTE bCell = (BYTE) lua_tonumber(L,-1); CQuestManager& q = CQuestManager::instance(); LPCHARACTER ch = q.GetCurrentCharacterPtr(); LPITEM item = ch->GetInventoryItem(bCell); int ret = fishing::RealRefineRod(ch, item); lua_pushnumber(L, ret); return 1; } int _give_char_privilege(lua_State* L) { int pid = CQuestManager::instance().GetCurrentCharacterPtr()->GetPlayerID(); int type = (int)lua_tonumber(L, 1); int value = (int)lua_tonumber(L, 2); if (MAX_PRIV_NUM <= type) { sys_err("PRIV_MANAGER: _give_char_privilege: wrong empire priv type(%u)", type); return 0; } CPrivManager::instance().RequestGiveCharacterPriv(pid, type, value); return 0; } int _give_empire_privilege(lua_State* L) { int empire = (int)lua_tonumber(L,1); int type = (int)lua_tonumber(L, 2); int value = (int)lua_tonumber(L, 3); int time = (int) lua_tonumber(L,4); LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (MAX_PRIV_NUM <= type) { sys_err("PRIV_MANAGER: _give_empire_privilege: wrong empire priv type(%u)", type); return 0; } if (ch) sys_log(0, "_give_empire_privileage(empire=%d, type=%d, value=%d, time=%d), by quest, %s", empire, type, value, time, ch->GetName()); else sys_log(0, "_give_empire_privileage(empire=%d, type=%d, value=%d, time=%d), by quest, NULL", empire, type, value, time); CPrivManager::instance().RequestGiveEmpirePriv(empire, type, value, time); return 0; } int _give_guild_privilege(lua_State* L) { int guild_id = (int)lua_tonumber(L,1); int type = (int)lua_tonumber(L, 2); int value = (int)lua_tonumber(L, 3); int time = (int)lua_tonumber( L, 4 ); if (MAX_PRIV_NUM <= type) { sys_err("PRIV_MANAGER: _give_guild_privilege: wrong empire priv type(%u)", type); return 0; } sys_log(0, "_give_guild_privileage(empire=%d, type=%d, value=%d, time=%d)", guild_id, type, value, time); CPrivManager::instance().RequestGiveGuildPriv(guild_id,type,value,time); return 0; } int _get_empire_privilege_string(lua_State* L) { int empire = (int) lua_tonumber(L, 1); ostringstream os; bool found = false; for (int type = PRIV_NONE + 1; type < MAX_PRIV_NUM; ++type) { CPrivManager::SPrivEmpireData* pkPrivEmpireData = CPrivManager::instance().GetPrivByEmpireEx(empire, type); if (pkPrivEmpireData && pkPrivEmpireData->m_value) { if (found) os << ", "; os << LC_TEXT(c_apszPrivNames[type]) << " : " << pkPrivEmpireData->m_value << "%" << " (" << ((pkPrivEmpireData->m_end_time_sec-get_global_time())/3600.0f) << " hours)" << endl; found = true; } } if (!found) os << "None!" << endl; lua_pushstring(L, os.str().c_str()); return 1; } int _get_empire_privilege(lua_State* L) { if (!lua_isnumber(L,1) || !lua_isnumber(L,2)) { lua_pushnumber(L,0); return 1; } int empire = (int)lua_tonumber(L,1); int type = (int)lua_tonumber(L,2); int value = CPrivManager::instance().GetPrivByEmpire(empire,type); lua_pushnumber(L, value); return 1; } int _get_guild_privilege_string(lua_State* L) { int guild = (int) lua_tonumber(L,1); ostringstream os; bool found = false; for (int type = PRIV_NONE+1; type < MAX_PRIV_NUM; ++type) { const CPrivManager::SPrivGuildData* pPrivGuildData = CPrivManager::instance().GetPrivByGuildEx( guild, type ); if (pPrivGuildData && pPrivGuildData->value) { if (found) os << ", "; os << LC_TEXT(c_apszPrivNames[type]) << " : " << pPrivGuildData->value << "%" << " (" << ((pPrivGuildData->end_time_sec - get_global_time()) / 3600.0f) << " hours)" << endl; found = true; } } if (!found) os << "None!" << endl; lua_pushstring(L, os.str().c_str()); return 1; } int _get_guildid_byname( lua_State* L ) { if ( !lua_isstring( L, 1 ) ) { sys_err( "_get_guildid_byname() - invalud argument" ); lua_pushnumber( L, 0 ); return 1; } const char* pszGuildName = lua_tostring( L, 1 ); CGuild* pFindGuild = CGuildManager::instance().FindGuildByName( pszGuildName ); if ( pFindGuild ) lua_pushnumber( L, pFindGuild->GetID() ); else lua_pushnumber( L, 0 ); return 1; } int _get_guild_privilege(lua_State* L) { if (!lua_isnumber(L,1) || !lua_isnumber(L,2)) { lua_pushnumber(L,0); return 1; } int guild = (int)lua_tonumber(L,1); int type = (int)lua_tonumber(L,2); int value = CPrivManager::instance().GetPrivByGuild(guild,type); lua_pushnumber(L, value); return 1; } int _item_name(lua_State* L) { if (lua_isnumber(L,1)) { DWORD dwVnum = (DWORD)lua_tonumber(L,1); TItemTable* pTable = ITEM_MANAGER::instance().GetTable(dwVnum); if (pTable) lua_pushstring(L,pTable->szLocaleName); else lua_pushstring(L,""); } else lua_pushstring(L,""); return 1; } int _mob_name(lua_State* L) { if (lua_isnumber(L, 1)) { DWORD dwVnum = (DWORD) lua_tonumber(L,1); const CMob * pkMob = CMobManager::instance().Get(dwVnum); if (pkMob) lua_pushstring(L, pkMob->m_table.szLocaleName); else lua_pushstring(L, ""); } else lua_pushstring(L,""); return 1; } int _mob_vnum(lua_State* L) { if (lua_isstring(L,1)) { const char* str = lua_tostring(L, 1); const CMob* pkMob = CMobManager::instance().Get(str, false); if (pkMob) lua_pushnumber(L,pkMob->m_table.dwVnum); else lua_pushnumber(L,0); } else lua_pushnumber(L,0); return 1; } int _get_global_time(lua_State* L) { lua_pushnumber(L, get_global_time()); return 1; } int _get_channel_id(lua_State* L) { lua_pushnumber(L, g_bChannel); return 1; } int _do_command(lua_State* L) { if (!lua_isstring(L, 1)) return 0; const char * str = lua_tostring(L, 1); size_t len = strlen(str); LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); ::interpret_command(ch, str, len); return 0; } int _find_pc(lua_State* L) { if (!lua_isstring(L, 1)) { sys_err("invalid argument"); lua_pushnumber(L, 0); return 1; } const char * name = lua_tostring(L, 1); LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(name); lua_pushnumber(L, tch ? tch->GetVID() : 0); return 1; } int _find_pc_cond(lua_State* L) { if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2) || !lua_isnumber(L, 3)) { sys_err("invalid argument"); lua_pushnumber(L, 0); return 1; } int iMinLev = (int) lua_tonumber(L, 1); int iMaxLev = (int) lua_tonumber(L, 2); unsigned int uiJobFlag = (unsigned int) lua_tonumber(L, 3); LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); LPCHARACTER tch; if (test_server) { sys_log(0, "find_pc_cond map=%d, job=%d, level=%d~%d", ch->GetMapIndex(), uiJobFlag, iMinLev, iMaxLev); } tch = CHARACTER_MANAGER::instance().FindSpecifyPC(uiJobFlag, ch->GetMapIndex(), ch, iMinLev, iMaxLev); lua_pushnumber(L, tch ? tch->GetVID() : 0); return 1; } int _find_npc_by_vnum(lua_State* L) { if (!lua_isnumber(L, 1)) { sys_err("invalid argument"); lua_pushnumber(L, 0); return 1; } DWORD race = (DWORD) lua_tonumber(L, 1); CharacterVectorInteractor i; if (CHARACTER_MANAGER::instance().GetCharactersByRaceNum(race, i)) { CharacterVectorInteractor::iterator it = i.begin(); while (it != i.end()) { LPCHARACTER tch = *(it++); if (tch->GetMapIndex() == CQuestManager::instance().GetCurrentCharacterPtr()->GetMapIndex()) { lua_pushnumber(L, tch->GetVID()); return 1; } } } //sys_err("not find(race=%d)", race); lua_pushnumber(L, 0); return 1; } // 새로운 state를 만든다. int _set_quest_state(lua_State* L) { if (!lua_isstring(L, 1) || !lua_isstring(L, 2)) return 0; CQuestManager& q = CQuestManager::instance(); QuestState * pqs = q.GetCurrentState(); PC* pPC = q.GetCurrentPC(); //assert(L == pqs->co); if (L!=pqs->co) { luaL_error(L, "running thread != current thread???"); sys_log(0,"running thread != current thread???"); return -1; } if (pPC) { //const char* szQuestName = lua_tostring(L, 1); //const char* szStateName = lua_tostring(L, 2); const string stQuestName(lua_tostring(L, 1)); const string stStateName(lua_tostring(L, 2)); if ( test_server ) sys_log(0,"set_state %s %s ", stQuestName.c_str(), stStateName.c_str() ); if (pPC->GetCurrentQuestName() == stQuestName) { pqs->st = q.GetQuestStateIndex(pPC->GetCurrentQuestName(), lua_tostring(L, -1)); pPC->SetCurrentQuestStateName(lua_tostring(L,-1)); } else { pPC->SetQuestState(stQuestName, stStateName); } } return 0; } int _get_quest_state(lua_State* L) { if (!lua_isstring(L, 1) ) return 0; CQuestManager& q = CQuestManager::instance(); PC* pPC = q.GetCurrentPC(); if (pPC) { std::string stQuestName = lua_tostring(L, 1); stQuestName += ".__status"; int nRet = pPC->GetFlag( stQuestName.c_str() ); lua_pushnumber(L, nRet ); if ( test_server ) sys_log(0,"Get_quest_state name %s value %d", stQuestName.c_str(), nRet ); } else { if ( test_server ) sys_log(0,"PC == 0 "); lua_pushnumber(L, 0); } return 1; } int _under_han(lua_State* L) { if (!lua_isstring(L, 1)) lua_pushboolean(L, 0); else lua_pushboolean(L, under_han(lua_tostring(L, 1))); return 1; } int _notice_all( lua_State* L ) { ostringstream s; combine_lua_string(L, s); TPacketGGNotice p; p.bHeader = HEADER_GG_NOTICE; p.lSize = strlen(s.str().c_str()) + 1; TEMP_BUFFER buf; buf.write(&p, sizeof(p)); buf.write(s.str().c_str(), p.lSize); P2P_MANAGER::instance().Send(buf.read_peek(), buf.size()); // HEADER_GG_NOTICE SendNotice(s.str().c_str()); return 1; } EVENTINFO(warp_all_to_village_event_info) { DWORD dwWarpMapIndex; warp_all_to_village_event_info() : dwWarpMapIndex( 0 ) { } }; struct FWarpAllToVillage { FWarpAllToVillage() {}; void operator()(LPENTITY ent) { if (ent->IsType(ENTITY_CHARACTER)) { LPCHARACTER ch = (LPCHARACTER) ent; if (ch->IsPC()) { BYTE bEmpire = ch->GetEmpire(); if ( bEmpire == 0 ) { sys_err( "Unkonwn Empire %s %d ", ch->GetName(), ch->GetPlayerID() ); return; } ch->WarpSet( g_start_position[bEmpire][0], g_start_position[bEmpire][1] ); } } } }; EVENTFUNC(warp_all_to_village_event) { warp_all_to_village_event_info * info = dynamic_cast(event->info); if ( info == NULL ) { sys_err( "warp_all_to_village_event> Null pointer" ); return 0; } LPSECTREE_MAP pSecMap = SECTREE_MANAGER::instance().GetMap( info->dwWarpMapIndex ); if (NULL != pSecMap) { FWarpAllToVillage f; pSecMap->for_each( f ); } return 0; } int _warp_all_to_village( lua_State * L ) { int iMapIndex = static_cast(lua_tonumber(L, 1)); int iSec = static_cast(lua_tonumber(L, 2)); warp_all_to_village_event_info* info = AllocEventInfo(); info->dwWarpMapIndex = iMapIndex; event_create(warp_all_to_village_event, info, PASSES_PER_SEC(iSec)); SendNoticeMap(LC_TEXT("잠시후 모두 마을로 이동됩니다."), iMapIndex, false); return 0; } int _warp_to_village( lua_State * L ) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (NULL != ch) { BYTE bEmpire = ch->GetEmpire(); ch->WarpSet( g_start_position[bEmpire][0], g_start_position[bEmpire][1] ); } return 0; } int _say_in_map( lua_State * L ) { int iMapIndex = static_cast(lua_tonumber( L, 1 )); std::string Script(lua_tostring( L, 2 )); Script += "[ENTER]"; Script += "[DONE]"; struct ::packet_script packet_script; packet_script.header = HEADER_GC_SCRIPT; packet_script.skin = CQuestManager::QUEST_SKIN_NORMAL; packet_script.src_size = Script.size(); packet_script.size = packet_script.src_size + sizeof(struct packet_script); FSendPacket f; f.buf.write(&packet_script, sizeof(struct packet_script)); f.buf.write(&Script[0], Script.size()); LPSECTREE_MAP pSecMap = SECTREE_MANAGER::instance().GetMap( iMapIndex ); if ( pSecMap ) { pSecMap->for_each( f ); } return 0; } struct FKillSectree2 { void operator () (LPENTITY ent) { if (ent->IsType(ENTITY_CHARACTER)) { LPCHARACTER ch = (LPCHARACTER) ent; #ifdef NEW_PET_SYSTEM if (!ch->IsPC() && !ch->IsPet() && !ch->IsNewPet()) #else if (!ch->IsPC() && !ch->IsPet()) #endif ch->Dead(); } } }; int _kill_all_in_map ( lua_State * L ) { LPSECTREE_MAP pSecMap = SECTREE_MANAGER::instance().GetMap( lua_tonumber(L,1) ); if (NULL != pSecMap) { FKillSectree2 f; pSecMap->for_each( f ); } return 0; } //주의: 몹 리젠이 안되는 맵에서만 사용 int _regen_in_map( lua_State * L ) { int iMapIndex = static_cast(lua_tonumber(L, 1)); std::string szFilename(lua_tostring(L, 2)); LPSECTREE_MAP pkMap = SECTREE_MANAGER::instance().GetMap(iMapIndex); if (pkMap != NULL) { regen_load_in_file( szFilename.c_str(), iMapIndex, pkMap->m_setting.iBaseX ,pkMap->m_setting.iBaseY ); } return 0; } int _enable_over9refine( lua_State* L ) { if ( lua_isnumber(L, 1) == true && lua_isnumber(L, 2) == true ) { DWORD dwVnumFrom = (DWORD)lua_tonumber(L, 1); DWORD dwVnumTo = (DWORD)lua_tonumber(L, 2); COver9RefineManager::instance().enableOver9Refine(dwVnumFrom, dwVnumTo); } return 0; } int _add_ox_quiz(lua_State* L) { int level = (int)lua_tonumber(L, 1); const char* quiz = lua_tostring(L, 2); bool answer = lua_toboolean(L, 3); if ( COXEventManager::instance().AddQuiz(level, quiz, answer) == false ) { sys_log(0, "OXEVENT : Cannot add quiz. %d %s %d", level, quiz, answer); } return 1; } EVENTFUNC(warp_all_to_map_my_empire_event) { warp_all_to_map_my_empire_event_info * info = dynamic_cast(event->info); if ( info == NULL ) { sys_err( "warp_all_to_map_my_empire_event> Null pointer" ); return 0; } LPSECTREE_MAP pSecMap = SECTREE_MANAGER::instance().GetMap( info->m_lMapIndexFrom ); if (pSecMap) { FWarpEmpire f; f.m_lMapIndexTo = info->m_lMapIndexTo; f.m_x = info->m_x; f.m_y = info->m_y; f.m_bEmpire = info->m_bEmpire; pSecMap->for_each(f); } return 0; } int _block_chat(lua_State* L) { LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr(); if (pChar != NULL) { if (lua_isstring(L, 1) != true && lua_isstring(L, 2) != true) { lua_pushboolean(L, false); return 1; } std::string strName(lua_tostring(L, 1)); std::string strTime(lua_tostring(L, 2)); std::string strArg = strName + " " + strTime; do_block_chat(pChar, const_cast(strArg.c_str()), 0, 0); lua_pushboolean(L, true); return 1; } lua_pushboolean(L, false); return 1; } int _spawn_mob(lua_State* L) { if( false == lua_isnumber(L, 1) || false == lua_isnumber(L, 2) || false == lua_isboolean(L, 3) ) { lua_pushnumber(L, 0); return 1; } const DWORD dwVnum = static_cast(lua_tonumber(L, 1)); const size_t count = MINMAX(1, static_cast(lua_tonumber(L, 2)), 10); const bool isAggresive = static_cast(lua_toboolean(L, 3)); size_t SpawnCount = 0; const CMob* pMonster = CMobManager::instance().Get( dwVnum ); if( NULL != pMonster ) { const LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr(); for( size_t i=0 ; i < count ; ++i ) { const LPCHARACTER pSpawnMonster = CHARACTER_MANAGER::instance().SpawnMobRange( dwVnum, pChar->GetMapIndex(), pChar->GetX() - number(200, 750), pChar->GetY() - number(200, 750), pChar->GetX() + number(200, 750), pChar->GetY() + number(200, 750), true, pMonster->m_table.bType == CHAR_TYPE_STONE, isAggresive ); if( NULL != pSpawnMonster ) { ++SpawnCount; } } sys_log(0, "QUEST Spawn Monstster: VNUM(%u) COUNT(%u) isAggresive(%b)", dwVnum, SpawnCount, isAggresive); } lua_pushnumber(L, SpawnCount); return 1; } int _notice_in_map( lua_State* L ) { const LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr(); if (NULL != pChar) { SendNoticeMap( lua_tostring(L,1), pChar->GetMapIndex(), lua_toboolean(L,2) ); } return 0; } int _get_locale_base_path( lua_State* L ) { lua_pushstring( L, LocaleService_GetBasePath().c_str() ); return 1; } struct FPurgeArea { int x1, y1, x2, y2; LPCHARACTER ExceptChar; FPurgeArea(int a, int b, int c, int d, LPCHARACTER p) : x1(a), y1(b), x2(c), y2(d), ExceptChar(p) {} void operator () (LPENTITY ent) { if (true == ent->IsType(ENTITY_CHARACTER)) { LPCHARACTER pChar = static_cast(ent); if (pChar == ExceptChar) return; #ifdef NEW_PET_SYSTEM if (!pChar->IsPet() && !pChar->IsNewPet() && (true == pChar->IsMonster() || true == pChar->IsStone())) #else if (!pChar->IsPet() && (true == pChar->IsMonster() || true == pChar->IsStone())) #endif { if (x1 <= pChar->GetX() && pChar->GetX() <= x2 && y1 <= pChar->GetY() && pChar->GetY() <= y2) { M2_DESTROY_CHARACTER(pChar); } } } } }; int _purge_area( lua_State* L ) { int x1 = lua_tonumber(L, 1); int y1 = lua_tonumber(L, 2); int x2 = lua_tonumber(L, 3); int y2 = lua_tonumber(L, 4); const int mapIndex = SECTREE_MANAGER::instance().GetMapIndex( x1, y1 ); if (0 == mapIndex) { sys_err("_purge_area: cannot get a map index with (%u, %u)", x1, y1); return 0; } LPSECTREE_MAP pSectree = SECTREE_MANAGER::instance().GetMap(mapIndex); if (NULL != pSectree) { FPurgeArea func(x1, y1, x2, y2, CQuestManager::instance().GetCurrentNPCCharacterPtr()); pSectree->for_each(func); } return 0; } struct FWarpAllInAreaToArea { int from_x1, from_y1, from_x2, from_y2; int to_x1, to_y1, to_x2, to_y2; size_t warpCount; FWarpAllInAreaToArea(int a, int b, int c, int d, int e, int f, int g, int h) : from_x1(a), from_y1(b), from_x2(c), from_y2(d), to_x1(e), to_y1(f), to_x2(g), to_y2(h), warpCount(0) {} void operator () (LPENTITY ent) { if (true == ent->IsType(ENTITY_CHARACTER)) { LPCHARACTER pChar = static_cast(ent); if (true == pChar->IsPC()) { if (from_x1 <= pChar->GetX() && pChar->GetX() <= from_x2 && from_y1 <= pChar->GetY() && pChar->GetY() <= from_y2) { ++warpCount; pChar->WarpSet( number(to_x1, to_x2), number(to_y1, to_y2) ); } } } } }; int _warp_all_in_area_to_area( lua_State* L ) { int from_x1 = lua_tonumber(L, 1); int from_y1 = lua_tonumber(L, 2); int from_x2 = lua_tonumber(L, 3); int from_y2 = lua_tonumber(L, 4); int to_x1 = lua_tonumber(L, 5); int to_y1 = lua_tonumber(L, 6); int to_x2 = lua_tonumber(L, 7); int to_y2 = lua_tonumber(L, 8); const int mapIndex = SECTREE_MANAGER::instance().GetMapIndex( from_x1, from_y1 ); if (0 == mapIndex) { sys_err("_warp_all_in_area_to_area: cannot get a map index with (%u, %u)", from_x1, from_y1); lua_pushnumber(L, 0); return 1; } LPSECTREE_MAP pSectree = SECTREE_MANAGER::instance().GetMap(mapIndex); if (NULL != pSectree) { FWarpAllInAreaToArea func(from_x1, from_y1, from_x2, from_y2, to_x1, to_y1, to_x2, to_y2); pSectree->for_each(func); lua_pushnumber(L, func.warpCount); sys_log(0, "_warp_all_in_area_to_area: %u character warp", func.warpCount); return 1; } else { lua_pushnumber(L, 0); sys_err("_warp_all_in_area_to_area: no sectree"); return 1; } } int _mysql_direct_query(lua_State* L) { // char szQuery[1024]; if (!lua_isstring(L, 1)) return 0; // strncpy(szQuery, lua_tostring(L, 1), sizeof(szQuery)); int i=0, m=1; MYSQL_ROW row; MYSQL_FIELD * field; MYSQL_RES * result; // SQLMsg * pMsg = DBManager::instance().DirectQuery(szQuery); std::auto_ptr pMsg(DBManager::instance().DirectQuery(lua_tostring(L, 1))); if (pMsg.get()) { // ret1 (number of affected rows) lua_pushnumber(L, pMsg->Get()->uiAffectedRows); //-1 if error such as duplicate occurs (-2147483648 via lua) // if wrong syntax error occurs (4294967295 via lua) // ret2 (table of affected rows) lua_newtable(L); if ((result = pMsg->Get()->pSQLResult) && !(pMsg->Get()->uiAffectedRows == 0 || pMsg->Get()->uiAffectedRows == (uint32_t)-1)) { // LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); // ch->ChatPacket(CHAT_TYPE_INFO, "<%s> Retrieved %u fields\n", __FUNCTION__, mysql_num_fields(result)); // ch->ChatPacket(CHAT_TYPE_INFO, "<%s> Retrieved %u rows\n", __FUNCTION__, mysql_num_rows(result)); // ch->ChatPacket(CHAT_TYPE_INFO, "<%s> Affected %u rows\n", __FUNCTION__, pMsg->Get()->uiAffectedRows); // ch->ChatPacket(CHAT_TYPE_INFO, "<%s> Num %u rows\n", __FUNCTION__, pMsg->Get()->uiNumRows); while((row = mysql_fetch_row(result))) { lua_pushnumber(L, m); lua_newtable(L); while((field = mysql_fetch_field(result))) { lua_pushstring(L, field->name); if (!(field->flags & NOT_NULL_FLAG) && (row[i]==NULL)) { // lua_pushstring(L, "NULL"); lua_pushnil(L); } else if (IS_NUM(field->type)) { double val = NAN; lua_pushnumber(L, (sscanf(row[i],"%lf",&val)==1)?val:NAN); } else if (field->type == MYSQL_TYPE_BLOB) { lua_newtable(L); for (DWORD iBlob=0; iBlob < field->max_length; iBlob++) { lua_pushnumber(L, row[i][iBlob]); lua_rawseti(L, -2, iBlob+1); } } else lua_pushstring(L, row[i]); // LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); // ch->ChatPacket(CHAT_TYPE_INFO, "<%s> Retrieved %d flag %s for %s\n", __FUNCTION__, field->type, field->name, row[i]?row[i]:"NULL"); lua_rawset(L, -3); i++; } mysql_field_seek(result, 0); i=0; lua_rawset(L, -3); m++; } } } else {lua_pushnumber(L, 0); lua_newtable(L);} // delete pMsg; return 2; } void RegisterGlobalFunctionTable(lua_State* L) { extern int quest_setstate(lua_State* L); luaL_reg global_functions[] = { { "sys_err", _syserr }, { "sys_log", _syslog }, { "char_log", _char_log }, { "item_log", _item_log }, { "set_state", quest_setstate }, { "set_skin", _set_skin }, { "setskin", _set_skin }, { "time_to_str", _time_to_str }, { "say", _say }, { "chat", _chat }, { "cmdchat", _cmdchat }, { "syschat", _syschat }, { "get_locale", _get_locale }, { "setleftimage", _left_image }, { "settopimage", _top_image }, { "server_timer", _set_server_timer }, { "clear_server_timer", _clear_server_timer }, { "server_loop_timer", _set_server_loop_timer }, { "get_server_timer_arg", _get_server_timer_arg }, { "timer", _timer }, { "loop_timer", _set_named_loop_timer }, { "cleartimer", _clear_named_timer }, { "getnpcid", _getnpcid }, { "is_test_server", _is_test_server }, { "is_speed_server", _is_speed_server }, { "raw_script", _raw_script }, { "number", _number }, // LUA_ADD_BGM_INFO { "set_bgm_volume_enable", _set_bgm_volume_enable }, { "add_bgm_info", _add_bgm_info }, // END_OF_LUA_ADD_BGM_INFO // LUA_ADD_GOTO_INFO { "add_goto_info", _add_goto_info }, // END_OF_LUA_ADD_GOTO_INFO // REFINE_PICK { "__refine_pick", _refine_pick }, // END_OF_REFINE_PICK { "add_ox_quiz", _add_ox_quiz }, { "__fish_real_refine_rod", _fish_real_refine_rod }, // XXX { "__give_char_priv", _give_char_privilege }, { "__give_empire_priv", _give_empire_privilege }, { "__give_guild_priv", _give_guild_privilege }, { "__get_empire_priv_string", _get_empire_privilege_string }, { "__get_empire_priv", _get_empire_privilege }, { "__get_guild_priv_string", _get_guild_privilege_string }, { "__get_guildid_byname", _get_guildid_byname }, { "__get_guild_priv", _get_guild_privilege }, { "item_name", _item_name }, { "mob_name", _mob_name }, { "mob_vnum", _mob_vnum }, { "get_time", _get_global_time }, { "get_global_time", _get_global_time }, { "get_channel_id", _get_channel_id }, { "command", _do_command }, { "find_pc_cond", _find_pc_cond }, { "find_pc_by_name", _find_pc }, { "find_npc_by_vnum", _find_npc_by_vnum }, { "set_quest_state", _set_quest_state }, { "get_quest_state", _get_quest_state }, { "under_han", _under_han }, { "notice", _notice }, { "notice_all", _notice_all }, { "notice_in_map", _notice_in_map }, { "warp_all_to_village", _warp_all_to_village }, { "warp_to_village", _warp_to_village }, { "say_in_map", _say_in_map }, { "kill_all_in_map", _kill_all_in_map }, { "regen_in_map", _regen_in_map }, { "enable_over9refine", _enable_over9refine }, { "block_chat", _block_chat }, { "spawn_mob", _spawn_mob }, { "get_locale_base_path", _get_locale_base_path }, { "purge_area", _purge_area }, { "warp_all_in_area_to_area", _warp_all_in_area_to_area }, { "mysql_direct_query", _mysql_direct_query }, { NULL, NULL } }; int i = 0; while (global_functions[i].name != NULL) { lua_register(L, global_functions[i].name, global_functions[i].func); ++i; } } }Je ne vois pas vraiment comment déclarer ce DBManager en fait... Merci de m'aider.
Lien vers le commentaire
Partager sur d’autres sites
Meilleurs contributeurs dans cette question
2
1
Jours populaires
le 5 mars
3
Meilleurs contributeurs dans cette question
MacDonarty 2 messages
Kuroro 1 message
Jours populaires
le 5 mars 2017
3 messages
1 réponse à cette question
Messages recommandés