Merge branch '4jcraft:dev' into fix-with-ubsan

This commit is contained in:
Nikita Edel 2026-03-11 11:57:46 +01:00 committed by GitHub
commit 11aa08aece
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
25 changed files with 257 additions and 251 deletions

View file

@ -32,7 +32,7 @@ jobs:
- name: Install system dependencies - name: Install system dependencies
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install -y build-essential python3 ninja-build meson libsdl2-dev libgl-dev libglu1-mesa-dev libpthread-stubs0-dev sudo apt-get install -y build-essential ccache python3 ninja-build meson libsdl2-dev libgl-dev libglu1-mesa-dev libpthread-stubs0-dev
# Set a reasonable ccache size # Set a reasonable ccache size
ccache -M 5G || true ccache -M 5G || true
@ -86,7 +86,7 @@ jobs:
- name: Install system dependencies - name: Install system dependencies
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install -y build-essential python3 ninja-build meson libsdl2-dev libgl-dev libglu1-mesa-dev libpthread-stubs0-dev sudo apt-get install -y build-essential ccache python3 ninja-build meson libsdl2-dev libgl-dev libglu1-mesa-dev libpthread-stubs0-dev
# Set a reasonable ccache size # Set a reasonable ccache size
ccache -M 5G || true ccache -M 5G || true

3
.gitignore vendored
View file

@ -6,6 +6,9 @@ builddir/
build_meson/ build_meson/
cmake-build-debug/ cmake-build-debug/
# Nix flake output
result
# Final binaries and platform output # Final binaries and platform output
/Linux/ /Linux/
/x64/ /x64/

View file

@ -215,7 +215,8 @@ bool C_4JInput::ButtonDown(int iPad, unsigned char ucAction) {
switch (ucAction) { switch (ucAction) {
case MINECRAFT_ACTION_ACTION: return MouseLDown() || KDown(SDL_SCANCODE_RETURN); case MINECRAFT_ACTION_ACTION: return MouseLDown() || KDown(SDL_SCANCODE_RETURN);
case MINECRAFT_ACTION_USE: return MouseRDown() || KDown(SDL_SCANCODE_F); case MINECRAFT_ACTION_USE: return MouseRDown() || KDown(SDL_SCANCODE_F);
case MINECRAFT_ACTION_SNEAK_TOGGLE: return KDown(SDL_SCANCODE_LSHIFT) || KDown(SDL_SCANCODE_RSHIFT) || KDown(SDL_SCANCODE_LCTRL) || KDown(SDL_SCANCODE_RCTRL); case MINECRAFT_ACTION_SNEAK_TOGGLE: return KDown(SDL_SCANCODE_LSHIFT) || KDown(SDL_SCANCODE_RSHIFT);
case MINECRAFT_ACTION_SPRINT: return KDown(SDL_SCANCODE_LCTRL) || KDown(SDL_SCANCODE_RCTRL);
case MINECRAFT_ACTION_LEFT_SCROLL: case MINECRAFT_ACTION_LEFT_SCROLL:
case ACTION_MENU_LEFT_SCROLL: return ScrollSnap() > 0; case ACTION_MENU_LEFT_SCROLL: return ScrollSnap() > 0;
case MINECRAFT_ACTION_RIGHT_SCROLL: case MINECRAFT_ACTION_RIGHT_SCROLL:
@ -229,7 +230,8 @@ bool C_4JInput::ButtonPressed(int iPad, unsigned char ucAction) {
switch (ucAction) { switch (ucAction) {
case MINECRAFT_ACTION_ACTION: return MouseLPressed() || KPressed(SDL_SCANCODE_RETURN); case MINECRAFT_ACTION_ACTION: return MouseLPressed() || KPressed(SDL_SCANCODE_RETURN);
case MINECRAFT_ACTION_USE: return MouseRPressed() || KPressed(SDL_SCANCODE_F); case MINECRAFT_ACTION_USE: return MouseRPressed() || KPressed(SDL_SCANCODE_F);
case MINECRAFT_ACTION_SNEAK_TOGGLE: return KPressed(SDL_SCANCODE_LSHIFT) || KPressed(SDL_SCANCODE_RSHIFT) || KPressed(SDL_SCANCODE_LCTRL) || KPressed(SDL_SCANCODE_RCTRL); case MINECRAFT_ACTION_SNEAK_TOGGLE: return KPressed(SDL_SCANCODE_LSHIFT) || KPressed(SDL_SCANCODE_RSHIFT);
case MINECRAFT_ACTION_SPRINT: return KPressed(SDL_SCANCODE_LCTRL) || KPressed(SDL_SCANCODE_RCTRL);
case MINECRAFT_ACTION_LEFT_SCROLL: case MINECRAFT_ACTION_LEFT_SCROLL:
case ACTION_MENU_LEFT_SCROLL: return ScrollSnap() > 0; case ACTION_MENU_LEFT_SCROLL: return ScrollSnap() > 0;
case MINECRAFT_ACTION_RIGHT_SCROLL: case MINECRAFT_ACTION_RIGHT_SCROLL:
@ -243,7 +245,8 @@ bool C_4JInput::ButtonReleased(int iPad, unsigned char ucAction) {
switch (ucAction) { switch (ucAction) {
case MINECRAFT_ACTION_ACTION: return MouseLReleased() || KReleased(SDL_SCANCODE_RETURN); case MINECRAFT_ACTION_ACTION: return MouseLReleased() || KReleased(SDL_SCANCODE_RETURN);
case MINECRAFT_ACTION_USE: return MouseRReleased() || KReleased(SDL_SCANCODE_F); case MINECRAFT_ACTION_USE: return MouseRReleased() || KReleased(SDL_SCANCODE_F);
case MINECRAFT_ACTION_SNEAK_TOGGLE: return KReleased(SDL_SCANCODE_LSHIFT) || KReleased(SDL_SCANCODE_RSHIFT) || KReleased(SDL_SCANCODE_LCTRL) || KReleased(SDL_SCANCODE_RCTRL); case MINECRAFT_ACTION_SNEAK_TOGGLE: return KReleased(SDL_SCANCODE_LSHIFT) || KReleased(SDL_SCANCODE_RSHIFT);
case MINECRAFT_ACTION_SPRINT: KReleased(SDL_SCANCODE_LCTRL) || KReleased(SDL_SCANCODE_RCTRL);
case MINECRAFT_ACTION_LEFT_SCROLL: case MINECRAFT_ACTION_LEFT_SCROLL:
case ACTION_MENU_LEFT_SCROLL: case ACTION_MENU_LEFT_SCROLL:
case MINECRAFT_ACTION_RIGHT_SCROLL: case MINECRAFT_ACTION_RIGHT_SCROLL:

View file

@ -70,6 +70,9 @@ static void onFramebufferResize(int w, int h)
::glViewport(0, 0, w, h); ::glViewport(0, 0, w, h);
} }
// V-Sync
// Initialize OpenGL & The SDL window. // Initialize OpenGL & The SDL window.
void C4JRender::Initialise() void C4JRender::Initialise()
{ {
@ -121,8 +124,14 @@ void C4JRender::Initialise()
SDL_Quit(); SDL_Quit();
return; return;
} }
SDL_GL_SetSwapInterval(0); // V-Sync Off Please.
// 4JCraft VSync/V-Sync
#ifdef ENABLE_VSYNC
SDL_GL_SetSwapInterval(1); // V-Sync On Please.
#else
SDL_GL_SetSwapInterval(0); // V-Sync Off Please.
#endif
int fw, fh; SDL_GetWindowSize(s_window, &fw, &fh); onFramebufferResize(fw, fh); int fw, fh; SDL_GetWindowSize(s_window, &fw, &fh); onFramebufferResize(fw, fh);
// We initialize the OpenGL states. Touching those values makes some funny artifacts appear. // We initialize the OpenGL states. Touching those values makes some funny artifacts appear.
@ -560,7 +569,7 @@ void C4JRender::TextureBind(int idx)
} }
} }
void C4JRender::TextureBindVertex(int idx) void C4JRender::TextureBindVertex(int idx, bool scaleLight)
{ {
// Unit 1 used for lightmapping in fixed-function or standard shaders // Unit 1 used for lightmapping in fixed-function or standard shaders
::glActiveTexture(GL_TEXTURE1); ::glActiveTexture(GL_TEXTURE1);
@ -574,7 +583,20 @@ void C4JRender::TextureBindVertex(int idx)
::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
// 4jcraft: jank workaround for entities
// referenced from the disabled code in GameRenderer::turnOnLightLayer
if (scaleLight)
{
::glMatrixMode(GL_TEXTURE);
::glLoadIdentity();
float s = 1 / 16.0f / 15.0f * 15 / 16;
::glScalef(s, s, s);
::glTranslatef(8.0f, 8.0f, 8.0f);
::glMatrixMode(GL_MODELVIEW);
}
} }
::glActiveTexture(GL_TEXTURE0); ::glActiveTexture(GL_TEXTURE0);
::glFlush(); ::glFlush();
} }

View file

@ -155,7 +155,7 @@ public:
int TextureCreate(); int TextureCreate();
void TextureFree(int idx); void TextureFree(int idx);
void TextureBind(int idx); void TextureBind(int idx);
void TextureBindVertex(int idx); void TextureBindVertex(int idx, bool scaleLight = false);
void TextureSetTextureLevels(int levels); void TextureSetTextureLevels(int levels);
int TextureGetTextureLevels(); int TextureGetTextureLevels();
void TextureData(int width, int height, void *data, int level, eTextureFormat format = TEXTURE_FORMAT_RxGyBzAw); void TextureData(int width, int height, void *data, int level, eTextureFormat format = TEXTURE_FORMAT_RxGyBzAw);

View file

@ -116,7 +116,13 @@ void Options::init()
bobView = true; bobView = true;
anaglyph3d = false; anaglyph3d = false;
advancedOpengl = false; advancedOpengl = false;
//4JCRAFT V-Sync / VSync
#ifdef ENABLE_VSYNC
framerateLimit = 2; framerateLimit = 2;
#else
framerateLimit = 3;
#endif
fancyGraphics = true; fancyGraphics = true;
ambientOcclusion = true; ambientOcclusion = true;
renderClouds = true; renderClouds = true;
@ -522,4 +528,4 @@ void Options::save()
bool Options::isCloudsOn() bool Options::isCloudsOn()
{ {
return viewDistance < 2 && renderClouds; return viewDistance < 2 && renderClouds;
} }

View file

@ -15,6 +15,7 @@ Input::Input()
wasJumping = false; wasJumping = false;
jumping = false; jumping = false;
sneaking = false; sneaking = false;
sprintKey = false;
lReset = false; lReset = false;
rReset = false; rReset = false;
@ -103,12 +104,8 @@ void Input::tick(LocalPlayer *player)
//jumping = controller.isButtonPressed(0); //jumping = controller.isButtonPressed(0);
sprintKey = InputManager.GetValue(iPad, MINECRAFT_ACTION_SPRINT) && pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_SPRINT);
unsigned int jump = InputManager.GetValue(iPad, MINECRAFT_ACTION_JUMP); jumping = InputManager.GetValue(iPad, MINECRAFT_ACTION_JUMP) && pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_JUMP);
if( jump > 0 && pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_JUMP) )
jumping = true;
else
jumping = false;
#ifndef _CONTENT_PACKAGE #ifndef _CONTENT_PACKAGE
if (app.GetFreezePlayers()) jumping = false; if (app.GetFreezePlayers()) jumping = false;

View file

@ -10,6 +10,7 @@ public:
bool wasJumping; bool wasJumping;
bool jumping; bool jumping;
bool sneaking; bool sneaking;
bool sprintKey;
Input(); // 4J - added Input(); // 4J - added
virtual ~Input(){} virtual ~Input(){}

View file

@ -828,6 +828,7 @@ enum EControllerActions
MINECRAFT_ACTION_PAUSEMENU, MINECRAFT_ACTION_PAUSEMENU,
MINECRAFT_ACTION_DROP, MINECRAFT_ACTION_DROP,
MINECRAFT_ACTION_SNEAK_TOGGLE, MINECRAFT_ACTION_SNEAK_TOGGLE,
MINECRAFT_ACTION_SPRINT,
MINECRAFT_ACTION_CRAFTING, MINECRAFT_ACTION_CRAFTING,
MINECRAFT_ACTION_RENDER_THIRD_PERSON, MINECRAFT_ACTION_RENDER_THIRD_PERSON,
MINECRAFT_ACTION_GAME_INFO, MINECRAFT_ACTION_GAME_INFO,

View file

@ -305,7 +305,7 @@ void LocalPlayer::aiStep()
// 4J - altered this slightly to make sure that the joypad returns to below returnTreshold in between registering two movements up to runThreshold // 4J - altered this slightly to make sure that the joypad returns to below returnTreshold in between registering two movements up to runThreshold
if (onGround && !isSprinting() && enoughFoodToSprint && !isUsingItem() && !hasEffect(MobEffect::blindness)) if (onGround && !isSprinting() && enoughFoodToSprint && !isUsingItem() && !hasEffect(MobEffect::blindness))
{ {
if( !wasRunning && input->ya >= runTreshold ) if( !wasRunning && (input->ya >= runTreshold) )
{ {
if (sprintTriggerTime == 0) if (sprintTriggerTime == 0)
{ {
@ -326,14 +326,18 @@ void LocalPlayer::aiStep()
{ {
sprintTriggerRegisteredReturn = true; sprintTriggerRegisteredReturn = true;
} }
else if (input->sprintKey)
{
setSprinting(true);
}
} }
if (isSneaking()) sprintTriggerTime = 0; if (isSneaking()) sprintTriggerTime = 0;
// 4J-PB - try not stopping sprint on collision // 4J-PB - try not stopping sprint on collision
//if (isSprinting() && (input->ya < runTreshold || horizontalCollision || !enoughFoodToSprint)) //if (isSprinting() && (input->ya < runTreshold || horizontalCollision || !enoughFoodToSprint))
if (isSprinting() && (input->ya < runTreshold || !enoughFoodToSprint)) if (isSprinting() && ((input->ya < runTreshold && !input->sprintKey) || !enoughFoodToSprint))
{ {
setSprinting(false); setSprinting(false);
} }
// 4J Stu - Fix for #52705 - Customer Encountered: Player can fly in bed while being in Creative mode. // 4J Stu - Fix for #52705 - Customer Encountered: Player can fly in bed while being in Creative mode.
if (!isSleeping() && (abilities.mayfly || isAllowedToFly() )) if (!isSleeping() && (abilities.mayfly || isAllowedToFly() ))

View file

@ -777,14 +777,14 @@ void GameRenderer::renderItemInHand(float a, int eye)
{ {
if (!mc->options->hideGui && !mc->gameMode->isCutScene()) if (!mc->options->hideGui && !mc->gameMode->isCutScene())
{ {
//turnOnLightLayer(a); // 4jcraft: disable light layer on handrenderer similarly to how it was done on the chunk render (this makes the hand look proper) turnOnLightLayer(a, true);
PIXBeginNamedEvent(0,"Item in hand render"); PIXBeginNamedEvent(0,"Item in hand render");
// 4jcraft: add null pointer check to itemInHandRenderer to prevent a occasional seg fault // 4jcraft: add null pointer check to itemInHandRenderer to prevent a occasional seg fault
if (itemInHandRenderer != nullptr) { if (itemInHandRenderer != nullptr) {
itemInHandRenderer->render(a); itemInHandRenderer->render(a);
} }
PIXEndNamedEvent(); PIXEndNamedEvent();
//turnOffLightLayer(a); // 4jcraft: disable light layer on handrenderer similarly to how it was done on the chunk render (this makes the hand look proper) turnOffLightLayer(a);
} }
} }
glPopMatrix(); glPopMatrix();
@ -806,21 +806,26 @@ void GameRenderer::renderItemInHand(float a, int eye)
// 4J - change brought forward from 1.8.2 // 4J - change brought forward from 1.8.2
void GameRenderer::turnOffLightLayer(double alpha) void GameRenderer::turnOffLightLayer(double alpha)
{ // 4J - TODO { // 4J - TODO
#if 0 // 4jcraft: manually handle this in order to ensure that the light layer is turned off correctly
#if 1
if (SharedConstants::TEXTURE_LIGHTING) if (SharedConstants::TEXTURE_LIGHTING)
{ {
glClientActiveTexture(GL_TEXTURE1); glClientActiveTexture(GL_TEXTURE1);
glActiveTexture(GL_TEXTURE1); glActiveTexture(GL_TEXTURE1);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);
glClientActiveTexture(GL_TEXTURE0); glClientActiveTexture(GL_TEXTURE0);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
} }
#endif #endif
RenderManager.TextureBindVertex(-1); //RenderManager.TextureBindVertex(-1);
} }
// 4J - change brought forward from 1.8.2 // 4J - change brought forward from 1.8.2
void GameRenderer::turnOnLightLayer(double alpha) void GameRenderer::turnOnLightLayer(double alpha, bool scaleLight)
{ // 4J - TODO { // 4J - TODO
#if 0 #if 0
if (SharedConstants::TEXTURE_LIGHTING) if (SharedConstants::TEXTURE_LIGHTING)
@ -851,7 +856,7 @@ void GameRenderer::turnOnLightLayer(double alpha)
#endif #endif
// update light texture // update light texture
// todo: check implementation of getLightTexture. // todo: check implementation of getLightTexture.
RenderManager.TextureBindVertex(getLightTexture(mc->player->GetXboxPad(), mc->level)); RenderManager.TextureBindVertex(getLightTexture(mc->player->GetXboxPad(), mc->level), scaleLight);
#if 0 #if 0
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
@ -971,7 +976,7 @@ void GameRenderer::updateLightTexture(float a)
int g = (int) (_g * 255); int g = (int) (_g * 255);
int b = (int) (_b * 255); int b = (int) (_b * 255);
#if ( defined _DURANGO || defined _WIN64 || __PSVITA__ ) #if ( defined _DURANGO || defined _WIN64 || __PSVITA__ || __linux__ )
lightPixels[j][i] = a << 24 | b << 16 | g << 8 | r; lightPixels[j][i] = a << 24 | b << 16 | g << 8 | r;
#elif ( defined _XBOX || defined __ORBIS__ ) #elif ( defined _XBOX || defined __ORBIS__ )
lightPixels[j][i] = a << 24 | r << 16 | g << 8 | b; lightPixels[j][i] = a << 24 | r << 16 | g << 8 | b;
@ -2189,6 +2194,9 @@ int GameRenderer::getFpsCap(int option)
int maxFps = 200; int maxFps = 200;
if (option == 1) maxFps = 120; if (option == 1) maxFps = 120;
if (option == 2) maxFps = 35; if (option == 2) maxFps = 35;
#ifndef ENABLE_VSYNC
if (option == 3) maxFps = 0;
#endif
return maxFps; return maxFps;
} }

View file

@ -104,7 +104,7 @@ public:
float blg; float blg;
float blgt; float blgt;
void turnOffLightLayer(double alpha); void turnOffLightLayer(double alpha);
void turnOnLightLayer(double alpha); void turnOnLightLayer(double alpha, bool scaleLight = false);
private: private:
void tickLightTexture(); void tickLightTexture();
void updateLightTexture(float a); void updateLightTexture(float a);

View file

@ -518,7 +518,7 @@ void LevelRenderer::renderEntities(Vec3 *cam, Culler *culler, float a)
TileEntityRenderDispatcher::yOff = (player->yOld + (player->y - player->yOld) * a); TileEntityRenderDispatcher::yOff = (player->yOld + (player->y - player->yOld) * a);
TileEntityRenderDispatcher::zOff = (player->zOld + (player->z - player->zOld) * a); TileEntityRenderDispatcher::zOff = (player->zOld + (player->z - player->zOld) * a);
// mc->gameRenderer->turnOnLightLayer(a); // 4J - brought forward from 1.8.2 mc->gameRenderer->turnOnLightLayer(a, true); // 4J - brought forward from 1.8.2
std::vector<std::shared_ptr<Entity> > entities = level[playerIndex]->getAllEntities(); std::vector<std::shared_ptr<Entity> > entities = level[playerIndex]->getAllEntities();
totalEntities = (int)entities.size(); totalEntities = (int)entities.size();
@ -600,7 +600,7 @@ void LevelRenderer::renderEntities(Vec3 *cam, Culler *culler, float a)
LeaveCriticalSection(&m_csRenderableTileEntities); LeaveCriticalSection(&m_csRenderableTileEntities);
// mc->gameRenderer->turnOffLightLayer(a); // 4J - brought forward from 1.8.2 mc->gameRenderer->turnOffLightLayer(a); // 4J - brought forward from 1.8.2
} }
std::wstring LevelRenderer::gatherStats1() std::wstring LevelRenderer::gatherStats1()
@ -742,8 +742,8 @@ int LevelRenderer::renderChunks(int from, int to, int layer, double alpha)
#if 1 #if 1
// 4J - cut down version, we're not using offsetted render lists, or a sorted chunk list, anymore // 4J - cut down version, we're not using offsetted render lists, or a sorted chunk list, anymore
// mc->gameRenderer->turnOnLightLayer(alpha); // 4J - brought forward from 1.8.2 mc->gameRenderer->turnOnLightLayer(alpha); // 4J - brought forward from 1.8.2
shared_ptr<Mob> player = mc->cameraTargetPlayer; std::shared_ptr<Mob> player = mc->cameraTargetPlayer;
double xOff = player->xOld + (player->x - player->xOld) * alpha; double xOff = player->xOld + (player->x - player->xOld) * alpha;
double yOff = player->yOld + (player->y - player->yOld) * alpha; double yOff = player->yOld + (player->y - player->yOld) * alpha;
double zOff = player->zOld + (player->z - player->zOld) * alpha; double zOff = player->zOld + (player->z - player->zOld) * alpha;
@ -838,7 +838,7 @@ int LevelRenderer::renderChunks(int from, int to, int layer, double alpha)
#endif // __PS3__ #endif // __PS3__
glPopMatrix(); glPopMatrix();
// mc->gameRenderer->turnOffLightLayer(alpha); // 4J - brought forward from 1.8.2 mc->gameRenderer->turnOffLightLayer(alpha); // 4J - brought forward from 1.8.2
#else #else
_renderChunks.clear(); _renderChunks.clear();

View file

@ -942,9 +942,15 @@ void Tesselator::vertex(float x, float y, float z)
#ifdef _XBOX #ifdef _XBOX
_array->data[p + 7] = ( ( _tex2 >> 16 ) & 0xffff ) | ( _tex2 << 16 ); _array->data[p + 7] = ( ( _tex2 >> 16 ) & 0xffff ) | ( _tex2 << 16 );
#else #else
#ifdef __PS3__ // 4jcraft: we will be lighting the blocks right in here
#if defined(__PS3__) || defined (__linux__)
#ifdef __PS3__
int16_t tex2U = ((int16_t*)&_tex2)[1] + 8; int16_t tex2U = ((int16_t*)&_tex2)[1] + 8;
int16_t tex2V = ((int16_t*)&_tex2)[0] + 8; int16_t tex2V = ((int16_t*)&_tex2)[0] + 8;
#else
int16_t tex2U = ((int16_t*)&_tex2)[0] + 8;
int16_t tex2V = ((int16_t*)&_tex2)[1] + 8;
#endif
int16_t* pShortArray = (int16_t*)&_array->data[p + 7]; int16_t* pShortArray = (int16_t*)&_array->data[p + 7];
pShortArray[0] = tex2U; pShortArray[0] = tex2U;
pShortArray[1] = tex2V; pShortArray[1] = tex2V;

View file

@ -4,7 +4,7 @@
#include "PacketListener.h" #include "PacketListener.h"
#include "MoveEntityPacket.h" #include "MoveEntityPacket.h"
MoveEntityPacket::MoveEntityPacket() MoveEntityPacket::MoveEntityPacket()
{ {
hasRot = false; hasRot = false;
@ -28,7 +28,7 @@ MoveEntityPacket::MoveEntityPacket(int id)
xRot = 0; xRot = 0;
} }
void MoveEntityPacket::read(DataInputStream *dis) //throws IOException void MoveEntityPacket::read(DataInputStream *dis) //throws IOException
{ {
id = dis->readShort(); id = dis->readShort();
} }
@ -48,7 +48,7 @@ void MoveEntityPacket::handle(PacketListener *listener)
listener->handleMoveEntity(shared_from_this()); listener->handleMoveEntity(shared_from_this());
} }
int MoveEntityPacket::getEstimatedSize() int MoveEntityPacket::getEstimatedSize()
{ {
return 2; return 2;
} }
@ -69,66 +69,66 @@ MoveEntityPacket::PosRot::PosRot()
hasRot = true; hasRot = true;
} }
MoveEntityPacket::PosRot::PosRot(int id, char xa, char ya, char za, char yRot, char xRot) : MoveEntityPacket( id ) MoveEntityPacket::PosRot::PosRot(int id, int8_t xa, int8_t ya, int8_t za, int8_t yRot, int8_t xRot) : MoveEntityPacket( id )
{ {
this->xa = xa; this->xa = xa;
this->ya = ya; this->ya = ya;
this->za = za; this->za = za;
this->yRot = yRot; this->yRot = yRot;
this->xRot = xRot; this->xRot = xRot;
hasRot = true; hasRot = true;
} }
void MoveEntityPacket::PosRot::read(DataInputStream *dis) //throws IOException void MoveEntityPacket::PosRot::read(DataInputStream *dis) //throws IOException
{ {
MoveEntityPacket::read(dis); MoveEntityPacket::read(dis);
xa = (int)dis->readByte(); xa = (int8_t)dis->readByte();
ya = (int)dis->readByte(); ya = (int8_t)dis->readByte();
za = (int)dis->readByte(); za = (int8_t)dis->readByte();
yRot = (int)dis->readByte(); yRot = (int8_t)dis->readByte();
xRot = (int)dis->readByte(); xRot = (int8_t)dis->readByte();
} }
void MoveEntityPacket::PosRot::write(DataOutputStream *dos) //throws IOException void MoveEntityPacket::PosRot::write(DataOutputStream *dos) //throws IOException
{ {
MoveEntityPacket::write(dos); MoveEntityPacket::write(dos);
dos->writeByte((uint8_t)xa); dos->writeByte((uint8_t)(xa & 0xFF));
dos->writeByte((uint8_t)ya); dos->writeByte((uint8_t)(ya & 0xFF));
dos->writeByte((uint8_t)za); dos->writeByte((uint8_t)(za & 0xFF));
dos->writeByte((uint8_t)yRot); dos->writeByte((uint8_t)(yRot & 0xFF));
dos->writeByte((uint8_t)xRot); dos->writeByte((uint8_t)(xRot & 0xFF));
} }
int MoveEntityPacket::PosRot::getEstimatedSize() int MoveEntityPacket::PosRot::getEstimatedSize()
{ {
return 2+5; return 2+5;
} }
MoveEntityPacket::Pos::Pos() MoveEntityPacket::Pos::Pos()
{ {
} }
MoveEntityPacket::Pos::Pos(int id, char xa, char ya, char za) : MoveEntityPacket(id) MoveEntityPacket::Pos::Pos(int id, int8_t xa, int8_t ya, int8_t za) : MoveEntityPacket(id)
{ {
this->xa = xa; this->xa = xa;
this->ya = ya; this->ya = ya;
this->za = za; this->za = za;
} }
void MoveEntityPacket::Pos::read(DataInputStream *dis) //throws IOException void MoveEntityPacket::Pos::read(DataInputStream *dis) //throws IOException
{ {
MoveEntityPacket::read(dis); MoveEntityPacket::read(dis);
xa = (int)dis->readByte(); xa = (int8_t)dis->readByte();
ya = (int)dis->readByte(); ya = (int8_t)dis->readByte();
za = (int)dis->readByte(); za = (int8_t)dis->readByte();
} }
void MoveEntityPacket::Pos::write(DataOutputStream *dos) //throws IOException void MoveEntityPacket::Pos::write(DataOutputStream *dos) //throws IOException
{ {
MoveEntityPacket::write(dos); MoveEntityPacket::write(dos);
dos->writeByte((uint8_t)xa); dos->writeByte((uint8_t)(xa & 0xFF));
dos->writeByte((uint8_t)ya); dos->writeByte((uint8_t)(ya & 0xFF));
dos->writeByte((uint8_t)za); dos->writeByte((uint8_t)(za & 0xFF));
} }
int MoveEntityPacket::Pos::getEstimatedSize() int MoveEntityPacket::Pos::getEstimatedSize()
@ -136,30 +136,30 @@ int MoveEntityPacket::Pos::getEstimatedSize()
return 2+3; return 2+3;
} }
MoveEntityPacket::Rot::Rot() MoveEntityPacket::Rot::Rot()
{ {
hasRot = true; hasRot = true;
} }
MoveEntityPacket::Rot::Rot(int id, char yRot, char xRot) : MoveEntityPacket(id) MoveEntityPacket::Rot::Rot(int id, int8_t yRot, int8_t xRot) : MoveEntityPacket(id)
{ {
this->yRot = yRot; this->yRot = yRot;
this->xRot = xRot; this->xRot = xRot;
hasRot = true; hasRot = true;
} }
void MoveEntityPacket::Rot::read(DataInputStream *dis) //throws IOException void MoveEntityPacket::Rot::read(DataInputStream *dis) //throws IOException
{ {
MoveEntityPacket::read(dis); MoveEntityPacket::read(dis);
yRot = (int)dis->readByte(); yRot = (int8_t)dis->readByte();
xRot = (int)dis->readByte(); xRot = (int8_t)dis->readByte();
} }
void MoveEntityPacket::Rot::write(DataOutputStream *dos) //throws IOException void MoveEntityPacket::Rot::write(DataOutputStream *dos) //throws IOException
{ {
MoveEntityPacket::write(dos); MoveEntityPacket::write(dos);
dos->writeByte((uint8_t)yRot); dos->writeByte((uint8_t)(yRot & 0xFF));
dos->writeByte((uint8_t)xRot); dos->writeByte((uint8_t)(xRot & 0xFF));
} }
int MoveEntityPacket::Rot::getEstimatedSize() int MoveEntityPacket::Rot::getEstimatedSize()

View file

@ -13,7 +13,7 @@ public:
class Rot; class Rot;
int id; int id;
char xa, ya, za, yRot, xRot; int8_t xa, ya, za, yRot, xRot;
bool hasRot; bool hasRot;
MoveEntityPacket(); MoveEntityPacket();
@ -35,7 +35,7 @@ class MoveEntityPacket::PosRot : public MoveEntityPacket
{ {
public: public:
PosRot(); PosRot();
PosRot(int id, char xa, char ya, char za, char yRot, char xRot); PosRot(int id, int8_t xa, int8_t ya, int8_t za, int8_t yRot, int8_t xRot);
virtual void read(DataInputStream *dis); virtual void read(DataInputStream *dis);
virtual void write(DataOutputStream *dos); virtual void write(DataOutputStream *dos);
@ -50,7 +50,7 @@ class MoveEntityPacket::Pos : public MoveEntityPacket
{ {
public: public:
Pos(); Pos();
Pos(int id, char xa, char ya, char za); Pos(int id, int8_t xa, int8_t ya, int8_t za);
virtual void read(DataInputStream *dis); virtual void read(DataInputStream *dis);
virtual void write(DataOutputStream *dos); virtual void write(DataOutputStream *dos);
@ -65,7 +65,7 @@ class MoveEntityPacket::Rot : public MoveEntityPacket
{ {
public: public:
Rot(); Rot();
Rot(int id, char yRot, char xRot); Rot(int id, int8_t yRot, int8_t xRot);
virtual void read(DataInputStream *dis); virtual void read(DataInputStream *dis);
virtual void write(DataOutputStream *dos); virtual void write(DataOutputStream *dos);

View file

@ -1,5 +1,6 @@
#include "../../Platform/stdafx.h" #include "../../Platform/stdafx.h"
#include <iostream> #include <iostream>
#include <limits>
#include "../../IO/Streams/InputOutputStream.h" #include "../../IO/Streams/InputOutputStream.h"
#include "PacketListener.h" #include "PacketListener.h"
#include "MoveEntityPacketSmall.h" #include "MoveEntityPacketSmall.h"
@ -19,30 +20,19 @@ MoveEntityPacketSmall::MoveEntityPacketSmall()
MoveEntityPacketSmall::MoveEntityPacketSmall(int id) MoveEntityPacketSmall::MoveEntityPacketSmall(int id)
{ {
if( (id < 0 ) || (id >= 2048 ) )
{
// We shouln't be tracking an entity that doesn't have a short type of id
__debugbreak();
}
this->id = id; this->id = id;
hasRot = false; hasRot = false;
xa = ya = za = yRot = xRot = 0;
xa = 0;
ya = 0;
za = 0;
yRot = 0;
xRot = 0;
} }
void MoveEntityPacketSmall::read(DataInputStream *dis) //throws IOException void MoveEntityPacketSmall::read(DataInputStream *dis) //throws IOException
{ {
id = dis->readShort(); id = dis->readShort();
} }
void MoveEntityPacketSmall::write(DataOutputStream *dos) //throws IOException void MoveEntityPacketSmall::write(DataOutputStream *dos) //throws IOException
{ {
if( (id < 0 ) || (id >= 2048 ) ) if(id < 0 || id > std::numeric_limits<int16_t>::max() )
{ {
// We shouln't be tracking an entity that doesn't have a short type of id // We shouln't be tracking an entity that doesn't have a short type of id
__debugbreak(); __debugbreak();
@ -55,7 +45,7 @@ void MoveEntityPacketSmall::handle(PacketListener *listener)
listener->handleMoveEntitySmall(shared_from_this()); listener->handleMoveEntitySmall(shared_from_this());
} }
int MoveEntityPacketSmall::getEstimatedSize() int MoveEntityPacketSmall::getEstimatedSize()
{ {
return 2; return 2;
} }
@ -76,7 +66,7 @@ MoveEntityPacketSmall::PosRot::PosRot()
hasRot = true; hasRot = true;
} }
MoveEntityPacketSmall::PosRot::PosRot(int id, char xa, char ya, char za, char yRot, char xRot) : MoveEntityPacketSmall( id ) MoveEntityPacketSmall::PosRot::PosRot(int id, int8_t xa, int8_t ya, int8_t za, int8_t yRot, int8_t xRot) : MoveEntityPacketSmall( id )
{ {
this->xa = xa; this->xa = xa;
this->ya = ya; this->ya = ya;
@ -86,80 +76,69 @@ MoveEntityPacketSmall::PosRot::PosRot(int id, char xa, char ya, char za, char yR
hasRot = true; hasRot = true;
} }
void MoveEntityPacketSmall::PosRot::read(DataInputStream *dis) //throws IOException void MoveEntityPacketSmall::PosRot::read(DataInputStream *dis) //throws IOException
{ {
int idAndRot = dis->readShort(); MoveEntityPacketSmall::read(dis);
this->id = idAndRot & 0x07ff; xa = (int8_t)dis->readByte();
this->yRot = idAndRot >> 11; ya = (int8_t)dis->readByte();
int xAndYAndZ = (int)dis->readShort(); za = (int8_t)dis->readByte();
this->xa = xAndYAndZ >> 11; yRot = (int8_t)dis->readByte();
this->ya = (xAndYAndZ << 21 ) >> 26; xRot = (int8_t)dis->readByte();
this->za = (xAndYAndZ << 27 ) >> 27;
} }
void MoveEntityPacketSmall::PosRot::write(DataOutputStream *dos) //throws IOException void MoveEntityPacketSmall::PosRot::write(DataOutputStream *dos) //throws IOException
{ {
if( (id < 0 ) || (id >= 2048 ) ) MoveEntityPacketSmall::write(dos);
{ dos->writeByte((uint8_t)(xa & 0xFF));
// We shouln't be tracking an entity that doesn't have a short type of id dos->writeByte((uint8_t)(ya & 0xFF));
__debugbreak(); dos->writeByte((uint8_t)(za & 0xFF));
} dos->writeByte((uint8_t)(yRot & 0xFF));
short idAndRot = id | yRot << 11; dos->writeByte((uint8_t)(xRot & 0xFF));
dos->writeShort(idAndRot);
short xAndYAndZ = ( xa << 11 ) | ( ( ya & 0x3f ) << 5 ) | ( za & 0x1f );
dos->writeShort(xAndYAndZ);
} }
int MoveEntityPacketSmall::PosRot::getEstimatedSize() int MoveEntityPacketSmall::PosRot::getEstimatedSize()
{ {
return 4; return 2+5;
} }
MoveEntityPacketSmall::Pos::Pos() MoveEntityPacketSmall::Pos::Pos()
{ {
} }
MoveEntityPacketSmall::Pos::Pos(int id, char xa, char ya, char za) : MoveEntityPacketSmall(id) MoveEntityPacketSmall::Pos::Pos(int id, int8_t xa, int8_t ya, int8_t za) : MoveEntityPacketSmall(id)
{ {
this->xa = xa; this->xa = xa;
this->ya = ya; this->ya = ya;
this->za = za; this->za = za;
} }
void MoveEntityPacketSmall::Pos::read(DataInputStream *dis) //throws IOException void MoveEntityPacketSmall::Pos::read(DataInputStream *dis) //throws IOException
{ {
int idAndY = dis->readShort(); MoveEntityPacketSmall::read(dis);
this->id = idAndY & 0x07ff; xa = (int8_t)dis->readByte();
this->ya = idAndY >> 11; ya = (int8_t)dis->readByte();
int XandZ = (int)((signed char)(dis->readByte())); za = (int8_t)dis->readByte();
xa = XandZ >> 4;
za = ( XandZ << 28 ) >> 28;
} }
void MoveEntityPacketSmall::Pos::write(DataOutputStream *dos) //throws IOException void MoveEntityPacketSmall::Pos::write(DataOutputStream *dos) //throws IOException
{ {
if( (id < 0 ) || (id >= 2048 ) ) MoveEntityPacketSmall::write(dos);
{ dos->writeByte((uint8_t)(xa & 0xFF));
// We shouln't be tracking an entity that doesn't have a short type of id dos->writeByte((uint8_t)(ya & 0xFF));
__debugbreak(); dos->writeByte((uint8_t)(za & 0xFF));
}
short idAndY = id | ya << 11;
dos->writeShort(idAndY);
char XandZ = ( xa << 4 ) | ( za & 0x0f );
dos->writeByte((uint8_t)XandZ);
} }
int MoveEntityPacketSmall::Pos::getEstimatedSize() int MoveEntityPacketSmall::Pos::getEstimatedSize()
{ {
return 3; return 2+3;
} }
MoveEntityPacketSmall::Rot::Rot() MoveEntityPacketSmall::Rot::Rot()
{ {
hasRot = true; hasRot = true;
} }
MoveEntityPacketSmall::Rot::Rot(int id, char yRot, char xRot) : MoveEntityPacketSmall(id) MoveEntityPacketSmall::Rot::Rot(int id, int8_t yRot, int8_t xRot) : MoveEntityPacketSmall(id)
{ {
this->yRot = yRot; this->yRot = yRot;
@ -167,25 +146,19 @@ MoveEntityPacketSmall::Rot::Rot(int id, char yRot, char xRot) : MoveEntityPacket
hasRot = true; hasRot = true;
} }
void MoveEntityPacketSmall::Rot::read(DataInputStream *dis) //throws IOException void MoveEntityPacketSmall::Rot::read(DataInputStream *dis) //throws IOException
{ {
int idAndRot = (int)dis->readShort(); MoveEntityPacketSmall::read(dis);
this->id = idAndRot & 0x07ff; yRot = (int8_t)dis->readByte();
this->yRot = idAndRot >> 11;
} }
void MoveEntityPacketSmall::Rot::write(DataOutputStream *dos) //throws IOException void MoveEntityPacketSmall::Rot::write(DataOutputStream *dos) //throws IOException
{ {
if( (id < 0 ) || (id >= 2048 ) ) MoveEntityPacketSmall::write(dos);
{ dos->writeByte((uint8_t)(yRot & 0xFF));
// We shouln't be tracking an entity that doesn't have a short type of id
__debugbreak();
}
short idAndRot = id | yRot << 11;
dos->writeShort(idAndRot);
} }
int MoveEntityPacketSmall::Rot::getEstimatedSize() int MoveEntityPacketSmall::Rot::getEstimatedSize()
{ {
return 2; return 2+1;
} }

View file

@ -13,8 +13,8 @@ public:
class Rot; class Rot;
int id; int id;
char xa, ya, za, yRot, xRot; int8_t xa, ya, za, yRot, xRot;
bool hasRot; bool hasRot;
MoveEntityPacketSmall(); MoveEntityPacketSmall();
MoveEntityPacketSmall(int id); MoveEntityPacketSmall(int id);
@ -34,8 +34,8 @@ public:
class MoveEntityPacketSmall::PosRot : public MoveEntityPacketSmall class MoveEntityPacketSmall::PosRot : public MoveEntityPacketSmall
{ {
public: public:
PosRot(); PosRot();
PosRot(int id, char xa, char ya, char za, char yRot, char xRot); PosRot(int id, int8_t xa, int8_t ya, int8_t za, int8_t yRot, int8_t xRot);
virtual void read(DataInputStream *dis); virtual void read(DataInputStream *dis);
virtual void write(DataOutputStream *dos); virtual void write(DataOutputStream *dos);
@ -50,7 +50,7 @@ class MoveEntityPacketSmall::Pos : public MoveEntityPacketSmall
{ {
public: public:
Pos(); Pos();
Pos(int id, char xa, char ya, char za); Pos(int id, int8_t xa, int8_t ya, int8_t za);
virtual void read(DataInputStream *dis); virtual void read(DataInputStream *dis);
virtual void write(DataOutputStream *dos); virtual void write(DataOutputStream *dos);
@ -66,7 +66,7 @@ class MoveEntityPacketSmall::Rot : public MoveEntityPacketSmall
{ {
public: public:
Rot(); Rot();
Rot(int id, char yRot, char xRot); Rot(int id, int8_t yRot, int8_t xRot);
virtual void read(DataInputStream *dis); virtual void read(DataInputStream *dis);
virtual void write(DataOutputStream *dos); virtual void write(DataOutputStream *dos);

View file

@ -17,22 +17,14 @@ void SetEntityMotionPacket::_init(int id, double xd, double yd, double zd)
if (xd > m) xd = m; if (xd > m) xd = m;
if (yd > m) yd = m; if (yd > m) yd = m;
if (zd > m) zd = m; if (zd > m) zd = m;
xa = (int) (xd * 8000.0); xa = (int16_t) (xd * 8000.0);
ya = (int) (yd * 8000.0); ya = (int16_t) (yd * 8000.0);
za = (int) (zd * 8000.0); za = (int16_t) (zd * 8000.0);
// 4J - if we could transmit this as bytes (in 1/16 accuracy) then flag to do so
if( ( xa >= (-128 * 16 ) ) && ( ya >= (-128 * 16 ) ) && ( za >= (-128 * 16 ) ) && useBytes = false;
( xa < (128 * 16 ) ) && ( ya < (128 * 16 ) ) && ( za < (128 * 16 ) ) )
{
useBytes = true;
}
else
{
useBytes = false;
}
} }
SetEntityMotionPacket::SetEntityMotionPacket() SetEntityMotionPacket::SetEntityMotionPacket()
{ {
_init(0, 0.0f, 0.0f, 0.0f); _init(0, 0.0f, 0.0f, 0.0f);
} }
@ -44,56 +36,27 @@ SetEntityMotionPacket::SetEntityMotionPacket(std::shared_ptr<Entity> e)
SetEntityMotionPacket::SetEntityMotionPacket(int id, double xd, double yd, double zd) SetEntityMotionPacket::SetEntityMotionPacket(int id, double xd, double yd, double zd)
{ {
_init(id, xd, yd, zd); _init(id, xd, yd, zd);
} }
void SetEntityMotionPacket::read(DataInputStream *dis) //throws IOException void SetEntityMotionPacket::read(DataInputStream *dis) //throws IOException
{ {
short idAndFlag = dis->readShort(); id = dis->readShort();
id = idAndFlag & 0x07ff;
if( idAndFlag & 0x0800 ) xa = dis->readShort();
{ ya = dis->readShort();
xa = (int)dis->readByte(); za = dis->readShort();
ya = (int)dis->readByte();
za = (int)dis->readByte(); useBytes = false;
xa = ( xa << 24 ) >> 24;
ya = ( ya << 24 ) >> 24;
za = ( za << 24 ) >> 24;
xa *= 16;
ya *= 16;
za *= 16;
useBytes = true;
}
else
{
xa = dis->readShort();
ya = dis->readShort();
za = dis->readShort();
useBytes = false;
}
} }
void SetEntityMotionPacket::write(DataOutputStream *dos) //throws IOException void SetEntityMotionPacket::write(DataOutputStream *dos) //throws IOException
{ {
if( useBytes ) dos->writeShort(id);
{
// 4jcraft: masking the id to 11 bits before writing to account for entity ids > 4095. dos->writeShort(xa);
// This fixes a connection drop when loading the tutorial world on linux. dos->writeShort(ya);
// dos->writeShort(za);
// FIXME: find the root cause of this, since there shouldn't be more than 4095 entities.
dos->writeShort((id & 0x07FF) | 0x800);
dos->writeByte(xa/16);
dos->writeByte(ya/16);
dos->writeByte(za/16);
}
else
{
// 4jcraft: same thing as line 80 here
dos->writeShort((id & 0x07FF));
dos->writeShort(xa);
dos->writeShort(ya);
dos->writeShort(za);
}
} }
void SetEntityMotionPacket::handle(PacketListener *listener) void SetEntityMotionPacket::handle(PacketListener *listener)
@ -103,7 +66,7 @@ void SetEntityMotionPacket::handle(PacketListener *listener)
int SetEntityMotionPacket::getEstimatedSize() int SetEntityMotionPacket::getEstimatedSize()
{ {
return useBytes ? 5 : 8; return 8;
} }
bool SetEntityMotionPacket::canBeInvalidated() bool SetEntityMotionPacket::canBeInvalidated()

View file

@ -7,7 +7,7 @@ class SetEntityMotionPacket : public Packet, public std::enable_shared_from_this
{ {
public: public:
int id; int id;
int xa, ya, za; int16_t xa, ya, za;
bool useBytes; // 4J added bool useBytes; // 4J added
private: private:

View file

@ -17,7 +17,7 @@ TeleportEntityPacket::TeleportEntityPacket()
xRot = 0; xRot = 0;
} }
TeleportEntityPacket::TeleportEntityPacket(std::shared_ptr<Entity> e) TeleportEntityPacket::TeleportEntityPacket(std::shared_ptr<Entity> e)
{ {
id = e->entityId; id = e->entityId;
x = Mth::floor(e->x * 32); x = Mth::floor(e->x * 32);
@ -27,7 +27,7 @@ TeleportEntityPacket::TeleportEntityPacket(std::shared_ptr<Entity> e)
xRot = (uint8_t) (e->xRot * 256 / 360); xRot = (uint8_t) (e->xRot * 256 / 360);
} }
TeleportEntityPacket::TeleportEntityPacket(int id, int x, int y, int z, uint8_t yRot, uint8_t xRot) TeleportEntityPacket::TeleportEntityPacket(int id, int32_t x, int32_t y, int32_t z, uint8_t yRot, uint8_t xRot)
{ {
this->id = id; this->id = id;
this->x = x; this->x = x;
@ -53,28 +53,22 @@ void TeleportEntityPacket::read(DataInputStream *dis) //throws IOException
xRot = (uint8_t) dis->read(); xRot = (uint8_t) dis->read();
} }
void TeleportEntityPacket::write(DataOutputStream *dos) //throws IOException void TeleportEntityPacket::write(DataOutputStream *dos) //throws IOException
{ {
dos->writeShort(id); dos->writeShort((short)id);
#ifdef _LARGE_WORLDS
dos->writeInt(x); dos->writeInt(x);
dos->writeInt(y); dos->writeInt(y);
dos->writeInt(z); dos->writeInt(z);
#else
dos->writeShort(x);
dos->writeShort(y);
dos->writeShort(z);
#endif
dos->write(yRot); dos->write(yRot);
dos->write(xRot); dos->write(xRot);
} }
void TeleportEntityPacket::handle(PacketListener *listener) void TeleportEntityPacket::handle(PacketListener *listener)
{ {
listener->handleTeleportEntity(shared_from_this()); listener->handleTeleportEntity(shared_from_this());
} }
int TeleportEntityPacket::getEstimatedSize() int TeleportEntityPacket::getEstimatedSize()
{ {
return 2 + 2 + 2 + 2 + 1 + 1; return 2 + 2 + 2 + 2 + 1 + 1;
} }

View file

@ -7,19 +7,19 @@ class TeleportEntityPacket : public Packet, public std::enable_shared_from_this<
{ {
public: public:
int id; int id;
int x, y, z; int32_t x, y, z;
uint8_t yRot, xRot; uint8_t yRot, xRot;
TeleportEntityPacket(); TeleportEntityPacket();
TeleportEntityPacket(std::shared_ptr<Entity> e); TeleportEntityPacket(std::shared_ptr<Entity> e);
TeleportEntityPacket(int id, int x, int y, int z, uint8_t yRot, uint8_t xRot); TeleportEntityPacket(int id, int32_t x, int32_t y, int32_t z, uint8_t yRot, uint8_t xRot);
virtual void read(DataInputStream *dis); virtual void read(DataInputStream *dis);
virtual void write(DataOutputStream *dos); virtual void write(DataOutputStream *dos);
virtual void handle(PacketListener *listener); virtual void handle(PacketListener *listener);
virtual int getEstimatedSize(); virtual int getEstimatedSize();
virtual bool canBeInvalidated(); virtual bool canBeInvalidated();
virtual bool isInvalidatedBy(std::shared_ptr<Packet> packet); virtual bool isInvalidatedBy(std::shared_ptr<Packet> packet);
public: public:
static std::shared_ptr<Packet> create() { return std::shared_ptr<Packet>(new TeleportEntityPacket()); } static std::shared_ptr<Packet> create() { return std::shared_ptr<Packet>(new TeleportEntityPacket()); }

View file

@ -1,11 +1,11 @@
{ {
description = "4jcraft-nix dev shell"; description = "4jcraft-nix package and dev shell";
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
}; };
outputs = { nixpkgs, ... }: outputs = { self, nixpkgs, ... }:
let let
allSystems = [ allSystems = [
"x86_64-linux" "x86_64-linux"
@ -19,30 +19,45 @@
}); });
in in
{ {
devShells = forAllSystems ({ pkgs }: packages = forAllSystems ({ pkgs }:
let
libs = with pkgs; [
openssl.dev
libGL
libGLU
sdl2
zlib
];
packages = with pkgs; [
clang
lld
cmake
gnumake
meson
ninja
pkg-config
];
in
{ {
default = pkgs.mkShell { default = pkgs.clangStdenv.mkDerivation {
LD_LIBRARY_PATH = "/run/opengl-driver/lib"; pname = "4jcraft";
buildInputs = libs; version = "0.1.0";
nativeBuildInputs = packages;
src = ./.;
buildInputs = with pkgs; [
openssl.dev
libGL
libGLU
SDL2
zlib
];
nativeBuildInputs = with pkgs; [
lld
meson
ninja
pkg-config
python3
makeWrapper
];
installPhase = ''
mkdir -p $out/share/4jcraft
cp -r Minecraft.Client/. $out/share/4jcraft/
mkdir -p $out/bin
makeWrapper $out/share/4jcraft/Minecraft.Client \
$out/bin/4jcraft \
--run "cd $out/share/4jcraft"
'';
meta = {
description = "4JCraft";
platforms = pkgs.lib.platforms.linux;
};
}; };
} }
); );

View file

@ -37,6 +37,12 @@ global_cpp_defs = [
'-DDEBUG', '-DDEBUG',
] ]
if get_option('enable_vsync')
global_cpp_defs += '-DENABLE_VSYNC'
message('v-sync enabled')
endif
if host_machine.system() == 'linux' if host_machine.system() == 'linux'
global_cpp_defs += [ global_cpp_defs += [
'-Dlinux', '-Dlinux',

4
meson.options Normal file
View file

@ -0,0 +1,4 @@
option('enable_vsync',
type : 'boolean',
value : true,
description : 'Toggles weather V-Sync will be toggle on or off.')