mirror of
				https://github.com/TES3MP/openmw-tes3mp.git
				synced 2025-11-03 23:56:47 +00:00 
			
		
		
		
	[Server] Remove Actors from a Cell's ActorList when they change cells
This commit is contained in:
		
							parent
							
								
									a77bd6652f
								
							
						
					
					
						commit
						83ba4b62b1
					
				
					 3 changed files with 37 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -127,6 +127,32 @@ mwmp::BaseActor *Cell::getActor(int refNumIndex, int mpNum)
 | 
			
		|||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Cell::removeActors(const mwmp::BaseActorList *newActorList)
 | 
			
		||||
{
 | 
			
		||||
    for (std::vector<mwmp::BaseActor>::iterator it = cellActorList.baseActors.begin(); it != cellActorList.baseActors.end();)
 | 
			
		||||
    {
 | 
			
		||||
        int refNumIndex = (*it).refNumIndex;
 | 
			
		||||
        int mpNum = (*it).mpNum;
 | 
			
		||||
 | 
			
		||||
        bool foundActor = false;
 | 
			
		||||
 | 
			
		||||
        for (unsigned int i = 0; i < newActorList->count; i++)
 | 
			
		||||
        {
 | 
			
		||||
            mwmp::BaseActor newActor = newActorList->baseActors.at(i);
 | 
			
		||||
 | 
			
		||||
            if (newActor.refNumIndex == refNumIndex && newActor.mpNum == mpNum)
 | 
			
		||||
            {
 | 
			
		||||
                it = cellActorList.baseActors.erase(it);
 | 
			
		||||
                foundActor = true;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!foundActor)
 | 
			
		||||
            it++;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mwmp::BaseActorList *Cell::getActorList()
 | 
			
		||||
{
 | 
			
		||||
    return &cellActorList;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,6 +33,7 @@ public:
 | 
			
		|||
    void readActorList(unsigned char packetID, const mwmp::BaseActorList *newActorList);
 | 
			
		||||
    bool containsActor(int refNumIndex, int mpNum);
 | 
			
		||||
    mwmp::BaseActor *getActor(int refNumIndex, int mpNum);
 | 
			
		||||
    void removeActors(const mwmp::BaseActorList *newActorList);
 | 
			
		||||
    mwmp::BaseActorList *getActorList();
 | 
			
		||||
 | 
			
		||||
    TPlayers getPlayers() const;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,10 +15,17 @@ namespace mwmp
 | 
			
		|||
 | 
			
		||||
        void Do(ActorPacket &packet, Player &player, BaseActorList &actorList) override
 | 
			
		||||
        {
 | 
			
		||||
            // Send this to everyone
 | 
			
		||||
            packet.Send(true);
 | 
			
		||||
            Cell *serverCell = CellController::get()->getCell(&actorList.cell);
 | 
			
		||||
 | 
			
		||||
            Script::Call<Script::CallbackIdentity("OnActorCellChange")>(player.getId(), actorList.cell.getDescription().c_str());
 | 
			
		||||
            if (serverCell != nullptr)
 | 
			
		||||
            {
 | 
			
		||||
                serverCell->removeActors(&actorList);
 | 
			
		||||
 | 
			
		||||
                Script::Call<Script::CallbackIdentity("OnActorCellChange")>(player.getId(), actorList.cell.getDescription().c_str());
 | 
			
		||||
 | 
			
		||||
                // Send this to everyone
 | 
			
		||||
                packet.Send(true);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue