From: <ma...@us...> - 2012-01-13 20:05:32
|
Revision: 7996 http://planeshift.svn.sourceforge.net/planeshift/?rev=7996&view=rev Author: magodra Date: 2012-01-13 20:05:25 +0000 (Fri, 13 Jan 2012) Log Message: ----------- - Added sending of perception spoken_to when a NPC is spoken to. Keep the spoken_to state as along as the npcs is spokento by anyone within last 60sec. Modified Paths: -------------- trunk/src/server/chatmanager.cpp trunk/src/server/database/mysql/sc_npc_definitions.sql trunk/src/server/database/mysql/sc_npctypes.sql trunk/src/server/gem.cpp trunk/src/server/gem.h Modified: trunk/src/server/chatmanager.cpp =================================================================== --- trunk/src/server/chatmanager.cpp 2012-01-13 20:03:44 UTC (rev 7995) +++ trunk/src/server/chatmanager.cpp 2012-01-13 20:05:25 UTC (rev 7996) @@ -218,16 +218,22 @@ //psChatMessage newMsg(client->GetClientNum(), client->GetName(), 0, // msg.sText, msg.iChatType, msg.translate); //newMsg.SendMessage(); - saveFlood = false; + saveFlood = false; gemObject *target = client->GetTargetObject(); gemNPC *targetnpc = dynamic_cast<gemNPC*>(target); - NpcResponse *resp = CheckNPCResponse(msg,client,targetnpc); - if (resp) + if (targetnpc) { - csTicks delay = resp->ExecuteScript(client->GetActor(), targetnpc); - if (delay != (csTicks)-1 && resp->menu ) - resp->menu->ShowMenu(client, delay, targetnpc); + // The NPC is spoken to so register this client as a speaker + targetnpc->RegisterSpeaker(client); + + NpcResponse *resp = CheckNPCResponse(msg,client,targetnpc); + if (resp) + { + csTicks delay = resp->ExecuteScript(client->GetActor(), targetnpc); + if (delay != (csTicks)-1 && resp->menu ) + resp->menu->ShowMenu(client, delay, targetnpc); + } } break; } Modified: trunk/src/server/database/mysql/sc_npc_definitions.sql =================================================================== --- trunk/src/server/database/mysql/sc_npc_definitions.sql 2012-01-13 20:03:44 UTC (rev 7995) +++ trunk/src/server/database/mysql/sc_npc_definitions.sql 2012-01-13 20:05:25 UTC (rev 7996) @@ -31,8 +31,8 @@ INSERT INTO sc_npc_definitions VALUES("6","Fighter1","Fighter","","0.00","0.00","0","N","N"); INSERT INTO sc_npc_definitions VALUES("7","Fighter2","On Sight Fighter","","0.00","0.00","0","N","N"); INSERT INTO sc_npc_definitions VALUES("8","Merchant","Wanderer","wander region","0.00","0.00","0","N","N"); -INSERT INTO sc_npc_definitions VALUES("12","QuestMaster1","Sit","","0.00","0.00","0","N","N"); -INSERT INTO sc_npc_definitions VALUES("13","QuestMaster2","Sit","","0.00","0.00","0","N","N"); +INSERT INTO sc_npc_definitions VALUES("12","QuestMaster1","QuestMaster1","","0.00","0.00","0","N","N"); +INSERT INTO sc_npc_definitions VALUES("13","QuestMaster2","QuestMaster2","","0.00","0.00","0","N","N"); INSERT INTO sc_npc_definitions VALUES("14","DictMaster1","Answerer","","0.00","0.00","0","N","N"); INSERT INTO sc_npc_definitions VALUES("15","DictMaster2","Answerer","","0.00","0.00","0","N","N"); INSERT INTO sc_npc_definitions VALUES("20","Miner","AbstractTribesman","","0.00","0.00","0","N","N"); Modified: trunk/src/server/database/mysql/sc_npctypes.sql =================================================================== --- trunk/src/server/database/mysql/sc_npctypes.sql 2012-01-13 20:03:44 UTC (rev 7995) +++ trunk/src/server/database/mysql/sc_npctypes.sql 2012-01-13 20:05:25 UTC (rev 7996) @@ -173,13 +173,18 @@ <react event="talk" inactive_only="yes" faction_diff="-100" oper=">" behavior="turn to face" delta="100" when_invisible="yes" when_invincible="yes" />'); -INSERT INTO sc_npctypes VALUES("10","Sit","DoNothing","","","","","","", -'<behavior name="sit" completion_decay="-1" growth="0" initial="0" > +INSERT INTO sc_npctypes VALUES("10","PoliteSitting","","","","","","","", +'<behavior name="Init" completion_decay="-1" initial="1000" > + <sit /> +</behavior> + +<behavior name="Stand" completion_decay="-1" growth="0" initial="0" > + <standup /> + <wait duration="10" /> <sit /> - <wait duration="10" anim="sit_idle" /> - <standup /> </behavior> -<react event="player adjacent" inactive_only="yes" behavior="sit" delta="100" when_invisible="yes" when_invincible="yes" />'); +<react event="stand" behavior="Stand" /> +<react event="player adjacent" inactive_only="yes" behavior="Stand" when_invisible="yes" when_invincible="yes" />'); INSERT INTO sc_npctypes VALUES("11","Move","","","","","","","", '<!-- Fail safe move operation. Target position taken from the "Move" locate. --> @@ -237,7 +242,20 @@ <react event="move_failed" behavior="MoveFailed" />'); +INSERT INTO sc_npctypes VALUES("12","QuestBlock","","","","","","","", +'<behavior name="SpokenTo" loop="Yes" interrupt="spoken_to_interrupted"> + <wait duration="10" /> + </behavior> + <!-- Make sure we just keep doing this while SpokenTo --> + <react event="spoken_to_interrupted" behavior="SpokenTo" /> + + <!-- Perception from server to block NPC while spoken to --> + <react event="spoken_to" type="true" behavior="SpokenTo" /> + <react event="spoken_to" type="false" behavior="SpokenTo" absolute="0" /> +'); + + INSERT INTO sc_npctypes VALUES("100","Smith","GoHomeOnTeleport,DoNothing","","","","","","", '<behavior name="go_climbing1" initial="0" completion_decay="20" loop="no"> <moveto x="-53.6003" y="0.0" z="-155.041" anim="walk" /> @@ -341,7 +359,12 @@ <react event="time" value="12,0,,," behavior="go_obstacles1" delta="20" /> <react event="time" value="14,0,,," behavior="go_climbing1" delta="20" />'); +INSERT INTO sc_npctypes VALUES("101","QuestMaster1","DoNothing,QuestBlock,PoliteSitting","","","","","","", +'<empty/>'); +INSERT INTO sc_npctypes VALUES("102","QuestMaster2","DoNothing,QuestBlock,PoliteSitting","","","","","","", +'<empty/>'); + INSERT INTO sc_npctypes VALUES("106","ChaseTest1","DoNothing","","","","","","", '<behavior name="init" initial="1000" completion_decay="-1" > <!--debug level="0" /--> Modified: trunk/src/server/gem.cpp =================================================================== --- trunk/src/server/gem.cpp 2012-01-13 20:03:44 UTC (rev 7995) +++ trunk/src/server/gem.cpp 2012-01-13 20:05:25 UTC (rev 7996) @@ -308,6 +308,11 @@ return dynamic_cast<gemNPC*>(actors_by_pid.Get(npc_id, NULL)); } +gemNPC *GEMSupervisor::FindNPCEntity(EID eid) +{ + return dynamic_cast<gemNPC*>(entities_by_eid.Get(eid, NULL)); +} + gemItem *GEMSupervisor::FindItemEntity(uint32 item_id) { return items_by_uid.Get(item_id, NULL); @@ -4410,6 +4415,7 @@ nextVeryShortRangeAvail = 0; /// When can npc respond to very short range prox trigger again nextShortRangeAvail = 0; /// When can npc respond to short range prox trigger again nextLongRangeAvail = 0; /// When can npc respond to long range prox trigger again + speakers = 0; //if( !GetEntity() ) //{ @@ -4543,6 +4549,8 @@ void gemNPC::ShowPopupMenu(Client *client) { + RegisterSpeaker(client); + NpcResponse *resp = NULL; NpcDialogMenu menu; @@ -5072,3 +5080,60 @@ //send this to all npcclients msg.Multicast(psserver->GetNPCManager()->GetSuperClients(),-1,PROX_LIST_ANY_RANGE); } + + +class psCheckSpeakerEvent : public psGameEvent +{ +public: + psCheckSpeakerEvent(EID eid) + : psGameEvent(0, 65000,"psCheckSpeakerEvent"), eid(eid) + { + + } + + virtual void Trigger() + { + gemNPC* npc = psserver->entitymanager->GetGEM()->FindNPCEntity(eid); + if (npc) + { + npc->CheckSpeakers(); + } + } + +private: + + EID eid; +}; + +void gemNPC::RegisterSpeaker(Client* client) +{ + bool first = speakers <= 0; + + speakers++; + + if (first) + { + psserver->GetNPCManager()->QueueSpokenToPerception(this, true); + } + + psCheckSpeakerEvent* event = new psCheckSpeakerEvent(GetEID()); + event->QueueEvent(); +} + + +void gemNPC::CheckSpeakers() +{ + bool last = (speakers == 1); + + speakers--; + + if (speakers <= 0) + { + speakers = 0; + } + + if (last) + { + psserver->GetNPCManager()->QueueSpokenToPerception(this, false); + } +} Modified: trunk/src/server/gem.h =================================================================== --- trunk/src/server/gem.h 2012-01-13 20:03:44 UTC (rev 7995) +++ trunk/src/server/gem.h 2012-01-13 20:05:25 UTC (rev 7996) @@ -155,7 +155,8 @@ gemActor *FindPlayerEntity(PID player_id); gemNPC *FindNPCEntity(PID npc_id); - gemItem *FindItemEntity(uint32 item_id); + gemNPC *FindNPCEntity(EID eid); + gemItem *FindItemEntity(uint32 item_id); //@} EID CreateEntity(gemObject *obj); @@ -1275,6 +1276,8 @@ csPDelArray<DialogCounter> badText; + int speakers; + NpcDialogMenu *initial_triggers; public: @@ -1372,6 +1375,14 @@ virtual void SendGroupStats(); virtual void ForcePositionUpdate(); + + /** Register clients that speak to a npc + */ + void RegisterSpeaker(Client* client); + + /** Check speakers to see if not spoken to anymore. + */ + void CheckSpeakers(); }; //----------------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |