Created
January 31, 2016 20:08
-
-
Save byteandahalf/b3e3b314b65f6ee48221 to your computer and use it in GitHub Desktop.
Decompilation of Level::_playerChangeDimension()
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
bool Level::_playerChangeDimension(Player* player, ChangeDimensionRequest& request) | |
{ | |
if(request.idk == 0) | |
{ | |
Dimension* destination = createDimension(request.newDim); | |
Dimension* currentDimension = getDimension(request.oldDim); | |
player->field_3272 = 3; | |
player->suspendRegion(); // VIRTUAL 215 | |
if(this->field_5440.field_12 == 0) | |
{ | |
currentDimension->chunkSource->waitDiscardFinished(); // VIRTUAL 16 | |
} | |
if(player->isLocalPlayer()) | |
{ | |
std::vector<BackgroundWorker*> workers = WorkerPool::getWorkersFor(0); | |
for(BackgroundWorker* worker : workers) | |
{ | |
worker->sync(); | |
} | |
} | |
this->field_5440.field_20 = this->field_5440.field_16; | |
WorkerPool::getFor(4)->flush(); | |
RemovePlayerPacket _removeLocalPlayerPkt {2, 1, 0, player->getUniqueID(), player->field_3352}; // RakNetGUID | |
/* Inform all server players that we are leaving, and vice-versa. */ | |
for(Player* p : this->_playerList) // 12 | |
{ | |
if(p != player && p->getDimensionId() == currentDimension) | |
{ | |
RemovePlayerPacket _removeServerPlayerPkt {2, 1, 0, p->getUniqueID(), p->field_3352}; // RakNetGUID | |
this->packetSender->send(player->field_3320, _removeServerPlayerPkt); // BatchedPacketSender, Level + 0x154 | |
this->packetSender->send(p->field_3320, _removeLocalPlayerPkt); // VIRTUAL 3 | |
} | |
} | |
/* Inform our player to remove all Entities from this dimension. */ | |
std::unordered_map<long, Entity*> _entities = currentDimension->getEntityIdMapConst(); | |
if(!_entities.empty()) | |
{ | |
for(auto i = _entities.begin(); i != _entities.end(); ++i) | |
{ | |
Entity* e = i->second; | |
RemoveEntityPacket _removeEntityPkt {2, 1, 0, e->getUniqueID()}; | |
this->packetSender->send(player->field_3320, _removeEntityPkt); | |
} | |
} | |
/* Spawn a Nether Portal in the new Dimension, doesn't actually warp the player AFAIK */ | |
if(this->field_5440.field_12 == 0 && request.a) | |
{ | |
Vec3 newDimensionPos = this->portalForcer->translatePosAcrossDimension(player->getPos(), request.oldDim, request.newDim); // 264 | |
BlockPos pos; | |
if(this->portalForcer->findPortal(destination->getId(), newDimensionPos, 128, pos)) | |
{ | |
Vec3 portalPosition(pos); | |
request.spawn.x = portalPosition.x; | |
request.spawn.y = portalPosition.y; | |
request.spawn.z = portalPosition.z; | |
} else { | |
request.spawn.x = newDimensionPos.x; | |
request.spawn.y = newDimensionPos.y; | |
request.spawn.z = newDimensionPos.z; | |
} | |
player->sendTelemetryPacket(TelemetryEventPacket(player, request.oldDim, request.newDim)); // VIRTUAL 253 | |
} | |
/* Unload the current world */ | |
player->onPrepChangeDimension(); // VIRTUAL 216 | |
player->destroyRegion(); // VIRTUAL 214 | |
player->setPos(request.spawn); // VIRTUAL 6 | |
player->lerpTo(Vec3::ZERO, Vec2::ZERO, 0); // VIRTUAL 15 | |
if(this->field_5440.field_12 == 0) | |
{ | |
ChangeDimensionPacket _changeDimensionPkt {2, 1, this->field_5440.field_12/*bool*/, request.newDim, request.spawn, request.b}; | |
this->packetSender->send(player->field_3320, _changeDimensionPkt); | |
if(!player->isLocalPlayer()) | |
{ | |
player->field_3276 = 1; // true? | |
} | |
} | |
player->field_3372 = 0; | |
player->prepareRegion(destination->getChunkSource()); // VIRTUAL 213 | |
player->onDimensionChanged(); // VIRTUAL 217 | |
request.idk = 1; | |
} | |
if(request.idk == 1) | |
{ | |
if(this->field_5440.field_12 == 0 && request.a) | |
{ | |
if(!player->getRegion().hasChunksAt(BlockPos(player->x, player->y, player->z), 32)) | |
{ | |
return false; | |
} | |
player->trySendBatchPacket(1); | |
this->portalForcer->force(*player); | |
player->setPos(player->getPos()); | |
player->lerpTo(Vec3::ZERO, Vec2::ZERO, 0); | |
this->packetSender->send(player->field_3320, MovePlayerPacket(*player, Player::PositionMode::ONE)); | |
request.a = 0; // false | |
} | |
Vec3 playerPos = player->getPos(); | |
if(!player->getRegion().hasChunksAt(BlockPos({playerPos.x - 16.0F, playerPos.y - 16.0F, playerPos.z - 16.0F}), BlockPos({playerPos.x + 16.0F, playerPos.y + 16.0F, playerPos.z + 16.0F}))) | |
{ | |
return false; | |
} | |
std::unique_ptr<AddEntityPacket> _localPlayerAddPkt = player->getAddPacket(); // VIRTUAL 19 | |
for(Player* p : this->_playerList) | |
{ | |
if(p != player && p->getDimensionId() == currentDimension) | |
{ | |
std::unique_ptr<AddEntityPacket> _serverPlayerAddPkt = p->getAddPacket(); | |
if(_serverPlayerAddPkt) | |
{ | |
this->packetSender->send(player->field_3320, _serverPlayerAddPkt); | |
} | |
this->packetSender->send(p->field_3320, _localPlayerAddPkt); | |
if(p->getArmorTypeHash() != NULL) // VIRTUAL 185 | |
{ | |
MobArmorEquipmentPacket _serverPlayerArmorPkt(*p); | |
this->packetSender->send(player->field_3320, _serverPlayerArmorPkt); | |
} | |
if(player->getArmorTypeHash() != NULL) | |
{ | |
MobArmorEquipmentPacket _localPlayerArmorPkt(*player); | |
this->packetSender->send(p->field_3320, _localPlayerArmorPkt); | |
} | |
} | |
} | |
std::unordered_map<long, Entity*> _entitiesNew = this->getDimension(request.newDim)->getEntityIdMapConst(); | |
if(!_entitiesNew.empty()) | |
{ | |
for(auto i = _entitiesNew.begin(); i != _entitiesNew.end(); ++i) | |
{ | |
Entity* e = i->second; | |
std::unique_ptr<AddEntityPacket> _entityAddPkt = e->getAddPacket(); | |
if(_entityAddPkt) | |
{ | |
this->packetSender->send(player->field_3320, *_entityAddPkt.get()); | |
} | |
if(EntityClassTree::isMob(*e)) | |
{ | |
if(e->getArmorTypeHash() != NULL) | |
{ | |
MobArmorEquipmentPacket _entityArmorPkt(*entity); | |
this->packetSender->send(player->field_3320, _entityArmorPkt); | |
} | |
if(e->getCarriedItem()) // VIRTUAL 156 | |
{ | |
ItemInstance _heldItem(e->getCarriedItem()); | |
MobEquipmentPacket _entityHeldItemPkt {2, 1, 0, e->getUniqueID(), _heldItem, false, false, false}; | |
this->packetSender->send(player->field_3320, _entityHeldItemPkt); | |
if(_heldItem.userData) // CompoundTag | |
{ | |
delete _heldItem.userData; | |
} | |
} | |
} | |
} | |
} | |
if(!request.b) | |
{ | |
if(this->field_5440.field_12 != 0) | |
{ | |
this->packetSender->send({2, 1, 0, 0, 0, 0, 0, 14, player->getUniqueID()}); // PlayerActionPacket | |
} | |
player->field_3272 = 0; | |
} | |
else | |
{ | |
request.idk = 2; | |
} | |
} | |
if(request.idk == 2) | |
{ | |
if(player->field_3480 == 0) | |
{ | |
return false; | |
} | |
player->field_3272 = 0; | |
player->respawn(); // VIRTUAL 222 | |
this->packetSender->send(player->field_3320, {2, 1, 0, player->getUniqueID(), player->getPos(), player->getRotation(), player->headRotation/*360*/, true, player->field_281}); // MovePlayerPacket | |
return player->field_3480; | |
} | |
return false; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Wow I didn't understand anything