From: tomtt <to...@us...> - 2007-05-12 23:09:57
|
Update of /cvsroot/planeshift/planeshift/src/server In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2322 Modified Files: psserverchar.cpp Log Message: Put all the action location response XML parsing in the cache load to make it easier to add entrance info. Index: psserverchar.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/psserverchar.cpp,v retrieving revision 1.518 retrieving revision 1.519 diff -C2 -d -r1.518 -r1.519 *** psserverchar.cpp 12 May 2007 17:32:23 -0000 1.518 --- psserverchar.cpp 12 May 2007 23:09:35 -0000 1.519 *************** *** 164,245 **** else { ! if ( action->response.StartsWith( "<Examine>", false ) ) { ! // load response into XML doc ! csRef<iDocument> doc = ParseString( action->response ); ! if(!doc) { ! Error1("Parse error in action response"); return; } ! csRef<iDocumentNode> root = doc->GetRoot(); ! if(!root) { ! Error1("No XML root in action response"); return; } ! ! csRef<iDocumentNode> topNode = root->GetNode( "Examine" ); ! if(!topNode) { ! Error1("No <Examine> tag in action response"); return; } ! ! // Check for container ! csRef<iDocumentNode> containerNode, descriptionNode, gameboardNode; ! csRef<iDocumentNode> entranceNode; ! containerNode = topNode->GetNode( "Container" ); ! if ( containerNode ) { ! uint32 instance_id = (uint32)containerNode->GetAttributeValueAsInt( "ID" ); ! gemItem* realItem = GEMSupervisor::GetSingleton().FindItemEntity( instance_id ); ! ! if (!realItem) ! { ! Error3("Invalid instance ID %u in action location %s", instance_id, action->name.GetDataSafe()); ! return; ! } ! ! item = realItem->GetItem(); ! ! if ( !item ) ! { ! CPrintf (CON_ERROR, "Invalid ItemID in Action Location Response.\n"); ! return; ! } ! ! // Check range ignoring Y co-ordinate ! csWeakRef<gemObject> gem = client->GetActor(); ! if (gem.IsValid() && gem->RangeTo(realItem, true) > RANGE_TO_SELECT) ! { ! psserver->SendSystemError(client->GetClientNum(), ! "You are not in range to see %s.",item->GetName()); ! return; ! } ! ! SendActionContents( client, action, topNode, item ); } ! ! // Check for minigames or entrances ! else if ((gameboardNode = topNode->GetNode("GameBoard")) || ! (entranceNode = topNode->GetNode("Entrance"))) { ! descriptionNode = topNode->GetNode("Description"); ! if (descriptionNode) ! { ! psViewActionLocationMessage mesg(client->GetClientNum(), action->name, ! descriptionNode->GetContentsValue()); ! mesg.SendMessage(); ! } ! else ! { ! Error2("Action location %s XML response is not a valid response", action->name.GetData()); ! return; ! } ! } - } else --- 164,212 ---- else { ! // Check for container ! if ( action->IsContainer() ) { ! // Get container instance ! uint32 instance_id = action->GetInstanceID(); ! gemItem* realItem = GEMSupervisor::GetSingleton().FindItemEntity( instance_id ); ! if (!realItem) { ! Error3("Invalid instance ID %u in action location %s", instance_id, action->name.GetDataSafe()); return; } ! // Get item pointer ! item = realItem->GetItem(); ! if ( !item ) { ! CPrintf (CON_ERROR, "Invalid ItemID in Action Location Response.\n"); return; } ! ! // Check range ignoring Y co-ordinate ! csWeakRef<gemObject> gem = client->GetActor(); ! if (gem.IsValid() && gem->RangeTo(realItem, true) > RANGE_TO_SELECT) { ! psserver->SendSystemError(client->GetClientNum(), ! "You are not in range to see %s.",item->GetName()); return; } ! SendActionContents( client, action, item ); ! } ! ! // Check for minigames or entrances ! else if (action->IsGameBoard() || action->IsEntrance()) ! { ! csString description = action->GetDescription(); ! if (!description.IsEmpty()) { ! psViewActionLocationMessage mesg(client->GetClientNum(), action->name, description.GetData()); ! mesg.SendMessage(); } ! else { ! Error2("Action location %s XML response does not have a valid description", action->name.GetData()); ! return; } } else *************** *** 1430,1434 **** ! bool psServerCharManager::SendActionContents( Client *client, psActionLocation *action, csRef<iDocumentNode> topNode, psItem *item, int parentContainer, int containerID) { --- 1397,1401 ---- ! bool psServerCharManager::SendActionContents( Client *client, psActionLocation *action, psItem *item, int parentContainer, int containerID) { *************** *** 1446,1453 **** csString icon( item->GetImageName() ); ! csRef<iDocumentNode> description = topNode->GetNode( "Description" ); if ( description ) { ! desc = description->GetContentsValue(); } --- 1413,1420 ---- csString icon( item->GetImageName() ); ! csString description = action->GetDescription(); if ( description ) { ! desc = description.GetData(); } *************** *** 1920,1923 **** --- 1887,1891 ---- worldContainer->AddToContainer(newItem); psserver->GetCharManager()->SendContainerContents(fromClient,worldContainer->GetItem(),0,containerEntityID); + psserver->GetWorkManager()->StartAutoWork(fromClient, worldContainer, newItem, msg.stackCount); break; } |