void handle_spell_tic(QuestInterface *parse, lua_State* L, NPC* npc, Client* client, uint32 spell_id, uint32 extra_data, std::vector<void*> *extra_pointers) { if(npc) { Lua_Mob l_npc(npc); luabind::adl::object l_npc_o = luabind::adl::object(L, l_npc); l_npc_o.push(L); } else if(client) { Lua_Mob l_client(client); luabind::adl::object l_client_o = luabind::adl::object(L, l_client); l_client_o.push(L); } else { Lua_Mob l_mob(nullptr); luabind::adl::object l_mob_o = luabind::adl::object(L, l_mob); l_mob_o.push(L); } lua_setfield(L, -2, "target"); lua_pushinteger(L, *reinterpret_cast<int*>(extra_pointers->at(0))); lua_setfield(L, -2, "tics_remaining"); lua_pushinteger(L, *reinterpret_cast<uint8*>(extra_pointers->at(1))); lua_setfield(L, -2, "caster_level"); lua_pushinteger(L, *reinterpret_cast<int*>(extra_pointers->at(2))); lua_setfield(L, -2, "buff_slot"); lua_pushinteger(L, extra_data); lua_setfield(L, -2, "caster_id"); }
void handle_npc_event_trade(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, std::vector<void*> *extra_pointers) { Lua_Client l_client(reinterpret_cast<Client*>(init)); luabind::adl::object l_client_o = luabind::adl::object(L, l_client); l_client_o.push(L); lua_setfield(L, -2, "other"); lua_createtable(L, 0, 0); std::stringstream ident; ident << npc->GetNPCTypeID(); if(extra_pointers) { for(size_t i = 0; i < extra_pointers->size(); ++i) { std::string prefix = "item" + std::to_string(static_cast<long long>(i + 1)); Lua_ItemInst l_inst = reinterpret_cast<ItemInst*>(extra_pointers->at(i)); luabind::adl::object l_inst_o = luabind::adl::object(L, l_inst); l_inst_o.push(L); lua_setfield(L, -2, prefix.c_str()); } } lua_pushinteger(L, std::stoul(parse->GetVar("platinum." + ident.str()))); lua_setfield(L, -2, "platinum"); lua_pushinteger(L, std::stoul(parse->GetVar("gold." + ident.str()))); lua_setfield(L, -2, "gold"); lua_pushinteger(L, std::stoul(parse->GetVar("silver." + ident.str()))); lua_setfield(L, -2, "silver"); lua_pushinteger(L, std::stoul(parse->GetVar("copper." + ident.str()))); lua_setfield(L, -2, "copper"); lua_setfield(L, -2, "trade"); }
void handle_player_duel_loss(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, std::vector<void*> *extra_pointers) { Lua_Client l_client(reinterpret_cast<Client*>(extra_pointers->at(0))); luabind::adl::object l_client_o = luabind::adl::object(L, l_client); l_client_o.push(L); lua_setfield(L, -2, "other"); }
void handle_npc_single_client(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, std::vector<void*> *extra_pointers) { Lua_Client l_client(reinterpret_cast<Client*>(init)); luabind::adl::object l_client_o = luabind::adl::object(L, l_client); l_client_o.push(L); lua_setfield(L, -2, "other"); }
int LuaParser::_EventPlayer(std::string package_name, QuestEventID evt, Client *client, std::string data, uint32 extra_data, std::vector<void*> *extra_pointers, luabind::adl::object *l_func) { const char *sub_name = LuaEvents[evt]; int start = lua_gettop(L); try { int npop = 1; if(l_func != nullptr) { l_func->push(L); } else { lua_getfield(L, LUA_REGISTRYINDEX, package_name.c_str()); lua_getfield(L, -1, sub_name); npop = 2; } lua_createtable(L, 0, 0); //push self Lua_Client l_client(client); luabind::adl::object l_client_o = luabind::adl::object(L, l_client); l_client_o.push(L); lua_setfield(L, -2, "self"); auto arg_function = PlayerArgumentDispatch[evt]; arg_function(this, L, client, data, extra_data, extra_pointers); quest_manager.StartQuest(client, client, nullptr); if(lua_pcall(L, 1, 1, 0)) { std::string error = lua_tostring(L, -1); AddError(error); quest_manager.EndQuest(); return 0; } quest_manager.EndQuest(); if(lua_isnumber(L, -1)) { int ret = static_cast<int>(lua_tointeger(L, -1)); lua_pop(L, npop); return ret; } lua_pop(L, npop); } catch(std::exception &ex) { std::string error = "Lua Exception: "; error += std::string(ex.what()); AddError(error); //Restore our stack to the best of our ability int end = lua_gettop(L); int n = end - start; if(n > 0) { lua_pop(L, n); } } return 0; }
//NPC void handle_npc_event_say(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, std::vector<void*> *extra_pointers) { npc->DoQuestPause(init); Lua_Client l_client(reinterpret_cast<Client*>(init)); luabind::adl::object l_client_o = luabind::adl::object(L, l_client); l_client_o.push(L); lua_setfield(L, -2, "other"); lua_pushstring(L, data.c_str()); lua_setfield(L, -2, "message"); lua_pushinteger(L, extra_data); lua_setfield(L, -2, "language"); }
void handle_translocate_finish(QuestInterface *parse, lua_State* L, NPC* npc, Client* client, uint32 spell_id, uint32 extra_data, std::vector<void*> *extra_pointers) { if(npc) { Lua_Mob l_npc(npc); luabind::adl::object l_npc_o = luabind::adl::object(L, l_npc); l_npc_o.push(L); } else if(client) { Lua_Mob l_client(client); luabind::adl::object l_client_o = luabind::adl::object(L, l_client); l_client_o.push(L); } else { Lua_Mob l_mob(nullptr); luabind::adl::object l_mob_o = luabind::adl::object(L, l_mob); l_mob_o.push(L); } lua_setfield(L, -2, "target"); }
void import(const std::string p_file_name,fichier_client_db & p_db) { ifstream l_input_file(p_file_name.c_str()); if(!l_input_file.is_open()) { cout << "ERROR : unable to open file \"" << p_file_name << "\"" << endl ; exit(-1); } string l_line = ""; uint32_t l_line_nb = 0; vector<facture_status> l_result_facture_status; p_db.get_facture_status_by_name(facture_status::get_non_checked_status(),l_result_facture_status,true); assert(l_result_facture_status.size()==1); facture_status l_facture_status = l_result_facture_status[0]; do { getline(l_input_file,l_line); ++l_line_nb; if(l_line.find("INSERT INTO") != string::npos) { bool l_condition = true; assert((l_condition ? true :(cout << "Message" << endl , false) )); // Extract table name size_t l_pos = l_line.find('`'); assert((l_pos != string::npos ? true :(cout << "Line " << l_line_nb << endl , false))); string l_table_name = l_line.substr(l_pos+1,l_line.find('`',l_pos+1)-l_pos-1); // Extract data l_pos = l_line.find('('); assert((l_pos != string::npos ? true :(cout << "Line " << l_line_nb << endl , false))); string l_data = l_line.substr(l_pos+1,l_line.find(')',l_pos+1)-l_pos-1); //Treat data if(l_table_name == "achat") { string l_result(""); l_data = extract_until(l_data,',',l_result,l_line_nb); uint32_t l_achat_id = strtol(remove_leading_space(l_result).c_str(),NULL,10); l_data = extract_until(l_data,',',l_result,l_line_nb); uint32_t l_client_id = strtol(remove_leading_space(l_result).c_str(),NULL,10); l_data = extract_until(l_data,',',l_result,l_line_nb); l_result = remove_leading_space(l_result); string l_date = l_result.substr(1,l_result.size()-2); l_data = extract_until(l_data,',',l_result,l_line_nb); uint32_t l_marque_id = strtol(remove_leading_space(l_result).c_str(),NULL,10); l_data = extract_until(l_data,',',l_result,l_line_nb); uint32_t l_type_id = strtol(remove_leading_space(l_result).c_str(),NULL,10); l_data = extract_until(l_data,',',l_result,l_line_nb); l_result = remove_leading_space(l_result); string l_reference = l_result.substr(1,l_result.size()-2); l_data = extract_until(l_data,',',l_result,l_line_nb); l_result = remove_leading_space(l_result); float l_prix_franc = strtof(l_result.substr(1,l_result.size()-2).c_str(),NULL); l_data = extract_until(l_data,',',l_result,l_line_nb); l_result = remove_leading_space(l_result); float l_prix_euro = strtof(l_result.substr(1,l_result.size()-2).c_str(),NULL); l_result = remove_leading_space(l_data); bool l_garantie = (l_result.substr(1,l_result.size()-2)) != "non"; // Search corresponding facture vector<facture> l_facture_result; p_db.get_by_date_and_client_id(l_date,l_client_id,l_facture_result); uint32_t l_facture_id = 0; if(l_facture_result.size()==0) { facture l_facture(0,l_client_id,l_date,0,l_facture_status.get_id(),0); p_db.create(l_facture); l_facture_id = l_facture.get_id(); } else if(l_facture_result.size() == 1) { l_facture_id = l_facture_result.front().get_id(); } else { cout << "ERROR : facture should be unique or not existing" << endl ; exit(-1); } // achat l_achat(l_achat_id,l_client_id,l_date,0,l_marque_id,l_type_id,l_reference,l_prix_franc,l_prix_euro,l_garantie); achat l_achat(l_achat_id,l_facture_id,l_marque_id,l_type_id,l_reference,l_prix_franc,l_prix_euro,l_garantie); #ifdef DEBUG_IMPORT_ACHAT cout << "Achat_id = \"" << l_achat_id << "\"" << endl ; cout << "Facture_id = \"" << l_facture_id << "\"" << endl ; // cout << "Client_id = \"" << l_client_id << "\"" << endl ; // cout << "Date = \"" << l_date << "\"" << endl ; cout << "Marque_id = \"" << l_marque_id << "\"" << endl ; cout << "type_id = \"" << l_type_id << "\"" << endl ; cout << "Reference = \"" << l_reference << "\"" << endl ; cout << "Prix_Franc = \"" << l_prix_franc << "\"" << endl ; cout << "Prix_Euro = \"" << l_prix_euro << "\"" << endl ; cout << "Garantie = \"" << l_garantie << "\"" << endl ; cout << l_achat << endl ; #endif p_db.create(l_achat); } else if(l_table_name == "client") { string l_result(""); l_data = extract_until(l_data,',',l_result,l_line_nb); uint32_t l_client_id = strtol(remove_leading_space(l_result).c_str(),NULL,10); l_data = extract_until(l_data,',',l_result,l_line_nb); l_result = remove_leading_space(l_result); string l_name = l_result.substr(1,l_result.size()-2); l_data = extract_until(l_data,',',l_result,l_line_nb); l_result = remove_leading_space(l_result); string l_first_name = l_result.substr(1,l_result.size()-2); size_t l_pos = l_data.find("'"); l_pos = l_data.find("'",l_pos+1); l_pos = l_data.find(",",l_pos); string l_address = remove_leading_space(l_data.substr(0,l_pos)); l_data = l_data.substr(l_pos+1); l_data = extract_until(l_data,',',l_result,l_line_nb); l_result = remove_leading_space(l_result); string l_tel = l_result.substr(1,l_result.size()-2); uint32_t l_ville_id = strtol(remove_leading_space(l_data).c_str(),NULL,10); client l_client(l_client_id,l_name,l_first_name,l_address,l_tel,l_ville_id); #ifdef DEBUG_IMPORT_CLIENT cout << "Client_id = \"" << l_client_id << "\"" << endl ; cout << "Name = \"" << l_name << "\"" << endl ; cout << "First name = \"" << l_first_name << "\"" << endl ; cout << "Address = \"" << l_address << "\"" << endl ; cout << "Tel = \"" << l_tel << "\"" << endl ; cout << "Ville_id = \"" << l_ville_id << "\"" << endl ; cout << l_client; #endif p_db.create(l_client); } else if(l_table_name == "marque") { string l_result(""); l_data = extract_until(l_data,',',l_result,l_line_nb); uint32_t l_marque_id = strtol(remove_leading_space(l_result).c_str(),NULL,10); l_result = remove_leading_space(l_data); string l_marque_name = l_result.substr(1,l_result.size()-2); marque l_marque(l_marque_id,l_marque_name); #ifdef DEBUG_IMPORT_MARQUE cout << "l_marque_id =\"" << l_marque_id << "\"" << endl ; cout << "Marque = \"" << l_marque_name << "\"" << endl ; cout << l_marque << endl ; #endif p_db.create(l_marque); } else if(l_table_name == "type") { string l_result(""); l_data = extract_until(l_data,',',l_result,l_line_nb); uint32_t l_type_id = strtol(remove_leading_space(l_result).c_str(),NULL,10); l_result = remove_leading_space(l_data); string l_type_name = l_result.substr(1,l_result.size()-2); type_achat l_type_achat(l_type_id,l_type_name); #ifdef DEBUG_IMPORT_TYPE cout << "type id = \"" << l_type_id << "\"" << endl ; cout << "type name = \"" << l_type_name << "\"" << endl ; cout << l_type_achat << endl ; #endif p_db.create(l_type_achat); } else if(l_table_name == "ville") { cout << l_line << endl ; cout << "table : \"" << l_table_name << "\"" << endl ; cout << "data : \"" << l_data << "\"" << endl ; string l_result(""); l_data = extract_until(l_data,',',l_result,l_line_nb); uint32_t l_ville_id = strtol(remove_leading_space(l_result).c_str(),NULL,10); l_data = extract_until(l_data,',',l_result,l_line_nb); l_result = remove_leading_space(l_result); string l_ville_name = l_result.substr(1,l_result.size()-2); l_result = remove_leading_space(l_data); string l_postal_code = l_result.substr(1,l_result.size()-2); ville l_ville(l_ville_id,l_ville_name,l_postal_code); #ifdef DEBUG_IMPORT_VILLE cout << "Ville id = \"" << l_ville_id << "\"" << endl ; cout << "Ville name = \"" << l_ville_name << "\"" << endl ; cout << "Postal code = \"" << l_postal_code << "\"" << endl ; cout << l_ville << endl ; #endif p_db.create(l_ville); } } } while(!l_input_file.eof() ); l_input_file.close(); }