TU19: merge Minecraft.World/Level

This commit is contained in:
Tropical
2026-03-21 17:07:51 -05:00
parent 29522d1ac9
commit 86e08af338
73 changed files with 3013 additions and 1259 deletions

View File

@@ -33,6 +33,8 @@ MapItemSavedData::HoldingPlayer::HoldingPlayer(std::shared_ptr<Player> player,
tick = 0;
sendPosTick = 0;
step = 0;
hasSentInitial = false;
// java ctor
// this->player = player;
@@ -50,6 +52,14 @@ MapItemSavedData::HoldingPlayer::~HoldingPlayer() {
charArray MapItemSavedData::HoldingPlayer::nextUpdatePacket(
std::shared_ptr<ItemInstance> itemInstance) {
if (!hasSentInitial) {
charArray data(2);
data[0] = HEADER_METADATA;
data[1] = parent->scale;
hasSentInitial = true;
return data;
}
if (--sendPosTick < 0) {
sendPosTick = 4;
@@ -129,15 +139,13 @@ charArray MapItemSavedData::HoldingPlayer::nextUpdatePacket(
std::shared_ptr<ServerPlayer> servPlayer =
std::dynamic_pointer_cast<ServerPlayer>(player);
for (int d = 0; d < 10; d++) {
int column = (tick * 11) % (MapItem::IMAGE_WIDTH);
tick++;
if (rowsDirtyMin[column] >= 0) {
int len = rowsDirtyMax[column] - rowsDirtyMin[column] + 1;
int min = rowsDirtyMin[column];
charArray data = charArray(len + 3);
data[0] = 0;
data[0] = HEADER_COLOURS;
data[1] = (char)column;
data[2] = (char)min;
for (unsigned int y = 0; y < data.length - 3; y++) {
@@ -157,7 +165,6 @@ MapItemSavedData::MapItemSavedData(const std::wstring& id) : SavedData(id) {
dimension = 0;
scale = 0;
colors = byteArray(MapItem::IMAGE_WIDTH * MapItem::IMAGE_HEIGHT);
step = 0;
}
MapItemSavedData::~MapItemSavedData() {
@@ -173,7 +180,7 @@ void MapItemSavedData::load(CompoundTag* tag) {
z = tag->getInt(L"zCenter");
scale = tag->getByte(L"scale");
if (scale < 0) scale = 0;
if (scale > 4) scale = 4;
if (scale > MAX_SCALE) scale = MAX_SCALE;
int width = tag->getShort(L"width");
int height = tag->getShort(L"height");
@@ -246,8 +253,7 @@ void MapItemSavedData::tickCarriedBy(std::shared_ptr<Player> player,
if (it2 != carriedByPlayers.end()) {
carriedByPlayers.erase(it2);
}
it = carriedBy.erase(
std::find(carriedBy.begin(), carriedBy.end(), hp));
it = carriedBy.erase(find(carriedBy.begin(), carriedBy.end(), hp));
} else {
++it;
@@ -330,7 +336,9 @@ void MapItemSavedData::tickCarriedBy(std::shared_ptr<Player> player,
int size = MAP_SIZE - 1;
char rot = (char)((item->getFrame()->dir * 90) * 16 / 360);
if (dimension < 0) {
int s = step / 10;
int s =
(int)(playerLevel->getLevelData()->getDayTime() /
10);
rot = (char)((s * s * 34187121 + s * 121) >> 15 & 15);
}
#ifdef _LARGE_WORLDS
@@ -416,7 +424,9 @@ void MapItemSavedData::tickCarriedBy(std::shared_ptr<Player> player,
rot =
(char)(decorationPlayer->yRot * 16 / 360 + 0.5);
if (dimension < 0) {
int s = step / 10;
int s = (int)(playerLevel->getLevelData()
->getDayTime() /
10);
rot =
(char)((s * s * 34187121 + s * 121) >> 15 &
15);
@@ -460,11 +470,10 @@ void MapItemSavedData::tickCarriedBy(std::shared_ptr<Player> player,
}
// float xd = (float) (hp->player->x - x) / (1 <<
// scale); float yd = (float) (hp->player->z - z) / (1 << scale);
// int ww = 64;
// int hh = 64;
// if (xd >= -ww && yd >= -hh && xd <= ww && yd <=
// hh)
// scale); float yd = (float) (hp->player->z - z) /
// (1 << scale); int ww = 64;
// int hh = 64; if (xd >= -ww && yd >= -hh && xd
// <= ww && yd <= hh)
// {
// char img = 0;
// char x = (char) (xd * 2 + 0.5);
@@ -511,7 +520,7 @@ void MapItemSavedData::setDirty(int x, int y0, int y1) {
}
void MapItemSavedData::handleComplexItemData(charArray& data) {
if (data[0] == 0) {
if (data[0] == HEADER_COLOURS) {
int xx = data[1] & 0xff;
int yy = data[2] & 0xff;
for (unsigned int y = 0; y < data.length - 3; y++) {
@@ -519,7 +528,7 @@ void MapItemSavedData::handleComplexItemData(charArray& data) {
}
setDirty();
} else if (data[0] == 1) {
} else if (data[0] == HEADER_DECORATIONS) {
for (unsigned int i = 0; i < decorations.size(); i++) {
delete decorations[i];
}
@@ -546,9 +555,27 @@ void MapItemSavedData::handleComplexItemData(charArray& data) {
decorations.push_back(
new MapDecoration(img, x, y, rot, entityId, visible));
}
} else if (data[0] == HEADER_METADATA) {
scale = data[1];
}
}
std::shared_ptr<MapItemSavedData::HoldingPlayer>
MapItemSavedData::getHoldingPlayer(std::shared_ptr<Player> player) {
std::shared_ptr<HoldingPlayer> hp = nullptr;
AUTO_VAR(it, carriedByPlayers.find(player));
if (it == carriedByPlayers.end()) {
hp = std::shared_ptr<HoldingPlayer>(new HoldingPlayer(player, this));
carriedByPlayers[player] = hp;
carriedBy.push_back(hp);
} else {
hp = it->second;
}
return hp;
}
// 4J Added
// We only have one map per player per dimension, so if they pickup someone
// elses map we merge their map data with ours so that we can see everything