From: <ken...@us...> - 2009-02-11 10:58:31
|
Revision: 3024 http://planeshift.svn.sourceforge.net/planeshift/?rev=3024&view=rev Author: kennygraunke Date: 2009-02-11 10:58:24 +0000 (Wed, 11 Feb 2009) Log Message: ----------- - Implemented OverridableMesh, MeshAOp - "Potion of Ulber Power" now works again! Modified Paths: -------------- personal/Kayden/src/server/adminmanager.cpp personal/Kayden/src/server/bulkobjects/buffable.h personal/Kayden/src/server/client.h personal/Kayden/src/server/creationmanager.cpp personal/Kayden/src/server/database/mysql/progress_events.sql personal/Kayden/src/server/entitymanager.cpp personal/Kayden/src/server/gem.cpp personal/Kayden/src/server/gem.h personal/Kayden/src/server/scripting.cpp Modified: personal/Kayden/src/server/adminmanager.cpp =================================================================== --- personal/Kayden/src/server/adminmanager.cpp 2009-02-11 10:56:57 UTC (rev 3023) +++ personal/Kayden/src/server/adminmanager.cpp 2009-02-11 10:58:24 UTC (rev 3024) @@ -7210,6 +7210,7 @@ } } +#define MORPH_FAKE_ACTIVESPELL ((ActiveSpell*) 0x447) void AdminManager::Morph(MsgEntry* me, psAdminCmdMessage& msg, AdminCmdData& data, Client *client, Client *targetclient) { if (data.player == "list" && data.mesh.IsEmpty()) @@ -7267,18 +7268,13 @@ if (data.mesh == "reset") { - if ( target->ResetMesh() ) - psserver->SendSystemInfo(me->clientnum,"Resetting mesh for %s", targetclient->GetName() ); - else - psserver->SendSystemError(me->clientnum,"Error resetting mesh for %s!", targetclient->GetName() ); - + psserver->SendSystemInfo(me->clientnum, "Resetting mesh for %s", targetclient->GetName()); + target->GetOverridableMesh().Cancel(MORPH_FAKE_ACTIVESPELL); } else { - if ( target->SetMesh(data.mesh) ) - psserver->SendSystemInfo(me->clientnum,"Setting mesh for %s to %s", targetclient->GetName(), data.mesh.GetData() ); - else - psserver->SendSystemError(me->clientnum,"Error setting mesh %s!", data.mesh.GetData() ); + psserver->SendSystemInfo(me->clientnum, "Overriding mesh for %s to %s", targetclient->GetName(), data.mesh.GetData()); + target->GetOverridableMesh().Override(MORPH_FAKE_ACTIVESPELL, data.mesh); } } Modified: personal/Kayden/src/server/bulkobjects/buffable.h =================================================================== --- personal/Kayden/src/server/bulkobjects/buffable.h 2009-02-11 10:56:57 UTC (rev 3023) +++ personal/Kayden/src/server/bulkobjects/buffable.h 2009-02-11 10:58:24 UTC (rev 3024) @@ -98,12 +98,12 @@ OnChange(); } +protected: /// Called whenever the current value changes; implemented in derived classes. - void OnChange() + virtual void OnChange() { } -protected: csList< csTuple2<const ActiveSpell*, T> > values; }; @@ -154,12 +154,12 @@ OnChange(); } +protected: /// Called whenever the value changes; implemented in derived classes. void OnChange() { } -protected: T base; T cached; csList< csTuple2<const ActiveSpell*, T> > buffs; Modified: personal/Kayden/src/server/client.h =================================================================== --- personal/Kayden/src/server/client.h 2009-02-11 10:56:57 UTC (rev 3023) +++ personal/Kayden/src/server/client.h 2009-02-11 10:58:24 UTC (rev 3024) @@ -152,7 +152,7 @@ void SetTargetObject(gemObject *object, bool updateClientGUI=false); gemObject* GetTargetObject() const { return target; } - // Mesh information + // Targeted mesh information - i.e. for adding action locations void SetMesh(csString nextMesh) { mesh = nextMesh; } csString GetMesh() const { return mesh; } Modified: personal/Kayden/src/server/creationmanager.cpp =================================================================== --- personal/Kayden/src/server/creationmanager.cpp 2009-02-11 10:56:57 UTC (rev 3023) +++ personal/Kayden/src/server/creationmanager.cpp 2009-02-11 10:58:24 UTC (rev 3024) @@ -867,12 +867,8 @@ // printf("Uploaded Skin Colour: %d\n", upload.selectedSkinColour ); - csString filename; - filename.Format("/planeshift/models/%s/%s.cal3d",raceinfo->mesh_name,raceinfo->mesh_name); - gemActor *actor = new gemActor( chardata, raceinfo->mesh_name, - filename, newinstance, EntityManager::GetSingleton().FindSector(sectorinfo->name), csVector3(x,y,z),yrot, Modified: personal/Kayden/src/server/database/mysql/progress_events.sql =================================================================== --- personal/Kayden/src/server/database/mysql/progress_events.sql 2009-02-11 10:56:57 UTC (rev 3023) +++ personal/Kayden/src/server/database/mysql/progress_events.sql 2009-02-11 10:58:24 UTC (rev 3024) @@ -106,7 +106,7 @@ INSERT INTO progression_events VALUES('create_familiar','<script><msg aim="Actor" text="create_familiar not implemented."/></script>'); INSERT INTO progression_events VALUES('fire_damage','<script><hp aim="Actor" value="-6"/><msg aim="Actor" text="You touch the ingots and your hand is burned!"/></script>'); INSERT INTO progression_events VALUES('healing_tree','<script><hp aim="Actor" value="6"/><msg aim="Actor" text="Walking near the tree you feel refreshed!"/></script>'); -INSERT INTO progression_events VALUES('morph_ulbernaut','<script><apply aim="Actor" type="buff" name="Ulberform" duration="6000"><mesh value="ulbernaut"/><msg text="You turn into a lumbering giant!" undo="Your ulbernaut form wears off."/></apply></script>'); +INSERT INTO progression_events VALUES('morph_ulbernaut','<script><apply aim="Actor" type="buff" name="Ulberform" duration="60000"><mesh value="ulbernaut"/><msg text="You turn into a lumbering giant!" undo="Your ulbernaut form wears off."/></apply></script>'); INSERT INTO progression_events VALUES('stronglegs','<script><msg aim="Actor" text="stronglegs not implemented."/></script>'); INSERT INTO progression_events VALUES('rain','<script><msg aim="Actor" text="rain not implemented."/></script>'); -- I don't think we can do the original Nitroglycerin effect anymore. :( Modified: personal/Kayden/src/server/entitymanager.cpp =================================================================== --- personal/Kayden/src/server/entitymanager.cpp 2009-02-11 10:56:57 UTC (rev 3023) +++ personal/Kayden/src/server/entitymanager.cpp 2009-02-11 10:58:24 UTC (rev 3024) @@ -541,7 +541,6 @@ bool EntityManager::CreatePlayer (Client* client) { - csString filename; psCharacter *chardata=psServer::CharacterLoader.LoadCharacterData(client->GetPID(),true); if (chardata==NULL) { @@ -560,8 +559,6 @@ return false; } - filename.Format("/planeshift/models/%s/%s.cal3d",raceinfo->mesh_name,raceinfo->mesh_name); - csVector3 pos; float yrot; psSectorInfo *sectorinfo; @@ -577,8 +574,7 @@ return false; } - - gemActor *actor = new gemActor(chardata,raceinfo->mesh_name,filename, + gemActor *actor = new gemActor(chardata, raceinfo->mesh_name, instance,sector,pos,yrot, client->GetClientNum()); @@ -720,7 +716,7 @@ return false; } - gemNPC *actor = new gemNPC(chardata, raceinfo->mesh_name, raceinfo->GetMeshFileName(), + gemNPC *actor = new gemNPC(chardata, raceinfo->mesh_name, instance, sector, pos, yrot, 0); if ( !actor->IsValid() ) @@ -797,7 +793,6 @@ gemObject *EntityManager::CreateItem( psItem *& iteminstance, bool transient ) { - const char *meshname; psSectorInfo *sectorinfo; csVector3 newpos; float xrot; @@ -835,25 +830,16 @@ // Cannot stack, so make a new one // Get the mesh for this object - meshname = iteminstance->GetMeshName(); - csString meshfile(meshname); - if (!meshfile.IsEmpty()) - { - meshfile.ReplaceAll("#", "/"); - csString tmp; - tmp.Format("/planeshift/%s.meshfact", meshfile.GetData()); - meshfile = tmp; - } + const char *meshname = iteminstance->GetMeshName(); gemItem *obj; - if (iteminstance->GetIsContainer()) { - obj = new gemContainer(iteminstance,meshname,meshfile,instance,isec,newpos,xrot,yrot,zrot,0); + obj = new gemContainer(iteminstance,meshname,instance,isec,newpos,xrot,yrot,zrot,0); } else { - obj = new gemItem(iteminstance,meshname,meshfile,instance,isec,newpos,xrot,yrot,zrot,0); + obj = new gemItem(iteminstance,meshname,instance,isec,newpos,xrot,yrot,zrot,0); } // Won't create item if gemItem entity was not created Modified: personal/Kayden/src/server/gem.cpp =================================================================== --- personal/Kayden/src/server/gem.cpp 2009-02-11 10:56:57 UTC (rev 3023) +++ personal/Kayden/src/server/gem.cpp 2009-02-11 10:58:24 UTC (rev 3024) @@ -572,7 +572,7 @@ return ""; } -gemObject::gemObject(const char *name) +gemObject::gemObject(const char *name) : factname("") { this->valid = true; this->name = name; @@ -591,15 +591,13 @@ iSector* room, const csVector3& pos, float rotangle, - int clientnum) + int clientnum) : factname(factname) { if (!this->cel) this->cel = GEMSupervisor::GetSingletonPtr(); this->valid = true; this->name = name; - this->factname = factname; - this->filename = filename; this->yRot = rotangle; this->worldInstance = myInstance; @@ -1422,7 +1420,6 @@ gemItem::gemItem(csWeakRef<psItem> item, const char* factname, - const char* filename, InstanceID instance, iSector* room, const csVector3& pos, @@ -1430,7 +1427,7 @@ float yrotangle, float zrotangle, int clientnum) - : gemActiveObject(item->GetName(),factname,filename,instance,room,pos,yrotangle,clientnum) + : gemActiveObject(item->GetName(),factname,MeshFile(factname),instance,room,pos,yrotangle,clientnum) { itemdata=item; xRot=xrotangle; @@ -1440,6 +1437,14 @@ cel->AddItemEntity(this); } +csString gemItem::MeshFile(const char *factname) +{ + csString meshfile; + meshfile.Format("/planeshift/%s.meshfact", factname); + meshfile.ReplaceAll("#", "/"); + return meshfile; +} + double gemItem::GetProperty(const char *prop) { CS_ASSERT(itemdata); @@ -1464,8 +1469,8 @@ eid, -2, name, - factname, - filename, + factname.Current(), + MeshFile(factname.Current()), sector->QueryObject()->GetName(), pos, xRot, @@ -1541,8 +1546,8 @@ eid, -2, name, - factname, - filename, + factname.Current(), + MeshFile(factname.Current()), sector->QueryObject()->GetName(), pos, xRot, @@ -1591,7 +1596,6 @@ gemContainer::gemContainer(csWeakRef<psItem> item, const char* factname, - const char* filename, InstanceID myInstance, iSector* room, const csVector3& pos, @@ -1599,7 +1603,7 @@ float yrotangle, float zrotangle, int clientnum) - : gemItem(item,factname,filename,myInstance,room,pos,xrotangle,yrotangle,zrotangle,clientnum) + : gemItem(item,factname,myInstance,room,pos,xrotangle,yrotangle,zrotangle,clientnum) { } @@ -1976,21 +1980,26 @@ } //-====================================================================================- +void OverridableMesh::OnChange() +{ + if (actor) + actor->SetMesh(Current()); +} + //-------------------------------------------------------------------------------------- // gemActor //-------------------------------------------------------------------------------------- gemActor::gemActor( psCharacter *chardata, const char* factname, - const char* filename, InstanceID myInstance, iSector* room, const csVector3& pos, float rotangle, int clientnum) : - gemObject(chardata->GetCharFullName(),factname,filename,myInstance,room,pos,rotangle,clientnum), + gemObject(chardata->GetCharFullName(),factname,MeshFile(factname),myInstance,room,pos,rotangle,clientnum), psChar(chardata), factions(NULL), DRcounter(0), lastDR(0), lastV(0), lastSentSuperclientPos(0, 0, 0), -lastSentSuperclientInstance(-1), numReports(0), reportTargetId(0), isFalling(false), invincible(false), visible(true), viewAllObjects(false), meshcache(factname), +lastSentSuperclientInstance(-1), numReports(0), reportTargetId(0), isFalling(false), invincible(false), visible(true), viewAllObjects(false), movementMode(0), isAllowedToMove(true), atRest(true), pcmove(NULL), nevertired(false), infinitemana(false), instantcast(false), safefall(false), givekillexp(false) { @@ -2023,6 +2032,8 @@ return; } + this->factname.SetActor(this); + Debug6(LOG_NPC,0,"Successfully created actor %s at %1.2f,%1.2f,%1.2f in sector %s.\n", factname,pos.x,pos.y,pos.z,sector->QueryObject()->GetName() ); @@ -2032,6 +2043,7 @@ UpdateValidLocation(pos, 0.0f, rotangle, sector, true); GetCharacterData()->SetStaminaRegenerationStill(); + } gemActor::~gemActor() @@ -2069,6 +2081,13 @@ delete pcmove; } +csString gemActor::MeshFile(const char *factname) +{ + csString meshfile; + meshfile.Format("/planeshift/models/%s/%s.cal3d", factname, factname); + return meshfile; +} + double gemActor::GetProperty(const char *prop) { CS_ASSERT(psChar); @@ -2611,8 +2630,8 @@ control, name, guildName, - factname, - filename, + factname.Current(), + MeshFile(factname.Current()), psChar->GetRaceInfo()->name, psChar->GetRaceInfo()->gender, helmGroup, @@ -3702,12 +3721,10 @@ return count; } -bool gemActor::SetMesh(const char* meshname) +void gemActor::SetMesh(const char* meshname) { - csString newmesh; - newmesh.Format("/planeshift/models/%s/%s.cal3d", meshname, meshname ); - - if ( psserver->vfs->Exists(newmesh) ) + csString filename = MeshFile(meshname); + if (psserver->vfs->Exists(filename)) { // Get current position to give to the newly set mesh csVector3 pos; @@ -3715,7 +3732,7 @@ iSector* sector; GetPosition(pos,angle,sector); - if ( pcmesh->SetMesh(meshname,newmesh) ) + if (pcmesh->SetMesh(meshname, filename)) { if (pcmove) { @@ -3729,45 +3746,37 @@ if ( pcmesh->GetMesh() ) { - factname = meshname; - filename = newmesh; - UpdateProxList(true); - return true; + return; } } // Setting the mesh failed. Resetting back to the original mesh assuming // that the mesh factory for the original mesh is already loaded. - if (!pcmesh->SetMesh(meshcache, 0)) + if (!pcmesh->SetMesh(factname.Base(), 0)) { // Last attempt with the full file name - newmesh.Format("/planeshift/models/%s/%s.cal3d", meshcache.GetData(), meshcache.GetData()); - if (!pcmesh->SetMesh(meshcache, newmesh)) + filename = MeshFile(factname.Base()); + if (!pcmesh->SetMesh(factname.Base(), filename)) { - //Previously was CS_ASSERT(ResetMesh());, CS_ASSERT disappears in release mode CS_ASSERT(false); } } SetPosition(pos,angle,sector); MulticastDRUpdate(); - } - - return false; } //-------------------------------------------------------------------------------------- gemNPC::gemNPC( psCharacter *chardata, const char* factname, - const char* filename, InstanceID instance, iSector* room, const csVector3& pos, float rotangle, int clientnum) - : gemActor(chardata,factname,filename,instance,room,pos,rotangle,clientnum) + : gemActor(chardata,factname,instance,room,pos,rotangle,clientnum) { npcdialog = NULL; superClientID = 0; @@ -4223,8 +4232,8 @@ control, name, guildName, - factname, - filename, + factname.Current(), + MeshFile(factname.Current()), psChar->GetRaceInfo()->name, psChar->GetRaceInfo()->gender, helmGroup, Modified: personal/Kayden/src/server/gem.h =================================================================== --- personal/Kayden/src/server/gem.h 2009-02-11 10:56:57 UTC (rev 3023) +++ personal/Kayden/src/server/gem.h 2009-02-11 10:58:24 UTC (rev 3024) @@ -33,6 +33,7 @@ // Project Space Includes //============================================================================= #include "bulkobjects/activespell.h" +#include "bulkobjects/buffable.h" #include "bulkobjects/pscharacter.h" #include "util/gameevent.h" @@ -105,6 +106,18 @@ //----------------------------------------------------------------------------- +class OverridableMesh : public Overridable<csString> +{ +public: + OverridableMesh(const csString mesh) : Overridable<csString>(mesh), actor(NULL) { } + void SetActor(gemActor *act) { actor = act; } +protected: + virtual void OnChange(); + gemActor *actor; +}; + +//----------------------------------------------------------------------------- + /** * This class holds the refs to the core factories, etc in CEL. */ @@ -301,7 +314,8 @@ // Mesh related functions iMeshWrapper *GetMeshWrapper(); - csString GetMesh() { return factname; }; + csString GetMesh() { return factname.Current(); } + OverridableMesh & GetOverridableMesh() { return factname; } void Move(const csVector3& pos,float rotangle,iSector* room); bool IsNear(gemObject *obj,float radius); void GetPosition(csVector3& pos, float& yrot,iSector*& sector); @@ -377,8 +391,7 @@ float yRot; ///< Left-Right rotation, in radians iSector *sector; ///< Ptr to the CS sector inhabited bool is_alive; ///< Flag indicating whether object is alive or not - csString factname; ///< Name of CS Mesh Factory used to create this object - csString filename; ///< VFS Filename of mesh + OverridableMesh factname; ///< Name of CS Mesh Factory used to create this object EID eid; ///< Entity ID (unique identifier for object) csArray<iDeleteObjectCallback*> receivers; ///< List of objects which are to be notified when this object is deleted. @@ -440,7 +453,6 @@ public: gemItem(csWeakRef<psItem> item, const char* factname, - const char* filename, InstanceID myInstance, iSector* room, const csVector3& pos, @@ -449,6 +461,8 @@ float zrotangle, int clientnum); + static csString MeshFile(const char *meshfact); + virtual const char* GetObjectType() { return itemType.GetData(); } virtual psItem *GetItem(); @@ -512,7 +526,6 @@ public: gemContainer(csWeakRef<psItem> item, const char* factname, - const char* filename, InstanceID myInstance, iSector* room, const csVector3& pos, @@ -672,8 +685,6 @@ bool visible; ///< is visible to clients ? bool viewAllObjects; ///< can view invisible objects? - csString meshcache; - csPDelArray<DamageHistory> dmgHistory; csArray<csString> onAttackScripts, onDamageScripts; @@ -691,11 +702,13 @@ public: psLinearMovement* pcmove; - gemActor(psCharacter *chardata, const char* factname,const char* filename, + gemActor(psCharacter *chardata, const char *factname, InstanceID myInstance,iSector* room,const csVector3& pos,float rotangle,int clientnum); virtual ~gemActor(); + static csString MeshFile(const char *meshfact); + virtual const char* GetObjectType() { return "Actor"; } virtual gemActor* GetActorPtr() { return this; } virtual psCharacter *GetCharacterData() { return psChar; } @@ -892,8 +905,8 @@ bool questtester; ///< no quest lockouts bool givekillexp; ///< give exp if killed - bool SetMesh(const char* meshname); - bool ResetMesh() { return SetMesh(meshcache); } + // don't use this directly + void SetMesh(const char* meshname); bool GetFiniteInventory() { return GetCharacterData()->Inventory().GetDoRestrictions(); } void SetFiniteInventory(bool v) { GetCharacterData()->Inventory().SetDoRestrictions(v); } @@ -939,7 +952,7 @@ NpcDialogMenu *initial_triggers; public: - gemNPC(psCharacter *chardata, const char* factname,const char* filename, + gemNPC(psCharacter *chardata, const char *factname, InstanceID myInstance,iSector* room,const csVector3& pos,float rotangle,int clientnum); virtual ~gemNPC(); @@ -1007,8 +1020,8 @@ { public: - gemPet(psCharacter *chardata, const char* factname,const char* filename,InstanceID instance,iSector* room, - const csVector3& pos,float rotangle,int clientnum,uint32 id) : gemNPC(chardata,factname,filename,instance,room,pos,rotangle,clientnum) + gemPet(psCharacter *chardata, const char* factname, InstanceID instance, iSector* room, + const csVector3& pos,float rotangle,int clientnum,uint32 id) : gemNPC(chardata,factname,instance,room,pos,rotangle,clientnum) { this->persistanceLevel = "Temporary"; }; Modified: personal/Kayden/src/server/scripting.cpp =================================================================== --- personal/Kayden/src/server/scripting.cpp 2009-02-11 10:56:57 UTC (rev 3023) +++ personal/Kayden/src/server/scripting.cpp 2009-02-11 10:58:24 UTC (rev 3024) @@ -176,6 +176,28 @@ PSITEMSTATS_STAT stat; //< which stat we're actually buffing }; +class MeshAOp : public AppliedOp +{ +public: + MeshAOp() : AppliedOp() { } + virtual ~MeshAOp() { } + + bool Load(iDocumentNode *node) + { + value = node->GetAttributeValue("value"); + return !value.IsEmpty(); + } + + void Run(const MathEnvironment *env, gemActor *target, ActiveSpell *asp) + { + target->GetOverridableMesh().Override(asp, value); + asp->Add(target->GetOverridableMesh(), "<mesh value=\"%s\"/>", value.GetData()); + } + +protected: + csString value; +}; + class OnAOp : public AppliedOp { public: @@ -507,7 +529,7 @@ // overridables else if (elem == "mesh") { - continue; + op = new MeshAOp; } else if (elem == "pos") { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |