static void ReloadLoginIDBans() { // init variables char szDataPath[MAX_PATH]; GetUserDataPath(szDataPath); string scAcctPath = string(szDataPath) + "\\Accts\\MultiPlayer\\loginidbans.ini"; if (set_iPluginDebug) ConPrint(L"NOTICE: Loading Login ID bans from %s\n",stows(scAcctPath).c_str()); INI_Reader ini; set_lstLoginIDBans.clear(); if (ini.open(scAcctPath.c_str(), false)) { while (ini.read_header()) { while (ini.read_value()) { set_lstLoginIDBans.push_back(Trim(ini.get_name_ptr())); if (set_iPluginDebug) ConPrint(L"NOTICE: Adding Login ID ban %s\n", stows(ini.get_name_ptr()).c_str()); } } ini.close(); } ConPrint(L"ID Bans [%u]\n",set_lstLoginIDBans.size()); }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Loading Settings /////////////////////////////////////////////////////////////////////////////////////////////////////////////// //hey look a bug! void conDebug(wstring wscText) { if (set_iPluginDebug) { ConPrint(L"[BOUNTYTRACKER] " + wscText); ConPrint(L"\n"); } }
void PrintZones() { zone_map_t set_mmapZones; ReadUniverse(set_mmapZones); ConPrint(L"Zone, Commodity, MinLoot, MaxLoot, Difficultly, PosX, PosY, PosZ, SizeX, SizeY, SizeZ, IdsName, IdsInfo, Bonus\n"); for (zone_map_iter_t i=set_mmapZones.begin(); i!=set_mmapZones.end(); i++) { ConPrint(L"%s, %s, %d, %d, %d, %0.0f, %0.0f, %0.0f, %0.0f, %0.0f, %0.0f, %d, %d, %2.2f\n", stows(i->second.zoneNick).c_str(), stows(i->second.lootNick).c_str(), i->second.iMinLoot, i->second.iMaxLoot, i->second.iLootDifficulty, i->second.pos.x,i->second.pos.y,i->second.pos.z, i->second.size.x,i->second.size.y,i->second.size.z); } ConPrint(L"Zones=%d\n",set_mmapZones.size()); }
void REP::LoadSettings() { // The path to the configuration file. char szCurDir[MAX_PATH]; GetCurrentDirectory(sizeof(szCurDir), szCurDir); string scPluginCfgFile = string(szCurDir) + "\\flhook_plugins\\alley_rep.cfg"; INI_Reader ini; if (ini.open(scPluginCfgFile.c_str(), false)) { while (ini.read_header()) { if (ini.is_header("reputations")) { while (ini.read_value()) { if (ini.is_value("rep")) { uint solarnick = CreateID(ini.get_value_string(0)); const char* newrep = ini.get_value_string(1); ConPrint(L"DEBUG: Rep of %s is %s \n", stows(ini.get_value_string(0)).c_str(), stows(ini.get_value_string(1)).c_str()); uint obj_rep_group; pub::Reputation::GetReputationGroup(obj_rep_group, newrep); pub::Reputation::SetAffiliation(solarnick, obj_rep_group); } } } } ini.close(); } }
struct CObject * __cdecl HkCb_GetRoot(struct CObject *child) { try { return GetRoot(child); } catch (...) { AddLog("ERROR: Crash suppression in GetRoot(child=%08x)",child); ConPrint(L"ERROR: Crash suppression in GetRoot(child=%08x)\n",child); return child; } }
void LoadSettings() { returncode = DEFAULT_RETURNCODE; string File_FLHook = "..\\exe\\flhook_plugins\\changesys.cfg"; int iLoaded = 0; INI_Reader ini; if (ini.open(File_FLHook.c_str(), false)) { while (ini.read_header()) { if (ini.is_header("config")) { while (ini.read_value()) { if (ini.is_value("enabled")) { bPluginEnabled = ini.get_value_bool(0); } } } if (ini.is_header("AllowedSystems")) { while (ini.read_value()) { if (ini.is_value("sys")) { bPluginAllowedSystems.push_back(ini.get_value_string(0)); } if (ini.is_value("desc")) { bPluginAllowedSystemsFriendly = ini.get_value_string(); } } } } ini.close(); } ConPrint(L"ChangeSys: Loaded\n", iLoaded); }
void LoadSettings() { // The path to the configuration file. char szCurDir[MAX_PATH]; GetCurrentDirectory(sizeof(szCurDir), szCurDir); string scPluginCfgFile = string(szCurDir) + "\\flhook_plugins\\event.cfg"; INI_Reader ini; set_mapCargoMissions.clear(); set_mapNpcMissions.clear(); if (ini.open(scPluginCfgFile.c_str(), false)) { while (ini.read_header()) { if (ini.is_header("General")) { while (ini.read_value()) { if (ini.is_value("debug")) { set_iPluginDebug = ini.get_value_int(0); } else if (ini.is_value("cargo")) { CARGO_MISSION mis; mis.nickname = ini.get_value_string(0); mis.base = CreateID(ini.get_value_string(1)); mis.item = CreateID(ini.get_value_string(2)); mis.required_amount = ini.get_value_int(3); set_mapCargoMissions.insert(multimap<uint, CARGO_MISSION>::value_type(mis.base, mis)); } else if (ini.is_value("npc")) { NPC_MISSION mis; mis.nickname = ini.get_value_string(0); mis.system = CreateID(ini.get_value_string(1)); mis.sector = ini.get_value_string(2); pub::Reputation::GetReputationGroup(mis.reputation, ini.get_value_string(3)); mis.required_amount = ini.get_value_int(4); set_mapNpcMissions.insert(multimap<uint, NPC_MISSION>::value_type(mis.reputation, mis)); } } } ini.close(); } if (set_iPluginDebug&1) { ConPrint(L"CargoMissionSettings loaded [%d]\n",set_mapCargoMissions.size()); ConPrint(L"NpcMissionSettings loaded [%d]\n",set_mapNpcMissions.size()); } ini.close(); } // Read the last saved event status char szDataPath[MAX_PATH]; GetUserDataPath(szDataPath); string scStatsPath = string(szDataPath) + "\\Accts\\MultiPlayer\\event_stats.txt"; if (ini.open(scStatsPath.c_str(), false)) { while (ini.read_header()) { if (ini.is_header("Missions")) { while (ini.read_value()) { if (ini.is_value("cargo")) { string nickname = ini.get_value_string(0); int curr_amount = ini.get_value_int(2); for (multimap<uint, CARGO_MISSION>::iterator i = set_mapCargoMissions.begin(); i != set_mapCargoMissions.end(); ++i) { if (i->second.nickname == nickname) { i->second.curr_amount = curr_amount; } } } else if (ini.is_value("npc")) { NPC_MISSION mis; string nickname = ini.get_value_string(0); int curr_amount = ini.get_value_int(2); for (multimap<uint, NPC_MISSION>::iterator i = set_mapNpcMissions.begin(); i != set_mapNpcMissions.end(); ++i) { if (i->second.nickname == nickname) { i->second.curr_amount = curr_amount; } } } } } } ini.close(); } }
void __stdcall ShipDestroyed(DamageList *_dmg, DWORD *ecx, uint iKill) { returncode = DEFAULT_RETURNCODE; if (iKill) { CShip *cship = (CShip*)ecx[4]; //check the death was a player if (cship->is_player()) { uint iDestroyedID = cship->GetOwnerPlayer(); wstring wscDestroyedName = ToLower((wchar_t*)Players.GetActiveCharacterName(iDestroyedID)); //check if they have a bounty BountyTargetInfo BTId = mapBountyTargets[wscDestroyedName]; if (BTId.Char == wstos(wscDestroyedName) && stoi(BTId.xTimes) > 0 && BTId.active) { if (deleteBountyCfg(BTId)) { ///ConPrint(L"bounty removed from cfg\n"); } else { ConPrint(L"BOUNTYTRACKER: Err removing from cfg. is server admin?\n"); } // calls the killer the last one to damage the victim DamageList dmg; try { dmg = *_dmg; } catch (...) { return; } dmg = ClientInfo[iDestroyedID].dmgLast; //The killer's id uint iKillerID = HkGetClientIDByShip(dmg.get_inflictor_id()); //The killer's name wstring wscKillerName = (wchar_t*)Players.GetActiveCharacterName(iKillerID); //check if player killed by ai if (stoi(wstos(HkGetAccountIDByClientID(iKillerID))) == -1) { ///ConPrint(L"nevermind, ai got him"); return; } if (iKillerID == iDestroyedID) { ///ConPrint(L"killer and victim are the same"); return; } if (ToLower(wscKillerName) == stows(BTId.issuer)) { ///ConPrint(L"killer was the issuer of the bounty"); return; } // -1 to contracts left BTId.xTimes = itos(stoi(BTId.xTimes) - 1); if (stoi(BTId.xTimes) == 0) { //bounty has been fullfilled, clear all dataa BTId.active = false; BTId.Cash = "0"; BTId.xTimes = "0"; BTId.issuer = "n/a"; BTId.lastTime = itos((int)time(0)); BTId.issueTime = "0"; } //upload into neural net mapBountyTargets[wscDestroyedName] = BTId; if (appendBountyCfg(BTId)) { ///ConPrint(L"cfg saved\n"); } else { ConPrint(L"BOUNTYTRACKER: Err saving to cfg. is serevr admin?\n"); } //Print Friendly Wide String TargetInfo wstring PFwsTargetInfo; PFwsTargetInfo = L"Target: "; PFwsTargetInfo += ToLower(wscDestroyedName); PFwsTargetInfo += L" Worth: "; PFwsTargetInfo += stows(BTId.Cash); PFwsTargetInfo += L" Contracts Left: "; PFwsTargetInfo += stows(BTId.xTimes); PFwsTargetInfo += L" Issuer: "; PFwsTargetInfo += stows(BTId.issuer); PFwsTargetInfo += L" Issued at: "; PFwsTargetInfo += stows(BTId.issueTime); //add bounty cash HkAddCash(wscKillerName, stoi(BTId.Cash)); PrintUserCmdText(iKillerID, L"Successfully collected bounty on"); PrintUserCmdText(iKillerID, PFwsTargetInfo); PrintUserCmdText(iKillerID, L"Alerting bounty issuer..."); wstring IssuerMailMsg = L"Bounty Alert: " + wscKillerName + L" Has collected your bounty on " + wscDestroyedName + L". " + stows(BTId.xTimes) + L" Contracts remaining."; MailSend(stows(BTId.issuer), MSG_LOG, IssuerMailMsg); PrintUserCmdText(iKillerID, L"Saving record..."); wstring KillerMailMsg = L"Bounty Alert: " + wscKillerName + L" Has collected a bounty on " + wscDestroyedName + L". " + stows(BTId.xTimes) + L" Contracts remaining."; MailSend(wscKillerName, MSG_LOG, KillerMailMsg); PrintUserCmdText(iKillerID, L"OK"); return; } else { ///ConPrint(L"bounty tracker found no name match, or no more contracts for name\n");//either the name didn't match, or they have exhaused the number of contracts left on them. } } else { ///ConPrint(L"Bounty tracker found dead ai\n");//never mind, it's just an ai death } } return; }
bool UserCmd_BountyAddTo(uint iClientID, const wstring &wscCmd, const wstring &wscParam, const wchar_t *usage) { if (!bPluginEnabled) { PrintUserCmdText(iClientID, L"BountyTracker is disabled."); return true; } // Get the parameters from the user command. wstring wscName = GetParam(wscParam, L' ', 0); wstring wscCash = GetParam(wscParam, L' ', 1); wstring wscxTimes = GetParam(wscParam, L' ', 2); wscCash = ReplaceStr(wscCash, L".", L""); wscCash = ReplaceStr(wscCash, L",", L""); wscCash = ReplaceStr(wscCash, L"$", L""); wscCash = ReplaceStr(wscCash, L"e6", L"000000"); if (wscName == L"") { PrintUserCmdText(iClientID, L"ERR invalid name\n"); return false; } if (HkGetAccountByCharname(wscName) == 0) { PrintUserCmdText(iClientID, L"ERR Player does not exist"); return true; } if (wscCash == L"") { PrintUserCmdText(iClientID, L"ERR invalid cash amount\n"); return false; } if (stoi(wscCash) < 1000000) { PrintUserCmdText(iClientID, L"ERR bounty cannot be less than 1,000,000 s.c"); return true; } //get bounty BountyTargetInfo BTIat = mapBountyTargets[ToLower(wscName)]; //check if it is active if (!BTIat.active) { PrintUserCmdText(iClientID, L"ERR bounty not currently active"); return true; } //check user has enough money for the bounty int iCash; HkGetCash(stows(ToLower(wstos((wchar_t*)Players.GetActiveCharacterName(iClientID)))), iCash); if (iCash < (stoi(wscCash) * stoi(BTIat.xTimes))) { PrintUserCmdText(iClientID, L"ERR Not enough cash for bounty."); return true; } HkAddCash((wchar_t*)Players.GetActiveCharacterName(iClientID), 0 - (stoi(wscCash) * stoi(BTIat.xTimes))); if (deleteBountyCfg(BTIat)) { //ConPrint(L"bounty removed from cfg\n"); } else { ConPrint(L"BOUNTYTRACKER: Err removing from cfg. is server admin?\n"); } BTIat.Cash = itos(stoi(BTIat.Cash) + stoi(wscCash));//update cash bounty PrintUserCmdText(iClientID, L"Uploading to Neural Net..."); mapBountyTargets[ToLower(wscName)] = BTIat; if (appendBountyCfg(BTIat)) { //ConPrint(L"cfg saved\n"); } else { ConPrint(L"BOUNTYTRACKER: Err saving to cfg. is serevr admin?\n"); } PrintUserCmdText(iClientID, L"OK"); return true; }
bool UserCmd_BountyAdd(uint iClientID, const wstring &wscCmd, const wstring &wscParam, const wchar_t *usage) { if (!bPluginEnabled) { PrintUserCmdText(iClientID, L"BountyTracker is disabled."); return true; } // Get the parameters from the user command. wstring wscName = GetParam(wscParam, L' ', 0); wstring wscCash = GetParam(wscParam, L' ', 1); wstring wscxTimes = GetParam(wscParam, L' ', 2); wscCash = ReplaceStr(wscCash, L".", L""); wscCash = ReplaceStr(wscCash, L",", L""); wscCash = ReplaceStr(wscCash, L"$", L""); wscCash = ReplaceStr(wscCash, L"e6", L"000000");//because scientific notation is cool int iOnlineSecs; HkGetOnLineTime((wchar_t*)Players.GetActiveCharacterName(iClientID), iOnlineSecs); if (iOnlineSecs < 7200)// 7200 = 2hrs { PrintUserCmdText(iClientID, L"ERR Char is too new"); return true; } //you are not allowed to create a bounty. ERR rank too low (note, find out what a good rank should be to have access to this. no fresh chars can //create bounties. this way we can protect against creating random fresh accs, tranferring cash, and setting copious amounts of bounties. if (wscName == L"") { PrintUserCmdText(iClientID, L"ERR invalid name\n"); return false; } if (HkGetAccountByCharname(wscName) == 0) { PrintUserCmdText(iClientID, L"ERR Player does not exist"); return true; } if (mapBountyTargets[ToLower(wscName)].active) { PrintUserCmdText(iClientID, L"ERR Player already has an active bounty\n"); return true; } if (mapBountyTargets[ToLower(wscName)].lastTime != "") { if ((stoi(mapBountyTargets[ToLower(wscName)].lastTime) + 3600) > (int)time(0)) { PrintUserCmdText(iClientID, L"ERR Player is protected\n"); PrintUserCmdText(iClientID, stows(itos((stoi(mapBountyTargets[ToLower(wscName)].lastTime) + 3600) - (int)time(0))) + L"'s remaining"); return true; } } if (iClientID == HkGetClientIdFromCharname(stows(mapBountyTargets[ToLower(wscName)].lastIssuer)))//not too sure about this { PrintUserCmdText(iClientID, L"ERR You cannot double a bounty on this player\n"); return true; } if (wscCash == L"") { PrintUserCmdText(iClientID, L"ERR invalid cash amount\n"); return false; } if (wscxTimes == L"") { PrintUserCmdText(iClientID, L"ERR invalid contract limit\n"); return false; } if (stoi(wscCash) < 1000000) { PrintUserCmdText(iClientID, L"ERR bounty cannot be less than 1,000,000 s.c"); return true; } if (stoi(wscxTimes) < 0 || stoi(wscxTimes) > 5) { PrintUserCmdText(iClientID, L"ERR bounty contract limit cannot be less than 0 or more than 5"); return true; } BountyTargetInfo BTIa = mapBountyTargets[ToLower(wscName)]; //generate new bounty map values BTIa.Char = ToLower(wstos(wscName)); BTIa.Cash = wstos(wscCash); BTIa.xTimes = wstos(wscxTimes); BTIa.issuer = ToLower(wstos((wchar_t*)Players.GetActiveCharacterName(iClientID))); BTIa.lastIssuer = BTIa.issuer; BTIa.active = true; BTIa.lastTime = ""; BTIa.issueTime = itos((int)time(0)); //check user has enough money for the bounty int iCash; HkGetCash(stows(BTIa.issuer), iCash); if (iCash < (stoi(BTIa.Cash) * stoi(BTIa.xTimes))) { PrintUserCmdText(iClientID, L"ERR Not enough cash for bounty."); return true; } HkAddCash((wchar_t*)Players.GetActiveCharacterName(iClientID), 0 - (stoi(BTIa.Cash) * stoi(BTIa.xTimes))); PrintUserCmdText(iClientID, L"Uploading to Neural Net..."); mapBountyTargets[ToLower(wscName)] = BTIa; wstring PFwsTargetInfo; PFwsTargetInfo = L"Target: "; PFwsTargetInfo += ToLower(wscName); PFwsTargetInfo += L" Worth: "; PFwsTargetInfo += stows(BTIa.Cash); PFwsTargetInfo += L" Contracts Left: "; PFwsTargetInfo += stows(BTIa.xTimes); PFwsTargetInfo += L" Issuer: "; PFwsTargetInfo += stows(BTIa.issuer); PFwsTargetInfo += L" Issued: "; PFwsTargetInfo += stows(BTIa.issueTime); PrintUserCmdText(iClientID, PFwsTargetInfo); if (appendBountyCfg(BTIa)) { ConPrint(L"cfg saved\n"); } else { ConPrint(L"Err saving to cfg\n"); } PrintUserCmdText(iClientID, L"OK"); return true; }
void LoadSettings() { returncode = DEFAULT_RETURNCODE; string File_FLHook = "..\\exe\\flhook_plugins\\bountytracker.cfg"; string File_FLHook_bounties = "..\\exe\\flhook_plugins\\bountytrackerbounties.cfg"; int iLoaded = 0; INI_Reader ini; if (ini.open(File_FLHook.c_str(), false)) { while (ini.read_header()) { if (ini.is_header("config")) { while (ini.read_value()) { if (ini.is_value("enabled")) { bPluginEnabled = ini.get_value_bool(0); } if (ini.is_value("CleanInterval")) { iCleanInterval = ini.get_value_int(0); conDebug(L"cleaning interval set to " + stows(itos(iCleanInterval))); } if (ini.is_value("BountyAge")) { iBountyAge = ini.get_value_int(0); conDebug(L"bounty age set to " + stows(itos(iBountyAge))); } } } }ini.close(); } if (ini.open(File_FLHook_bounties.c_str(), false)) { while (ini.read_header()) { if (ini.is_header("bounty")) { while (ini.read_value()) { if (ini.is_value("hit")) { string setTargetName = ini.get_value_string(0); wstring theTargetName = ToLower(stows(setTargetName)); BTI.Char = ToLower(ini.get_value_string(0)); BTI.Cash = ini.get_value_string(1); BTI.xTimes = ini.get_value_string(2); BTI.issuer = ToLower(ini.get_value_string(3)); BTI.active = ini.get_value_bool(4); BTI.lastIssuer = ToLower(ini.get_value_string(5)); BTI.lastTime = ini.get_value_string(6); BTI.issueTime = ini.get_value_string(7); mapBountyTargets[theTargetName] = BTI; ++iLoaded; } } } } ini.close(); } ConPrint(L"BOUNTYTRACKER: Loaded %u Bounties\n", iLoaded); }
/** Move a character from a remote account into this one. */ bool Rename::UserCmd_MoveChar(uint iClientID, const wstring &wscCmd, const wstring &wscParam, const wchar_t *usage) { HK_ERROR err; // Don't indicate an error if moving is disabled. if (!set_bEnableMoveChar) return false; // Indicate an error if the command does not appear to be formatted correctly // and stop processing but tell FLHook that we processed the command. if (wscParam.size()==0) { PrintUserCmdText(iClientID, L"ERR Invalid parameters"); PrintUserCmdText(iClientID, usage); return true; } uint iBaseID; pub::Player::GetBase(iClientID, iBaseID); if (!iBaseID) { PrintUserCmdText(iClientID, L"ERR Not in base"); return true; } // Get the target account directory. string scFile; wstring wscMovingCharname = Trim(GetParam(wscParam, L' ', 0)); if (!GetUserFilePath(scFile, wscMovingCharname, "-movechar.ini")) { PrintUserCmdText(iClientID, L"ERR Character does not exist"); return true; } // Check the move char code. wstring wscCode = Trim(GetParam(wscParam, L' ', 1)); wstring wscTargetCode = IniGetWS(scFile, "Settings", "Code", L""); if (!wscTargetCode.length() || wscTargetCode!=wscCode) { PrintUserCmdText(iClientID, L"ERR Move character access denied"); return true; } // Get the character name for this connection. wstring wscCharname = (const wchar_t*)Players.GetActiveCharacterName(iClientID); for (map<wstring, LockedShipsStruct>::iterator i = MapLockedShips.begin(); i != MapLockedShips.end(); ++i) { if ((i->first == wscMovingCharname) && (i->second.LockLevel > 0)) { PrintUserCmdText(iClientID, L"ERR This ship is locked. The FBI has been notified."); wstring spurdoip; HkGetPlayerIP(iClientID, spurdoip); AddLog("SHIPLOCK: Attempt to movechar locked ship %s from IP %s", wstos(wscMovingCharname).c_str(), wstos(spurdoip).c_str()); ConPrint(L"SHIPLOCK: Attempt to movechar locked ship %s from IP %s\n", wscMovingCharname.c_str(), spurdoip.c_str()); return true; } } // Prevent ships from banned accounts from being moved. if (IsBanned(wscMovingCharname)) { PrintUserCmdText(iClientID, L"ERR not permitted"); return true; } // Saving the characters forces an anti-cheat checks and fixes // up a multitude of other problems. HkSaveChar(wscCharname); HkSaveChar(wscMovingCharname); // Read the current number of credits for the player // and check that the character has enough cash. int iCash = 0; if ((err = HkGetCash(wscCharname, iCash)) != HKE_OK) { PrintUserCmdText(iClientID, L"ERR "+HkErrGetText(err)); return true; } if (set_iMoveCost>0 && iCash<set_iMoveCost) { PrintUserCmdText(iClientID, L"ERR Insufficient credits"); return true; } // Check there is room in this account. CAccount *acc=Players.FindAccountFromClientID(iClientID); if (acc->iNumberOfCharacters >= 7) { PrintUserCmdText(iClientID, L"ERR Too many characters in account"); return true; } // Copy character file into this account with a temp name. char szDataPath[MAX_PATH]; GetUserDataPath(szDataPath); string scAcctPath = string(szDataPath) + "\\Accts\\MultiPlayer\\"; wstring wscDir; wstring wscSourceDir; wstring wscSourceFile; if ((err = HkGetAccountDirName(wscCharname, wscDir))!=HKE_OK) { PrintUserCmdText(iClientID, L"ERR "+HkErrGetText(err)); return true; } if ((err = HkGetAccountDirName(wscMovingCharname, wscSourceDir))!=HKE_OK) { PrintUserCmdText(iClientID, L"ERR "+HkErrGetText(err)); return true; } if ((err = HkGetCharFileName(wscMovingCharname, wscSourceFile))!=HKE_OK) { PrintUserCmdText(iClientID, L"ERR "+HkErrGetText(err)); return true; } // Remove cash if we're charging for it. if (set_iMoveCost>0) HkAddCash(wscCharname, 0-set_iMoveCost); HkSaveChar(wscCharname); // Schedule the move MOVE o; o.wscDestinationCharname = wscCharname; o.wscMovingCharname = wscMovingCharname; o.scSourceFile = scAcctPath + wstos(wscSourceDir) + "\\" + wstos(wscSourceFile) + ".fl"; o.scDestFile = scAcctPath + wstos(wscDir) + "\\" + wstos(wscSourceFile) + ".fl"; o.scDestFileTemp = scAcctPath + wstos(wscDir) + "\\" + wstos(wscSourceFile) + ".fl.moving"; pendingMoves.push_back(o); // Delete the move code ::DeleteFileA(scFile.c_str()); // Kick HkKickReason(o.wscDestinationCharname, L"Moving character, please wait 10 seconds before reconnecting"); HkKickReason(o.wscMovingCharname, L"Moving character, please wait 10 seconds before reconnecting"); return true; }
bool UserCmd_RenameMe(uint iClientID, const wstring &wscCmd, const wstring &wscParam, const wchar_t *usage) { HK_ERROR err; // Don't indicate an error if moving is disabled. if (!set_bEnableRenameMe) return false; // Indicate an error if the command does not appear to be formatted correctly // and stop processing but tell FLHook that we processed the command. if (wscParam.size()==0) { PrintUserCmdText(iClientID, L"ERR Invalid parameters"); PrintUserCmdText(iClientID, usage); return true; } uint iBaseID; pub::Player::GetBase(iClientID, iBaseID); if (!iBaseID) { PrintUserCmdText(iClientID, L"ERR Not in base"); return true; } // If the new name contains spaces then flag this as an // error. wstring wscNewCharname = Trim(GetParam(wscParam, L' ', 0)); // Get the character name for this connection. wstring wscCharname = (const wchar_t*)Players.GetActiveCharacterName(iClientID); for (map<wstring, LockedShipsStruct>::iterator i = MapLockedShips.begin(); i != MapLockedShips.end(); ++i) { if ((i->first == wscCharname) && (i->second.LockLevel > 0)) { PrintUserCmdText(iClientID, L"ERR This ship is locked. The FBI has been notified."); wstring spurdoip; HkGetPlayerIP(iClientID, spurdoip); AddLog("SHIPLOCK: Attempt to rename locked ship %s from IP %s", wstos(wscCharname).c_str(), wstos(spurdoip).c_str()); ConPrint(L"SHIPLOCK: Attempt to rename locked ship %s from IP %s\n", wscCharname.c_str(), spurdoip.c_str()); return true; } } if (wscNewCharname.find(L" ")!=-1) { PrintUserCmdText(iClientID, L"ERR Space characters not allowed in name"); return true; } if (HkGetAccountByCharname(wscNewCharname)) { PrintUserCmdText(iClientID, L"ERR Name already exists"); return true; } if (wscNewCharname.length() > 23) { PrintUserCmdText(iClientID, L"ERR Name to long"); return true; } if (wscNewCharname.length() < MIN_CHAR_TAG_LEN) { PrintUserCmdText(iClientID, L"ERR Name to short"); return true; } if (set_bCharnameTags) { wstring wscPassword = Trim(GetParam(wscParam, L' ', 1)); for (std::map<wstring, TAG_DATA>::iterator i = mapTagToPassword.begin(); i != mapTagToPassword.end(); ++i) { if (wscNewCharname.find(i->first)==0 && i->second.rename_password.size() != 0) { if (!wscPassword.length()) { PrintUserCmdText(iClientID, L"ERR Name starts with an owned tag. Password is required."); return true; } else if (wscPassword != i->second.master_password && wscPassword != i->second.rename_password) { PrintUserCmdText(iClientID, L"ERR Name starts with an owned tag. Password is wrong."); return true; } // Password is valid for owned tag. break; } } } // Saving the characters forces an anti-cheat checks and fixes // up a multitude of other problems. HkSaveChar(wscCharname); if (!HkIsValidClientID(iClientID)) return true; // Read the current number of credits for the player // and check that the character has enough cash. int iCash = 0; if ((err = HkGetCash(wscCharname, iCash)) != HKE_OK) { PrintUserCmdText(iClientID, L"ERR "+HkErrGetText(err)); return true; } if (set_iRenameCost>0 && iCash<set_iRenameCost) { PrintUserCmdText(iClientID, L"ERR Insufficient credits"); return true; } // Read the last time a rename was done on this character wstring wscDir; if ((err = HkGetAccountDirName(wscCharname, wscDir))!=HKE_OK) { PrintUserCmdText(iClientID, L"ERR "+HkErrGetText(err)); return true; } string scRenameFile = scAcctPath + wstos(wscDir) + "\\" + "rename.ini"; int lastRenameTime = IniGetI(scRenameFile, "General", wstos(wscCharname), 0); // If a rename was done recently by this player then reject the request. // I know that time() returns time_t...shouldn't matter for a few years // yet. if ((lastRenameTime + 300) < (int)time(0)) { if ((lastRenameTime + set_iRenameTimeLimit) > (int)time(0)) { PrintUserCmdText(iClientID, L"ERR Rename time limit"); return true; } } char szDataPath[MAX_PATH]; GetUserDataPath(szDataPath); string scAcctPath = string(szDataPath) + "\\Accts\\MultiPlayer\\"; wstring wscSourceFile; if ((err = HkGetCharFileName(wscCharname, wscSourceFile))!=HKE_OK) { PrintUserCmdText(iClientID, L"ERR "+HkErrGetText(err)); return true; } wstring wscDestFile; if ((err = HkGetCharFileName(wscNewCharname, wscDestFile))!=HKE_OK) { PrintUserCmdText(iClientID, L"ERR "+HkErrGetText(err)); return true; } // Remove cash if we're charging for it. if (set_iRenameCost>0) HkAddCash(wscCharname, 0-set_iRenameCost); RENAME o; o.wscCharname = wscCharname; o.wscNewCharname = wscNewCharname; o.scSourceFile = scAcctPath + wstos(wscDir) + "\\" + wstos(wscSourceFile) + ".fl"; o.scDestFile = scAcctPath + wstos(wscDir) + "\\" + wstos(wscDestFile) + ".fl"; o.scDestFileTemp = scAcctPath + wstos(wscDir) + "\\" + wstos(wscSourceFile) + ".fl.renaming"; pendingRenames.push_back(o); HkKickReason(o.wscCharname, L"Updating character, please wait 10 seconds before reconnecting"); IniWrite(scRenameFile, "General", wstos(o.wscNewCharname), itos((int)time(0))); return true; }
void LoadSettings() { returncode = DEFAULT_RETURNCODE; // The path to the configuration file. string marketshipsfile = "..\\data\\equipment\\market_ships.ini"; string marketcommoditiesfile = "..\\data\\equipment\\market_commodities.ini"; string flhookitems = "..\\exe\\flhook_plugins\\alley_mf.cfg"; int shipamount1 = 0; int shipamount2 = 0; int commodamount1 = 0; int commodamount2 = 0; INI_Reader ini; if (ini.open(marketshipsfile.c_str(), false)) { while (ini.read_header()) { if (ini.is_header("BaseGood")) { while (ini.read_value()) { uint currentbase; if (ini.is_value("base")) { currentbase = CreateID(ini.get_value_string(0)); shipamount1 = shipamount1 + 1; } else if (ini.is_value("marketgood")) { mapACShips[currentbase].push_back(CreateID(ini.get_value_string(0))); shipamount2 = shipamount2 + 1; } } } } ini.close(); } if (ini.open(marketcommoditiesfile.c_str(), false)) { while (ini.read_header()) { if (ini.is_header("BaseGood")) { while (ini.read_value()) { //uint temple = CreateID("st04_03_base"); uint bastilleguard = CreateID("iw09_03_base"); uint currentbase; if (ini.is_value("base")) { currentbase = CreateID(ini.get_value_string(0)); //we don't record operations from the temple of the damned so when we come across it we'll ignore it. //if (currentbase == temple) //{ // ConPrint(L"MARKETFUCKER: Ignoring Temple of the Damned. \n"); //} if (currentbase == bastilleguard) { ConPrint(L"MARKETFUCKER: Ignoring Bastille Guard Station. \n"); } else { mapACBases.push_back(currentbase); commodamount1 = commodamount1 + 1; } } } } } ini.close(); } if (ini.open(flhookitems.c_str(), false)) { while (ini.read_header()) { if (ini.is_header("items")) { while (ini.read_value()) { uint currentitem; if (ini.is_value("item")) { currentitem = CreateID(ini.get_value_string(0)); //mapACItems.push_back(currentitem); mapACItems[currentitem] = ini.get_value_string(0); commodamount2 = commodamount2 + 1; } } } } ini.close(); } ConPrint(L"MARKETFUCKER: Loaded %u ships for %u bases \n", shipamount2, shipamount1); ConPrint(L"MARKETFUCKER: Loaded %u items for %u bases \n", commodamount2, commodamount1); }