mirror of
https://github.com/neoStudiosLCE/neoLegacy.git
synced 2026-06-09 00:22:57 +00:00
fix(PlayerConnection): /tp fix
fix(PlayerConnection): pointer fix(PlayerConnection): bytearray fix(PlayerConnection): bytearray fix(PlayerConnection): bytearray fix(TeleportCommand): crash on coords fix(TeleportCommand): crash on coords fix: sunflower randomly spawning
This commit is contained in:
parent
083ccbd4e9
commit
89a64882ef
|
|
@ -61,6 +61,7 @@ extern bool g_Win64DedicatedServer;
|
|||
|
||||
//neo: added
|
||||
#include "ItemNameMap.h"
|
||||
#include "../Minecraft.World/ByteArrayOutputStream.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
|
|
@ -1131,19 +1132,10 @@ if (cmd == L"tp" || cmd == L"teleport")
|
|||
? static_cast<byte>(tpTarget->xRot)
|
||||
: static_cast<byte>(stoi(sXRot) & 0xFF);
|
||||
|
||||
TeleportEntityPacket packet(
|
||||
tpTarget->entityId,
|
||||
static_cast<int>(x),
|
||||
static_cast<int>(y),
|
||||
static_cast<int>(z),
|
||||
yRot,
|
||||
xRot
|
||||
);
|
||||
DataOutputStream ds(OutputStream::createMemoryStream());
|
||||
packet.write(&ds);
|
||||
shared_ptr<GameCommandPacket> gamePacket = make_shared<GameCommandPacket>(eGameCommand_Teleport, ds.getData());
|
||||
shared_ptr<GameCommandPacket> gamePacket = TeleportCommand::preparePacket(
|
||||
tpTarget->getXuid(), x, y, z, yRot, xRot);
|
||||
server->getCommandDispatcher()->performCommand(tpTarget, eGameCommand_Teleport, gamePacket->data);
|
||||
}
|
||||
}
|
||||
} else if (cmd == L"time")
|
||||
{
|
||||
if (!player->hasPermission(eGameCommand_Time))
|
||||
|
|
|
|||
|
|
@ -19,89 +19,95 @@ EGameCommand TeleportCommand::getId()
|
|||
|
||||
void TeleportCommand::execute(shared_ptr<CommandSender> source, byteArray commandData)
|
||||
{
|
||||
ByteArrayInputStream bais(commandData);
|
||||
DataInputStream dis(&bais);
|
||||
ByteArrayInputStream bais(commandData);
|
||||
DataInputStream dis(&bais);
|
||||
byte flag = dis.readByte();
|
||||
PlayerUID subjectID = dis.readPlayerUID();
|
||||
PlayerList *players = MinecraftServer::getInstance()->getPlayerList();
|
||||
shared_ptr<ServerPlayer> subject = players->getPlayer(subjectID);
|
||||
if (subject == nullptr || !subject->isAlive())
|
||||
return;
|
||||
|
||||
PlayerUID subjectID = dis.readPlayerUID();
|
||||
PlayerUID destinationID = dis.readPlayerUID();
|
||||
|
||||
bais.reset();
|
||||
if (flag == 1)
|
||||
{
|
||||
float x = dis.readFloat();
|
||||
float y = dis.readFloat();
|
||||
float z = dis.readFloat();
|
||||
byte yRot = dis.readByte();
|
||||
byte xRot = dis.readByte();
|
||||
|
||||
PlayerList *players = MinecraftServer::getInstance()->getPlayerList();
|
||||
|
||||
shared_ptr<ServerPlayer> subject = players->getPlayer(subjectID);
|
||||
shared_ptr<ServerPlayer> destination = players->getPlayer(destinationID);
|
||||
|
||||
if(subject != nullptr && destination != nullptr && subject->level->dimension->id == destination->level->dimension->id && subject->isAlive() )
|
||||
{
|
||||
subject->ride(nullptr);
|
||||
subject->ride(nullptr);
|
||||
#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD)
|
||||
{
|
||||
double outX, outY, outZ;
|
||||
bool cancelled = FourKitBridge::FirePlayerTeleport(subject->entityId,
|
||||
subject->x, subject->y, subject->z, subject->dimension,
|
||||
destination->x, destination->y, destination->z, destination->dimension,
|
||||
1 /* COMMAND */,
|
||||
&outX, &outY, &outZ);
|
||||
if (cancelled)
|
||||
return;
|
||||
subject->connection->teleport(outX, outY, outZ, destination->yRot, destination->xRot);
|
||||
}
|
||||
{
|
||||
double outX, outY, outZ;
|
||||
bool cancelled = FourKitBridge::FirePlayerTeleport(subject->entityId,
|
||||
subject->x, subject->y, subject->z, subject->dimension,
|
||||
x, y, z, subject->dimension,
|
||||
1, &outX, &outY, &outZ);
|
||||
if (cancelled)
|
||||
return;
|
||||
subject->connection->teleport(outX, outY, outZ, yRot, xRot);
|
||||
}
|
||||
#else
|
||||
subject->connection->teleport(destination->x, destination->y, destination->z, destination->yRot, destination->xRot);
|
||||
subject->connection->teleport(x, y, z, yRot, xRot);
|
||||
#endif
|
||||
//logAdminAction(source, "commands.tp.success", subject->getAName(), destination->getAName());
|
||||
logAdminAction(source, ChatPacket::e_ChatCommandTeleportSuccess, subject->getName(), eTYPE_SERVERPLAYER, destination->getName());
|
||||
logAdminAction(source, ChatPacket::e_ChatCommandTeleportSuccess, subject->getName(), eTYPE_SERVERPLAYER, subject->getName());
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayerUID destinationID = dis.readPlayerUID();
|
||||
shared_ptr<ServerPlayer> destination = players->getPlayer(destinationID);
|
||||
if (destination == nullptr)
|
||||
return;
|
||||
|
||||
if(subject == source)
|
||||
{
|
||||
destination->sendMessage(subject->getName(), ChatPacket::e_ChatCommandTeleportToMe);
|
||||
}
|
||||
else
|
||||
{
|
||||
subject->sendMessage(destination->getName(), ChatPacket::e_ChatCommandTeleportMe);
|
||||
}
|
||||
}
|
||||
if (subject->level->dimension->id != destination->level->dimension->id)
|
||||
return;
|
||||
|
||||
//if (args.length >= 1) {
|
||||
// MinecraftServer server = MinecraftServer.getInstance();
|
||||
// ServerPlayer victim;
|
||||
|
||||
// if (args.length == 2 || args.length == 4) {
|
||||
// victim = server.getPlayers().getPlayer(args[0]);
|
||||
// if (victim == null) throw new PlayerNotFoundException();
|
||||
// } else {
|
||||
// victim = (ServerPlayer) convertSourceToPlayer(source);
|
||||
// }
|
||||
|
||||
// if (args.length == 3 || args.length == 4) {
|
||||
// if (victim.level != null) {
|
||||
// int pos = args.length - 3;
|
||||
// int maxPos = Level.MAX_LEVEL_SIZE;
|
||||
// int x = convertArgToInt(source, args[pos++], -maxPos, maxPos);
|
||||
// int y = convertArgToInt(source, args[pos++], Level.minBuildHeight, Level.maxBuildHeight);
|
||||
// int z = convertArgToInt(source, args[pos++], -maxPos, maxPos);
|
||||
|
||||
// victim.teleportTo(x + 0.5f, y, z + 0.5f);
|
||||
// logAdminAction(source, "commands.tp.coordinates", victim.getAName(), x, y, z);
|
||||
// }
|
||||
// } else if (args.length == 1 || args.length == 2) {
|
||||
// ServerPlayer destination = server.getPlayers().getPlayer(args[args.length - 1]);
|
||||
// if (destination == null) throw new PlayerNotFoundException();
|
||||
|
||||
// victim.connection.teleport(destination.x, destination.y, destination.z, destination.yRot, destination.xRot);
|
||||
// logAdminAction(source, "commands.tp.success", victim.getAName(), destination.getAName());
|
||||
// }
|
||||
//}
|
||||
subject->ride(nullptr);
|
||||
#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD)
|
||||
{
|
||||
double outX, outY, outZ;
|
||||
bool cancelled = FourKitBridge::FirePlayerTeleport(subject->entityId,
|
||||
subject->x, subject->y, subject->z, subject->dimension,
|
||||
destination->x, destination->y, destination->z, destination->dimension,
|
||||
1, &outX, &outY, &outZ);
|
||||
if (cancelled)
|
||||
return;
|
||||
subject->connection->teleport(outX, outY, outZ, destination->yRot, destination->xRot);
|
||||
}
|
||||
#else
|
||||
subject->connection->teleport(destination->x, destination->y, destination->z, destination->yRot, destination->xRot);
|
||||
#endif
|
||||
logAdminAction(source, ChatPacket::e_ChatCommandTeleportSuccess, subject->getName(), eTYPE_SERVERPLAYER, destination->getName());
|
||||
if (subject == source)
|
||||
destination->sendMessage(subject->getName(), ChatPacket::e_ChatCommandTeleportToMe);
|
||||
else
|
||||
subject->sendMessage(destination->getName(), ChatPacket::e_ChatCommandTeleportMe);
|
||||
}
|
||||
}
|
||||
|
||||
shared_ptr<GameCommandPacket> TeleportCommand::preparePacket(PlayerUID subject, PlayerUID destination)
|
||||
{
|
||||
ByteArrayOutputStream baos;
|
||||
DataOutputStream dos(&baos);
|
||||
ByteArrayOutputStream baos;
|
||||
DataOutputStream dos(&baos);
|
||||
dos.writeByte(0);
|
||||
dos.writePlayerUID(subject);
|
||||
dos.writePlayerUID(destination);
|
||||
return std::make_shared<GameCommandPacket>(eGameCommand_Teleport, baos.toByteArray());
|
||||
}
|
||||
|
||||
dos.writePlayerUID(subject);
|
||||
dos.writePlayerUID(destination);
|
||||
|
||||
return std::make_shared<GameCommandPacket>(eGameCommand_Teleport, baos.toByteArray());
|
||||
//neo: added
|
||||
shared_ptr<GameCommandPacket> TeleportCommand::preparePacket(PlayerUID subject, float x, float y, float z, byte yRot, byte xRot)
|
||||
{
|
||||
ByteArrayOutputStream baos;
|
||||
DataOutputStream dos(&baos);
|
||||
dos.writeByte(1);
|
||||
dos.writePlayerUID(subject);
|
||||
dos.writeFloat(x);
|
||||
dos.writeFloat(y);
|
||||
dos.writeFloat(z);
|
||||
dos.writeByte(yRot);
|
||||
dos.writeByte(xRot);
|
||||
return std::make_shared<GameCommandPacket>(eGameCommand_Teleport, baos.toByteArray());
|
||||
}
|
||||
|
|
@ -9,4 +9,7 @@ public:
|
|||
virtual void execute(shared_ptr<CommandSender> source, byteArray commandData);
|
||||
|
||||
static shared_ptr<GameCommandPacket> preparePacket(PlayerUID subject, PlayerUID destination);
|
||||
|
||||
//neo: added
|
||||
static shared_ptr<GameCommandPacket> preparePacket(PlayerUID subject, float x, float y, float z, byte yRot, byte xRot);
|
||||
};
|
||||
|
|
@ -551,10 +551,10 @@ int Biome::getRandomDoublePlantType(Random *random)
|
|||
{
|
||||
|
||||
int type = random->nextInt(10);
|
||||
if (type < 7) return 0;
|
||||
if (type < 7) return 2;
|
||||
if (type == 7) return 3;
|
||||
if (type == 8) return 4;
|
||||
return 2;
|
||||
return 5;
|
||||
}
|
||||
Biome* Biome::getBiome(uint32_t id) {
|
||||
|
||||
|
|
|
|||
|
|
@ -273,4 +273,10 @@ void DataOutputStream::writePlayerUID(PlayerUID player)
|
|||
#else
|
||||
writeLong(player);
|
||||
#endif // PS3
|
||||
}
|
||||
|
||||
//neo: added
|
||||
OutputStream* DataOutputStream::getChildOutputStream()
|
||||
{
|
||||
return stream;
|
||||
}
|
||||
|
|
@ -35,4 +35,7 @@ public:
|
|||
virtual void writeUTF(const wstring& a);
|
||||
virtual void writePlayerUID(PlayerUID player);
|
||||
virtual void flush();
|
||||
|
||||
//neo: added for future use cases, dont ask.
|
||||
virtual OutputStream* getChildOutputStream();
|
||||
};
|
||||
Loading…
Reference in a new issue