From: <ma...@us...> - 2013-02-23 19:25:48
|
Revision: 8603 http://planeshift.svn.sourceforge.net/planeshift/?rev=8603&view=rev Author: magodra Date: 2013-02-23 19:25:29 +0000 (Sat, 23 Feb 2013) Log Message: ----------- - Addeed to admin command /award practice <skill> <value> Modified Paths: -------------- trunk/src/server/adminmanager.cpp trunk/src/server/adminmanager.h Modified: trunk/src/server/adminmanager.cpp =================================================================== --- trunk/src/server/adminmanager.cpp 2013-02-23 18:29:28 UTC (rev 8602) +++ trunk/src/server/adminmanager.cpp 2013-02-23 19:25:29 UTC (rev 8603) @@ -188,6 +188,18 @@ return (skillName.IsEmpty()); } +psRewardDataPractice::psRewardDataPractice(csString pSkillName, int pPractice) + : psRewardData(REWARD_PRACTICE) +{ + skillName = pSkillName; + practice = pPractice; +} + +bool psRewardDataPractice::IsZero() +{ + return (skillName.IsEmpty() || practice == 0); +} + psRewardDataMoney::psRewardDataMoney(csString pmoneyType, int pmoneyCount, bool prandom) : psRewardData(REWARD_MONEY), moneyType(pmoneyType), moneyCount(pmoneyCount), random(prandom) { @@ -661,9 +673,9 @@ { if(!IsAllowedTargetType(ADMINCMD_TARGET_NPC)) { - // it is a npc, but npc is not an allowed target, so reset + // it is a npc, but npc is not an allowed target psserver->SendSystemError(me->clientnum,"Target is an NPC, but server does not allow this command on an npc."); - Reset(); + return false; } else { @@ -806,6 +818,7 @@ rewardTypes.Push("skill","<skillname>|all [+-]<value> [<max>]"); rewardTypes.Push("money","<circles|hexas|octas|trias> <value>|random"); rewardTypes.Push("faction","<factionname> <value>"); + rewardTypes.Push("practice","<skillname>|all <value>"); } bool AdminCmdRewardParser::ParseWords(size_t index, const WordArray &words) @@ -873,6 +886,18 @@ { rewards.Push(new psRewardDataFaction(words[index++], words.GetInt(index++))); } + else if(subCmd == "practice" && remaining >= 2) + { + relative = false; + skill = words[index++]; + + // check for relative value + if(words[index].GetAt(0) == '+' || words[index].GetAt(0) == '-') + relative = true; + delta = words.GetInt(index++); + + rewards.Push(new psRewardDataPractice(skill, delta)); + } else // invalid arguments { //check wether command was invalid or it was too short @@ -892,12 +917,13 @@ csString AdminCmdRewardParser::GetHelpMessage() { - return "REWARD: \n " + // rewardTypes.GetHelpMessage() + "\n" + " " + return "REWARD: \n " + rewardTypes.GetHelpMessage("exp") + "\n" + " " + rewardTypes.GetHelpMessage("item") + "\n" + " " + rewardTypes.GetHelpMessage("skill") + "\n" + " " + rewardTypes.GetHelpMessage("money") + "\n" + - " " + rewardTypes.GetHelpMessage("faction"); + " " + rewardTypes.GetHelpMessage("faction") + "\n" + + " " + rewardTypes.GetHelpMessage("practice"); } AdminCmdOnOffToggleParser::AdminCmdOnOffToggleParser(ADMINCMD_SETTING_ONOFF defaultValue) @@ -10105,6 +10131,12 @@ return; } + if(!target) + { + psserver->SendSystemError(gmClientNum, "No target selected!"); + return; + } + if(!target->GetCharacterData()) { psserver->SendSystemError(gmClientNum, "Invalid target to award"); @@ -10197,6 +10229,32 @@ } } + if(data->rewardType == psRewardData::REWARD_PRACTICE) // award skill practice + { + psRewardDataPractice* rewardDataPractice = dynamic_cast<psRewardDataPractice*>(data); + + bool modified = false; + if(rewardDataPractice->skillName == "all") // update all skills + { + for(size_t i = 0; i < psserver->GetCacheManager()->GetSkillAmount(); i++) + { + psSkillInfo* skill = psserver->GetCacheManager()->GetSkillByID(i); + if(!skill) continue; // skill doesn't exist -> this should not happen + modified |= target->GetCharacterData()->Skills().AddSkillPractice(skill, rewardDataPractice->practice); + } + } + else // update a certain one + { + psSkillInfo* skill = psserver->GetCacheManager()->GetSkillByName(rewardDataPractice->skillName); + modified |= target->GetCharacterData()->Skills().AddSkillPractice(skill, rewardDataPractice->practice); + } + + if(modified && target) // update client view if we changed something + { + psserver->GetProgressionManager()->SendSkillList(target, false); + } + } + if(data->rewardType == psRewardData::REWARD_MONEY) // award money { psRewardDataMoney* rewardDataMoney = dynamic_cast<psRewardDataMoney*>(data); Modified: trunk/src/server/adminmanager.h =================================================================== --- trunk/src/server/adminmanager.h 2013-02-23 18:29:28 UTC (rev 8602) +++ trunk/src/server/adminmanager.h 2013-02-23 19:25:29 UTC (rev 8603) @@ -92,7 +92,8 @@ REWARD_FACTION, ///< faction points REWARD_SKILL, ///< skill points REWARD_MONEY, ///< trias, octas, ... - REWARD_ITEM ///< an item + REWARD_ITEM, ///< an item + REWARD_PRACTICE ///< skill practice }; Reward_Type rewardType; ///< stores the reward type /see Reward_Type @@ -171,6 +172,26 @@ virtual bool IsZero(); ///< checks if the reward is zero }; +/// @brief RewardDataPractice holds practice reward data +class psRewardDataPractice : public psRewardData +{ +public: + /** name of the practice to adjust. + * may be "all" to adjust all practices. + * may be "copy" to set the values of the target + */ + csString skillName; + int practice; ///< value to adjust the practice by/set it to + + psRewardDataPractice(csString pSkillName, int pDelta); + + /** @brief checks if the reward is zero. + * + * @returns bool: true when reward is a zero gain, otherwise false + */ + virtual bool IsZero(); ///< checks if the reward is zero +}; + /// @brief RewardDataMoney holds money reward data class psRewardDataMoney : public psRewardData { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |