void ComplaintTicket::SaveToDB() const { SQLTransaction trans = CharacterDatabase.BeginTransaction(); uint8 idx = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GM_COMPLAINT); stmt->setUInt32(idx, _id); stmt->setUInt64(++idx, _playerGuid.GetCounter()); stmt->setString(++idx, _note); stmt->setUInt32(++idx, _mapId); stmt->setFloat(++idx, _pos.x); stmt->setFloat(++idx, _pos.y); stmt->setFloat(++idx, _pos.z); stmt->setFloat(++idx, _facing); stmt->setUInt64(++idx, _targetCharacterGuid.GetCounter()); stmt->setUInt8(++idx, _complaintType); if (_chatLog.ReportLineIndex) stmt->setInt32(++idx, *_chatLog.ReportLineIndex); else stmt->setInt32(++idx, -1); // empty ReportLineIndex stmt->setInt64(++idx, _closedBy.GetCounter()); stmt->setUInt64(++idx, _assignedTo.GetCounter()); stmt->setString(++idx, _comment); trans->Append(stmt); uint32 lineIndex = 0; for (auto const& c : _chatLog.Lines) { idx = 0; stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GM_COMPLAINT_CHATLINE); stmt->setUInt32(idx, _id); stmt->setUInt32(++idx, lineIndex); stmt->setUInt32(++idx, c.Timestamp); stmt->setString(++idx, c.Text); trans->Append(stmt); ++lineIndex; } CharacterDatabase.CommitTransaction(trans); }
void WorldSession::HandleReportLag(WorldPacket& recv_data) { // just put the lag report into the database... // can't think of anything else to do with it uint32 lagType, mapId; recv_data >> lagType; recv_data >> mapId; float x, y, z; recv_data >> x; recv_data >> y; recv_data >> z; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_ADD_LAG_REPORT); stmt->setUInt32(0, GUID_LOPART(GetPlayer()->GetGUID())); stmt->setUInt8 (1, lagType); stmt->setUInt16(2, mapId); stmt->setFloat (3, x); stmt->setFloat (4, y); stmt->setFloat (5, z); CharacterDatabase.Execute(stmt); }
void Corpse::SaveToDB() { // prevent DB data inconsistence problems and duplicates SQLTransaction trans = CharacterDatabase.BeginTransaction(); DeleteFromDB(trans); uint16 index = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CORPSE); stmt->setUInt64(index++, GetGUID().GetCounter()); // corpseGuid stmt->setUInt64(index++, GetOwnerGUID().GetCounter()); // guid stmt->setFloat (index++, GetPositionX()); // posX stmt->setFloat (index++, GetPositionY()); // posY stmt->setFloat (index++, GetPositionZ()); // posZ stmt->setFloat (index++, GetOrientation()); // orientation stmt->setUInt16(index++, GetMapId()); // mapId stmt->setUInt32(index++, GetUInt32Value(CORPSE_FIELD_DISPLAY_ID)); // displayId stmt->setString(index++, _ConcatFields(CORPSE_FIELD_ITEM, EQUIPMENT_SLOT_END)); // itemCache stmt->setUInt32(index++, GetUInt32Value(CORPSE_FIELD_BYTES_1)); // bytes1 stmt->setUInt32(index++, GetUInt32Value(CORPSE_FIELD_BYTES_2)); // bytes2 stmt->setUInt8 (index++, GetUInt32Value(CORPSE_FIELD_FLAGS)); // flags stmt->setUInt8 (index++, GetUInt32Value(CORPSE_FIELD_DYNAMIC_FLAGS)); // dynFlags stmt->setUInt32(index++, uint32(m_time)); // time stmt->setUInt8 (index++, GetType()); // corpseType stmt->setUInt32(index++, GetInstanceId()); // instanceId trans->Append(stmt); for (uint32 phaseId : GetPhases()) { index = 0; stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CORPSE_PHASES); stmt->setUInt32(index++, GetGUID().GetCounter()); // Guid (corpse's) stmt->setUInt32(index++, phaseId); // PhaseId stmt->setUInt32(index++, GetOwnerGUID().GetCounter()); // OwnerGuid stmt->setUInt32(index++, uint32(m_time)); // Time stmt->setUInt8(index++, GetType()); // CorpseType trans->Append(stmt); } CharacterDatabase.CommitTransaction(trans); }
static bool HandleTicketCreate(ChatHandler* handler, char const* args) { Player* player = handler->GetSession()->GetPlayer();; if (!player) return false; // if (*args) { uint8 index = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GM_TICKET); stmt->setUInt32(index, sTicketMgr->GenerateTicketId()); stmt->setUInt32(++index, GUID_LOPART(handler->GetSession()->GetPlayer()->GetGUID())); stmt->setString(++index, handler->GetSession()->GetPlayer()->GetName()); stmt->setString(++index, args); stmt->setUInt32(++index, uint32(000)); stmt->setUInt16(++index, 1); stmt->setFloat(++index, 1.0f); stmt->setFloat(++index, 1.0f); stmt->setFloat(++index, 1.0f); stmt->setUInt32(++index, uint32(000)); stmt->setInt32(++index, GUID_LOPART(0)); stmt->setUInt32(++index, GUID_LOPART(0)); stmt->setString(++index, "NO COMMENT"); stmt->setBool(++index, false); stmt->setUInt8(++index, uint8(0)); stmt->setBool(++index, false); stmt->setBool(++index, true); CharacterDatabase.Execute(stmt); return true; ChatHandler(player->GetSession()).PSendSysMessage("You have created a new ticket, and it'll soon be addressed by one of our staff members, please, be patient."); } else { ChatHandler(player->GetSession()).PSendSysMessage("You must include some content of text in your ticket, the way of doing is by writing like in the following example: .pticket create my warrior is stuck, please help me gm!"); return false; } }
//Todo Questlog AuraLog PhaseLog! void WorldSession::HandleSubmitBugOpcode(WorldPacket& recvData) { TC_LOG_DEBUG("network", "WORLD: CMSG_SUBMIT_BUG"); float posX, posY, posZ, posO; uint32 mapID; recvData >> posZ; recvData >> posY; recvData >> posX; recvData >> posO; recvData >> mapID; uint32 length = recvData.ReadBits(10); recvData.FlushBits(); std::string bug = recvData.ReadString(length); ObjectGuid plrGuid = GUID_LOPART(GetPlayer()->GetGUID()); std::string name = "<unknown>"; sObjectMgr->GetPlayerNameByGUID(plrGuid, name); SQLTransaction trans = SQLTransaction(NULL); // 0 1 2 3 4 5 6 7 8 // realm, guid, message, createTime, pool, mapId, posX, posY, posZ uint8 index = 0; PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_BUG_TICKET); stmt->setUInt32(index, realmID); stmt->setUInt32(++index, plrGuid); stmt->setString(++index, bug); stmt->setUInt32(++index, uint32(time(NULL))); stmt->setString(++index, name.c_str()); stmt->setUInt16(++index, uint16(mapID)); stmt->setFloat(++index, (float)posX); stmt->setFloat(++index, (float)posY); stmt->setFloat(++index, (float)posZ); LoginDatabase.ExecuteOrAppend(trans, stmt); }
void GmTicket::SaveToDB(SQLTransaction& trans) const { uint8 index = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_ADD_GM_TICKET); stmt->setUInt32( index, _id); stmt->setUInt32(++index, GUID_LOPART(_playerGuid)); stmt->setString(++index, _playerName); stmt->setString(++index, _message); stmt->setUInt32(++index, uint32(_createTime)); stmt->setUInt16(++index, _mapId); stmt->setFloat (++index, _posX); stmt->setFloat (++index, _posY); stmt->setFloat (++index, _posZ); stmt->setUInt32(++index, uint32(_lastModifiedTime)); stmt->setInt32 (++index, GUID_LOPART(_closedBy)); stmt->setUInt32(++index, GUID_LOPART(_assignedTo)); stmt->setString(++index, _comment); stmt->setBool (++index, _completed); stmt->setUInt8 (++index, uint8(_escalatedStatus)); stmt->setBool (++index, _viewed); CharacterDatabase.ExecuteOrAppend(trans, stmt); }
void OnSave(Player *plr) { if( !plr || !WebsiteDatabase->IsOpen() ) return; uint32 psi = ConfigMgr::GetIntDefault("PlayerSaveInterval", 0); float pph = ConfigMgr::GetFloatDefault("Vote.PointsPerHour", 0.f); if( psi == 0 || pph == 0.f ) return; PreparedStatement *stmt = (*WebsiteDatabase)->GetPreparedStatement(WEB_ADD_VOTE_POINTS); stmt->setFloat(0, ((pph / 60.f / 60.f) * ((float)psi / 1000))); stmt->setUInt32(1, plr->GetSession()->GetAccountId()); (*WebsiteDatabase)->Execute(stmt); }
void WorldSession::SendBindPoint(Creature *npc) { // prevent set homebind to instances in any case if (GetPlayer()->GetMap()->Instanceable()) return; uint32 bindspell = 3286; // update sql homebind PreparedStatement* stmt = CharDB.GetPreparedStatement(CHAR_SET_PLAYER_HOMEBIND); stmt->setUInt16(0, _player->GetMapId()); stmt->setUInt16(1, _player->GetAreaId()); stmt->setFloat (2, _player->GetPositionX()); stmt->setFloat (3, _player->GetPositionY()); stmt->setFloat (4, _player->GetPositionZ()); stmt->setUInt32(5, _player->GetGUIDLow()); CharDB.Execute(stmt); _player->m_homebindMapId = _player->GetMapId(); _player->m_homebindAreaId = _player->GetAreaId(); _player->m_homebindX = _player->GetPositionX(); _player->m_homebindY = _player->GetPositionY(); _player->m_homebindZ = _player->GetPositionZ(); _player->SetBindPoint(npc->GetGUID()); // send spell for homebinding (3286) /*npc->CastSpell(_player, bindspell, true); WorldPacket data(SMSG_TRAINER_BUY_SUCCEEDED, (8+4)); data << uint64(npc->GetGUID()); data << uint32(bindspell); SendPacket(&data);*/ _player->PlayerTalkClass->CloseGossip(); }
void GmTicket::SaveToDB(SQLTransaction& trans) const { uint8 idx = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GM_TICKET); stmt->setUInt32(idx, _id); stmt->setUInt64(++idx, _playerGuid.GetCounter()); stmt->setString(++idx, _description); stmt->setUInt32(++idx, _createTime); stmt->setUInt16(++idx, _mapId); stmt->setFloat(++idx, _pos.x); stmt->setFloat(++idx, _pos.y); stmt->setFloat(++idx, _pos.z); stmt->setUInt32(++idx, uint32(_lastModifiedTime)); stmt->setInt64(++idx, int64(_closedBy.GetCounter())); stmt->setUInt64(++idx, _assignedTo.GetCounter()); stmt->setString(++idx, _comment); stmt->setString(++idx, _response); stmt->setBool(++idx, _completed); stmt->setUInt8(++idx, uint8(_assignedToStatus)); stmt->setUInt8(++idx, _openedByGmStatus); stmt->setBool(++idx, _needMoreHelp); CharacterDatabase.ExecuteOrAppend(trans, stmt); }
//set spawn dist of creature static bool HandleNpcSetSpawnDistCommand(ChatHandler* handler, const char* args) { if (!*args) return false; float option = (float)(atof((char*)args)); if (option < 0.0f) { handler->SendSysMessage(LANG_BAD_VALUE); return false; } MovementGeneratorType mtype = IDLE_MOTION_TYPE; if (option >0.0f) mtype = RANDOM_MOTION_TYPE; Creature* creature = handler->getSelectedCreature(); uint32 guidLow = 0; if (creature) guidLow = creature->GetDBTableGUIDLow(); else return false; creature->SetRespawnRadius((float)option); creature->SetDefaultMovementType(mtype); creature->GetMotionMaster()->Initialize(); if (creature->isAlive()) // dead creature will reset movement generator at respawn { creature->setDeathState(JUST_DIED); creature->Respawn(); } PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_CREATURE_SPAWN_DISTANCE); stmt->setFloat(0, option); stmt->setUInt8(1, uint8(mtype)); stmt->setUInt32(2, guidLow); WorldDatabase.Execute(stmt); handler->PSendSysMessage(LANG_COMMAND_SPAWNDIST, option); return true; }
static bool HandleWpModifyCommand(ChatHandler* handler, const char* args) { if (!*args) return false; // first arg: add del text emote spell waittime move char* show_str = strtok((char*)args, " "); if (!show_str) { return false; } std::string show = show_str; // Check // Remember: "show" must also be the name of a column! if ((show != "delay") && (show != "action") && (show != "action_chance") && (show != "move_flag") && (show != "del") && (show != "move") && (show != "wpadd") ) { return false; } // Next arg is: <PATHID> <WPNUM> <ARGUMENT> char* arg_str = NULL; // Did user provide a GUID // or did the user select a creature? // -> variable lowguid is filled with the GUID of the NPC uint32 pathid = 0; uint32 point = 0; uint32 wpGuid = 0; Creature* target = handler->getSelectedCreature(); if (!target || target->GetEntry() != VISUAL_WAYPOINT) { handler->SendSysMessage("|cffff33ffERROR: You must select a waypoint.|r"); return false; } // The visual waypoint wpGuid = target->GetGUIDLow(); // User did select a visual waypoint? // Check the creature QueryResult result = WorldDatabase.PQuery("SELECT id, point FROM waypoint_data WHERE wpguid = %u", wpGuid); if (!result) { handler->PSendSysMessage(LANG_WAYPOINT_NOTFOUNDSEARCH, target->GetGUIDLow()); // Select waypoint number from database // Since we compare float values, we have to deal with // some difficulties. // Here we search for all waypoints that only differ in one from 1 thousand // (0.001) - There is no other way to compare C++ floats with mySQL floats // See also: http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html const char* maxDIFF = "0.01"; result = WorldDatabase.PQuery("SELECT id, point FROM waypoint_data WHERE (abs(position_x - %f) <= %s) and (abs(position_y - %f) <= %s) and (abs(position_z - %f) <= %s)", target->GetPositionX(), maxDIFF, target->GetPositionY(), maxDIFF, target->GetPositionZ(), maxDIFF); if (!result) { handler->PSendSysMessage(LANG_WAYPOINT_NOTFOUNDDBPROBLEM, wpGuid); return true; } } do { Field* fields = result->Fetch(); pathid = fields[0].GetUInt32(); point = fields[1].GetUInt32(); } while (result->NextRow()); // We have the waypoint number and the GUID of the "master npc" // Text is enclosed in "<>", all other arguments not arg_str = strtok((char*)NULL, " "); // Check for argument if (show != "del" && show != "move" && arg_str == NULL) { handler->PSendSysMessage(LANG_WAYPOINT_ARGUMENTREQ, show_str); return false; } if (show == "del" && target) { handler->PSendSysMessage("|cff00ff00DEBUG: wp modify del, PathID: |r|cff00ffff%u|r", pathid); // wpCreature Creature* wpCreature = NULL; if (wpGuid != 0) { wpCreature = handler->GetSession()->GetPlayer()->GetMap()->GetCreature(MAKE_NEW_GUID(wpGuid, VISUAL_WAYPOINT, HIGHGUID_UNIT)); wpCreature->CombatStop(); wpCreature->DeleteFromDB(); wpCreature->AddObjectToRemoveList(); } PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_WAYPOINT_DATA); stmt->setUInt32(0, pathid); stmt->setUInt32(1, point); WorldDatabase.Execute(stmt); stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_POINT); stmt->setUInt32(0, pathid); stmt->setUInt32(1, point); WorldDatabase.Execute(stmt); handler->PSendSysMessage(LANG_WAYPOINT_REMOVED); return true; } // del if (show == "move" && target) { handler->PSendSysMessage("|cff00ff00DEBUG: wp move, PathID: |r|cff00ffff%u|r", pathid); Player* chr = handler->GetSession()->GetPlayer(); Map* map = chr->GetMap(); { // wpCreature Creature* wpCreature = NULL; // What to do: // Move the visual spawnpoint // Respawn the owner of the waypoints if (wpGuid != 0) { wpCreature = handler->GetSession()->GetPlayer()->GetMap()->GetCreature(MAKE_NEW_GUID(wpGuid, VISUAL_WAYPOINT, HIGHGUID_UNIT)); wpCreature->CombatStop(); wpCreature->DeleteFromDB(); wpCreature->AddObjectToRemoveList(); // re-create Creature* wpCreature2 = new Creature; if (!wpCreature2->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), VISUAL_WAYPOINT, 0, 0, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation())) { handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT); delete wpCreature2; return false; } wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); //TODO: Should we first use "Create" then use "LoadFromDB"? if (!wpCreature2->LoadCreatureFromDB(wpCreature2->GetDBTableGUIDLow(), map)) { handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT); delete wpCreature2; return false; } //sMapMgr->GetMap(npcCreature->GetMapId())->Add(wpCreature2); } PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_POSITION); stmt->setFloat(0, chr->GetPositionX()); stmt->setFloat(1, chr->GetPositionY()); stmt->setFloat(2, chr->GetPositionZ()); stmt->setUInt32(3, pathid); stmt->setUInt32(4, point); WorldDatabase.Execute(stmt); handler->PSendSysMessage(LANG_WAYPOINT_CHANGED); } return true; } // move const char *text = arg_str; if (text == 0) { // show_str check for present in list of correct values, no sql injection possible WorldDatabase.PExecute("UPDATE waypoint_data SET %s=NULL WHERE id='%u' AND point='%u'", show_str, pathid, point); // Query can't be a prepared statement } else { // show_str check for present in list of correct values, no sql injection possible std::string text2 = text; WorldDatabase.EscapeString(text2); WorldDatabase.PExecute("UPDATE waypoint_data SET %s='%s' WHERE id='%u' AND point='%u'", show_str, text2.c_str(), pathid, point); // Query can't be a prepared statement } handler->PSendSysMessage(LANG_WAYPOINT_CHANGED_NO, show_str); return true; }
static bool HandleWpEventCommand(ChatHandler* handler, const char* args) { if (!*args) return false; char* show_str = strtok((char*)args, " "); std::string show = show_str; // Check if ((show != "add") && (show != "mod") && (show != "del") && (show != "listid")) return false; char* arg_id = strtok(NULL, " "); uint32 id = 0; if (show == "add") { if (arg_id) id = atoi(arg_id); if (id) { QueryResult result = WorldDatabase.PQuery("SELECT id FROM waypoint_scripts WHERE guid = %u", id); if (!result) { PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_WAYPOINT_SCRIPT); stmt->setUInt32(0, id); WorldDatabase.Execute(stmt); handler->PSendSysMessage("%s%s%u|r", "|cff00ff00", "Wp Event: New waypoint event added: ", id); } else handler->PSendSysMessage("|cff00ff00Wp Event: You have choosed an existing waypoint script guid: %u|r", id); } else { QueryResult result = WorldDatabase.Query("SELECT MAX(guid) FROM waypoint_scripts"); id = result->Fetch()->GetUInt32(); PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_WAYPOINT_SCRIPT); stmt->setUInt32(0, id + 1); WorldDatabase.Execute(stmt); handler->PSendSysMessage("%s%s%u|r", "|cff00ff00", "Wp Event: New waypoint event added: |r|cff00ffff", id+1); } return true; } if (show == "listid") { if (!arg_id) { handler->PSendSysMessage("%s%s|r", "|cff33ffff", "Wp Event: You must provide waypoint script id."); return true; } id = atoi(arg_id); uint32 a2, a3, a4, a5, a6; float a8, a9, a10, a11; char const* a7; QueryResult result = WorldDatabase.PQuery("SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = %u", id); if (!result) { handler->PSendSysMessage("%s%s%u|r", "|cff33ffff", "Wp Event: No waypoint scripts found on id: ", id); return true; } Field* fields; do { fields = result->Fetch(); a2 = fields[0].GetUInt32(); a3 = fields[1].GetUInt32(); a4 = fields[2].GetUInt32(); a5 = fields[3].GetUInt32(); a6 = fields[4].GetUInt32(); a7 = fields[5].GetCString(); a8 = fields[6].GetFloat(); a9 = fields[7].GetFloat(); a10 = fields[8].GetFloat(); a11 = fields[9].GetFloat(); handler->PSendSysMessage("|cffff33ffid:|r|cff00ffff %u|r|cff00ff00, guid: |r|cff00ffff%u|r|cff00ff00, delay: |r|cff00ffff%u|r|cff00ff00, command: |r|cff00ffff%u|r|cff00ff00, datalong: |r|cff00ffff%u|r|cff00ff00, datalong2: |r|cff00ffff%u|r|cff00ff00, datatext: |r|cff00ffff%s|r|cff00ff00, posx: |r|cff00ffff%f|r|cff00ff00, posy: |r|cff00ffff%f|r|cff00ff00, posz: |r|cff00ffff%f|r|cff00ff00, orientation: |r|cff00ffff%f|r", id, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } while (result->NextRow()); } if (show == "del") { id = atoi(arg_id); QueryResult result = WorldDatabase.PQuery("SELECT guid FROM waypoint_scripts WHERE guid = %u", id); if (result) { PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_WAYPOINT_SCRIPT); stmt->setUInt32(0, id); WorldDatabase.Execute(stmt); handler->PSendSysMessage("%s%s%u|r", "|cff00ff00", "Wp Event: Waypoint script removed: ", id); } else handler->PSendSysMessage("|cffff33ffWp Event: ERROR: you have selected a non existing script: %u|r", id); return true; } if (show == "mod") { if (!arg_id) { handler->SendSysMessage("|cffff33ffERROR: Waypoint script guid not present.|r"); return true; } id = atoi(arg_id); if (!id) { handler->SendSysMessage("|cffff33ffERROR: No vallid waypoint script id not present.|r"); return true; } char* arg_2 = strtok(NULL, " "); if (!arg_2) { handler->SendSysMessage("|cffff33ffERROR: No argument present.|r"); return true; } std::string arg_string = arg_2; if ((arg_string != "setid") && (arg_string != "delay") && (arg_string != "command") && (arg_string != "datalong") && (arg_string != "datalong2") && (arg_string != "dataint") && (arg_string != "posx") && (arg_string != "posy") && (arg_string != "posz") && (arg_string != "orientation")) { handler->SendSysMessage("|cffff33ffERROR: No valid argument present.|r"); return true; } char* arg_3; std::string arg_str_2 = arg_2; arg_3 = strtok(NULL, " "); if (!arg_3) { handler->SendSysMessage("|cffff33ffERROR: No additional argument present.|r"); return true; } if (arg_str_2 == "setid") { uint32 newid = atoi(arg_3); handler->PSendSysMessage("%s%s|r|cff00ffff%u|r|cff00ff00%s|r|cff00ffff%u|r", "|cff00ff00", "Wp Event: Wypoint scipt guid: ", newid, " id changed: ", id); PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_SCRIPT_ID); stmt->setUInt32(0, newid); stmt->setUInt32(1, id); WorldDatabase.Execute(stmt); return true; } else { QueryResult result = WorldDatabase.PQuery("SELECT id FROM waypoint_scripts WHERE guid='%u'", id); if (!result) { handler->SendSysMessage("|cffff33ffERROR: You have selected an non existing waypoint script guid.|r"); return true; } if (arg_str_2 == "posx") { PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_SCRIPT_X); stmt->setFloat(0, float(atof(arg_3))); stmt->setUInt32(1, id); WorldDatabase.Execute(stmt); handler->PSendSysMessage("|cff00ff00Waypoint script:|r|cff00ffff %u|r|cff00ff00 position_x updated.|r", id); return true; } else if (arg_str_2 == "posy") { PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_SCRIPT_Y); stmt->setFloat(0, float(atof(arg_3))); stmt->setUInt32(1, id); WorldDatabase.Execute(stmt); handler->PSendSysMessage("|cff00ff00Waypoint script: %u position_y updated.|r", id); return true; } else if (arg_str_2 == "posz") { PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_SCRIPT_Z); stmt->setFloat(0, float(atof(arg_3))); stmt->setUInt32(1, id); WorldDatabase.Execute(stmt); handler->PSendSysMessage("|cff00ff00Waypoint script: |r|cff00ffff%u|r|cff00ff00 position_z updated.|r", id); return true; } else if (arg_str_2 == "orientation") { PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_SCRIPT_O); stmt->setFloat(0, float(atof(arg_3))); stmt->setUInt32(1, id); WorldDatabase.Execute(stmt); handler->PSendSysMessage("|cff00ff00Waypoint script: |r|cff00ffff%u|r|cff00ff00 orientation updated.|r", id); return true; } else if (arg_str_2 == "dataint") { WorldDatabase.PExecute("UPDATE waypoint_scripts SET %s='%u' WHERE guid='%u'", arg_2, atoi(arg_3), id); // Query can't be a prepared statement handler->PSendSysMessage("|cff00ff00Waypoint script: |r|cff00ffff%u|r|cff00ff00 dataint updated.|r", id); return true; } else { std::string arg_str_3 = arg_3; WorldDatabase.EscapeString(arg_str_3); WorldDatabase.PExecute("UPDATE waypoint_scripts SET %s='%s' WHERE guid='%u'", arg_2, arg_str_3.c_str(), id); // Query can't be a prepared statement } } handler->PSendSysMessage("%s%s|r|cff00ffff%u:|r|cff00ff00 %s %s|r", "|cff00ff00", "Waypoint script:", id, arg_2, "updated."); } return true; }
/** * Add a waypoint to a creature. * * The user can either select an npc or provide its GUID. * * The user can even select a visual waypoint - then the new waypoint * is placed *after* the selected one - this makes insertion of new * waypoints possible. * * eg: * .wp add 12345 * -> adds a waypoint to the npc with the GUID 12345 * * .wp add * -> adds a waypoint to the currently selected creature * * * @param args if the user did not provide a GUID, it is NULL * * @return true - command did succeed, false - something went wrong */ static bool HandleWpAddCommand(ChatHandler* handler, const char* args) { // optional char* path_number = NULL; uint32 pathid = 0; if (*args) path_number = strtok((char*)args, " "); uint32 point = 0; Creature* target = handler->getSelectedCreature(); if (!path_number) { if (target) pathid = target->GetWaypointPath(); else { PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_MAX_ID); PreparedQueryResult result = WorldDatabase.Query(stmt); uint32 maxpathid = result->Fetch()->GetInt32(); pathid = maxpathid+1; handler->PSendSysMessage("%s%s|r", "|cff00ff00", "New path started."); } } else pathid = atoi(path_number); // path_id -> ID of the Path // point -> number of the waypoint (if not 0) if (!pathid) { handler->PSendSysMessage("%s%s|r", "|cffff33ff", "Current creature haven't loaded path."); return true; } PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_MAX_POINT); stmt->setUInt32(0, pathid); PreparedQueryResult result = WorldDatabase.Query(stmt); if (result) point = (*result)[0].GetUInt32(); Player* player = handler->GetSession()->GetPlayer(); //Map* map = player->GetMap(); stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_WAYPOINT_DATA); stmt->setUInt32(0, pathid); stmt->setUInt32(1, point + 1); stmt->setFloat(2, player->GetPositionX()); stmt->setFloat(3, player->GetPositionY()); stmt->setFloat(4, player->GetPositionZ()); WorldDatabase.Execute(stmt); handler->PSendSysMessage("%s%s%u%s%u%s|r", "|cff00ff00", "PathID: |r|cff00ffff", pathid, "|r|cff00ff00: Waypoint |r|cff00ffff", point+1, "|r|cff00ff00 created. "); return true; } // HandleWpAddCommand
void GmTicket::SaveToDB(SQLTransaction& trans) const { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, completed, escalated, viewed uint8 index = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GM_TICKET); stmt->setUInt32( index, _id); stmt->setUInt32(++index, GUID_LOPART(_playerGuid)); stmt->setString(++index, _playerName); stmt->setString(++index, _message); stmt->setUInt32(++index, uint32(_createTime)); stmt->setUInt16(++index, _mapId); stmt->setFloat (++index, _posX); stmt->setFloat (++index, _posY); stmt->setFloat (++index, _posZ); stmt->setUInt32(++index, uint32(_lastModifiedTime)); stmt->setInt32 (++index, GUID_LOPART(_closedBy)); stmt->setUInt32(++index, GUID_LOPART(_assignedTo)); stmt->setString(++index, _comment); stmt->setBool (++index, _completed); stmt->setUInt8 (++index, uint8(_escalatedStatus)); stmt->setBool (++index, _viewed); char dest[20]; std::string ticketstatusmsg; uint32 countOpen = sTicketMgr->GetOpenTicketCount(); if (countOpen > 1) { ticketstatusmsg += "PRIVMSG ChanServ TOPIC #wowticket "; ticketstatusmsg += "\x03"; ticketstatusmsg += "4 "; sprintf(dest, "%d", countOpen); ticketstatusmsg += dest; ticketstatusmsg += " Tickets sind noch offen!"; sIRC.SendIRC(ticketstatusmsg); } else if (countOpen == 1) { ticketstatusmsg += "PRIVMSG ChanServ TOPIC #wowticket "; ticketstatusmsg += "\x03"; ticketstatusmsg += "4 "; ticketstatusmsg += "1 Ticket ist noch offen!"; sIRC.SendIRC(ticketstatusmsg); } else if (countOpen == 0) { ticketstatusmsg += "PRIVMSG ChanServ TOPIC #wowticket "; ticketstatusmsg += "\x03"; ticketstatusmsg += "4"; ticketstatusmsg += "Es sind keine Tickets mehr offen!"; sIRC.SendIRC(ticketstatusmsg); } std::string infomsg; if (GUID_LOPART(_closedBy)) { infomsg += "PRIVMSG #wowticket "; infomsg += "\x03"; infomsg += "4Ticket mit ID "; sprintf(dest, "%d", _id); infomsg += dest; infomsg += " von Player "; infomsg += _playerName; infomsg += " (GUID: "; sprintf(dest, "%d", GUID_LOPART(_playerGuid)); infomsg += dest; infomsg += ") wurde von Player-GUID: "; sprintf(dest, "%d", GUID_LOPART(_closedBy)); infomsg += dest; infomsg += " geschlossen!"; sIRC.SendIRC(infomsg); } else { infomsg += "PRIVMSG #wowticket "; infomsg += "\x03"; infomsg += "4Player: "; infomsg += _playerName; infomsg += ", Player GUID: "; sprintf(dest, "%d", GUID_LOPART(_playerGuid)); infomsg += dest; infomsg += ", Ticket GUID: "; sprintf(dest, "%d", _id); infomsg += dest; infomsg += "; "; infomsg += "\x03"; infomsg += "1Map: "; sprintf(dest, "%d", _mapId); infomsg += dest; infomsg += "; X: "; sprintf(dest, "%f", _posX); infomsg += dest; infomsg += "; Y: "; sprintf(dest, "%f", _posY); infomsg += dest; infomsg += "; Z: "; sprintf(dest, "%f", _posZ); infomsg += dest; infomsg += "; GM GUID: "; sprintf(dest, "%d", GUID_LOPART(_assignedTo)); infomsg += dest; infomsg += "; CLOSED: "; sprintf(dest, "%d", GUID_LOPART(_closedBy)); infomsg += dest; sIRC.SendIRC(infomsg); if (_message.length() > 220) { std::string msgpart1; std::string msg1; msgpart1.insert(0, _message, 0, 220); msg1 += "PRIVMSG #wowticket "; msg1 += msgpart1; std::replace( msg1.begin(), msg1.end(), '\n', ' '); sIRC.SendIRC(msg1); std::string msgpart2; std::string msg2; msgpart2.insert(0, _message, 220, _message.length() - 220); msg2 += "PRIVMSG #wowticket "; msg2 += msgpart2; std::replace( msg2.begin(), msg2.end(), '\n', ' '); sIRC.SendIRC(msg2); } else { std::string msgpart1; std::string msg1; msgpart1.insert(0, _message, 0, _message.length()); msg1 += "PRIVMSG #wowticket "; msg1 += msgpart1; std::replace( msg1.begin(), msg1.end(), '\n', ' '); sIRC.SendIRC(msg1); } } CharacterDatabase.ExecuteOrAppend(trans, stmt); }
//move selected creature static bool HandleNpcMoveCommand(ChatHandler* handler, const char* args) { uint32 lowguid = 0; Creature* creature = handler->getSelectedCreature(); if (!creature) { // number or [name] Shift-click form |color|Hcreature:creature_guid|h[name]|h|r char* cId = handler->extractKeyFromLink((char*)args, "Hcreature"); if (!cId) return false; lowguid = atoi(cId); /* FIXME: impossible without entry if (lowguid) creature = ObjectAccessor::GetCreature(*handler->GetSession()->GetPlayer(), MAKE_GUID(lowguid, HIGHGUID_UNIT)); */ // Attempting creature load from DB data if (!creature) { CreatureData const* data = sObjectMgr->GetCreatureData(lowguid); if (!data) { handler->PSendSysMessage(LANG_COMMAND_CREATGUIDNOTFOUND, lowguid); handler->SetSentErrorMessage(true); return false; } uint32 map_id = data->mapid; if (handler->GetSession()->GetPlayer()->GetMapId() != map_id) { handler->PSendSysMessage(LANG_COMMAND_CREATUREATSAMEMAP, lowguid); handler->SetSentErrorMessage(true); return false; } } else { lowguid = creature->GetDBTableGUIDLow(); } } else { lowguid = creature->GetDBTableGUIDLow(); } float x = handler->GetSession()->GetPlayer()->GetPositionX(); float y = handler->GetSession()->GetPlayer()->GetPositionY(); float z = handler->GetSession()->GetPlayer()->GetPositionZ(); float o = handler->GetSession()->GetPlayer()->GetOrientation(); if (creature) { if (CreatureData const* data = sObjectMgr->GetCreatureData(creature->GetDBTableGUIDLow())) { const_cast<CreatureData*>(data)->posX = x; const_cast<CreatureData*>(data)->posY = y; const_cast<CreatureData*>(data)->posZ = z; const_cast<CreatureData*>(data)->orientation = o; } creature->SetPosition(x, y, z, o); creature->GetMotionMaster()->Initialize(); if (creature->isAlive()) // dead creature will reset movement generator at respawn { creature->setDeathState(JUST_DIED); creature->Respawn(); } } PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_CREATURE_POSITION); stmt->setFloat(0, x); stmt->setFloat(1, y); stmt->setFloat(2, z); stmt->setFloat(3, o); stmt->setUInt32(4, lowguid); WorldDatabase.Execute(stmt); handler->PSendSysMessage(LANG_COMMAND_CREATUREMOVED); return true; }
//add spawn of creature static bool HandleNpcAddCommand(ChatHandler* handler, const char* args) { if (!*args) return false; char* charID = handler->extractKeyFromLink((char*)args, "Hcreature_entry"); if (!charID) return false; char* team = strtok(NULL, " "); int32 teamval = 0; if (team) { teamval = atoi(team); } if (teamval < 0) { teamval = 0; } uint32 id = atoi(charID); Player* chr = handler->GetSession()->GetPlayer(); float x = chr->GetPositionX(); float y = chr->GetPositionY(); float z = chr->GetPositionZ(); float o = chr->GetOrientation(); Map* map = chr->GetMap(); if (chr->GetTransport()) { uint32 tguid = chr->GetTransport()->AddNPCPassenger(0, id, chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO()); if (tguid > 0) { PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_CREATURE_TRANSPORT); stmt->setInt32(0, int32(tguid)); stmt->setInt32(1, int32(id)); stmt->setInt32(2, int32(chr->GetTransport()->GetEntry())); stmt->setFloat(3, chr->GetTransOffsetX()); stmt->setFloat(4, chr->GetTransOffsetY()); stmt->setFloat(5, chr->GetTransOffsetZ()); stmt->setFloat(6, chr->GetTransOffsetO()); WorldDatabase.Execute(stmt); } return true; } Creature* creature = new Creature(); if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, (uint32)teamval, x, y, z, o)) { delete creature; return false; } creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); uint32 db_guid = creature->GetDBTableGUIDLow(); // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); if (!creature->LoadCreatureFromDB(db_guid, map)) { delete creature; return false; } sObjectMgr->AddCreatureToGrid(db_guid, sObjectMgr->GetCreatureData(db_guid)); return true; }