void NetObjectRPCEvent::pack(EventConnection *ps, BitStream *bstream) { GhostConnection *gc = static_cast<GhostConnection *>(ps); S32 ghostIndex = -1; if(!mDestObject.isNull()) ghostIndex = gc->getGhostIndex(mDestObject); if(bstream->writeFlag(ghostIndex != -1)) { bstream->writeInt(ghostIndex, GhostConnection::GhostIdBitSize); RPCEvent::pack(ps, bstream); } }
void NetObjectRPCEvent::unpack(EventConnection *ps, BitStream *bstream) { // make sure this is a valid place for this event to be... GhostConnection *gc = static_cast<GhostConnection *>(ps); if( (gc->doesGhostTo() && mRPCDirection == RPCToGhost) || (gc->doesGhostFrom() && mRPCDirection == RPCToGhostParent) ) { if(bstream->readFlag()) { S32 ghostIndex = bstream->readInt(GhostConnection::GhostIdBitSize); RPCEvent::unpack(ps, bstream); if(mRPCDirection == RPCToGhost) mDestObject = gc->resolveGhost(ghostIndex); else mDestObject = gc->resolveGhostParent(ghostIndex); } } else gc->setLastError("Invalid Packet."); }
void GhostConnection::readPacket(BitStream *bstream) { Parent::readPacket(bstream); if(mConnectionParameters.mDebugObjectSizes) { U32 sum = bstream->readInt(32); TNLAssert(sum == DebugChecksum, "Invalid checksum."); } if(!doesGhostTo()) return; if(!bstream->readFlag()) return; S32 idSize; idSize = bstream->readInt( 3 ); idSize += 3; // while there's an object waiting... while(bstream->readFlag()) { U32 index; //S32 startPos = bstream->getCurPos(); index = (U32) bstream->readInt(idSize); if(bstream->readFlag()) // is this ghost being deleted? { TNLAssert(mLocalGhosts[index] != NULL, "Error, NULL ghost encountered."); if(mLocalGhosts[index]) { mLocalGhosts[index]->onGhostRemove(); delete mLocalGhosts[index]; mLocalGhosts[index] = NULL; } } else { U32 endPosition = 0; if(mConnectionParameters.mDebugObjectSizes) endPosition = bstream->readInt(BitStreamPosBitSize); if(!mLocalGhosts[index]) // it's a new ghost... cool { S32 classId = bstream->readClassId(NetClassTypeObject, getNetClassGroup()); if(classId == -1) { setLastError("Invalid packet."); return; } NetObject *obj = (NetObject *) Object::create(getNetClassGroup(), NetClassTypeObject, classId); if(!obj) { setLastError("Invalid packet."); return; } obj->mOwningConnection = this; obj->mNetFlags = NetObject::IsGhost; // object gets initial update before adding to the manager obj->mNetIndex = index; mLocalGhosts[index] = obj; NetObject::mIsInitialUpdate = true; mLocalGhosts[index]->unpackUpdate(this, bstream); NetObject::mIsInitialUpdate = false; if(!obj->onGhostAdd(this)) { if(!mErrorBuffer[0]) setLastError("Invalid packet."); return; } if(mRemoteConnection) { GhostConnection *gc = static_cast<GhostConnection *>(mRemoteConnection.getPointer()); obj->mServerObject = gc->resolveGhostParent(index); } } else { mLocalGhosts[index]->unpackUpdate(this, bstream); } if(mConnectionParameters.mDebugObjectSizes) { TNLAssert(bstream->getBitPosition() == endPosition, avar("unpackUpdate did not match packUpdate for object of class %s. Expected %d bits, got %d bits.", mLocalGhosts[index]->getClassName(), endPosition, bstream->getBitPosition()) ); } if(mErrorBuffer[0]) return; } } }