From: <la...@us...> - 2011-05-23 23:46:01
|
Revision: 7308 http://planeshift.svn.sourceforge.net/planeshift/?rev=7308&view=rev Author: landson Date: 2011-05-23 23:45:55 +0000 (Mon, 23 May 2011) Log Message: ----------- Unless I decide to add more possibilities later on, requirement checking is done and working. all checks are functional. Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psattack.cpp soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp soc/2011/combat/src/server/bulkobjects/psattackreqops.h soc/2011/combat/src/server/command.cpp Modified: soc/2011/combat/src/server/bulkobjects/psattack.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-05-22 08:29:23 UTC (rev 7307) +++ soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-05-23 23:45:55 UTC (rev 7308) @@ -312,9 +312,9 @@ //Hand specific?? also not required csString weaponHand = topNode->GetAttributeValue("hand",NULL); //also 1 or 2 of this type, Null means any at all, 1 means 1 specifically(2 would return false), and 2 means 2 specifically - int weaponNum = topNode->GetAttributeValueAsInt("number",NULL); + int weaponNum = topNode->GetAttributeValueAsInt("number",0); - if(weaponType.IsEmpty() || weaponName.IsEmpty()) + if(weaponType.IsEmpty() && weaponName.IsEmpty()) { Error1("Must have a weapon type or name to check against."); return false; @@ -323,15 +323,15 @@ } else if ( strcmp( topNode->GetValue(), "stance" ) == 0 ) { - csString stance = topNode->GetAttributeValue("name"); + csString stanceName = topNode->GetAttributeValue("name"); - if(stance.IsEmpty()) + if(stanceName.IsEmpty()) { Error1("Must specify a stance."); return false; } - - //requirement.AttachNew(new psAttackReqOpStance(stance)); + + requirement.AttachNew(new psAttackReqOpStance(stanceName)); } else if ( strcmp( topNode->GetValue(), "advisorpoints" ) == 0 ) { Modified: soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp 2011-05-22 08:29:23 UTC (rev 7307) +++ soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp 2011-05-23 23:45:55 UTC (rev 7308) @@ -386,6 +386,13 @@ bool psAttackReqOpWeapon::Check(psCharacter * character) { + bool type = false; + bool name = false; + bool hand = false; + bool num = false; + + + int numofwep = 0; for (int slot=0; slot<PSCHARACTER_SLOT_BULK1; slot++) { if (character->Inventory().CanItemAttack((INVENTORY_SLOT_NUMBER) slot)) @@ -393,19 +400,85 @@ INVENTORY_SLOT_NUMBER weaponSlot = (INVENTORY_SLOT_NUMBER) slot; psItem *weapon=character->Inventory().GetEffectiveWeaponInSlot(weaponSlot); PSITEMSTATS_WEAPONTYPE curWeaponType = weapon->GetWeaponType(); + csString curName = weapon->GetName(); - if(!weaponType.IsEmpty()) + if(checkType(curWeaponType) && checkName(curName)) { - if(weaponType == "sword" && (int)curWeaponType == 1) + name = true; + type = true; + if(checkHand(weaponSlot)) + hand=true; + if(weaponNum != 0) { - return true; + numofwep++; + if(checkNum(numofwep)) + num = true; + else + num = false; } + else + num = true; + } + + } } + return name && type && hand && num; +} + +bool psAttackReqOpWeapon::checkType(PSITEMSTATS_WEAPONTYPE type) +{ + if(weaponType.IsEmpty()) + return true; + + int flag; + + if(weaponType.Upcase() == "SWORD") + flag = 0; + else if(weaponType.Upcase() == "AXE") + flag = 1; + else if(weaponType.Upcase() == "DAGGER") + flag = 2; + else if(weaponType.Upcase() == "HAMMER") + flag = 3; + else if(weaponType.Upcase() == "BOW") + flag = 4; + else if(weaponType.Upcase() == "CROSSBOW") + flag = 5; + else if(weaponType.Upcase() == "SLING") + flag = 6; + + if(type == (PSITEMSTATS_WEAPONTYPE)flag) + return true; + + return true; +} +bool psAttackReqOpWeapon::checkName(csString wepName) +{ + if(weaponName.IsEmpty()) + return true; + + if(weaponName.Upcase() == wepName.Upcase()) + return true; return false; } +bool psAttackReqOpWeapon::checkHand(INVENTORY_SLOT_NUMBER slot) +{ + if(weaponHand.IsEmpty()) + return true; + SlotNameHash* slotNameId = new SlotNameHash(); + if(slot == slotNameId->GetID(weaponHand)) + return true; + return false; +} +bool psAttackReqOpWeapon::checkNum(int num) +{ + if(num == weaponNum) + return true; + return false; +} csString psAttackReqOpWeapon::GetScriptOp() { csString script; @@ -436,12 +509,12 @@ csPtr<psAttackReqOp> psAttackReqOpWeapon::Copy() { csRef<psAttackReqOpWeapon> copy; - copy.AttachNew(new psAttackReqOpWeapon(weaponType, weaponName,weaponHand, weaponNum)); + copy.AttachNew(new psAttackReqOpWeapon(weaponType, weaponName, weaponHand, weaponNum)); return csPtr<psAttackReqOp>(copy); } -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool psAttackReqOpStance::Check(psCharacter * character) { @@ -449,11 +522,11 @@ csString charstance = character->GetActor()->GetCombatStance().stance_name; //if the required stance matches the current stance return true. + if(stance == charstance) return true; return false; - } csString psAttackReqOpStance::GetScriptOp() Modified: soc/2011/combat/src/server/bulkobjects/psattackreqops.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackreqops.h 2011-05-22 08:29:23 UTC (rev 7307) +++ soc/2011/combat/src/server/bulkobjects/psattackreqops.h 2011-05-23 23:45:55 UTC (rev 7308) @@ -564,22 +564,22 @@ virtual csPtr<psAttackReqOp> Copy(); }; + /** * Weapon requirement operator. * * Checks for various weapon situations. */ -class psAttackReqOpWeapon : public psAttackReqOp +class psAttackReqOpWeapon: public psAttackReqOp { - protected: - csString weaponType;//if a specific weapon type is desired, not required is name is specified. - csString weaponName;//If a specific weapon is desired, not required. - - csString weaponHand; ///Hand specific? Not required or even likely to be used - - int weaponNum;///also 1 or 2 of this type, Null means any at all, 1 means 1 specifically(2 would return false), and 2 means 2 specifically + protected: + csString weaponType;//if a specific weapon type is desired, not required is name is specified. + csString weaponName;//If a specific weapon is desired, not required. + csString weaponHand; ///Hand specific? Not required or even likely to be used + int weaponNum;///also 1 or 2 of this type, Null means any at all, 1 means 1 specifically(2 would return false), and 2 means 2 specifically - public: + public: + /** * Construct a skill operator * @@ -588,13 +588,14 @@ * @param max The hand which should be checked for. * @param num The number of said weapon that should be held */ - psAttackReqOpWeapon(csString type, csString name, csString hand, int num):weaponType(type),weaponName(name),weaponHand(hand),weaponNum(num){}; + psAttackReqOpWeapon(csString weaponType, csString weaponName, csString weaponHand, int weaponNum):weaponType(weaponType),weaponName(weaponName),weaponHand(weaponHand),weaponNum(weaponNum){}; /** * Destructor */ virtual ~psAttackReqOpWeapon() {} + /** * Check if the weapon specification is correct * @@ -613,6 +614,7 @@ */ virtual csString GetScriptOp(); + /** * Copy the requirement operator * @@ -623,32 +625,60 @@ */ virtual csPtr<psAttackReqOp> Copy(); + + /** + * Checks weapon's type, if specified + * + */ + bool checkType(PSITEMSTATS_WEAPONTYPE type); + + + /** + * Checks weapon's name, if specified + * + */ + bool checkName(csString wepName); + + + /** + * Checks weapon's Hand, if specified + * + */ + bool checkHand(INVENTORY_SLOT_NUMBER theslot); + + + /** + * Checks weapon's number, if specified + * + */ + bool checkNum(int num); }; /** - * Stance requirement operator. + * Weapon requirement operator. * - * Checks to see if a player is in a specific stance + * Checks for various weapon situations. */ -class psAttackReqOpStance : public psAttackReqOp +class psAttackReqOpStance: public psAttackReqOp { - protected: - csString stance; /// stance a player should be in + protected: + csString stance; - public: + public: + /** * Construct a stance operator * * @param stance The stance which should be checked for. - */ psAttackReqOpStance(csString stance):stance(stance){}; /** * Destructor */ - virtual ~psAttackReqOpStance() {}; + virtual ~psAttackReqOpStance() {} + /** * Check if the player stance is correct * @@ -657,6 +687,7 @@ */ virtual bool Check(psCharacter * character); + /** * Convert the requirement operator to a xml string * @@ -667,6 +698,8 @@ */ virtual csString GetScriptOp(); + + /** * Copy the requirement operator * @@ -678,5 +711,6 @@ virtual csPtr<psAttackReqOp> Copy(); }; + + #endif - \ No newline at end of file Modified: soc/2011/combat/src/server/command.cpp =================================================================== --- soc/2011/combat/src/server/command.cpp 2011-05-22 08:29:23 UTC (rev 7307) +++ soc/2011/combat/src/server/command.cpp 2011-05-23 23:45:55 UTC (rev 7308) @@ -356,7 +356,7 @@ } if(client->GetConnection()) { - clientStatus.AppendFmt(" %4u %4u %4.2f %4u", client->GetConnection()->RTO, + clientStatus.AppendFmt(" %4u %4u %4.2f %4u", client->GetConnection()->RTO, client->GetConnection()->window, client->GetConnection()->sends > 0 ? 100.0 * client->GetConnection()->resends/client->GetConnection()->sends : 0.0, client->GetConnection()->sends); } clientStatus.Append('\n'); @@ -1700,7 +1700,7 @@ } if (!pattern || strstr(obj->GetName(),pattern) || atoi(pattern) == (int)obj->GetEID().Unbox()) - { + { csVector3 pos; float rot; iSector *sector; @@ -2260,31 +2260,68 @@ } return 0; } -int com_attackCheck(char * str) +int com_attackCheck(char * line) { - csString cmd(str); - WordArray words(cmd); + bool temploaded=false; + if (!line) + { + CPrintf(CON_CMDOUTPUT ,"Please specify Character Name and Attack Name.\n"); + return 0; + } + + WordArray words(line); + csString charName = words[0]; - csString attack = words[1]; + csString attackName = words[1]; + if (!charName.Length() || !attackName.Length()) + { + CPrintf(CON_CMDOUTPUT ,"Please specify Character Name and Attack Name.\n"); + return 0; + } + + // Get the UID of this character based on the provided name. This ensures the name is accurate. PID characteruid = psserver->CharacterLoader.FindCharacterID(charName.GetData()); + if (!characteruid.IsValid()) + { + CPrintf(CON_CMDOUTPUT ,"Character name not found.\n"); + return 0; + } + + // If the character is online, update the stats live. Otherwise we need to load the character data to add this item to + // an appropriate inventory slot. psCharacter *chardata=NULL; Client* client = psserver->GetNetManager()->GetConnections()->Find(charName.GetData()); + if (!client) + { + // Character is not online + chardata=psserver->CharacterLoader.LoadCharacterData(characteruid,false); + temploaded=true; + } + else + chardata=client->GetCharacterData(); - chardata=client->GetCharacterData(); + + if (chardata==NULL) + { + CPrintf(CON_CMDOUTPUT ,"Could not get character data for specified character.\n"); + return 0; + } - psAttack* attk = psserver->cachemanager->GetAttackByName(attack); + psAttack* attk = psserver->GetCacheManager()->GetAttackByName(attackName); + if(attk->requirementsMet(chardata)) - { - CPrintf(CON_CMDOUTPUT, "Requirements met!!\n"); - } + CPrintf(CON_CMDOUTPUT ,"requirements met.\n"); else - { - CPrintf(CON_CMDOUTPUT, "Requirements not met!!\n"); - } + CPrintf(CON_CMDOUTPUT ,"requirements not met.\n"); + + if (temploaded) + delete chardata; + return 0; + } int com_questreward( char* str ) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |