From: <la...@us...> - 2011-05-14 15:47:19
|
Revision: 7277 http://planeshift.svn.sourceforge.net/planeshift/?rev=7277&view=rev Author: landson Date: 2011-05-14 15:47:13 +0000 (Sat, 14 May 2011) Log Message: ----------- -Added comments to the attack database table -Fixed/Added comments in the attack data structure -Added the attacks table to drop.sql Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psattack.cpp soc/2011/combat/src/server/bulkobjects/psattack.h soc/2011/combat/src/server/database/mysql/attacks.sql soc/2011/combat/src/server/database/mysql/drop.sql Modified: soc/2011/combat/src/server/bulkobjects/psattack.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-05-14 15:20:16 UTC (rev 7276) +++ soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-05-14 15:47:13 UTC (rev 7277) @@ -1,7 +1,7 @@ /* - * psattack.cpp + * psattack.cpp creator: har...@gm... * -// * Copyright (C) 2003 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) * * * This program is free software; you can redistribute it and/or @@ -17,6 +17,7 @@ * */ + #include <psconfig.h> //============================================================================= // Crystal Space Includes @@ -70,11 +71,3 @@ return true; } - -bool psAttack::PostLoad() -{ - //todo - - return true; -} - Modified: soc/2011/combat/src/server/bulkobjects/psattack.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattack.h 2011-05-14 15:20:16 UTC (rev 7276) +++ soc/2011/combat/src/server/bulkobjects/psattack.h 2011-05-14 15:47:13 UTC (rev 7277) @@ -1,7 +1,7 @@ /* - * psattack.cpp creator har...@gm... + * psattack.cpp creator: har...@gm... * - * Copyright (C) 2001-2008 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) * * * This program is free software; you can redistribute it and/or @@ -39,19 +39,42 @@ psAttack(); virtual ~psAttack(); + /* This method can be called when the attack is loaded from the database + * The row is passed in and can be parsed into the attack datastructure + * + * @param row The row pulled from the attack database holding the attack values + * @return True if row is parsed succesfully. + */ bool Load(iResultRow& row); - bool PostLoad(); + /* This method can be called When you want to do a quick initialization of an attack. + * will be set to default values with a different name, can be used to create attacks on the fly if ever needed. + * + * @param nid The ID of the attack + * @param nname The name of the new attack + */ void Init(int nid, const char *nname); + /* Gets the ID of the attack + * @return ID of the attack + */ int GetID() const { return id; } + /* Gets the name of the attack + * @return name of the attack + */ const char *GetName() const { return name; } + /* Gets the multiplier of the attack + * @return multiplier of the attack + */ double GetMultiplier() const {return multiplier; } + /* Gets the animation of the attack + * @return animation of the attack + */ const char *GetAnim() const {return anim; } protected: - int id; - csString name; - float multiplier; - csString anim; + int id; /// The stored ID of the attack + csString name; /// The stored name of the attack + float multiplier; /// The stored multiplier of the attack instance + csString anim; /// The stored animation of the attack instance. }; #endif Modified: soc/2011/combat/src/server/database/mysql/attacks.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/attacks.sql 2011-05-14 15:20:16 UTC (rev 7276) +++ soc/2011/combat/src/server/database/mysql/attacks.sql 2011-05-14 15:47:13 UTC (rev 7277) @@ -1,5 +1,19 @@ -- ---------------------------- -- Table structure for `attacks` +-- This table holds attcks to be used in the updated +-- combat system. +-- +-- `id` holds the attacks unique id number +-- `name` is the attacks name, each name must be unique. +-- `multiplier` is the float value that the final damage is multiplied by to get the attack specific final damage +-- `anim` is the name of the animation the character uses for the specific attack +-- `requirements` is a xml script of requirements, these requirements will be checked before a character can +-- use the attack. schema to be added soon, but will be very flexable. +-- `special` is another script that allows varaibles to be set for different special effects for each attack. +-- - won't be used in this stage, but will be extended upon in stage 2 of the project. +-- `aoe` is a script that allows aoe variables to be set, not so much a script and may be changed, it +-- will allows the variable of how radius such to to be set. +-- - won't be used in this stage, but will be extended upon in stage 2 of the project. -- ---------------------------- DROP TABLE IF EXISTS `attacks`; CREATE TABLE `attacks` ( @@ -7,11 +21,11 @@ `name` varchar(40) NOT NULL DEFAULT 'default', `multiplier` double(5,3) DEFAULT '1.000', `anim` varchar(40) DEFAULT 'default', - `prerequisite` varchar(250) DEFAULT '<preq></preq>', - `special` varchar(250) DEFAULT '<special></special>', + `requirements` varchar(250) DEFAULT '<req></req>', + `special` varchar(250) DEFAULT '<spec></spec>', `aoe` varchar(250) DEFAULT '<aoe></aoe>', PRIMARY KEY (`id`), UNIQUE KEY (`name`) )ENGINE=MyISAM DEFAULT CHARSET=latin1; -INSERT INTO `attacks` VALUES (1, 'default',1.000,'default','<preq></preq>','<special></special>','<aoe></aoe>'); +INSERT INTO `attacks` VALUES (1, 'default',1.000,'default','<req></req>','<special></special>','<aoe></aoe>'); Modified: soc/2011/combat/src/server/database/mysql/drop.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/drop.sql 2011-05-14 15:20:16 UTC (rev 7276) +++ soc/2011/combat/src/server/database/mysql/drop.sql 2011-05-14 15:47:13 UTC (rev 7277) @@ -3,6 +3,7 @@ DROP TABLE action_locations; DROP TABLE alliances; DROP TABLE `armor_vs_weapon`; +DROP TABLE `attacks`; DROP TABLE `bad_names`; DROP TABLE bans; DROP TABLE `character_events`; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-05-20 03:41:19
|
Revision: 7298 http://planeshift.svn.sourceforge.net/planeshift/?rev=7298&view=rev Author: landson Date: 2011-05-20 03:41:12 +0000 (Fri, 20 May 2011) Log Message: ----------- -Finished the basis of requirement checking for attacks, just need to finish weapon and stance support -added a command for testing purposes, will remove later likely Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psattack.cpp soc/2011/combat/src/server/bulkobjects/psattack.h 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-18 20:33:32 UTC (rev 7297) +++ soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-05-20 03:41:12 UTC (rev 7298) @@ -66,23 +66,52 @@ bool psAttack::Load(iResultRow& row) { id = row.GetInt("id"); - name = row.GetString("name"); + name = row["name"]; multiplier = row.GetFloat("multiplier"); - anim = row.GetString("anim"); + anim = row["anim"]; + requirementStr = row["requirements"]; + LoadRequirementXML(requirement,this,requirementStr); return true; } bool psAttack::postload() { + // Parse the requirement string + if (!requirementStr.IsEmpty()) + { + Debug2(LOG_QUESTS,0, "Loading prereq : %s", requirementStr.GetDataSafe()); + + if (!LoadRequirementXML(requirement,this,requirementStr)) + { + Error1("Failed to load prerequisite XML!"); + return false; + } + + if (requirement) + { + requirementStr.Empty(); + Debug2(LOG_QUESTS, 0, "Resulting prereq: %s\n", requirement->GetScript().GetDataSafe()); + } + else + return false; + } + return true; } csString psAttack::GetRequirementStr() { + if (requirement) + return requirement->GetScript(); + return ""; } +bool psAttack::requirementsMet(psCharacter *chardata) +{ + return requirement->Check(chardata); +} bool LoadRequirementXML(iDocumentNode * topNode, psAttack * self, csRef<psAttackReqOp>& requirement) { if ( strcmp( topNode->GetValue(), "req" ) == 0 ) @@ -252,5 +281,136 @@ break; } } + else if ( strcmp( topNode->GetValue(), "faction" ) == 0 ) + { + csString name = topNode->GetAttributeValue("name"); + if (name.IsEmpty()) + { + Error1("No name given for faction requirement operation"); + return false; + } + + Faction * faction = psserver->GetCacheManager()->GetFaction(name); + if (!faction) + { + Error2("Can't find faction '%s' for faction requirement operation",name.GetDataSafe()); + return false; + } + + int value = topNode->GetAttributeValueAsInt("value"); + + int max = topNode->GetAttributeValueAsInt("max"); + + requirement.AttachNew(new psAttackReqOpFaction(faction,value,max!=0)); + + } + else if ( strcmp( topNode->GetValue(), "weapon" ) == 0 ) + { + csString weaponType = topNode->GetAttributeValue("type",NULL); + // It is possible to limit attack by a specific weapon, to allow for certain weapons to have specials, but by default this is left empty + csString weaponName = topNode->GetAttributeValue("name",NULL); + //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); + + if(weaponType.IsEmpty() || weaponName.IsEmpty()) + { + Error1("Must have a weapon type or name to check against."); + return false; + } + requirement.AttachNew(new psAttackReqOpWeapon(weaponType,weaponName,weaponHand,weaponNum)); + } + else if ( strcmp( topNode->GetValue(), "stance" ) == 0 ) + { + csString stance = topNode->GetAttributeValue("name"); + + if(stance.IsEmpty()) + { + Error1("Must specify a stance."); + return false; + } + + //requirement.AttachNew(new psAttackReqOpStance(stance)); + } + else if ( strcmp( topNode->GetValue(), "advisorpoints" ) == 0 ) + { + int min = topNode->GetAttributeValueAsInt("min"); + + int max = topNode->GetAttributeValueAsInt("max"); + + csString type = topNode->GetAttributeValue("type"); + + if (type.IsEmpty()) + { + Error1("No type given for advisorpoints prerequisite operation"); + return false; + } + + requirement.AttachNew(new psAttackReqOpAdvisorPoints(min,max,type)); + } + else if ( strcmp( topNode->GetValue(), "skill" ) == 0 ) + { + csString name = topNode->GetAttributeValue("name"); + if (name.IsEmpty()) + { + Error1("No name given for skill prerequisite operation"); + return false; + } + + psSkillInfo * skill = psserver->GetCacheManager()->GetSkillByName( name ); + if (!skill) + { + Error2("Can't find skill '%s' for skill prerequisite operation",name.GetDataSafe()); + return false; + } + + unsigned int min = topNode->GetAttributeValueAsInt("min"); + + unsigned int max = topNode->GetAttributeValueAsInt("max"); + + //we don't allow buffed stats to be taken in consideration by default + bool allowBuffed = topNode->GetAttributeValueAsBool("allowbuffed", false); + + requirement.AttachNew(new psAttackReqOpSkill(skill,min,max, allowBuffed)); + } + else + { + Error2("Node \"%s\" isn't supported in prerequisite scripts",topNode->GetValue()); + return false; + } + return true; +} + +bool LoadRequirementXML(csRef<psAttackReqOp>& requirement, psAttack* self, csString script) +{ + csRef<iDocumentSystem> xml = csPtr<iDocumentSystem>(new csTinyDocumentSystem); + csRef<iDocument> doc = xml->CreateDocument(); + const char* error = doc->Parse( script ); + if ( error ) + { + Error3("%s\n%s",error, script.GetDataSafe() ); + return false; + } + + csRef<iDocumentNode> root = doc->GetRoot(); + if(!root) + { + Error1("No XML root in prerequisite script"); + return false; + } + csRef<iDocumentNode> topNode = root->GetNode("req"); + if (topNode) + { + return LoadRequirementXML(topNode,self,requirement); + } + else + { + Error3("Could not find <pre> tag in requirement script '%s' for quest '%s'!", + script.GetData(),(self?self->GetName():"(null)")); + return false; + } + + return true; } \ No newline at end of file Modified: soc/2011/combat/src/server/bulkobjects/psattack.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattack.h 2011-05-18 20:33:32 UTC (rev 7297) +++ soc/2011/combat/src/server/bulkobjects/psattack.h 2011-05-20 03:41:12 UTC (rev 7298) @@ -34,17 +34,16 @@ class psCharacter; class psAttack; -/** - * Utility function to parse requirement scripts. - * - * @param requirement The variable that will hold the parsed requirements - * @param self Pointer to the attack if used to load for an attack - * @param scripts The requirement to parse <req>...</req>. - * @return True if successfully parsed. - */ -bool LoadRequirementXML(csRef<psAttackReqOp>& requirement, psAttack* self, csString script); - - + /** + * Utility function to parse requirement scripts. + * + * @param requirement The variable that will hold the parsed requirements + * @param self Pointer to the attack if used to load for an attack + * @param scripts The requirement to parse <req>...</req>. + * @return True if successfully parsed. + */ + bool LoadRequirementXML(csRef<psAttackReqOp>& requirement, psAttack* self, csString script); + bool LoadRequirementXML(iDocumentNode * topNode, psAttack * self, csRef<psAttackReqOp>& requirement); /** An attack data holder/parser * This class will hold data about attacks, as well as parse any scripts needed for the attack. */ @@ -97,7 +96,13 @@ * @return requirement as string */ csString GetRequirementStr(); - + + /** + * + * + */ + bool requirementsMet(psCharacter *character); + protected: int id; /// The stored ID of the attack csString name; /// The stored name of the attack Modified: soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp 2011-05-18 20:33:32 UTC (rev 7297) +++ soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp 2011-05-20 03:41:12 UTC (rev 7298) @@ -261,4 +261,189 @@ } return csPtr<psAttackReqOp>(copy); } -/////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file +/////////////////////////////////////////////////////////////////////////////////////////// + + +bool psAttackReqOpFaction::Check(psCharacter * character) +{ + if(max) + { + // If value is max, make sure we're below it + return !character->CheckFaction(faction,value); + } + return character->CheckFaction(faction,value); +} + +csString psAttackReqOpFaction::GetScriptOp() +{ + csString script; + + script.AppendFmt("<faction name=\"%s\" value=\"%d\" max=\"%d\"/>",faction->name.GetData(),value,max); + + return script; +} + +csPtr<psAttackReqOp> psAttackReqOpFaction::Copy() +{ + csRef<psAttackReqOpFaction> copy; + copy.AttachNew(new psAttackReqOpFaction(faction,value,max)); + return csPtr<psAttackReqOp>(copy); +} + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +bool psAttackReqOpAdvisorPoints::Check(psCharacter * character) +{ + if(character->GetActor()) + { + if(character->GetActor()->GetClient()) + { + if(type == "min") + return (character->GetActor()->GetClient()->GetAdvisorPoints() > minPoints); + if(type == "max") + return (character->GetActor()->GetClient()->GetAdvisorPoints() < maxPoints); + if(type == "both") + return (character->GetActor()->GetClient()->GetAdvisorPoints() > minPoints && + character->GetActor()->GetClient()->GetAdvisorPoints() < maxPoints); + } + } + return false; +} + +csString psAttackReqOpAdvisorPoints::GetScriptOp() +{ + csString script; + + script.Format("<advisorpoints min=\"%d\" max=\"%d\" type=\"%s\"/>", minPoints, maxPoints, type.GetDataSafe()); + + return script; +} + +csPtr<psAttackReqOp> psAttackReqOpAdvisorPoints::Copy() +{ + csRef<psAttackReqOpAdvisorPoints> copy; + copy.AttachNew(new psAttackReqOpAdvisorPoints(minPoints, maxPoints, type)); + return csPtr<psAttackReqOp>(copy); +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +bool psAttackReqOpSkill::Check(psCharacter * character) +{ + int skill_val; + + //if we allow buffed stats to be taken in consideration we take the + //current skill else we take the base skill (without buff/debuff) + if(allowBuffed) + skill_val = character->GetSkillRank(skill->id).Current(); + else + skill_val = character->GetSkillRank(skill->id).Base(); + + if(max && skill_val > max) + { + return false; + } + if(min && skill_val < min) + { + return false; + } + return true; +} + +csString psAttackReqOpSkill::GetScriptOp() +{ + csString script; + + script.AppendFmt("<skill name=\"%s\"", skill->name.GetData()); + if(min) + { + script.AppendFmt(" min=\"%d\"", min); + } + if(max) + { + script.AppendFmt(" max=\"%d\"", max); + } + + script.AppendFmt(" allowbuffed=\"%s\" />", allowBuffed ? "true" : "false"); + + return script; +} + +csPtr<psAttackReqOp> psAttackReqOpSkill::Copy() +{ + csRef<psAttackReqOpSkill> copy; + copy.AttachNew(new psAttackReqOpSkill(skill, min, max, allowBuffed)); + return csPtr<psAttackReqOp>(copy); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +bool psAttackReqOpWeapon::Check(psCharacter * character) +{ + + return true; +} + +csString psAttackReqOpWeapon::GetScriptOp() +{ + csString script; + + script.AppendFmt("<weapon "); + if(!weaponType.IsEmpty()) + { + script.AppendFmt("type=\"%s\" ", weaponType); + } + if(!weaponName.IsEmpty()) + { + script.AppendFmt("name=\"%s\" ", weaponName); + } + if(!weaponHand.IsEmpty()) + { + script.AppendFmt("hand=\"%s\" ", weaponHand); + } + if(!weaponNum == NULL) + { + script.AppendFmt("number=\"%d\" ", weaponNum); + } + + script.AppendFmt(" />"); + + return script; +} + +csPtr<psAttackReqOp> psAttackReqOpWeapon::Copy() +{ + csRef<psAttackReqOpWeapon> copy; + copy.AttachNew(new psAttackReqOpWeapon(weaponType, weaponName,weaponHand, weaponNum)); + return csPtr<psAttackReqOp>(copy); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +bool psAttackReqOpStance::Check(psCharacter * character) +{ + + return true; +} + +csString psAttackReqOpStance::GetScriptOp() +{ + csString script; + + script.AppendFmt("<stance name=\"%s\" />", stance); + + return script; +} + +csPtr<psAttackReqOp> psAttackReqOpStance::Copy() +{ + csRef<psAttackReqOpStance> copy; + copy.AttachNew(new psAttackReqOpStance(stance)); + return csPtr<psAttackReqOp>(copy); +} Modified: soc/2011/combat/src/server/bulkobjects/psattackreqops.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackreqops.h 2011-05-18 20:33:32 UTC (rev 7297) +++ soc/2011/combat/src/server/bulkobjects/psattackreqops.h 2011-05-20 03:41:12 UTC (rev 7298) @@ -384,8 +384,299 @@ +/** + * Faction requirement operator. + * + * The given faction level is needed for this requirement + * to be true. + */ +class psAttackReqOpFaction: public psAttackReqOp +{ + protected: + /** + * The faction that is to be checked. + */ + Faction * faction; + /** + * The faction level needed + */ + int value; + bool max; + public: + /** + * Construct a faction operator + * + * @param faction The quest that need to be assigned. + */ + psAttackReqOpFaction(Faction* faction, int value, bool max):faction(faction),value(value),max(max){}; + /** + */ + virtual ~psAttackReqOpFaction() {} + + /** + * Check if the faction is above level. + * + * requirement = Is the faction positive. + * + * @param character The character that are checking for a requirement + * @return True if the faction is positive. + */ + virtual bool Check(psCharacter * character); + + /** + * Convert the requirement operator to a xml string + * + * Convert the operator into the xml string: + * <faction name="faction name" value="faction value"/> + * + * @return XML string for the requirement operator. + */ + virtual csString GetScriptOp(); + + /** + * Copy the requirement operator + * + * Override this function to return a copy of the requirement + * operator. + * + * @return Copy of the requirement operator. + */ + virtual csPtr<psAttackReqOp> Copy(); +}; + + +/** + * advisor points requirement operator + * + * The advisorpoints must be beetwen maxPoints and minPoints. + */ +class psAttackReqOpAdvisorPoints : public psAttackReqOp +{ + protected: + int minPoints, maxPoints; + csString type; + + public: + + /** + * Construct an advisor points operator + * + * @param minPoints Minimal advisor points + * @param maxPoints Maximal advisor points + * @param type Type of the check + */ + psAttackReqOpAdvisorPoints(int minPoints, int maxPoints, csString type):minPoints(minPoints),maxPoints(maxPoints),type(type){}; + + virtual ~psAttackReqOpAdvisorPoints() {} + + /** + * Check if within the advisor points range + * + * @param character The character that are checking for a requirement + * @return True if in the valid range + */ + virtual bool Check(psCharacter * character); + + /** + * Convert the requirement operator to a xml string + * + * Convert the operator into the xml string: + * <advisorpoints min="-min" max="-max" type="min/max/both"/> + * + * @return XML string for the requirement operator. + */ + virtual csString GetScriptOp(); + + /** + * Copy the requirement operator + * + * Override this function to return a copy of the requirement + * operator. + * + * @return Copy of the requirement operator. + */ + virtual csPtr<psAttackReqOp> Copy(); +}; + +/** + * Skill requirement operator. + * + * The given skill level is required to be between min and max for this operator + * to be true. + */ +class psAttackReqOpSkill: public psAttackReqOp +{ + protected: + /** + * The skill name that is to be checked. + */ + psSkillInfo *skill; + + int min; ///< The minimum skill level + int max; ///< The maximum skill level + bool allowBuffed; ///< Stores if we should allow buff to be taken in consideration + public: + + /** + * Construct a skill operator + * + * @param skill The skill which should be checked for. + * @param min The minimum acceptable for this requirement to be true. + * @param max The maximum acceptable for this requirement to be true. + * @param allowBuffed Declares if buff should be taken in consideration + */ + psAttackReqOpSkill(psSkillInfo *skill, unsigned int min, unsigned int max, bool allowBuffed):skill(skill),min(min),max(max),allowBuffed(allowBuffed){}; + + /** + * Destructor + */ + virtual ~psAttackReqOpSkill() {} + + /** + * Check if the skill is in the range. + * + * @param character The character that are checking for a requirement + * @return True if min <= skill <= max. + */ + virtual bool Check(psCharacter * character); + + /** + * Convert the requirement operator to a xml string + * + * Convert the operator into the xml string: + * <skill name="skill name" min="0" max="0" allowbuffed="false" /> + * + * @return XML string for the requirement operator. + */ + virtual csString GetScriptOp(); + + /** + * Copy the requirement operator + * + * Override this function to return a copy of the requirement + * operator. + * + * @return Copy of the requirement operator. + */ + virtual csPtr<psAttackReqOp> Copy(); +}; + +/** + * Weapon requirement operator. + * + * Checks for various weapon situations. + */ +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 + + public: + /** + * Construct a skill operator + * + * @param type The type which should be checked for. + * @param name The name which should be checked for. + * @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){}; + + /** + * Destructor + */ + virtual ~psAttackReqOpWeapon() {} + + /** + * Check if the weapon specification is correct + * + * @param character The character that are checking for a requirement + * @return True if specs are correct. + */ + virtual bool Check(psCharacter * character); + + /** + * Convert the requirement operator to a xml string + * + * Convert the operator into the xml string: + * <weapon type="weapon type" name = "weapon name" hand = "hand" number="number needed of said weapon" /> + * + * @return XML string for the requirement operator. + */ + virtual csString GetScriptOp(); + + /** + * Copy the requirement operator + * + * Override this function to return a copy of the requirement + * operator. + * + * @return Copy of the requirement operator. + */ + virtual csPtr<psAttackReqOp> Copy(); + +}; + +/** + * Stance requirement operator. + * + * Checks to see if a player is in a specific stance + */ +class psAttackReqOpStance : public psAttackReqOp +{ + protected: + csString stance; /// stance a player should be in + + public: + /** + * Construct a stance operator + * + * @param stance The stance which should be checked for. + + */ + psAttackReqOpStance(csString stance):stance(stance){}; + + /** + * Destructor + */ + virtual ~psAttackReqOpStance() {}; + + /** + * Check if the player stance is correct + * + * @param character The character that are checking for a requirement + * @return True if specs are correct. + */ + virtual bool Check(psCharacter * character); + + /** + * Convert the requirement operator to a xml string + * + * Convert the operator into the xml string: + * <stance name = "stance name"/> + * + * @return XML string for the requirement operator. + */ + virtual csString GetScriptOp(); + + /** + * Copy the requirement operator + * + * Override this function to return a copy of the requirement + * operator. + * + * @return Copy of the requirement operator. + */ + 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-18 20:33:32 UTC (rev 7297) +++ soc/2011/combat/src/server/command.cpp 2011-05-20 03:41:12 UTC (rev 7298) @@ -75,6 +75,7 @@ #include "bulkobjects/psaccountinfo.h" #include "bulkobjects/pstrainerinfo.h" #include "bulkobjects/psitem.h" +#include "bulkobjects/psattack.h" #include "bulkobjects/pssectorinfo.h" int com_lock (char *) @@ -2259,7 +2260,32 @@ } return 0; } +int com_attackCheck(char * str) +{ + csString cmd(str); + WordArray words(cmd); + csString charName = words[0]; + csString attack = words[1]; + + PID characteruid = psserver->CharacterLoader.FindCharacterID(charName.GetData()); + psCharacter *chardata=NULL; + Client* client = psserver->GetNetManager()->GetConnections()->Find(charName.GetData()); + + chardata=client->GetCharacterData(); + + psAttack* attk = psserver->cachemanager->GetAttackByName(attack); + + if(attk->requirementsMet(chardata)) + { + CPrintf(CON_CMDOUTPUT, "Requirements met!!\n"); + } + else + { + CPrintf(CON_CMDOUTPUT, "Requirements not met!!\n"); + } + return 0; +} int com_questreward( char* str ) { csString cmd(str); @@ -2431,6 +2457,7 @@ return 0; } + /** List of commands available at the console. * * Add new commands that should be avalble at the console here. @@ -2501,6 +2528,7 @@ { "say", true, com_say, "Tell something to all players connected"}, { "gossipsay", true, com_sayGossip, "Tell something to all players in the main public channel"}, { "showinv", true, com_showinv, "Show items in a player's inventory" }, + { "checkattack", true, com_attackCheck, "Check if a player meets attack requirements" }, { "showinvf", true, com_showinvf, "Show items in a player's inventory (more item information)" }, // various commands This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
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. |
From: <la...@us...> - 2011-05-25 01:59:32
|
Revision: 7323 http://planeshift.svn.sourceforge.net/planeshift/?rev=7323&view=rev Author: landson Date: 2011-05-25 01:59:26 +0000 (Wed, 25 May 2011) Log Message: ----------- Weltall: You mentioned earlier that I had hardcoded weapon types, unpon trying to fix this I noticed that the reason I had to do this was because in psitemstats.h they were hardcoded so Here I removed all hardcoding and made some changes needed for it to work as such, I have run some tests and there seems to be no problems brought up by this, but I will continue testing it and make fixes if needed. Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp soc/2011/combat/src/server/bulkobjects/psattackreqops.h soc/2011/combat/src/server/bulkobjects/psitem.cpp soc/2011/combat/src/server/bulkobjects/psitem.h soc/2011/combat/src/server/bulkobjects/psitemstats.cpp soc/2011/combat/src/server/bulkobjects/psitemstats.h soc/2011/combat/src/server/command.cpp Modified: soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp 2011-05-24 21:36:10 UTC (rev 7322) +++ soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp 2011-05-25 01:59:26 UTC (rev 7323) @@ -399,7 +399,7 @@ { INVENTORY_SLOT_NUMBER weaponSlot = (INVENTORY_SLOT_NUMBER) slot; psItem *weapon=character->Inventory().GetEffectiveWeaponInSlot(weaponSlot); - PSITEMSTATS_WEAPONTYPE curWeaponType = weapon->GetWeaponType(); + csString curWeaponType = weapon->GetWeaponType(); csString curName = weapon->GetName(); if(checkType(curWeaponType) && checkName(curName)) @@ -427,29 +427,12 @@ return name && type && hand && num; } -bool psAttackReqOpWeapon::checkType(PSITEMSTATS_WEAPONTYPE type) +bool psAttackReqOpWeapon::checkType(csString 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) + if(type.Upcase() == weaponType.Upcase()) return true; return true; Modified: soc/2011/combat/src/server/bulkobjects/psattackreqops.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackreqops.h 2011-05-24 21:36:10 UTC (rev 7322) +++ soc/2011/combat/src/server/bulkobjects/psattackreqops.h 2011-05-25 01:59:26 UTC (rev 7323) @@ -630,7 +630,7 @@ * Checks weapon's type, if specified * */ - bool checkType(PSITEMSTATS_WEAPONTYPE type); + bool checkType(csString type); /** Modified: soc/2011/combat/src/server/bulkobjects/psitem.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psitem.cpp 2011-05-24 21:36:10 UTC (rev 7322) +++ soc/2011/combat/src/server/bulkobjects/psitem.cpp 2011-05-25 01:59:26 UTC (rev 7323) @@ -1767,7 +1767,7 @@ return current_stats->GetDescription(); } -PSITEMSTATS_WEAPONTYPE psItem::GetWeaponType() +csString psItem::GetWeaponType() { return current_stats->Weapon().Type(); } Modified: soc/2011/combat/src/server/bulkobjects/psitem.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psitem.h 2011-05-24 21:36:10 UTC (rev 7322) +++ soc/2011/combat/src/server/bulkobjects/psitem.h 2011-05-25 01:59:26 UTC (rev 7323) @@ -736,7 +736,7 @@ float GetRange() const { return current_stats->GetRange(); } csSet<unsigned int> GetAmmoTypeID() const { return current_stats->GetAmmoTypeID(); } - PSITEMSTATS_WEAPONTYPE GetWeaponType(); + csString GetWeaponType(); PSSKILL GetWeaponSkill(PSITEMSTATS_WEAPONSKILL_INDEX index); float GetLatency(); float GetDamage(PSITEMSTATS_DAMAGETYPE dmgtype); Modified: soc/2011/combat/src/server/bulkobjects/psitemstats.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psitemstats.cpp 2011-05-24 21:36:10 UTC (rev 7322) +++ soc/2011/combat/src/server/bulkobjects/psitemstats.cpp 2011-05-25 01:59:26 UTC (rev 7323) @@ -101,7 +101,7 @@ psItemWeaponStats::psItemWeaponStats() { - weapon_type=PSITEMSTATS_WEAPONTYPE_NONE; + weapon_type=""; memset(weapon_skill,0,sizeof(weapon_skill)); memset(attribute_bonuses,0,sizeof(attribute_bonuses)); @@ -117,8 +117,8 @@ void psItemWeaponStats::ReadStats( iResultRow& row ) { - csString type( row["item_type"] ); - if ( type == "SWORD" ) + weapon_type = row["item_type"]; + /*if ( type == "SWORD" ) weapon_type = PSITEMSTATS_WEAPONTYPE_SWORD; else if ( type == "AXE" ) weapon_type = PSITEMSTATS_WEAPONTYPE_AXE; @@ -131,7 +131,7 @@ else if ( type == "CROSSBOW" ) weapon_type = PSITEMSTATS_WEAPONTYPE_CROSSBOW; else if ( type == "SLING" ) - weapon_type = PSITEMSTATS_WEAPONTYPE_SLING; + weapon_type = PSITEMSTATS_WEAPONTYPE_SLING;*/ weapon_skill[PSITEMSTATS_WEAPONSKILL_INDEX_0] = psserver->GetCacheManager()->ConvertSkill(row.GetInt("item_skill_id_1")); weapon_skill[PSITEMSTATS_WEAPONSKILL_INDEX_1] = psserver->GetCacheManager()->ConvertSkill(row.GetInt("item_skill_id_2")); Modified: soc/2011/combat/src/server/bulkobjects/psitemstats.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psitemstats.h 2011-05-24 21:36:10 UTC (rev 7322) +++ soc/2011/combat/src/server/bulkobjects/psitemstats.h 2011-05-25 01:59:26 UTC (rev 7323) @@ -49,18 +49,18 @@ class psItem; struct psItemCategory; -enum PSITEMSTATS_WEAPONTYPE -{ - PSITEMSTATS_WEAPONTYPE_NONE = -1, - PSITEMSTATS_WEAPONTYPE_SWORD, - PSITEMSTATS_WEAPONTYPE_AXE, - PSITEMSTATS_WEAPONTYPE_DAGGER, - PSITEMSTATS_WEAPONTYPE_HAMMER, - PSITEMSTATS_WEAPONTYPE_BOW, - PSITEMSTATS_WEAPONTYPE_CROSSBOW, - PSITEMSTATS_WEAPONTYPE_SLING, - PSITEMSTATS_WEAPONTYPE_COUNT -}; +//enum PSITEMSTATS_WEAPONTYPE +//{ +// PSITEMSTATS_WEAPONTYPE_NONE = -1, +// PSITEMSTATS_WEAPONTYPE_SWORD, +// PSITEMSTATS_WEAPONTYPE_AXE, +// PSITEMSTATS_WEAPONTYPE_DAGGER, +// PSITEMSTATS_WEAPONTYPE_HAMMER, +// PSITEMSTATS_WEAPONTYPE_BOW, +// PSITEMSTATS_WEAPONTYPE_CROSSBOW, +// PSITEMSTATS_WEAPONTYPE_SLING, +// PSITEMSTATS_WEAPONTYPE_COUNT +//}; enum PSITEMSTATS_WEAPONSKILL_INDEX { @@ -263,7 +263,7 @@ /** Read the weapon related details from the database. */ void ReadStats( iResultRow& row ); - PSITEMSTATS_WEAPONTYPE Type() { return weapon_type; } + csString Type() { return weapon_type; } PSSKILL Skill(PSITEMSTATS_WEAPONSKILL_INDEX index); @@ -280,7 +280,7 @@ float AttributeBonusMax(int index); private: - PSITEMSTATS_WEAPONTYPE weapon_type; + csString weapon_type; PSSKILL weapon_skill[PSITEMSTATS_WEAPONSKILL_INDEX_COUNT]; st_attribute_bonus attribute_bonuses[PSITEMSTATS_STAT_BONUS_COUNT]; float latency; Modified: soc/2011/combat/src/server/command.cpp =================================================================== --- soc/2011/combat/src/server/command.cpp 2011-05-24 21:36:10 UTC (rev 7322) +++ soc/2011/combat/src/server/command.cpp 2011-05-25 01:59:26 UTC (rev 7323) @@ -1342,18 +1342,13 @@ CPrintf(CON_CMDOUTPUT ," Hardness:%g\n", item->GetHardness()); } - PSITEMSTATS_WEAPONTYPE weapontype = item->GetWeaponType(); - if (weapontype != PSITEMSTATS_WEAPONTYPE_NONE) + csString weapontype = item->GetWeaponType(); + if (!weapontype.IsEmpty()) { + indent(depth); - switch (weapontype) - { - case PSITEMSTATS_WEAPONTYPE_SWORD: CPrintf(CON_CMDOUTPUT ,"WType:Sword"); break; - case PSITEMSTATS_WEAPONTYPE_AXE: CPrintf(CON_CMDOUTPUT ,"WType:Axe"); break; - case PSITEMSTATS_WEAPONTYPE_DAGGER: CPrintf(CON_CMDOUTPUT ,"WType:Dagger"); break; - case PSITEMSTATS_WEAPONTYPE_HAMMER: CPrintf(CON_CMDOUTPUT ,"WType:Hammer"); break; - default:; - } + CPrintf(CON_CMDOUTPUT ,"WType:%s", weapontype); + CPrintf(CON_CMDOUTPUT ," Latency:%g Penetration:%g untgtblock:%g tgtblock=%g cntblock=%g\n", item->GetLatency(), item->GetPenetration(), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-06-04 05:13:39
|
Revision: 7360 http://planeshift.svn.sourceforge.net/planeshift/?rev=7360&view=rev Author: landson Date: 2011-06-04 05:13:32 +0000 (Sat, 04 Jun 2011) Log Message: ----------- I have started changing a lot of what I have done already to fit my new paradigm. THIS IS NOT COMPLETE IN ANY FORM. this is more of a backup commit. It does compile however Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psattack.cpp soc/2011/combat/src/server/bulkobjects/psattack.h soc/2011/combat/src/server/bulkobjects/psattackqueue.cpp soc/2011/combat/src/server/bulkobjects/psitem.h soc/2011/combat/src/server/bulkobjects/psitemstats.h soc/2011/combat/src/server/cachemanager.cpp soc/2011/combat/src/server/cachemanager.h soc/2011/combat/src/server/command.cpp soc/2011/combat/src/server/database/mysql/attack_types.sql Modified: soc/2011/combat/src/server/bulkobjects/psattack.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-06-04 02:51:16 UTC (rev 7359) +++ soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-06-04 05:13:32 UTC (rev 7360) @@ -19,99 +19,122 @@ #include <psconfig.h> +#include "psattack.h" //============================================================================= // Crystal Space Includes //============================================================================= #include <iutil/document.h> #include <csutil/xmltiny.h> +#include <csgeom/math.h> //============================================================================= // Project Includes //============================================================================= #include "util/log.h" -#include "util/strutil.h" -#include "util/consoleout.h" +#include "util/mathscript.h" +#include "util/psdatabase.h" -#include "../psserver.h" -#include "../cachemanager.h" +#include "psserver.h" +#include "gem.h" +#include "client.h" +#include "cachemanager.h" +#include "entitymanager.h" +#include "commandmanager.h" +#include "progressionmanager.h" +#include "npcmanager.h" #include "../globals.h" +#include "scripting.h" //============================================================================= // Local Includes //============================================================================= -#include "psattack.h" #include "psattackreqops.h" -#include "dictionary.h" psAttack::psAttack() { - id = 0; - name = ""; - multiplier = 1.0; - anim = ""; + chargeDuration = NULL; + attackDuration = NULL; + range = NULL; + aoeRadius = NULL; + aoeAngle = NULL; } psAttack::~psAttack() { - requirement = NULL; - + if (chargeDuration) + { + delete chargeDuration; + chargeDuration = NULL; + } + if (ticks) + { + delete ticks; + ticks = NULL; + } + if (range) + { + delete range; + range = NULL; + } + if (aoeRadius) + { + delete aoeRadius; + aoeRadius = NULL; + } + if (aoeAngle) + { + delete aoeAngle; + aoeAngle = NULL; + } } -void psAttack::Init(int nid, const char *nname) -{ - id = nid; - name = nname; -} bool psAttack::Load(iResultRow& row) { - id = row.GetInt("id"); + id = row.GetInt("id"); name = row["name"]; + + type = NULL;//will be changed + + image = row["image_name"]; + psserver->GetCacheManager()->AddCommonStringID(image); + + description = row["attack_description"]; + AttackEffect = row["attack_effect"]; multiplier = row.GetFloat("multiplier"); - anim = row["anim"]; + attackDuration = row.GetInt("attack_duration"); + chargeDuration = MathExpression::Create(row["charge_duration"]); + + ticks = MathExpression::Create(row["attack_ticks"]); + range = MathExpression::Create(row["range"]); + aoeRadius = MathExpression::Create(row["aoe_radius"]); + aoeAngle = MathExpression::Create(row["aoe_angle"]); + + outcome = psserver->GetProgressionManager()->FindScript(row["outcome"]); + CS_ASSERT(chargeDuration && attackDuration && range && aoeRadius && aoeAngle && outcome); + requirementStr = row["requirements"]; + LoadRequirementXML(requirement,this,requirementStr); - LoadRequirementXML(requirement,this,requirementStr); return true; + + + } -bool psAttack::postload() -{ - // Parse the requirement string - if (!requirementStr.IsEmpty()) - { - Debug2(LOG_QUESTS,0, "Loading prereq : %s", requirementStr.GetDataSafe()); - if (!LoadRequirementXML(requirement,this,requirementStr)) - { - Error1("Failed to load prerequisite XML!"); - return false; - } - if (requirement) - { - requirementStr.Empty(); - Debug2(LOG_QUESTS, 0, "Resulting prereq: %s\n", requirement->GetScript().GetDataSafe()); - } - else - return false; - } - return true; -} -csString psAttack::GetRequirementStr() -{ - if (requirement) - return requirement->GetScript(); - return ""; -} -bool psAttack::requirementsMet(psCharacter *chardata) -{ - return requirement->Check(chardata); -} + + + + + + + bool LoadRequirementXML(iDocumentNode * topNode, psAttack * self, csRef<psAttackReqOp>& requirement) { if ( strcmp( topNode->GetValue(), "req" ) == 0 ) Modified: soc/2011/combat/src/server/bulkobjects/psattack.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattack.h 2011-06-04 02:51:16 UTC (rev 7359) +++ soc/2011/combat/src/server/bulkobjects/psattack.h 2011-06-04 05:13:32 UTC (rev 7360) @@ -27,13 +27,46 @@ // Project Includes //==================================================================================== #include <idal.h> + #include "util/scriptvar.h" + #include "util/gameevent.h" + +//============================================================================= +// Local Includes +//============================================================================= + #include "psskills.h" + #include "psitemstats.h" + #include "psitem.h" + #include "deleteobjcallback.h" + using namespace CS; class psAttackReqOp; class psCharacter; class psAttack; +class Client; +class gemObject; +class gemActor; +class ProgressionScript; +class MathExpression; +struct psAttackType +{ + unsigned int id; + csString weapon; + csArray<psWeaponType*> weaponTypes; + bool dualWield; + PSITEMSTATS_STAT related_stat; // for example, Strength + csString name; +}; + + +struct psAttackCost// may be expanded later if more balance is needed +{ + float physStamina; +}; + + /** * Utility function to parse requirement scripts. * @@ -44,72 +77,101 @@ */ bool LoadRequirementXML(csRef<psAttackReqOp>& requirement, psAttack* self, csString script); bool LoadRequirementXML(iDocumentNode * topNode, psAttack * self, csRef<psAttackReqOp>& requirement); - /** An attack data holder/parser - * This class will hold data about attacks, as well as parse any scripts needed for the attack. - */ + + +/** + * Represents an Attack. This is mostly data that is cached in from the + * database to represent what a attack is. It contains details such as the + * required glyphs as well as the effect of the spell. + * + * This is going to be very close to how a spell works but more in touch with melee adn range style. + */ class psAttack : public csRefCount { public: psAttack(); virtual ~psAttack(); - /* This method can be called when the attack is loaded from the database - * The row is passed in and can be parsed into the attack datastructure - * - * @param row The row pulled from the attack database holding the attack values - * @return True if row is parsed succesfully. - */ - bool Load(iResultRow& row); - /* This method can be called When you want to do a quick initialization of an attack. - * will be set to default values with a different name, can be used to create attacks on the fly if ever needed. - * - * @param nid The ID of the attack - * @param nname The name of the new attack - */ - void Init(int nid, const char *nname); + + bool Load(iResultRow& row); - bool postload(); - /* Gets the ID of the attack - * @return ID of the attack - */ - int GetID() const { return id; } - /* Gets the name of the attack - * @return name of the attack - */ - const char *GetName() const { return name; } - /* Gets the multiplier of the attack - * @return multiplier of the attack - */ - double GetMultiplier() const {return multiplier; } - /* Gets the animation of the attack - * @return animation of the attack - */ - const char *GetAnim() const {return anim; } + int GetID() const { return id; } + const csString& GetName() const { return name; } + const csString& GetImage() const { return image; } + const csString& GetDescription() const { return description; } - - /**Return the requirement for this quest. - * @return The requirement for this quest. + /** Performs the necessary checks on the player to make sure they meet + * the requirements to cast this spell. */ - psAttackReqOp* GetRequirement() { return requirement; } - /** Returns the requirements script as a string - * - * @return requirement as string - */ - csString GetRequirementStr(); + bool CanAttack(Client *client, csString & reason); - /** - * - * - */ - bool requirementsMet(psCharacter *character); + /// iScriptableVar Implementation + /// This is used by the math scripting engine to get various values. + //double GetProperty(MathEnvironment* env, const char* ptr); + // double CalcFunction(MathEnvironment* env, const char* functionName, const double* params); + const char* ToString() { return name.GetDataSafe(); } - protected: + bool AffectTarget(gemActor* caster, gemObject* origTarget, gemObject* target, float power) const; + int id; /// The stored ID of the attack csString name; /// The stored name of the attack + csString image; + csString description; + csString AttackEffect; + psAttackType *type; float multiplier; /// The stored multiplier of the attack instance - csString anim; /// The stored animation of the attack instance. csRef<psAttackReqOp> requirement; /// The scripted requirements a character needs to meet before an attack can be executed csString requirementStr; /// a string version of the requirement script. + int attackDuration; /// attack duration in Seconds + + + /// Math for various properties. + /// Charge duration: -> Seconds + MathExpression *chargeDuration; + ///number of attack ticks + MathExpression *ticks; + /// Maximum range to target allowed: -> Meters + MathExpression *range; + /// AOE Radius: -> Meters + MathExpression *aoeRadius; + /// AOE Angle: -> Degrees + MathExpression *aoeAngle; + /// The progression script: -> (side effects) + ProgressionScript *outcome; + }; - #endif + + //----------------------------------------------------------------------------- + +/** + * This event actually triggers a spell, after the casting wait time. + */ +class psCombatAttackGameEvent : public psGameEvent, public iDeleteObjectCallback +{ +public: + Client *attacker; ///< Entity who attacking + gemObject *target; ///< Entity who is target of this attack + const psAttack *attack; ///< The attack + + float max_range; + float powerLevel; + csTicks chargeDuration; + csTicks attackDuration; + + psCombatAttackGameEvent(const psAttack * attack, + Client *attacker, + gemObject *target, + csTicks chargingDuration, + csTicks attackingDuration, + float max_range, + float power); + + ~psCombatAttackGameEvent(); + + void Interrupt(); + + virtual void Trigger(); // Abstract event processing function + virtual void DeleteObjectCallback(iDeleteNotificationObject * object); +}; +#endif Modified: soc/2011/combat/src/server/bulkobjects/psattackqueue.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackqueue.cpp 2011-06-04 02:51:16 UTC (rev 7359) +++ soc/2011/combat/src/server/bulkobjects/psattackqueue.cpp 2011-06-04 05:13:32 UTC (rev 7360) @@ -54,6 +54,8 @@ psAttack* psAttackQueue::Pop() { + if(attackList.GetSize() < 1) + return NULL; return attackList.PopTop(); } Modified: soc/2011/combat/src/server/bulkobjects/psitem.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psitem.h 2011-06-04 02:51:16 UTC (rev 7359) +++ soc/2011/combat/src/server/bulkobjects/psitem.h 2011-06-04 05:13:32 UTC (rev 7360) @@ -148,6 +148,12 @@ class psScheduledItem; class psWorkGameEvent; +struct psWeaponType +{ + unsigned int id; + csString name; + PSSKILL skill; // a skill that it may be effected by +}; /**Stores the randomized stats from the loot randomizer, it could be used to apply any global special effect * which is able to change various properties of the item: cost, mesh, name... * This makes up a 3 levels modification of a single item in order of priority: Modified: soc/2011/combat/src/server/bulkobjects/psitemstats.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psitemstats.h 2011-06-04 02:51:16 UTC (rev 7359) +++ soc/2011/combat/src/server/bulkobjects/psitemstats.h 2011-06-04 05:13:32 UTC (rev 7360) @@ -49,19 +49,6 @@ class psItem; struct psItemCategory; -//enum PSITEMSTATS_WEAPONTYPE -//{ -// PSITEMSTATS_WEAPONTYPE_NONE = -1, -// PSITEMSTATS_WEAPONTYPE_SWORD, -// PSITEMSTATS_WEAPONTYPE_AXE, -// PSITEMSTATS_WEAPONTYPE_DAGGER, -// PSITEMSTATS_WEAPONTYPE_HAMMER, -// PSITEMSTATS_WEAPONTYPE_BOW, -// PSITEMSTATS_WEAPONTYPE_CROSSBOW, -// PSITEMSTATS_WEAPONTYPE_SLING, -// PSITEMSTATS_WEAPONTYPE_COUNT -//}; - enum PSITEMSTATS_WEAPONSKILL_INDEX { PSITEMSTATS_WEAPONSKILL_INDEX_0 = 0, Modified: soc/2011/combat/src/server/cachemanager.cpp =================================================================== --- soc/2011/combat/src/server/cachemanager.cpp 2011-06-04 02:51:16 UTC (rev 7359) +++ soc/2011/combat/src/server/cachemanager.cpp 2011-06-04 05:13:32 UTC (rev 7360) @@ -32,6 +32,7 @@ #include "util/serverconsole.h" #include "util/eventmanager.h" #include "util/psdatabase.h" +#include "util/strutil.h" #include "net/message.h" @@ -183,6 +184,10 @@ return false; if (!PreloadQuests()) return false; + if(!PreloadWeaponTypes())//the next 3 items MUST be loaded in this order + return false; + if(!PreloadAttackTypes()) + return false; if (!PreloadAttacks()) return false; if (!PreloadTradeCombinations()) @@ -2390,6 +2395,68 @@ } +psAttackType *CacheManager::GetAttackTypeByID(unsigned int id) +{ + size_t i; + for (i=0;i<wayList.GetSize();i++) + { + psAttackType *currentType; + currentType=attackTypeList.Get(i); + if (currentType && id==currentType->id) + { + return currentType; + } + } + return NULL; +} + +psAttackType *CacheManager::GetAttackTypeByName(const csString & name) +{ + size_t i; + for (i=0;i<attackTypeList.GetSize();i++) + { + psAttackType *currentType; + currentType=attackTypeList.Get(i); + if (currentType && name==currentType->name) + { + return currentType; + } + } + return NULL; +} + + +psWeaponType *CacheManager::GetWeaponTypeByID(unsigned int id) +{ + size_t i; + for (i=0;i<weaponTypeList.GetSize();i++) + { + psWeaponType *currentType; + currentType=weaponTypeList.Get(i); + if (currentType && id==currentType->id) + { + return currentType; + } + } + return NULL; +} + +psWeaponType *CacheManager::GetWeaponTypeByName(const csString & name) +{ + size_t i; + for (i=0;i<weaponTypeList.GetSize();i++) + { + psWeaponType *currentType; + currentType=weaponTypeList.Get(i); + if (currentType && name==currentType->name) + { + return currentType; + } + } + return NULL; +} + + // TODO: This function needs to be implemented in a fast fashion psWay *CacheManager::GetWayByID(unsigned int id) { @@ -2718,7 +2785,57 @@ Notify2( LOG_STARTUP, "%lu Item Categories Loaded", categories.Count() ); return true; } +bool CacheManager::PreloadWeaponTypes() +{ + Result types(db->Select("SELECT * from weapon_types")); + if(types.IsValid()) + { + int i, count = types.Count(); + for(i=0; i< count; i++) + { + psWeaponType * type = new psWeaponType; + type->id = atoi(types[i]["id"]); + type->name = types[i]["name"]; + type->skill = (PSSKILL)atoi(types[i]["skill"]); + } + } + Notify2( LOG_STARTUP, "%lu Weapon Types Loaded", types.Count() ); + return true; +} +bool CacheManager::PreloadAttackTypes() +{ + Result types(db->Select("SELECT * from attack_types")); + if( types.IsValid()) + { + int i, count=types.Count(); + for(i=0; i < count; i++) + { + psAttackType * type = new psAttackType; + type->id = atoi(types[i]["id"]); + type->name = types[i]["name"]; + type->dualWield = (bool)types[i]["dual_wield"]; + type->related_stat = (PSITEMSTATS_STAT)atoi(types[i]["stat"]); + type->weapon = types[i]["weaponName"]; + csString tempWTypes = types[i]["weaponType"]; + WordArray ids(tempWTypes); + for(int i = 0; i < ids.GetCount(); i++) + { + psWeaponType* weapontype = GetWeaponTypeByID(atoi(ids[i])); + if(!weapontype) + { + weapontype = GetWeaponTypeByName(ids[i]); + } + if(weapontype) + type->weaponTypes.Push(weapontype); + } + + attackTypeList.Push(type); + } + } + Notify2( LOG_STARTUP, "%lu Attack Types Loaded", types.Count() ); + return true; +} bool CacheManager::PreloadWays() { Result ways(db->Select("SELECT * from ways")); Modified: soc/2011/combat/src/server/cachemanager.h =================================================================== --- soc/2011/combat/src/server/cachemanager.h 2011-06-04 02:51:16 UTC (rev 7359) +++ soc/2011/combat/src/server/cachemanager.h 2011-06-04 05:13:32 UTC (rev 7360) @@ -403,6 +403,14 @@ psWay *GetWayByID(unsigned int id); psWay *GetWayByName(const csString & name); + // attack types + psAttackType *GetAttackTypeByID(unsigned int id); + psAttackType *GetAttackTypeByName(const csString & name); + + // weapon types + psWeaponType*GetWeaponTypeByID(unsigned int id); + psWeaponType *GetWeaponTypeByName(const csString & name); + // Factions Faction * GetFaction(const char *name); Faction * GetFaction(int id); @@ -572,6 +580,8 @@ bool PreloadTraits(); bool PreloadItemCategories(); bool PreloadWays(); + bool PreloadAttackTypes(); + bool PreloadWeaponTypes(); ///preloads the character events script for a faction void PreloadFactionCharacterEvents(const char* script, Faction* faction); bool PreloadFactions(); @@ -662,6 +672,8 @@ csPDelArray<psItemCategory > itemCategoryList; csPDelArray<psWay > wayList; + csPDelArray<psAttackType > attackTypeList; + csPDelArray<psWeaponType > weaponTypeList; csHash<Faction*, int> factions_by_id; csHash<Faction*, csString> factions; csHash<ProgressionScript*,csString> scripts; Modified: soc/2011/combat/src/server/command.cpp =================================================================== --- soc/2011/combat/src/server/command.cpp 2011-06-04 02:51:16 UTC (rev 7359) +++ soc/2011/combat/src/server/command.cpp 2011-06-04 05:13:32 UTC (rev 7360) @@ -2257,63 +2257,63 @@ } int com_attackCheck(char * line) { - bool temploaded=false; + // bool temploaded=false; - if (!line) - { - CPrintf(CON_CMDOUTPUT ,"Please specify Character Name and Attack Name.\n"); - return 0; - } + //if (!line) + //{ + // CPrintf(CON_CMDOUTPUT ,"Please specify Character Name and Attack Name.\n"); + // return 0; + //} - WordArray words(line); + //WordArray words(line); - csString charName = words[0]; - csString attackName = words[1]; + //csString charName = words[0]; + //csString attackName = words[1]; - if (!charName.Length() || !attackName.Length()) - { - CPrintf(CON_CMDOUTPUT ,"Please specify Character Name and Attack Name.\n"); - return 0; - } + //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; - } + // // 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(); + //// 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(); - - if (chardata==NULL) - { - CPrintf(CON_CMDOUTPUT ,"Could not get character data for specified character.\n"); - return 0; - } + // + //if (chardata==NULL) + //{ + // CPrintf(CON_CMDOUTPUT ,"Could not get character data for specified character.\n"); + // return 0; + //} - psAttack* attk = psserver->GetCacheManager()->GetAttackByName(attackName); + //psAttack* attk = psserver->GetCacheManager()->GetAttackByName(attackName); - if(attk->requirementsMet(chardata)) - CPrintf(CON_CMDOUTPUT ,"requirements met.\n"); - else - CPrintf(CON_CMDOUTPUT ,"requirements not met.\n"); + //if(attk->requirementsMet(chardata)) + // CPrintf(CON_CMDOUTPUT ,"requirements met.\n"); + //else + // CPrintf(CON_CMDOUTPUT ,"requirements not met.\n"); - if (temploaded) - delete chardata; + //if (temploaded) + // delete chardata; return 0; Modified: soc/2011/combat/src/server/database/mysql/attack_types.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/attack_types.sql 2011-06-04 02:51:16 UTC (rev 7359) +++ soc/2011/combat/src/server/database/mysql/attack_types.sql 2011-06-04 05:13:32 UTC (rev 7360) @@ -7,7 +7,8 @@ `name` VARCHAR(40) NOT NULL COMMENT 'is the types name, each name must be unique.' , `weaponName` VARCHAR(40) DEFAULT NULL COMMENT 'This is a field that should be filled in if an attack is made for a very specific weapon, like a weapons special attack, not always going to be used but either this or weapon type should always be filled in', `weaponType` VARCHAR(40) DEFAULT NULL COMMENT 'more than one required weapon type may be listed, seperate each weapon type id with a space', - `dual_wield` BOOLEAN NOT NULL COMMENT 'is this a dual weild based attack, if it is, then both weapons may use the attack, if it is not, only one will execute the attack' + `dual_wield` BOOLEAN NOT NULL COMMENT 'is this a dual weild based attack, if it is, then both weapons may use the attack, if it is not, only one will execute the attack', + `stat` int(11) NOT NULL COMMENT 'The skill related to this type', PRIMARY KEY (`id`) , UNIQUE INDEX `name_UNIQUE` (`name`) )ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table holds attck types to be used in the updated combat system'; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-06-05 02:03:47
|
Revision: 7362 http://planeshift.svn.sourceforge.net/planeshift/?rev=7362&view=rev Author: landson Date: 2011-06-05 02:03:40 +0000 (Sun, 05 Jun 2011) Log Message: ----------- - got rid of weapon checking in the requirementsMet - replaces old weapon type label with new weapontype struct As with last night this is no where near complete, its at a compilable saveable state. more commenting will be done. Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psattack.cpp soc/2011/combat/src/server/bulkobjects/psattack.h soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp soc/2011/combat/src/server/bulkobjects/psattackreqops.h soc/2011/combat/src/server/bulkobjects/psitem.cpp soc/2011/combat/src/server/bulkobjects/psitem.h soc/2011/combat/src/server/bulkobjects/psitemstats.cpp soc/2011/combat/src/server/bulkobjects/psitemstats.h soc/2011/combat/src/server/cachemanager.cpp soc/2011/combat/src/server/command.cpp soc/2011/combat/src/server/database/mysql/attacks.sql Modified: soc/2011/combat/src/server/bulkobjects/psattack.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-06-04 18:54:45 UTC (rev 7361) +++ soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-06-05 02:03:40 UTC (rev 7362) @@ -41,6 +41,7 @@ #include "entitymanager.h" #include "commandmanager.h" #include "progressionmanager.h" +#include "combatmanager.h" #include "npcmanager.h" #include "../globals.h" #include "scripting.h" @@ -52,25 +53,13 @@ psAttack::psAttack() { - chargeDuration = NULL; - attackDuration = NULL; + power = NULL; range = NULL; aoeRadius = NULL; - aoeAngle = NULL; } - psAttack::~psAttack() { - if (chargeDuration) - { - delete chargeDuration; - chargeDuration = NULL; - } - if (ticks) - { - delete ticks; - ticks = NULL; - } + if (range) { delete range; @@ -81,37 +70,25 @@ delete aoeRadius; aoeRadius = NULL; } - if (aoeAngle) - { - delete aoeAngle; - aoeAngle = NULL; - } } - - bool psAttack::Load(iResultRow& row) { id = row.GetInt("id"); name = row["name"]; - type = NULL;//will be changed + type = psserver->GetCacheManager()->GetAttackTypeByName(row["attackType"]); image = row["image_name"]; psserver->GetCacheManager()->AddCommonStringID(image); description = row["attack_description"]; - AttackEffect = row["attack_effect"]; - multiplier = row.GetFloat("multiplier"); - attackDuration = row.GetInt("attack_duration"); - chargeDuration = MathExpression::Create(row["charge_duration"]); - - ticks = MathExpression::Create(row["attack_ticks"]); + AttackAnim = row["attack_anim"]; + power = MathExpression::Create(row["power"]); range = MathExpression::Create(row["range"]); aoeRadius = MathExpression::Create(row["aoe_radius"]); - aoeAngle = MathExpression::Create(row["aoe_angle"]); outcome = psserver->GetProgressionManager()->FindScript(row["outcome"]); - CS_ASSERT(chargeDuration && attackDuration && range && aoeRadius && aoeAngle && outcome); + CS_ASSERT(power && range && aoeRadius && outcome); requirementStr = row["requirements"]; LoadRequirementXML(requirement,this,requirementStr); @@ -125,16 +102,56 @@ +/**********************************************************************************************************/ +psCombatAttackGameEvent::psCombatAttackGameEvent(CombatManager *mgr, + int delayticks, + psAttack *attack, + gemObject *attacker, + gemObject *target, + INVENTORY_SLOT_NUMBER weaponslot, + int attackerCID, + int targetCID, + int attackResult, + int previousResult) : psGameEvent(0,delayticks,"psCombatAttackGameEvent") +{ + combatmanager = mgr; + this->attacker = attacker; + this->attack = attack; + this->target = target; + this->attackerdata = attacker->GetCharacterData(); + this->targetdata = target->GetCharacterData(); + this->WeaponSlot = weaponslot; + this->weapon = attackerdata->Inventory().GetEffectiveWeaponInSlot(weaponslot); + this->AttackerCID = attackerCID; + this->TargetCID = targetCID; + AttackLocation=PSCHARACTER_SLOT_NONE; + FinalDamage=-1; + AttackResult=ATTACK_NOTCALCULATED; + PreviousAttackResult=previousResult; +} +void psCombatAttackGameEvent::Trigger() +{ +} + + + + + + + + + + bool LoadRequirementXML(iDocumentNode * topNode, psAttack * self, csRef<psAttackReqOp>& requirement) { if ( strcmp( topNode->GetValue(), "req" ) == 0 ) @@ -327,23 +344,23 @@ requirement.AttachNew(new psAttackReqOpFaction(faction,value,max!=0)); } - else if ( strcmp( topNode->GetValue(), "weapon" ) == 0 ) - { - csString weaponType = topNode->GetAttributeValue("type",NULL); - // It is possible to limit attack by a specific weapon, to allow for certain weapons to have specials, but by default this is left empty - csString weaponName = topNode->GetAttributeValue("name",NULL); - //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",0); + //else if ( strcmp( topNode->GetValue(), "weapon" ) == 0 ) + //{ + // csString weaponType = topNode->GetAttributeValue("type",NULL); + // // It is possible to limit attack by a specific weapon, to allow for certain weapons to have specials, but by default this is left empty + // csString weaponName = topNode->GetAttributeValue("name",NULL); + // //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",0); - if(weaponType.IsEmpty() && weaponName.IsEmpty()) - { - Error1("Must have a weapon type or name to check against."); - return false; - } - requirement.AttachNew(new psAttackReqOpWeapon(weaponType,weaponName,weaponHand,weaponNum)); - } + // if(weaponType.IsEmpty() && weaponName.IsEmpty()) + // { + // Error1("Must have a weapon type or name to check against."); + // return false; + // } + // requirement.AttachNew(new psAttackReqOpWeapon(weaponType,weaponName,weaponHand,weaponNum)); + //} else if ( strcmp( topNode->GetValue(), "stance" ) == 0 ) { csString stanceName = topNode->GetAttributeValue("name"); Modified: soc/2011/combat/src/server/bulkobjects/psattack.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattack.h 2011-06-04 18:54:45 UTC (rev 7361) +++ soc/2011/combat/src/server/bulkobjects/psattack.h 2011-06-05 02:03:40 UTC (rev 7362) @@ -49,15 +49,22 @@ class gemActor; class ProgressionScript; class MathExpression; +class CombatManager; + +/** This stuct holds data for generic attack types + * This could be for example an assassin attack which would require maybe daggers. and require dual wielded daggers at that, so each dagger does part of the attack specifically. + * each attack type would also be based off a specic skill, such as strength or agility. + */ struct psAttackType { - unsigned int id; - csString weapon; - csArray<psWeaponType*> weaponTypes; - bool dualWield; - PSITEMSTATS_STAT related_stat; // for example, Strength - csString name; + unsigned int id;/// the id number, corresponding to its id in the database + csString name;/// the name of the attack type + csString weapon;/// if it requires 1 specific weapon, maybe its an attack that is special adn specific to 1 particular weapon. + csArray<psWeaponType*> weaponTypes;/// if it requires multiple types of weapons they would be listed here. + bool dualWield;/// if it is a dual weilding based attack it willb e flagged here, that means it requires 2 weapons and each will perform part of the attack, if it is false then only one hand will execute the attack. + PSITEMSTATS_STAT related_stat; /// each attack will have a stat related to it that will be part of the power computation + }; @@ -86,7 +93,7 @@ * * This is going to be very close to how a spell works but more in touch with melee adn range style. */ - class psAttack : public csRefCount + class psAttack : public iScriptableVar, public csRefCount { public: psAttack(); @@ -95,49 +102,57 @@ bool Load(iResultRow& row); + /** gets the id + * @return the attack id + */ int GetID() const { return id; } + /** Gets the Name + * @return returns the name of attack + */ const csString& GetName() const { return name; } + /** Gets the attack icon string + *@return attack icon image string + */ const csString& GetImage() const { return image; } + /** Gets the attack description + * @return attack description + */ const csString& GetDescription() const { return description; } /** Performs the necessary checks on the player to make sure they meet - * the requirements to cast this spell. + * the requirements to use this attack. + * + *@param client the client being checked for attack eligability + *@reason will be returned holding the reason an attack may not be executed. */ bool CanAttack(Client *client, csString & reason); /// iScriptableVar Implementation /// This is used by the math scripting engine to get various values. - //double GetProperty(MathEnvironment* env, const char* ptr); - // double CalcFunction(MathEnvironment* env, const char* functionName, const double* params); + double GetProperty(MathEnvironment* env, const char* ptr); + double CalcFunction(MathEnvironment* env, const char* functionName, const double* params); const char* ToString() { return name.GetDataSafe(); } protected: bool AffectTarget(gemActor* caster, gemObject* origTarget, gemObject* target, float power) const; - int id; /// The stored ID of the attack - csString name; /// The stored name of the attack - csString image; + int id; ///< The stored ID of the attack + csString name; ///< The stored name of the attack + csString image; ///< csString description; - csString AttackEffect; + csString AttackAnim; psAttackType *type; - float multiplier; /// The stored multiplier of the attack instance - csRef<psAttackReqOp> requirement; /// The scripted requirements a character needs to meet before an attack can be executed - csString requirementStr; /// a string version of the requirement script. - int attackDuration; /// attack duration in Seconds + csRef<psAttackReqOp> requirement; ///< The scripted requirements a character needs to meet before an attack can be executed + csString requirementStr; ///< a string version of the requirement script. - /// Math for various properties. - /// Charge duration: -> Seconds - MathExpression *chargeDuration; - ///number of attack ticks - MathExpression *ticks; - /// Maximum range to target allowed: -> Meters + /// power of the attack: + MathExpression *power; + /// Maximum range to target allowed: (range of attack, related stat, related skill) -> Meters, or a specific number MathExpression *range; - /// AOE Radius: -> Meters + /// AOE Radius: (range of attack, related stat, related skill) -> Meters , or a specific number MathExpression *aoeRadius; - /// AOE Angle: -> Degrees - MathExpression *aoeAngle; - /// The progression script: -> (side effects) + /// The progression script: (power, attacker, target) -> (side effects) ProgressionScript *outcome; }; @@ -145,33 +160,78 @@ //----------------------------------------------------------------------------- /** - * This event actually triggers a spell, after the casting wait time. + * This event actually triggers an attack */ class psCombatAttackGameEvent : public psGameEvent, public iDeleteObjectCallback { public: - Client *attacker; ///< Entity who attacking - gemObject *target; ///< Entity who is target of this attack + csWeakRef<gemObject> attacker; ///< Entity who instigated this attack + csWeakRef<gemObject> target; ///< Entity who is target of this attack + psCharacter *attackerdata; + psCharacter *targetdata; + int TargetCID; ///< ClientID of target + int AttackerCID; ///< ClientID of attacker + const psAttack *attack; ///< The attack + INVENTORY_SLOT_NUMBER WeaponSlot; ///< Identifier of the slot for which this attack event should process + psItem *weapon; + + INVENTORY_SLOT_NUMBER AttackLocation; ///< Which slot should we check the armor of? + + float FinalDamage; ///< Final damage applied to target + + int AttackResult; ///< Code indicating the result of the attack attempt + int PreviousAttackResult; ///< The code of the previous result of the attack attempt + float max_range; float powerLevel; - csTicks chargeDuration; - csTicks attackDuration; - psCombatAttackGameEvent(const psAttack * attack, - Client *attacker, - gemObject *target, - csTicks chargingDuration, - csTicks attackingDuration, - float max_range, - float power); + int attackAnim; + int TargetAnim; + psCombatAttackGameEvent(CombatManager *mgr, + int delayticks, + psAttack *attack, + gemObject *attacker, + gemObject *target, + INVENTORY_SLOT_NUMBER weaponslot, + int attackerCID, + int targetCID, + int attackResult, + int previousResult); ~psCombatAttackGameEvent(); - void Interrupt(); - virtual void Trigger(); // Abstract event processing function virtual void DeleteObjectCallback(iDeleteNotificationObject * object); + + gemObject* GetTarget() + { + return target; + }; + gemObject* GetAttacker() + { + return attacker; + }; + psCharacter *GetTargetData() + { + return targetdata; + }; + psCharacter *GetAttackerData() + { + return attackerdata; + }; + INVENTORY_SLOT_NUMBER GetWeaponSlot() + { + return WeaponSlot; + }; + + + int GetTargetID() { return TargetCID; }; + int GetAttackerID() { return AttackerCID; }; + int GetAttackResult() { return AttackResult; }; + +protected: + CombatManager *combatmanager; }; #endif Modified: soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp 2011-06-04 18:54:45 UTC (rev 7361) +++ soc/2011/combat/src/server/bulkobjects/psattackreqops.cpp 2011-06-05 02:03:40 UTC (rev 7362) @@ -382,122 +382,122 @@ } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// +//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)) +// { +// INVENTORY_SLOT_NUMBER weaponSlot = (INVENTORY_SLOT_NUMBER) slot; +// psItem *weapon=character->Inventory().GetEffectiveWeaponInSlot(weaponSlot); +// csString curWeaponType = weapon->GetWeaponType(); +// csString curName = weapon->GetName(); +// +// if(checkType(curWeaponType) && checkName(curName)) +// { +// name = true; +// type = true; +// if(checkHand(weaponSlot)) +// hand=true; +// if(weaponNum != 0) +// { +// numofwep++; +// if(checkNum(numofwep)) +// num = true; +// else +// num = false; +// } +// else +// num = true; +// +// } +// +// +// } +// } +// return name && type && hand && num; +//} +// +//bool psAttackReqOpWeapon::checkType(csString type) +//{ +// if(weaponType.IsEmpty()) +// return true; +// +// if(type.Upcase() == weaponType.Upcase()) +// 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; +// +// script.AppendFmt("<weapon "); +// if(!weaponType.IsEmpty()) +// { +// script.AppendFmt("type=\"%s\" ", weaponType); +// } +// if(!weaponName.IsEmpty()) +// { +// script.AppendFmt("name=\"%s\" ", weaponName); +// } +// if(!weaponHand.IsEmpty()) +// { +// script.AppendFmt("hand=\"%s\" ", weaponHand); +// } +// if(!weaponNum == NULL) +// { +// script.AppendFmt("number=\"%d\" ", weaponNum); +// } +// +// script.AppendFmt(" />"); +// +// return script; +//} +// +//csPtr<psAttackReqOp> psAttackReqOpWeapon::Copy() +//{ +// csRef<psAttackReqOpWeapon> copy; +// copy.AttachNew(new psAttackReqOpWeapon(weaponType, weaponName, weaponHand, weaponNum)); +// return csPtr<psAttackReqOp>(copy); +//} +// - -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)) - { - INVENTORY_SLOT_NUMBER weaponSlot = (INVENTORY_SLOT_NUMBER) slot; - psItem *weapon=character->Inventory().GetEffectiveWeaponInSlot(weaponSlot); - csString curWeaponType = weapon->GetWeaponType(); - csString curName = weapon->GetName(); - - if(checkType(curWeaponType) && checkName(curName)) - { - name = true; - type = true; - if(checkHand(weaponSlot)) - hand=true; - if(weaponNum != 0) - { - numofwep++; - if(checkNum(numofwep)) - num = true; - else - num = false; - } - else - num = true; - - } - - - } - } - return name && type && hand && num; -} - -bool psAttackReqOpWeapon::checkType(csString type) -{ - if(weaponType.IsEmpty()) - return true; - - if(type.Upcase() == weaponType.Upcase()) - 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; - - script.AppendFmt("<weapon "); - if(!weaponType.IsEmpty()) - { - script.AppendFmt("type=\"%s\" ", weaponType); - } - if(!weaponName.IsEmpty()) - { - script.AppendFmt("name=\"%s\" ", weaponName); - } - if(!weaponHand.IsEmpty()) - { - script.AppendFmt("hand=\"%s\" ", weaponHand); - } - if(!weaponNum == NULL) - { - script.AppendFmt("number=\"%d\" ", weaponNum); - } - - script.AppendFmt(" />"); - - return script; -} - -csPtr<psAttackReqOp> psAttackReqOpWeapon::Copy() -{ - csRef<psAttackReqOpWeapon> copy; - copy.AttachNew(new psAttackReqOpWeapon(weaponType, weaponName, weaponHand, weaponNum)); - return csPtr<psAttackReqOp>(copy); -} - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool psAttackReqOpStance::Check(psCharacter * character) Modified: soc/2011/combat/src/server/bulkobjects/psattackreqops.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackreqops.h 2011-06-04 18:54:45 UTC (rev 7361) +++ soc/2011/combat/src/server/bulkobjects/psattackreqops.h 2011-06-05 02:03:40 UTC (rev 7362) @@ -564,101 +564,101 @@ virtual csPtr<psAttackReqOp> Copy(); }; +// +///** +// * Weapon requirement operator. +// * +// * Checks for various weapon situations. +// */ +//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 +// +// public: +// +// /** +// * Construct a skill operator +// * +// * @param type The type which should be checked for. +// * @param name The name which should be checked for. +// * @param max The hand which should be checked for. +// * @param num The number of said weapon that should be held +// */ +// 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 +// * +// * @param character The character that are checking for a requirement +// * @return True if specs are correct. +// */ +// virtual bool Check(psCharacter * character); +// +// /** +// * Convert the requirement operator to a xml string +// * +// * Convert the operator into the xml string: +// * <weapon type="weapon type" name = "weapon name" hand = "hand" number="number needed of said weapon" /> +// * +// * @return XML string for the requirement operator. +// */ +// virtual csString GetScriptOp(); +// +// +// /** +// * Copy the requirement operator +// * +// * Override this function to return a copy of the requirement +// * operator. +// * +// * @return Copy of the requirement operator. +// */ +// virtual csPtr<psAttackReqOp> Copy(); +// +// +// /** +// * Checks weapon's type, if specified +// * +// */ +// bool checkType(csString 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); +//}; /** - * Weapon requirement operator. + * Stance requirement operator. * * Checks for various weapon situations. */ -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 - - public: - - /** - * Construct a skill operator - * - * @param type The type which should be checked for. - * @param name The name which should be checked for. - * @param max The hand which should be checked for. - * @param num The number of said weapon that should be held - */ - 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 - * - * @param character The character that are checking for a requirement - * @return True if specs are correct. - */ - virtual bool Check(psCharacter * character); - - /** - * Convert the requirement operator to a xml string - * - * Convert the operator into the xml string: - * <weapon type="weapon type" name = "weapon name" hand = "hand" number="number needed of said weapon" /> - * - * @return XML string for the requirement operator. - */ - virtual csString GetScriptOp(); - - - /** - * Copy the requirement operator - * - * Override this function to return a copy of the requirement - * operator. - * - * @return Copy of the requirement operator. - */ - virtual csPtr<psAttackReqOp> Copy(); - - - /** - * Checks weapon's type, if specified - * - */ - bool checkType(csString 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); -}; - -/** - * Weapon requirement operator. - * - * Checks for various weapon situations. - */ class psAttackReqOpStance: public psAttackReqOp { protected: Modified: soc/2011/combat/src/server/bulkobjects/psitem.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psitem.cpp 2011-06-04 18:54:45 UTC (rev 7361) +++ soc/2011/combat/src/server/bulkobjects/psitem.cpp 2011-06-05 02:03:40 UTC (rev 7362) @@ -1767,7 +1767,7 @@ return current_stats->GetDescription(); } -csString psItem::GetWeaponType() +psWeaponType *psItem::GetWeaponType() { return current_stats->Weapon().Type(); } Modified: soc/2011/combat/src/server/bulkobjects/psitem.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psitem.h 2011-06-04 18:54:45 UTC (rev 7361) +++ soc/2011/combat/src/server/bulkobjects/psitem.h 2011-06-05 02:03:40 UTC (rev 7362) @@ -148,12 +148,6 @@ class psScheduledItem; class psWorkGameEvent; -struct psWeaponType -{ - unsigned int id; - csString name; - PSSKILL skill; // a skill that it may be effected by -}; /**Stores the randomized stats from the loot randomizer, it could be used to apply any global special effect * which is able to change various properties of the item: cost, mesh, name... * This makes up a 3 levels modification of a single item in order of priority: @@ -742,7 +736,7 @@ float GetRange() const { return current_stats->GetRange(); } csSet<unsigned int> GetAmmoTypeID() const { return current_stats->GetAmmoTypeID(); } - csString GetWeaponType(); + psWeaponType *GetWeaponType(); PSSKILL GetWeaponSkill(PSITEMSTATS_WEAPONSKILL_INDEX index); float GetLatency(); float GetDamage(PSITEMSTATS_DAMAGETYPE dmgtype); Modified: soc/2011/combat/src/server/bulkobjects/psitemstats.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psitemstats.cpp 2011-06-04 18:54:45 UTC (rev 7361) +++ soc/2011/combat/src/server/bulkobjects/psitemstats.cpp 2011-06-05 02:03:40 UTC (rev 7362) @@ -101,7 +101,7 @@ psItemWeaponStats::psItemWeaponStats() { - weapon_type=""; + weapon_type = NULL; memset(weapon_skill,0,sizeof(weapon_skill)); memset(attribute_bonuses,0,sizeof(attribute_bonuses)); @@ -117,22 +117,9 @@ void psItemWeaponStats::ReadStats( iResultRow& row ) { - weapon_type = row["item_type"]; - /*if ( type == "SWORD" ) - weapon_type = PSITEMSTATS_WEAPONTYPE_SWORD; - else if ( type == "AXE" ) - weapon_type = PSITEMSTATS_WEAPONTYPE_AXE; - else if ( type == "DAGGER" ) - weapon_type = PSITEMSTATS_WEAPONTYPE_DAGGER; - else if ( type == "HAMMER" ) - weapon_type = PSITEMSTATS_WEAPONTYPE_HAMMER; - else if ( type == "BOW" ) - weapon_type = PSITEMSTATS_WEAPONTYPE_BOW; - else if ( type == "CROSSBOW" ) - weapon_type = PSITEMSTATS_WEAPONTYPE_CROSSBOW; - else if ( type == "SLING" ) - weapon_type = PSITEMSTATS_WEAPONTYPE_SLING;*/ - + + weapon_type = psserver->GetCacheManager()->GetWeaponTypeByName(row["item_type"]); + weapon_skill[PSITEMSTATS_WEAPONSKILL_INDEX_0] = psserver->GetCacheManager()->ConvertSkill(row.GetInt("item_skill_id_1")); weapon_skill[PSITEMSTATS_WEAPONSKILL_INDEX_1] = psserver->GetCacheManager()->ConvertSkill(row.GetInt("item_skill_id_2")); weapon_skill[PSITEMSTATS_WEAPONSKILL_INDEX_2] = psserver->GetCacheManager()->ConvertSkill(row.GetInt("item_skill_id_3")); Modified: soc/2011/combat/src/server/bulkobjects/psitemstats.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psitemstats.h 2011-06-04 18:54:45 UTC (rev 7361) +++ soc/2011/combat/src/server/bulkobjects/psitemstats.h 2011-06-05 02:03:40 UTC (rev 7362) @@ -201,6 +201,13 @@ float min_value; }; +struct psWeaponType +{ + unsigned int id; + csString name; + PSSKILL skill; // a skill that it may be effected by +}; + /** * Each weapon specifies what anims can be used with it. This is for * cosmetic purposes only on the client and is not used in calculations. @@ -250,7 +257,7 @@ /** Read the weapon related details from the database. */ void ReadStats( iResultRow& row ); - csString Type() { return weapon_type; } + psWeaponType *Type() { return weapon_type; } PSSKILL Skill(PSITEMSTATS_WEAPONSKILL_INDEX index); @@ -267,7 +274,7 @@ float AttributeBonusMax(int index); private: - csString weapon_type; + psWeaponType *weapon_type; PSSKILL weapon_skill[PSITEMSTATS_WEAPONSKILL_INDEX_COUNT]; st_attribute_bonus attribute_bonuses[PSITEMSTATS_STAT_BONUS_COUNT]; float latency; Modified: soc/2011/combat/src/server/cachemanager.cpp =================================================================== --- soc/2011/combat/src/server/cachemanager.cpp 2011-06-04 18:54:45 UTC (rev 7361) +++ soc/2011/combat/src/server/cachemanager.cpp 2011-06-05 02:03:40 UTC (rev 7362) @@ -2788,23 +2788,26 @@ bool CacheManager::PreloadWeaponTypes() { Result types(db->Select("SELECT * from weapon_types")); + if(types.IsValid()) { int i, count = types.Count(); for(i=0; i< count; i++) { psWeaponType * type = new psWeaponType; - type->id = atoi(types[i]["id"]); - type->name = types[i]["name"]; - type->skill = (PSSKILL)atoi(types[i]["skill"]); - } + type->id = atoi(types[i]["id"]); + type->name = types[i]["name"]; + type->skill = (PSSKILL)atoi(types[i]["skill"]); + } } - Notify2( LOG_STARTUP, "%lu Weapon Types Loaded", types.Count() ); + + Notify2( LOG_STARTUP, "%lu Weapon Types Loaded", types.Count()); return true; } bool CacheManager::PreloadAttackTypes() { Result types(db->Select("SELECT * from attack_types")); + if( types.IsValid()) { int i, count=types.Count(); @@ -2812,12 +2815,13 @@ for(i=0; i < count; i++) { psAttackType * type = new psAttackType; - type->id = atoi(types[i]["id"]); - type->name = types[i]["name"]; - type->dualWield = (bool)types[i]["dual_wield"]; - type->related_stat = (PSITEMSTATS_STAT)atoi(types[i]["stat"]); - type->weapon = types[i]["weaponName"]; - csString tempWTypes = types[i]["weaponType"]; + type->id = types[i].GetInt("id"); + type->name = types[i]["name"]; + type->dualWield = (bool)types[i]["dual_wield"]; + type->related_stat = (PSITEMSTATS_STAT)atoi(types[i]["stat"]); + type->weapon = types[i]["weaponName"]; + csString tempWTypes = types[i]["weaponType"]; + WordArray ids(tempWTypes); for(int i = 0; i < ids.GetCount(); i++) { @@ -2833,7 +2837,8 @@ attackTypeList.Push(type); } } - Notify2( LOG_STARTUP, "%lu Attack Types Loaded", types.Count() ); + + Notify2( LOG_STARTUP, "%lu Attack Types Loaded", types.Count()); return true; } bool CacheManager::PreloadWays() @@ -2843,18 +2848,18 @@ { int i,count=ways.Count(); - for (i=0;i<count;i++) + for (i = 0; i < count; i++) { - psWay *way = new psWay; - way->id = atoi(ways[i]["id"]); - way->name = ways[i]["name"]; - way->skill = (PSSKILL)atoi(ways[i]["skill"]); + psWay *way = new psWay; + way->id = atoi(ways[i]["id"]); + way->name = ways[i]["name"]; + way->skill = (PSSKILL)atoi(ways[i]["skill"]); way->related_stat = (PSITEMSTATS_STAT)atoi(ways[i]["related_stat"]); - wayList.Push(way); + wayList.Push(way); } } - Notify2( LOG_STARTUP, "%lu Ways Loaded", ways.Count() ); + Notify2( LOG_STARTUP, "%lu Ways Loaded", ways.Count()); return true; } @@ -2920,7 +2925,7 @@ } } - Notify2( LOG_STARTUP, "%lu Factions Loaded", result_factions.Count() ); + Notify2( LOG_STARTUP, "%lu Factions Loaded", result_factions.Count()); return true; } @@ -2964,7 +2969,7 @@ } } } - Notify2( LOG_STARTUP, "%lu Spells Loaded", spells.Count() ); + Notify2( LOG_STARTUP, "%lu Spells Loaded", spells.Count()); return true; } Modified: soc/2011/combat/src/server/command.cpp =================================================================== --- soc/2011/combat/src/server/command.cpp 2011-06-04 18:54:45 UTC (rev 7361) +++ soc/2011/combat/src/server/command.cpp 2011-06-05 02:03:40 UTC (rev 7362) @@ -1342,7 +1342,7 @@ CPrintf(CON_CMDOUTPUT ," Hardness:%g\n", item->GetHardness()); } - csString weapontype = item->GetWeaponType(); + csString weapontype = item->GetWeaponType()->name; if (!weapontype.IsEmpty()) { Modified: soc/2011/combat/src/server/database/mysql/attacks.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/attacks.sql 2011-06-04 18:54:45 UTC (rev 7361) +++ soc/2011/combat/src/server/database/mysql/attacks.sql 2011-06-05 02:03:40 UTC (rev 7362) @@ -6,18 +6,15 @@ `id` INT NOT NULL AUTO_INCREMENT COMMENT ' holds the attacks unique id number' , `name` VARCHAR(40) NOT NULL DEFAULT 'default' COMMENT 'is the attacks name, each name must be unique.' , `image_name` VARCHAR(40) NULL DEFAULT '' COMMENT 'the icon image', - `attack_effect` VARCHAR(255) COMMENT 'The visual effect of the attack', + `attack_anim` VARCHAR(255) COMMENT 'The visual effect of the attack', `attack_description` text COMMENT 'a short description of the attack', - `charge_duration` text DEFAULT NULL COMMENT 'The formula for the attack charge duration, effected by factors such as skill level, may not be used for every attack', - `attack_duration` INT NOT NULL COMMENT 'The length of time the attack lasts, instant 1 hit attacks will be 0, while a whirlwing may last longer', - `attack_ticks` text COMMENT 'teh formula that states the number of ticks in an attack, if duration is 0, this should be null', `range` text, `aoe_radius` text, `outcome` text NOT NULL, - `multiplier` DOUBLE(5,3) NULL DEFAULT 1.000 COMMENT 'is the float value that the final damage is multiplied by to get the attack specific final damage' , + `multiplier` text NOT NULL, `requirements` VARCHAR(250) NULL DEFAULT '<req></req>' COMMENT 'is a xml script of requirements, these requirements will be checked before a character can use the attack. schema to be added soon, but will be very flexable.' , PRIMARY KEY (`id`) , UNIQUE INDEX `name_UNIQUE` (`name`) )ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table holds attcks to be used in the updated combat system'; -INSERT INTO `attacks` (`id`, `name`, `image_name`, `attack_effect`, `attack_description`, `charge_duration`, `attack_duration`, `attack_ticks`, `range`, `aoe_radius`, `outcome`, `multiplier`, `requirements`) VALUES (1, 'default', '', NULL, 'the default normal attack', '0', 0, NULL, '2', '0', '', 1.000, '<req></req>'); +INSERT INTO `attacks` VALUES (1, 'default', '', NULL, 'the default normal attack', '2', '0', '', '', '<req></req>'); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-06-05 05:10:54
|
Revision: 7365 http://planeshift.svn.sourceforge.net/planeshift/?rev=7365&view=rev Author: landson Date: 2011-06-05 05:10:48 +0000 (Sun, 05 Jun 2011) Log Message: ----------- made some additional small changes to fix what was keeping the server from starting up; mostly was a database issue Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psattack.cpp soc/2011/combat/src/server/cachemanager.cpp soc/2011/combat/src/server/cachemanager.h soc/2011/combat/src/server/database/mysql/attack_types.sql soc/2011/combat/src/server/database/mysql/attacks.sql Modified: soc/2011/combat/src/server/bulkobjects/psattack.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-06-05 04:26:31 UTC (rev 7364) +++ soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-06-05 05:10:48 UTC (rev 7365) @@ -88,7 +88,7 @@ aoeRadius = MathExpression::Create(row["aoe_radius"]); outcome = psserver->GetProgressionManager()->FindScript(row["outcome"]); - CS_ASSERT(power && range && aoeRadius && outcome); + // CS_ASSERT(power && range && aoeRadius && outcome); requirementStr = row["requirements"]; LoadRequirementXML(requirement,this,requirementStr); Modified: soc/2011/combat/src/server/cachemanager.cpp =================================================================== --- soc/2011/combat/src/server/cachemanager.cpp 2011-06-05 04:26:31 UTC (rev 7364) +++ soc/2011/combat/src/server/cachemanager.cpp 2011-06-05 05:10:48 UTC (rev 7365) @@ -2410,14 +2410,14 @@ return NULL; } -psAttackType *CacheManager::GetAttackTypeByName(const csString & name) +psAttackType *CacheManager::GetAttackTypeByName(csString name) { size_t i; for (i=0;i<attackTypeList.GetSize();i++) { psAttackType *currentType; currentType=attackTypeList.Get(i); - if (currentType && name==currentType->name) + if (currentType && name.Upcase()==currentType->name.Upcase()) { return currentType; } @@ -2441,14 +2441,14 @@ return NULL; } -psWeaponType *CacheManager::GetWeaponTypeByName(const csString & name) +psWeaponType *CacheManager::GetWeaponTypeByName(csString name) { size_t i; for (i=0;i<weaponTypeList.GetSize();i++) { psWeaponType *currentType; currentType=weaponTypeList.Get(i); - if (currentType && name==currentType->name) + if (currentType && name.Upcase()==currentType->name.Upcase()) { return currentType; } Modified: soc/2011/combat/src/server/cachemanager.h =================================================================== --- soc/2011/combat/src/server/cachemanager.h 2011-06-05 04:26:31 UTC (rev 7364) +++ soc/2011/combat/src/server/cachemanager.h 2011-06-05 05:10:48 UTC (rev 7365) @@ -405,11 +405,11 @@ // attack types psAttackType *GetAttackTypeByID(unsigned int id); - psAttackType *GetAttackTypeByName(const csString & name); + psAttackType *GetAttackTypeByName(csString name); // weapon types psWeaponType*GetWeaponTypeByID(unsigned int id); - psWeaponType *GetWeaponTypeByName(const csString & name); + psWeaponType *GetWeaponTypeByName(csString name); // Factions Faction * GetFaction(const char *name); Modified: soc/2011/combat/src/server/database/mysql/attack_types.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/attack_types.sql 2011-06-05 04:26:31 UTC (rev 7364) +++ soc/2011/combat/src/server/database/mysql/attack_types.sql 2011-06-05 05:10:48 UTC (rev 7365) @@ -12,3 +12,5 @@ PRIMARY KEY (`id`) , UNIQUE INDEX `name_UNIQUE` (`name`) )ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table holds attck types to be used in the updated combat system'; + +INSERT INTO `attack_types` VALUES (1, 'default', NULL, NULL, 1, 0); Modified: soc/2011/combat/src/server/database/mysql/attacks.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/attacks.sql 2011-06-05 04:26:31 UTC (rev 7364) +++ soc/2011/combat/src/server/database/mysql/attacks.sql 2011-06-05 05:10:48 UTC (rev 7365) @@ -8,13 +8,14 @@ `image_name` VARCHAR(40) NULL DEFAULT '' COMMENT 'the icon image', `attack_anim` VARCHAR(255) COMMENT 'The visual effect of the attack', `attack_description` text COMMENT 'a short description of the attack', + `attackType` VARCHAR(40) NOT NULL COMMENT 'the type of attack it is, found in the attack_types table', `range` text, `aoe_radius` text, `outcome` text NOT NULL, - `multiplier` text NOT NULL, + `power` text NOT NULL, `requirements` VARCHAR(250) NULL DEFAULT '<req></req>' COMMENT 'is a xml script of requirements, these requirements will be checked before a character can use the attack. schema to be added soon, but will be very flexable.' , PRIMARY KEY (`id`) , UNIQUE INDEX `name_UNIQUE` (`name`) )ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table holds attcks to be used in the updated combat system'; -INSERT INTO `attacks` VALUES (1, 'default', '', NULL, 'the default normal attack', '2', '0', '', '', '<req></req>'); +INSERT INTO `attacks` VALUES (1, 'default', '', '0', 'default attack', 'default', '2', '0', 'cast SpellFailure', '5', '<req></req>'); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-06-08 20:54:53
|
Revision: 7379 http://planeshift.svn.sourceforge.net/planeshift/?rev=7379&view=rev Author: landson Date: 2011-06-08 20:54:47 +0000 (Wed, 08 Jun 2011) Log Message: ----------- fixed an issue with the attack database Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psprereqops.cpp soc/2011/combat/src/server/bulkobjects/psprereqops.h soc/2011/combat/src/server/database/mysql/attacks.sql Modified: soc/2011/combat/src/server/bulkobjects/psprereqops.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psprereqops.cpp 2011-06-08 20:25:28 UTC (rev 7378) +++ soc/2011/combat/src/server/bulkobjects/psprereqops.cpp 2011-06-08 20:54:47 UTC (rev 7379) @@ -1,7 +1,7 @@ /* * psPrereqopts.cpp * - * Copyright (C) 2005 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * Copyright (C) 2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) * * * This program is free software; you can redistribute it and/or Modified: soc/2011/combat/src/server/bulkobjects/psprereqops.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psprereqops.h 2011-06-08 20:25:28 UTC (rev 7378) +++ soc/2011/combat/src/server/bulkobjects/psprereqops.h 2011-06-08 20:54:47 UTC (rev 7379) @@ -1,7 +1,7 @@ /* * psquest.h * - * Copyright (C) 2005 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * Copyright (C) 2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) * * * This program is free software; you can redistribute it and/or @@ -41,8 +41,6 @@ class psQuest; class psSkillInfo; struct Faction; - -class psQuestPrereqOp; /** * Pure virtual base quest prerequisite operator class * Modified: soc/2011/combat/src/server/database/mysql/attacks.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/attacks.sql 2011-06-08 20:25:28 UTC (rev 7378) +++ soc/2011/combat/src/server/database/mysql/attacks.sql 2011-06-08 20:54:47 UTC (rev 7379) @@ -13,9 +13,9 @@ `aoe_radius` text, `outcome` text NOT NULL, `power` text NOT NULL, - `requirements` VARCHAR(250) NULL DEFAULT '<req></req>' COMMENT 'is a xml script of requirements, these requirements will be checked before a character can use the attack. schema to be added soon, but will be very flexable.' , + `requirements` VARCHAR(250) NULL DEFAULT '<pre></pre>' COMMENT 'is a xml script of requirements, these requirements will be checked before a character can use the attack. schema to be added soon, but will be very flexable.' , PRIMARY KEY (`id`) , UNIQUE INDEX `name_UNIQUE` (`name`) )ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table holds attcks to be used in the updated combat system'; -INSERT INTO `attacks` VALUES (1, 'default', '', '0', 'default attack', 'default', '2', '0', 'cast SpellFailure', '5', '<req></req>'); +INSERT INTO `attacks` VALUES (1, 'default', '', '0', 'default attack', 'default', '2', '0', 'cast SpellFailure', '5', '<pre></pre>'); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-06-22 23:29:47
|
Revision: 7440 http://planeshift.svn.sourceforge.net/planeshift/?rev=7440&view=rev Author: landson Date: 2011-06-22 23:29:40 +0000 (Wed, 22 Jun 2011) Log Message: ----------- - Made a few small changes, still working on exactly how I want to do dual wielding, have my choices pretty much down to two very different choices. But right now attacks are handled on a by weapon basis, so each weapon will execute an attack instead of an attack using both weapons. This will likely change, but it works for now until I can work out another system. Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psAttackDefault.cpp soc/2011/combat/src/server/bulkobjects/psAttackDefault.h soc/2011/combat/src/server/bulkobjects/psattack.cpp soc/2011/combat/src/server/bulkobjects/psattack.h soc/2011/combat/src/server/combatmanager.cpp soc/2011/combat/src/server/combatmanager.h Modified: soc/2011/combat/src/server/bulkobjects/psAttackDefault.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psAttackDefault.cpp 2011-06-21 21:51:44 UTC (rev 7439) +++ soc/2011/combat/src/server/bulkobjects/psAttackDefault.cpp 2011-06-22 23:29:40 UTC (rev 7440) @@ -1,5 +1,5 @@ /* - * fileName.cpp creator har...@gm... + * psAttackDefault.cpp creator har...@gm... * * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) * @@ -78,6 +78,25 @@ } +bool psAttackDefault::IsDualWield(psCharacter* attacker) +{ + int count = 0; + //default being a dual wield depends on whether or not the character has 2 weapons or not, it is supposed to be flexible + for (int slot=0; slot<PSCHARACTER_SLOT_BULK1; slot++) + { + // See if this slot is able to attack + if (attacker->Inventory().CanItemAttack((INVENTORY_SLOT_NUMBER) slot)) + { + count++; + } + if(count > 1) //if it's greater than 1 it is a dualwield attack + break; + } + if(count > 1) + return true; + else + return false; +} bool psAttackDefault::Load(iResultRow& row) { //no need to load anything for this particular attack Modified: soc/2011/combat/src/server/bulkobjects/psAttackDefault.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psAttackDefault.h 2011-06-21 21:51:44 UTC (rev 7439) +++ soc/2011/combat/src/server/bulkobjects/psAttackDefault.h 2011-06-22 23:29:40 UTC (rev 7440) @@ -68,8 +68,8 @@ */ bool CanAttack(Client *client); + bool IsDualWield(psCharacter* attacker); - bool Attack(gemObject *attacker,gemObject* target); bool Attack(gemObject *attacker, gemObject* target, INVENTORY_SLOT_NUMBER slot); void Affect(psCombatAttackGameEvent *event); Modified: soc/2011/combat/src/server/bulkobjects/psattack.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-06-21 21:51:44 UTC (rev 7439) +++ soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-06-22 23:29:40 UTC (rev 7440) @@ -91,6 +91,8 @@ { attacker->UnregisterCallback(this); } + + attackerdata->allowAttackPop = true; } void psCombatAttackGameEvent::DeleteObjectCallback(iDeleteNotificationObject * object) { Modified: soc/2011/combat/src/server/bulkobjects/psattack.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattack.h 2011-06-21 21:51:44 UTC (rev 7439) +++ soc/2011/combat/src/server/bulkobjects/psattack.h 2011-06-22 23:29:40 UTC (rev 7440) @@ -129,6 +129,7 @@ */ const csString& GetDescription() const { return description; } + virtual bool IsDualWield(psCharacter* attacker) = 0; protected: //applies combat damage to a target, may be called more than once per attack if the attack is aoe virtual void AffectTarget(psCombatAttackGameEvent *event, int attack_result) = 0; Modified: soc/2011/combat/src/server/combatmanager.cpp =================================================================== --- soc/2011/combat/src/server/combatmanager.cpp 2011-06-21 21:51:44 UTC (rev 7439) +++ soc/2011/combat/src/server/combatmanager.cpp 2011-06-22 23:29:40 UTC (rev 7440) @@ -56,6 +56,7 @@ targetLocations.Push(PSCHARACTER_SLOT_LEGS); targetLocations.Push(PSCHARACTER_SLOT_BOOTS); + Subscribe(&CombatManager::HandleDeathEvent, MSGTYPE_DEATH_EVENT, NO_VALIDATION); } @@ -158,7 +159,9 @@ void CombatManager::AttackSomeone(gemActor *attacker,gemObject *target,Stance stance) { + psCharacter *attackerChar = attacker->GetCharacterData(); + attackerChar->allowAttackPop = true; //we don't allow an overweight or defeated char to fight if (attacker->GetMode() == PSCHARACTER_MODE_DEFEATED || attacker->GetMode() == PSCHARACTER_MODE_OVERWEIGHT) @@ -243,20 +246,14 @@ void CombatManager::HandleCombatEvent(psCombatAttackGameEvent *event) { event->attack->Affect(event); - // Queue next event to continue combat if this is an auto attack slot - if (event->attackerdata->Inventory().IsItemAutoAttack(event->GetWeaponSlot())) - { - //currently the same attack is used so there is no more polling - //TODO: pull a new attack from the queue - event->attack->Attack(event->attacker,event->target,event->GetWeaponSlot()); - } - else - { -#ifdef COMBAT_DEBUG - psserver->SendSystemError(event->AttackerCID, "Item %s is not a auto attack item.",attacker_data->Inventory().GetEffectiveWeaponInSlot(event->GetWeaponSlot())->GetName()); -#endif - } + psAttack* attack = event->GetAttackerData()->GetAttackQueue()->Pop(); + + if(!attack) + attack = new psAttackDefault(); + + attack->Attack(event->attacker,event->target, event->WeaponSlot); + } Modified: soc/2011/combat/src/server/combatmanager.h =================================================================== --- soc/2011/combat/src/server/combatmanager.h 2011-06-21 21:51:44 UTC (rev 7439) +++ soc/2011/combat/src/server/combatmanager.h 2011-06-22 23:29:40 UTC (rev 7440) @@ -105,7 +105,7 @@ csArray<INVENTORY_SLOT_NUMBER> targetLocations; void SetCombat(gemActor *combatant, Stance stance); void NotifyTarget(gemActor *attacker, gemObject *target); - + private: csRandomGen* randomgen; LocationType* pvp_region; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-06-26 23:14:16
|
Revision: 7456 http://planeshift.svn.sourceforge.net/planeshift/?rev=7456&view=rev Author: landson Date: 2011-06-26 23:14:10 +0000 (Sun, 26 Jun 2011) Log Message: ----------- made a few small bug fixes regarding a previous dual wielding attempt Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psattack.cpp soc/2011/combat/src/server/combatmanager.cpp Modified: soc/2011/combat/src/server/bulkobjects/psattack.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-06-26 00:41:05 UTC (rev 7455) +++ soc/2011/combat/src/server/bulkobjects/psattack.cpp 2011-06-26 23:14:10 UTC (rev 7456) @@ -91,8 +91,6 @@ { attacker->UnregisterCallback(this); } - - attackerdata->allowAttackPop = true; } void psCombatAttackGameEvent::DeleteObjectCallback(iDeleteNotificationObject * object) { Modified: soc/2011/combat/src/server/combatmanager.cpp =================================================================== --- soc/2011/combat/src/server/combatmanager.cpp 2011-06-26 00:41:05 UTC (rev 7455) +++ soc/2011/combat/src/server/combatmanager.cpp 2011-06-26 23:14:10 UTC (rev 7456) @@ -161,7 +161,6 @@ { psCharacter *attackerChar = attacker->GetCharacterData(); - attackerChar->allowAttackPop = true; //we don't allow an overweight or defeated char to fight if (attacker->GetMode() == PSCHARACTER_MODE_DEFEATED || attacker->GetMode() == PSCHARACTER_MODE_OVERWEIGHT) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-06-27 23:18:56
|
Revision: 7463 http://planeshift.svn.sourceforge.net/planeshift/?rev=7463&view=rev Author: landson Date: 2011-06-27 23:18:49 +0000 (Mon, 27 Jun 2011) Log Message: ----------- - began to flesh out pieces of melee specials - made some revisions to the attack tables Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psattack.h soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp soc/2011/combat/src/server/bulkobjects/psattackmelee.h soc/2011/combat/src/server/bulkobjects/psattackqueue.cpp soc/2011/combat/src/server/bulkobjects/psprereqops.cpp soc/2011/combat/src/server/cachemanager.cpp soc/2011/combat/src/server/database/mysql/attack_types.sql soc/2011/combat/src/server/database/mysql/attacks.sql Modified: soc/2011/combat/src/server/bulkobjects/psattack.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattack.h 2011-06-27 19:12:42 UTC (rev 7462) +++ soc/2011/combat/src/server/bulkobjects/psattack.h 2011-06-27 23:18:49 UTC (rev 7463) @@ -63,7 +63,7 @@ csString name;/// the name of the attack type csString weapon;/// if it requires 1 specific weapon, maybe its an attack that is special adn specific to 1 particular weapon. csArray<psWeaponType*> weaponTypes;/// if it requires multiple types of weapons they would be listed here. - bool dualWield;/// if it is a dual weilding based attack it willb e flagged here, that means it requires 2 weapons and each will perform part of the attack, if it is false then only one hand will execute the attack. + bool OneHand;/// if it is a dual weilding based attack it willb e flagged here, that means it requires 2 weapons and each will perform part of the attack, if it is false then only one hand will execute the attack. PSITEMSTATS_STAT related_stat; /// each attack will have a stat related to it that will be part of the power computation }; Modified: soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp 2011-06-27 19:12:42 UTC (rev 7462) +++ soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp 2011-06-27 23:18:49 UTC (rev 7463) @@ -62,20 +62,47 @@ psAttackMelee::~psAttackMelee() { + } bool psAttackMelee::Load(iResultRow& row) { + id = row.GetInt("id"); + name = row["name"]; + image = row["image_name"]; + Animation = row["attack_anim"]; + description = row["attack_description"]; + + type = psserver->GetCacheManager()->GetAttackTypeByName(row["attackType"]); + + aoeRadius = MathExpression::Create(row["aoe_radius"]); + aoeAngle = MathExpression::Create(row["aoe_angle"]); + Power = MathExpression::Create(row["power"]); + outcome = psserver->GetProgressionManager()->FindScript(row["outcome"]); + CS_ASSERT(aoeRadius && Power && aoeAngle && outcome); + + LoadPrerequisiteXML(requirements,row["requirements"]); + + TypeRequirements = new psPrereqOpAttackType(type); + return true; } bool psAttackMelee::CanAttack(Client *client) { - return true; + if(requirements->Check(client->GetCharacterData()) && TypeRequirements->Check(client->GetCharacterData())) + { + return true; + } + else + return false; } bool psAttackMelee::IsDualWield(psCharacter* attacker) { - return true; + if(type->OneHand) + return true; + else + return false; } bool psAttackMelee::Attack(gemObject *attacker, gemObject* target, INVENTORY_SLOT_NUMBER slot) Modified: soc/2011/combat/src/server/bulkobjects/psattackmelee.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackmelee.h 2011-06-27 19:12:42 UTC (rev 7462) +++ soc/2011/combat/src/server/bulkobjects/psattackmelee.h 2011-06-27 23:18:49 UTC (rev 7463) @@ -52,9 +52,9 @@ psAttackMelee(); ~psAttackMelee(); - /** - * Loads data from the database, btu since this is a default attack, nothing is loaded at teh moment. - */ + /** + * Loads data from the database, btu since this is a default attack, nothing is loaded at teh moment. + */ bool Load(iResultRow& row); /** Performs the necessary checks on the player to make sure they meet @@ -76,9 +76,27 @@ * Queues up the next attack, specific to the default attack at the moment */ void QueueAttack(gemObject *attacker,INVENTORY_SLOT_NUMBER weaponslot,gemObject *target,int attackerCID, int targetCID); - MathScript *calc_decay; ///< This is the particular calculation for decay. - MathScript* staminacombat;///< if the player is too tired, stop fighting. We stop if we don't have enough stamina to make an attack with the current stance. + float PowerLevel(psCharacter *caster, float kFactor) const; + + csString Animation; ///< possible attack animation + + csRef< psPrereqOp > requirements; ///< all non weapon based attack requirements. + csRef< psPrereqOp > TypeRequirements; ///< all Attack Type based requirements(not handled as a script) + + int MaxPower; ///< the maximum amount of power an attack can have + + /// AOE Radius: (Power, WaySkill, RelatedStat) -> Meters + MathExpression *aoeRadius; + /// AOE Angle: (Power, WaySkill, RelatedStat) -> Degrees + MathExpression *aoeAngle; + + MathExpression *Power; + + /// The progression script: (Power, Caster, Target) -> (side effects) + ProgressionScript *outcome; + + }; #endif \ No newline at end of file Modified: soc/2011/combat/src/server/bulkobjects/psattackqueue.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackqueue.cpp 2011-06-27 19:12:42 UTC (rev 7462) +++ soc/2011/combat/src/server/bulkobjects/psattackqueue.cpp 2011-06-27 23:18:49 UTC (rev 7463) @@ -44,12 +44,12 @@ bool psAttackQueue::Push(psAttack * attack) { - if(attack->GetType()->dualWield && (attackListOneHand.GetSize() < max)) + if(attack->GetType()->OneHand && (attackListOneHand.GetSize() < max)) { attackListOneHand.Push(attack); return true; } - else if(!attack->GetType()->dualWield && (attackListBoth.GetSize() < max)) + else if(!attack->GetType()->OneHand && (attackListBoth.GetSize() < max)) { attackListBoth.Push(attack); return true; Modified: soc/2011/combat/src/server/bulkobjects/psprereqops.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psprereqops.cpp 2011-06-27 19:12:42 UTC (rev 7462) +++ soc/2011/combat/src/server/bulkobjects/psprereqops.cpp 2011-06-27 23:18:49 UTC (rev 7463) @@ -1733,7 +1733,7 @@ bool psPrereqOpAttackType::Check(psCharacter * character) { - if(attackType->dualWield) + if(attackType->OneHand) { int count = 0; for (int slot=0; slot<PSCHARACTER_SLOT_BULK1; slot++) Modified: soc/2011/combat/src/server/cachemanager.cpp =================================================================== --- soc/2011/combat/src/server/cachemanager.cpp 2011-06-27 19:12:42 UTC (rev 7462) +++ soc/2011/combat/src/server/cachemanager.cpp 2011-06-27 23:18:49 UTC (rev 7463) @@ -2846,7 +2846,7 @@ psAttackType * type = new psAttackType; type->id = types[i].GetInt("id"); type->name = types[i]["name"]; - type->dualWield = (bool)types[i]["dual_wield"]; + type->OneHand = (bool)types[i]["onehand"]; type->related_stat = (PSITEMSTATS_STAT)atoi(types[i]["stat"]); type->weapon = types[i]["weaponName"]; csString tempWTypes = types[i]["weaponType"]; Modified: soc/2011/combat/src/server/database/mysql/attack_types.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/attack_types.sql 2011-06-27 19:12:42 UTC (rev 7462) +++ soc/2011/combat/src/server/database/mysql/attack_types.sql 2011-06-27 23:18:49 UTC (rev 7463) @@ -7,7 +7,7 @@ `name` VARCHAR(40) NOT NULL COMMENT 'is the types name, each name must be unique.' , `weaponName` VARCHAR(40) DEFAULT NULL COMMENT 'This is a field that should be filled in if an attack is made for a very specific weapon, like a weapons special attack, not always going to be used but either this or weapon type should always be filled in', `weaponType` VARCHAR(40) DEFAULT NULL COMMENT 'more than one required weapon type may be listed, seperate each weapon type id with a space', - `dual_wield` BOOLEAN NOT NULL COMMENT 'is this a dual weild based attack, if it is, then both weapons may use the attack, if it is not, only one will execute the attack', + `onehand` BOOLEAN NOT NULL COMMENT 'This is a bool, if true then the attack is designed for a one handed weapon, if false then it is designed for a 2 handed weapon', `stat` int(11) NOT NULL COMMENT 'The skill related to this type', PRIMARY KEY (`id`) , UNIQUE INDEX `name_UNIQUE` (`name`) Modified: soc/2011/combat/src/server/database/mysql/attacks.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/attacks.sql 2011-06-27 19:12:42 UTC (rev 7462) +++ soc/2011/combat/src/server/database/mysql/attacks.sql 2011-06-27 23:18:49 UTC (rev 7463) @@ -19,5 +19,3 @@ PRIMARY KEY (`id`) , UNIQUE INDEX `name_UNIQUE` (`name`) )ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table holds attcks to be used in the updated combat system'; - -INSERT INTO `attacks` VALUES (1, 'default', '', '0', 'default attack', 'default', '2', '0', '0', 'cast SpellFailure', '5', '<pre></pre>'); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-07-01 20:42:52
|
Revision: 7483 http://planeshift.svn.sourceforge.net/planeshift/?rev=7483&view=rev Author: landson Date: 2011-07-01 20:42:46 +0000 (Fri, 01 Jul 2011) Log Message: ----------- -Implemented a basic(still going to need a bit more fleshing out and testing) but very functional melee special attack class -Added a test case in the database -Also added a mathscript for determining power level of an attack, but Until I or the Rules team can work out a proper formula it is a constant 50 for testing. -Fixed issues with my weapon requirement checking(it was still checking for dualwield based checks. Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp soc/2011/combat/src/server/bulkobjects/psprereqops.cpp soc/2011/combat/src/server/database/mysql/attack_types.sql soc/2011/combat/src/server/database/mysql/attacks.sql soc/2011/combat/src/server/database/mysql/math_scripts.sql soc/2011/combat/src/server/database/mysql/progress_events.sql soc/2011/combat/src/server/database/mysql/weapon_types.sql Modified: soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp 2011-07-01 15:45:29 UTC (rev 7482) +++ soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp 2011-07-01 20:42:46 UTC (rev 7483) @@ -88,12 +88,25 @@ bool psAttackMelee::CanAttack(Client *client) { - if(requirements->Check(client->GetCharacterData()) && TypeRequirements->Check(client->GetCharacterData())) + if(TypeRequirements) { - return true; + if(TypeRequirements->Check(client->GetCharacterData())) + { + if(requirements) + return requirements->Check(client->GetCharacterData()); + else + return true; + } + else + return false; } else - return false; + { + if(requirements) + return requirements->Check(client->GetCharacterData()); + else + return true; + } } bool psAttackMelee::IsDualWield(psCharacter* attacker) @@ -125,7 +138,7 @@ static MathScript *script = NULL; if (!script) { - script = psserver->GetMathScriptEngine()->FindScript("CalculatePowerLevel"); + script = psserver->GetMathScriptEngine()->FindScript("CalculateAttackPowerLevel"); CS_ASSERT(script); } @@ -159,14 +172,9 @@ int affectedCount = 0; if (radius < 0.01f) // single target { - if (target && attacker->RangeTo(target) <= range) - { AffectTarget(attacker, target, target, power); - } - else - { - psserver->SendSystemInfo(attacker->GetClientID(), "%s is too far away for your attack to reach.", target ? target->GetName() : "Your target"); - } + + affectedCount++; } else // AOE (Area of Effect) { @@ -260,7 +268,7 @@ // Spell hit successfully. Run the script. MathEnvironment env; - env.Define("Attacker", attacker); + env.Define("Actor", attacker); env.Define("Target", target); env.Define("OrigTarget", origTarget); // the epicentre of an AOE attack/original cast target env.Define("Power", power); Modified: soc/2011/combat/src/server/bulkobjects/psprereqops.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psprereqops.cpp 2011-07-01 15:45:29 UTC (rev 7482) +++ soc/2011/combat/src/server/bulkobjects/psprereqops.cpp 2011-07-01 20:42:46 UTC (rev 7483) @@ -1733,36 +1733,15 @@ bool psPrereqOpAttackType::Check(psCharacter * character) { - if(attackType->OneHand) + + for (int slot=0; slot<PSCHARACTER_SLOT_BULK1; slot++) { - int count = 0; - for (int slot=0; slot<PSCHARACTER_SLOT_BULK1; slot++) + if (character->Inventory().CanItemAttack((INVENTORY_SLOT_NUMBER) slot)) { - if (character->Inventory().CanItemAttack((INVENTORY_SLOT_NUMBER) slot)) - { - if(checkWeapon(character,slot)) - count++; - - if(count > 1) - return true; - else - return false; - } + return checkWeapon(character,slot); } } - else - { - for (int slot=0; slot<PSCHARACTER_SLOT_BULK1; slot++) - { - if (character->Inventory().CanItemAttack((INVENTORY_SLOT_NUMBER) slot)) - { - if(checkWeapon(character,slot)) - return true; - else - return false; - } - } - } + return false; } bool psPrereqOpAttackType::checkWeapon(psCharacter *character, int slot) Modified: soc/2011/combat/src/server/database/mysql/attack_types.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/attack_types.sql 2011-07-01 15:45:29 UTC (rev 7482) +++ soc/2011/combat/src/server/database/mysql/attack_types.sql 2011-07-01 20:42:46 UTC (rev 7483) @@ -13,4 +13,4 @@ UNIQUE INDEX `name_UNIQUE` (`name`) )ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table holds attck types to be used in the updated combat system'; -INSERT INTO `attack_types` VALUES (1, 'default', NULL, NULL, 1, 0); +INSERT INTO `attack_types` (`id`, `name`, `weaponName`, `weaponType`, `onehand`, `stat`) VALUES (1, 'Pound', NULL, 'HAMMER', 1, 0); Modified: soc/2011/combat/src/server/database/mysql/attacks.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/attacks.sql 2011-07-01 15:45:29 UTC (rev 7482) +++ soc/2011/combat/src/server/database/mysql/attacks.sql 2011-07-01 20:42:46 UTC (rev 7483) @@ -19,3 +19,5 @@ PRIMARY KEY (`id`) , UNIQUE INDEX `name_UNIQUE` (`name`) )ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table holds attcks to be used in the updated combat system'; + +INSERT INTO `attacks` (`id`, `name`, `image_name`, `attack_anim`, `attack_description`, `attackType`, `form`, `range`, `aoe_radius`, `aoe_angle`, `outcome`, `power`, `requirements`) VALUES (1, 'HammerSmash', '', NULL, 'an attack that causes a hammer to smash the ground and damage all nearby targets', 'Pound', 'melee', NULL, '0', '0', 'cast Hammer Smash', '100*(RelatedStat+WeaponSkill)*(Power/10)', ''); Modified: soc/2011/combat/src/server/database/mysql/math_scripts.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/math_scripts.sql 2011-07-01 15:45:29 UTC (rev 7482) +++ soc/2011/combat/src/server/database/mysql/math_scripts.sql 2011-07-01 20:42:46 UTC (rev 7483) @@ -499,6 +499,7 @@ Time = Transform:TransformPoints; }"); +#This script is for future use, I have not worked one out yet, I can do it later or the rules team can do it. +INSERT INTO math_scripts VALUES( "CalculateAttackPowerLevel", +"50"); - - Modified: soc/2011/combat/src/server/database/mysql/progress_events.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/progress_events.sql 2011-07-01 15:45:29 UTC (rev 7482) +++ soc/2011/combat/src/server/database/mysql/progress_events.sql 2011-07-01 20:42:46 UTC (rev 7483) @@ -228,7 +228,7 @@ </then> </if> </script>'); - +INSERT INTO progression_events VALUES('cast Hammer Smash','<script><msg aim="Actor" text="Hammer Smash not implemented."/></script>'); INSERT INTO progression_events VALUES("vegeta", '<script> <if t="Target:IsEnemy(NPC:owner) = 1"> Modified: soc/2011/combat/src/server/database/mysql/weapon_types.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/weapon_types.sql 2011-07-01 15:45:29 UTC (rev 7482) +++ soc/2011/combat/src/server/database/mysql/weapon_types.sql 2011-07-01 20:42:46 UTC (rev 7483) @@ -9,3 +9,11 @@ PRIMARY KEY (`id`) , UNIQUE INDEX `name_UNIQUE` (`name`) )ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table holds different types of weapons and their associations'; + +INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (1, 'SWORD', 0); +INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (2, 'KNIVES', 1); +INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (3, 'AXE', 2); +INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (4, 'HAMMER', 3); +INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (5, 'POLEARM', 5); +INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (6, 'MARTIALARTS', 4); +INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (7, 'RANGED', 6); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-07-05 04:39:31
|
Revision: 7495 http://planeshift.svn.sourceforge.net/planeshift/?rev=7495&view=rev Author: landson Date: 2011-07-05 04:39:24 +0000 (Tue, 05 Jul 2011) Log Message: ----------- -Calculate attack is no longer required in an attack datatype -Added a script to calculate an attacks success chance, still debating whether special attacks should be able to miss on top of the chance to be unsuccessful, these are special and powerful after all -Added a speed modifier to attacks, this allows for attacks that can be slightly faster or slower than weapon speed, though weapon speed is also added into the calculation so that it is still important. Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psAttackDefault.cpp soc/2011/combat/src/server/bulkobjects/psattack.h soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp soc/2011/combat/src/server/bulkobjects/psattackmelee.h soc/2011/combat/src/server/database/mysql/attacks.sql Modified: soc/2011/combat/src/server/bulkobjects/psAttackDefault.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psAttackDefault.cpp 2011-07-04 21:43:18 UTC (rev 7494) +++ soc/2011/combat/src/server/bulkobjects/psAttackDefault.cpp 2011-07-05 04:39:24 UTC (rev 7495) @@ -177,14 +177,7 @@ #endif return; } -//// -//// if (attacker_data->Inventory().GetEquipmentObject(event->GetWeaponSlot()).eventId != event->id) -//// { -////#ifdef COMBAT_DEBUG -//// psserver->SendSystemError(event->AttackerCID, "Ignored combat event as newer is in."); -////#endif -//// return; -//// } + psItem* weapon = attacker_data->Inventory().GetEffectiveWeaponInSlot(event->GetWeaponSlot()); Modified: soc/2011/combat/src/server/bulkobjects/psattack.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattack.h 2011-07-04 21:43:18 UTC (rev 7494) +++ soc/2011/combat/src/server/bulkobjects/psattack.h 2011-07-05 04:39:24 UTC (rev 7495) @@ -102,10 +102,6 @@ */ virtual bool CanAttack(Client *client) = 0; - /* - * Calculates teh damage and how the hit went(i.e. did it miss?) - */ - virtual int CalculateAttack(psCombatAttackGameEvent *event, psItem* subWeapon = NULL) = 0; /** gets the id * @return the attack id Modified: soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp 2011-07-04 21:43:18 UTC (rev 7494) +++ soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp 2011-07-05 04:39:24 UTC (rev 7495) @@ -71,6 +71,7 @@ image = row["image_name"]; Animation = row["attack_anim"]; description = row["attack_description"]; + AttackSpeed = row.GetFloat("speed"); type = psserver->GetCacheManager()->GetAttackTypeByName(row["attackType"]); @@ -79,6 +80,8 @@ outcome = psserver->GetProgressionManager()->FindScript(row["outcome"]); CS_ASSERT(aoeRadius && aoeAngle && outcome); + successChance = MathExpression::Create(row["successchance"]); + LoadPrerequisiteXML(requirements,row["requirements"]); TypeRequirements = new psPrereqOpAttackType(type); @@ -123,9 +126,13 @@ psItem *Weapon=Character->Inventory().GetEffectiveWeaponInSlot(slot); uint32 weaponID = Weapon->GetUID(); float latency = Weapon->GetLatency(); - int delay = (int)(latency*1000); + int delay = 0; + if(AttackSpeed>0) + delay = (int)(((AttackSpeed+latency)/2)*1000); //each attack has a speed value, each weapon has a latency, the average of the 2 will give the speed of the attack + else + delay = (int)((latency)*1000); //however if the attack don't have a speed value, hten weapon latency is used. + //^this is useful for making some attacks slower, but allowing weapon speed and choice to still be important - psCombatAttackGameEvent *event; event = new psCombatAttackGameEvent(delay,this,attacker,target,slot,attacker->GetClientID(),target->GetClientID()); event->GetAttackerData()->TagEquipmentObject(slot,event->id); @@ -154,10 +161,11 @@ } void psAttackMelee::Affect(psCombatAttackGameEvent *event) { + gemObject* attacker = event->attacker; gemObject* target = event->target; float range = event->weapon->GetRange(); - // Look for targets + // Look for targets float power = MIN(MaxPower, PowerLevel(attacker->GetCharacterData(), event->weapon)); MathEnvironment env; @@ -167,13 +175,17 @@ float radius = aoeRadius->Evaluate(&env); float angle = aoeAngle->Evaluate(&env); + //checks the chances of the attack being successful, will implement a script, if it is successful then the attack goes through, if its not then it dont + if(!CalculateSuccess(event)) + { + psserver->SendSystemInfo(attacker->GetClientID(),"Your Attack failed");//will flesh this out a bit later + return; + } - int affectedCount = 0; if (radius < 0.01f) // single target { AffectTarget(attacker, target, target, power); - affectedCount++; } else // AOE (Area of Effect) @@ -246,10 +258,24 @@ } -int psAttackMelee::CalculateAttack(psCombatAttackGameEvent *event, psItem* subWeapon) +bool psAttackMelee::CalculateSuccess(psCombatAttackGameEvent *event) { - return 0; + //This is a trial thing, will probably change up later, relies heavily on the script always coming up with a number between 1 and 100, otherwise it breaks(over 100 would work but be pointless) + if(!successChance) + return true; + + MathEnvironment env; + env.Define("WeaponSkill",event->attacker->GetCharacterData()->GetSkillRank(event->weapon->GetWeaponType()->skill).Current()); + + float chance = successChance->Evaluate(&env); + + int randomnum = psserver->rng->Get(100); + + if(randomnum <= chance) + return true; + + return false; } bool psAttackMelee::AffectTarget(gemObject* attacker, gemObject* origTarget, gemObject* target, float power) @@ -257,21 +283,21 @@ if (!attacker->GetClient()->IsAllowedToAttack(target,true)) return false; - gemActor *attackee = dynamic_cast<gemActor*>(target); - gemActor *attker = dynamic_cast<gemActor*>(attacker); - if (attackee) - { - gemNPC *targetNPC = dynamic_cast<gemNPC*>(target); - if (targetNPC) - psserver->GetNPCManager()->QueueAttackPerception(attker, targetNPC); - } + gemActor *attackee = dynamic_cast<gemActor*>(target); + gemActor *attker = dynamic_cast<gemActor*>(attacker); + if (attackee) + { + gemNPC *targetNPC = dynamic_cast<gemNPC*>(target); + if (targetNPC) + psserver->GetNPCManager()->QueueAttackPerception(attker, targetNPC); + } - // Spell hit successfully. Run the script. - MathEnvironment env; - env.Define("Actor", attacker); - env.Define("Target", target); - env.Define("OrigTarget", origTarget); // the epicentre of an AOE attack/original cast target - env.Define("Power", power); + // Spell hit successfully. Run the script. + MathEnvironment env; + env.Define("Actor", attacker); + env.Define("Target", target); + env.Define("OrigTarget", origTarget); // the epicentre of an AOE attack/original cast target + env.Define("Power", power); outcome->Run(&env); Modified: soc/2011/combat/src/server/bulkobjects/psattackmelee.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackmelee.h 2011-07-04 21:43:18 UTC (rev 7494) +++ soc/2011/combat/src/server/bulkobjects/psattackmelee.h 2011-07-05 04:39:24 UTC (rev 7495) @@ -69,12 +69,16 @@ bool Attack(gemObject *attacker, gemObject* target, INVENTORY_SLOT_NUMBER slot); void Affect(psCombatAttackGameEvent *event); - int CalculateAttack(psCombatAttackGameEvent *event, psItem* subWeapon = NULL); + /** + * NYI + * + */ + bool CalculateSuccess(psCombatAttackGameEvent *event); private: bool AffectTarget(gemObject* attacker, gemObject* origTarget, gemObject* target, float power); float PowerLevel(psCharacter *attacker, psItem* weapon) const; - + float AttackSpeed; csString Animation; ///< possible attack animation csRef< psPrereqOp > requirements; ///< all non weapon based attack requirements. @@ -86,7 +90,8 @@ MathExpression *aoeRadius; /// AOE Angle: (Power, WaySkill, RelatedStat) -> Degrees MathExpression *aoeAngle; - + ///Chance of Success + MathExpression *successChance; /// The progression script: (Power, Caster, Target) -> (side effects) ProgressionScript *outcome; Modified: soc/2011/combat/src/server/database/mysql/attacks.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/attacks.sql 2011-07-04 21:43:18 UTC (rev 7494) +++ soc/2011/combat/src/server/database/mysql/attacks.sql 2011-07-05 04:39:24 UTC (rev 7495) @@ -8,6 +8,8 @@ `image_name` VARCHAR(40) NULL DEFAULT '' COMMENT 'the icon image', `attack_anim` VARCHAR(255) COMMENT 'The visual effect of the attack', `attack_description` text COMMENT 'a short description of the attack', + `speed` double COMMENT 'the attack speed value', + `successchance` COMMENT 'a math script for the chance of success should always equal 1-100 and can use weapon skill and a random number', `attackType` VARCHAR(40) NOT NULL COMMENT 'the type of attack it is, found in the attack_types table', `form` VARCHAR(40) NOT NULL COMMENT 'the form of attack, currently limited to range and melee, can/will be expanded', `range` text COMMENT 'Mostly for range attacks, melee is confined based on weapon range', This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-07-17 20:56:29
|
Revision: 7522 http://planeshift.svn.sourceforge.net/planeshift/?rev=7522&view=rev Author: landson Date: 2011-07-17 20:56:22 +0000 (Sun, 17 Jul 2011) Log Message: ----------- - ADDED some test cases and ran some tests myself to fix some bugs - Still need to add decay and attack animations(Beyond effects) Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp soc/2011/combat/src/server/combatmanager.cpp soc/2011/combat/src/server/combatmanager.h soc/2011/combat/src/server/database/mysql/attack_types.sql soc/2011/combat/src/server/database/mysql/attacks.sql soc/2011/combat/src/server/database/mysql/progress_events.sql soc/2011/combat/src/server/database/mysql/weapon_types.sql Modified: soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp 2011-07-17 18:02:13 UTC (rev 7521) +++ soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp 2011-07-17 20:56:22 UTC (rev 7522) @@ -166,7 +166,7 @@ gemObject* target = event->target; float range = event->weapon->GetRange(); // Look for targets - float power = MIN(MaxPower, PowerLevel(attacker->GetCharacterData(), event->weapon)); + float power = PowerLevel(attacker->GetCharacterData(), event->weapon); MathEnvironment env; env.Define("Power", power); Modified: soc/2011/combat/src/server/combatmanager.cpp =================================================================== --- soc/2011/combat/src/server/combatmanager.cpp 2011-07-17 18:02:13 UTC (rev 7521) +++ soc/2011/combat/src/server/combatmanager.cpp 2011-07-17 20:56:22 UTC (rev 7522) @@ -1,7 +1,7 @@ /* - * combatmanager.cpp + * combatmanager.cpp creator: har...@gm... * - * Copyright (C) 2001-2002 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) * * * This program is free software; you can redistribute it and/or @@ -16,7 +16,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ - #include <psconfig.h> //============================================================================= // Project Includes Modified: soc/2011/combat/src/server/combatmanager.h =================================================================== --- soc/2011/combat/src/server/combatmanager.h 2011-07-17 18:02:13 UTC (rev 7521) +++ soc/2011/combat/src/server/combatmanager.h 2011-07-17 20:56:22 UTC (rev 7522) @@ -1,7 +1,7 @@ /* - * combatmanager.h + * combatmanager.h creator: har...@gm... * - * Copyright (C) 2001-2002 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) * * * This program is free software; you can redistribute it and/or Modified: soc/2011/combat/src/server/database/mysql/attack_types.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/attack_types.sql 2011-07-17 18:02:13 UTC (rev 7521) +++ soc/2011/combat/src/server/database/mysql/attack_types.sql 2011-07-17 20:56:22 UTC (rev 7522) @@ -13,4 +13,7 @@ UNIQUE INDEX `name_UNIQUE` (`name`) )ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table holds attck types to be used in the updated combat system'; -INSERT INTO `attack_types` (`id`, `name`, `weaponName`, `weaponType`, `onehand`, `stat`) VALUES (1, 'Pound', NULL, 'HAMMER', 1, 0); +INSERT INTO `attack_types` (`id`, `name`, `weaponName`, `weaponType`, `onehand`, `stat`) VALUES (1, 'Assassination', NULL, 'SWORD KNIVES', 1, 1); +INSERT INTO `attack_types` (`id`, `name`, `weaponName`, `weaponType`, `onehand`, `stat`) VALUES (2, 'Archery', NULL, 'BOW CROSSBOW', 1, 1); +INSERT INTO `attack_types` (`id`, `name`, `weaponName`, `weaponType`, `onehand`, `stat`) VALUES (3, 'Barbaric', NULL, 'SWORD CLAYMORE POLEARM HAMMER AXE', 0, 0); +INSERT INTO `attack_types` (`id`, `name`, `weaponName`, `weaponType`, `onehand`, `stat`) VALUES (4, 'Long Bow Special', 'Long Bow', NULL, 1, 1); Modified: soc/2011/combat/src/server/database/mysql/attacks.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/attacks.sql 2011-07-17 18:02:13 UTC (rev 7521) +++ soc/2011/combat/src/server/database/mysql/attacks.sql 2011-07-17 20:56:22 UTC (rev 7522) @@ -16,10 +16,11 @@ `aoe_radius` text, `aoe_angle` text, `outcome` text NOT NULL, - `power` text NOT NULL, `requirements` VARCHAR(250) NULL DEFAULT '<pre></pre>' COMMENT 'is a xml script of requirements, these requirements will be checked before a character can use the attack. schema to be added soon, but will be very flexable.' , PRIMARY KEY (`id`) , UNIQUE INDEX `name_UNIQUE` (`name`) )ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='This table holds attcks to be used in the updated combat system'; -INSERT INTO `attacks` (`id`, `name`, `image_name`, `attack_anim`, `attack_description`, `attackType`, `form`, `range`, `aoe_radius`, `aoe_angle`, `outcome`, `power`, `requirements`) VALUES (1, 'HammerSmash', '', NULL, 'an attack that causes a hammer to smash the ground and damage all nearby targets', 'Pound', 'melee', NULL, '0', '0', 'cast Hammer Smash', '100*(RelatedStat+WeaponSkill)*(Power/10)', ''); +INSERT INTO `attacks` (`id`, `name`, `image_name`, `speed`, `successchance`, `attack_anim`, `attack_description`, `attackType`, `form`, `range`, `aoe_radius`, `aoe_angle`, `outcome`, `requirements`) VALUES (1, 'Hammer Smash', 'club01a_icon.dds', 1.00000000000000000000, '100', NULL, 'an attack that causes a hammer to smash the ground and damage all nearby targets', 'Barbaric', 'melee', NULL, '20', '360', 'cast Hammer Smash', ''); +INSERT INTO `attacks` (`id`, `name`, `image_name`, `speed`, `successchance`, `attack_anim`, `attack_description`, `attackType`, `form`, `range`, `aoe_radius`, `aoe_angle`, `outcome`, `requirements`) VALUES (2, 'Hyper Shot', 'bow_higher01a_icon.dds', 0.00000000000000000000, '100', NULL, 'A very powerful bow attack', 'Archery', 'range', '60', '0', '0', 'cast Hyper Shot', '<pre> <skill name=\"range\" min=\"50\" max=\"4000\" /> </pre>'); +INSERT INTO `attacks` (`id`, `name`, `image_name`, `speed`, `successchance`, `attack_anim`, `attack_description`, `attackType`, `form`, `range`, `aoe_radius`, `aoe_angle`, `outcome`, `requirements`) VALUES (3, 'Divine Shot', 'bow_higher01a_icon.dds', 1.00000000000000000000, '100', NULL, 'A long bow specific shot that takes the power of the gods and pushes it into an arrow', 'Long Bow Special', 'range', '100', '50', '90', 'cast LB Shot', ''); Modified: soc/2011/combat/src/server/database/mysql/progress_events.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/progress_events.sql 2011-07-17 18:02:13 UTC (rev 7521) +++ soc/2011/combat/src/server/database/mysql/progress_events.sql 2011-07-17 20:56:22 UTC (rev 7522) @@ -68,6 +68,50 @@ </else> </if> </script>'); +INSERT INTO progression_events VALUES("cast Hyper Shot", +' +<script> + <hp attacker="Caster" aim="Target" value="-6*Power"/> + <msg aim="Caster" text="You hit ${Target} with your Hyper arrow."/> + <fx source="Caster" target="Target" type="unattached" name="arrow success"/> + +</script> +'); +INSERT INTO progression_events VALUES("cast LB Shot", +' +<script> + <if t="Target = OrigTarget"> + <then> + <fx source="Caster" target="Target" name="summon_missile" type="unattached"/> + <hp aim="Target" value="-10*Power"/> + <msg aim="Target" text="${Caster} hits you with a divine arrow!"/> + </then> + <else> + <fx source="OrigTarget" target="Target" name="flame_burst" type="unattached"/> + <hp aim="Target" value="-2*Power"/> + <msg aim="Target" text="${Caster}s Divine Arrow Sends waves of energy to damage you"/> + </else> + </if> + </script> +'); + +INSERT INTO progression_events VALUES("cast Hammer Smash", +' +<script> + <if t="Target = OrigTarget"> + <then> + <fx source="Caster" target="Target" name="flame_burst" type="unattached"/> + <hp aim="Target" value="-5*Power"/> + <msg aim="Target" text="${Caster} Pounds you with hammer smash!"/> + </then> + <else> + <fx source="Caster" target="Target" name="flame_burst" type="unattached"/> + <hp aim="Target" value="-3*Power"/> + <msg aim="Target" text="${Caster} hammer smash causes rocks to fly and hit you"/> + </else> + </if> +</script> +'); INSERT INTO progression_events VALUES("cast Defensive Wind", '<script> <apply aim="Target" type="buff" name="Defensive Wind" duration="30000"> Modified: soc/2011/combat/src/server/database/mysql/weapon_types.sql =================================================================== --- soc/2011/combat/src/server/database/mysql/weapon_types.sql 2011-07-17 18:02:13 UTC (rev 7521) +++ soc/2011/combat/src/server/database/mysql/weapon_types.sql 2011-07-17 20:56:22 UTC (rev 7522) @@ -16,4 +16,7 @@ INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (4, 'HAMMER', 3); INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (5, 'POLEARM', 5); INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (6, 'MARTIALARTS', 4); -INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (7, 'RANGED', 6); +INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (7, 'BOW', 6); +INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (8, 'CROSS BOW', 6); +INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (9, 'SABRE', 0); +INSERT INTO `weapon_types` (`id`, `name`, `skill`) VALUES (10, 'CLAYMORE', 0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-07-20 04:30:34
|
Revision: 7524 http://planeshift.svn.sourceforge.net/planeshift/?rev=7524&view=rev Author: landson Date: 2011-07-20 04:30:27 +0000 (Wed, 20 Jul 2011) Log Message: ----------- Several Bug Fixes Modified Paths: -------------- soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp soc/2011/combat/src/server/bulkobjects/psattackqueue.cpp soc/2011/combat/src/server/bulkobjects/psattackqueue.h soc/2011/combat/src/server/bulkobjects/psattackrange.cpp soc/2011/combat/src/server/combatmanager.cpp soc/2011/combat/src/server/combatmanager.h soc/2011/combat/src/server/usermanager.cpp Modified: soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp 2011-07-18 20:19:43 UTC (rev 7523) +++ soc/2011/combat/src/server/bulkobjects/psattackmelee.cpp 2011-07-20 04:30:27 UTC (rev 7524) @@ -210,7 +210,7 @@ csArray<gemObject*> nearby = psserver->entitymanager->GetGEM()->FindNearbyEntities(sector, targetPos, radius); for (size_t i = 0; i < nearby.GetSize(); i++) { - if (!attacker->GetClient()->IsAllowedToAttack(nearby[i])); + if (!attacker->GetClient()->IsAllowedToAttack(nearby[i],false)); continue; if (angle < PI) @@ -278,7 +278,7 @@ bool psAttackMelee::AffectTarget(gemObject* attacker, gemObject* origTarget, gemObject* target, float power) { - if (!attacker->GetClient()->IsAllowedToAttack(target,true)) + if (!attacker->GetClient()->IsAllowedToAttack(target,false)) return false; gemActor *attackee = dynamic_cast<gemActor*>(target); Modified: soc/2011/combat/src/server/bulkobjects/psattackqueue.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackqueue.cpp 2011-07-18 20:19:43 UTC (rev 7523) +++ soc/2011/combat/src/server/bulkobjects/psattackqueue.cpp 2011-07-20 04:30:27 UTC (rev 7524) @@ -42,12 +42,12 @@ max = DEFAULT_ATTACKQUEUE_SIZE; } -bool psAttackQueue::Push(psAttack * attack, Client* client) +bool psAttackQueue::Push(psAttack * attack, psCharacter* character) { if(attackList.GetSize() < max) { attackList.Push(attack); - psserver->GetCombatManager()->sendAttackQueue(client); + psserver->GetCombatManager()->sendAttackQueue(character); return true; } Modified: soc/2011/combat/src/server/bulkobjects/psattackqueue.h =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackqueue.h 2011-07-18 20:19:43 UTC (rev 7523) +++ soc/2011/combat/src/server/bulkobjects/psattackqueue.h 2011-07-20 04:30:27 UTC (rev 7524) @@ -51,7 +51,7 @@ *pushes attack into the last slot of the queue *@param attack the attack to push into the last slot of the queue */ - bool Push(psAttack * attack, Client *client); + bool Push(psAttack * attack, psCharacter* character); /* * retrieves the next slot in the queue Modified: soc/2011/combat/src/server/bulkobjects/psattackrange.cpp =================================================================== --- soc/2011/combat/src/server/bulkobjects/psattackrange.cpp 2011-07-18 20:19:43 UTC (rev 7523) +++ soc/2011/combat/src/server/bulkobjects/psattackrange.cpp 2011-07-20 04:30:27 UTC (rev 7524) @@ -237,7 +237,7 @@ csArray<gemObject*> nearby = psserver->entitymanager->GetGEM()->FindNearbyEntities(sector, targetPos, radius); for (size_t i = 0; i < nearby.GetSize(); i++) { - if (!attacker->GetClient()->IsAllowedToAttack(nearby[i])); + if (!attacker->GetClient()->IsAllowedToAttack(nearby[i],false)); continue; if (angle < PI) @@ -324,7 +324,7 @@ } bool psAttackRange::AffectTarget(gemObject* attacker, gemObject* origTarget, gemObject* target, float power) { - if (!attacker->GetClient()->IsAllowedToAttack(target,true)) + if (!attacker->GetClient()->IsAllowedToAttack(target,false)) return false; gemActor *attackee = dynamic_cast<gemActor*>(target); @@ -344,5 +344,4 @@ env.Define("Power", power); outcome->Run(&env); - } \ No newline at end of file Modified: soc/2011/combat/src/server/combatmanager.cpp =================================================================== --- soc/2011/combat/src/server/combatmanager.cpp 2011-07-18 20:19:43 UTC (rev 7523) +++ soc/2011/combat/src/server/combatmanager.cpp 2011-07-20 04:30:27 UTC (rev 7524) @@ -197,7 +197,7 @@ haveWeapon = true; csString response; psAttack* attack = attackerChar->GetAttackQueue()->Pop(); - sendAttackQueue(attacker->GetClient()); + sendAttackQueue(attackerChar); if(!attack || !attack->CanAttack(attacker->GetClient())) { attack = new psAttackDefault(); @@ -310,7 +310,7 @@ attack->Attack(event->attacker,event->target, event->WeaponSlot); - sendAttackQueue(event->GetAttacker()->GetClient()); + sendAttackQueue(event->GetAttackerData()); } @@ -343,22 +343,27 @@ } void CombatManager::sendAttackQueue(MsgEntry* me, Client* client) { - sendAttackQueue(client); + sendAttackQueue(client->GetCharacterData()); } -void CombatManager::sendAttackQueue(Client* client) + +void CombatManager::sendAttackQueue(psCharacter* character) { - psAttackQueueMessage mesg(client->GetClientNum()); - csFIFO<csRef<psAttack>> attacks = client->GetCharacterData()->GetAttackQueue()->getAttackList(); + if(!character->IsNPC()) + { + Client* client = character->GetActor()->GetClient(); + psAttackQueueMessage mesg(client->GetClientNum()); + csFIFO<csRef<psAttack>> attacks = client->GetCharacterData()->GetAttackQueue()->getAttackList(); - int x = attacks.GetSize(); - for( int i = 0; i < x;i++) - { - psAttack* attack = attacks.PopTop(); - mesg.AddAttack(attack->GetName(),attack->GetImage()); - } + int x = attacks.GetSize(); + for( int i = 0; i < x;i++) + { + psAttack* attack = attacks.PopTop(); + mesg.AddAttack(attack->GetName(),attack->GetImage()); + } - mesg.Construct(cacheManager->GetMsgStrings()); - mesg.SendMessage(); + mesg.Construct(cacheManager->GetMsgStrings()); + mesg.SendMessage(); + } } void CombatManager::sendAttackList(MsgEntry* me, Client *client) Modified: soc/2011/combat/src/server/combatmanager.h =================================================================== --- soc/2011/combat/src/server/combatmanager.h 2011-07-18 20:19:43 UTC (rev 7523) +++ soc/2011/combat/src/server/combatmanager.h 2011-07-20 04:30:27 UTC (rev 7524) @@ -107,7 +107,7 @@ void NotifyTarget(gemActor *attacker, gemObject *target); void sendAttackList(MsgEntry* me, Client * client); void sendAttackQueue(MsgEntry* me, Client* client); - void sendAttackQueue(Client* client); + void sendAttackQueue(psCharacter* character); private: csRandomGen* randomgen; LocationType* pvp_region; Modified: soc/2011/combat/src/server/usermanager.cpp =================================================================== --- soc/2011/combat/src/server/usermanager.cpp 2011-07-18 20:19:43 UTC (rev 7523) +++ soc/2011/combat/src/server/usermanager.cpp 2011-07-20 04:30:27 UTC (rev 7524) @@ -1584,7 +1584,7 @@ { if(attack->CanAttack(client)) { - if(character->GetAttackQueue()->Push(cacheManager->GetAttackByName(msg.attack), client)) + if(character->GetAttackQueue()->Push(cacheManager->GetAttackByName(msg.attack), client->GetCharacterData())) return; else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |