Skip to content

Instantly share code, notes, and snippets.

@byteandahalf
Created January 31, 2016 20:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save byteandahalf/b3e3b314b65f6ee48221 to your computer and use it in GitHub Desktop.
Save byteandahalf/b3e3b314b65f6ee48221 to your computer and use it in GitHub Desktop.
Decompilation of Level::_playerChangeDimension()
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;
}
Copy link

ghost commented Feb 1, 2016

Wow I didn't understand anything

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment