4 Commits

17 changed files with 399 additions and 47 deletions

View File

@@ -111,7 +111,6 @@ CPMAddPackage(
"ALSOFT_STATIC_LIBGCC ON" "ALSOFT_STATIC_LIBGCC ON"
) )
# TODO: Clear this paths with *
file(GLOB SERVER_SOURCES file(GLOB SERVER_SOURCES
"project/lib_projects/raknet/jni/RaknetSources/*.cpp" "project/lib_projects/raknet/jni/RaknetSources/*.cpp"
"src/NinecraftApp.cpp" "src/NinecraftApp.cpp"

View File

@@ -16,8 +16,9 @@ namespace SharedConstants
{ {
// 0.5.0 uses NPv8 // 0.5.0 uses NPv8
// 0.6.0 uses NPv9 // 0.6.0 uses NPv9
const int NetworkProtocolVersion = 9; // TODO: Better proto check
const int NetworkProtocolLowestSupportedVersion = 9; const int NetworkProtocolVersion = 10;
const int NetworkProtocolLowestSupportedVersion = 10;
const int GameProtocolVersion = 1; const int GameProtocolVersion = 1;
const int GameProtocolLowestSupportedVersion = 1; const int GameProtocolLowestSupportedVersion = 1;

View File

@@ -16,6 +16,8 @@
#include "../../../../world/level/Level.h" #include "../../../../world/level/Level.h"
#include "../../../../world/item/DyePowderItem.h" #include "../../../../world/item/DyePowderItem.h"
#include "../../../../world/item/crafting/Recipe.h" #include "../../../../world/item/crafting/Recipe.h"
#include "network/RakNetInstance.h"
#include "network/packet/WantCreatePacket.h"
#include "platform/input/Keyboard.h" #include "platform/input/Keyboard.h"
static NinePatchLayer* guiPaneFrame = NULL; static NinePatchLayer* guiPaneFrame = NULL;
@@ -439,6 +441,10 @@ void PaneCraftingScreen::craftSelectedItem()
ItemInstance resultItem = currentItem->item; ItemInstance resultItem = currentItem->item;
if (minecraft->player) { if (minecraft->player) {
if (minecraft->isOnline()) {
WantCreatePacket packet(minecraft->player->entityId, resultItem.count, resultItem.getAuxValue(), resultItem.id);
minecraft->raknetInstance->send(packet);
} else {
// Remove all items required for the recipe and ... // Remove all items required for the recipe and ...
for (unsigned int i = 0; i < currentItem->neededItems.size(); ++i) { for (unsigned int i = 0; i < currentItem->neededItems.size(); ++i) {
CItem::ReqItem& req = currentItem->neededItems[i]; CItem::ReqItem& req = currentItem->neededItems[i];
@@ -467,6 +473,7 @@ void PaneCraftingScreen::craftSelectedItem()
recheckRecipes(); recheckRecipes();
} }
}
} }
bool PaneCraftingScreen::renderGameBehind() bool PaneCraftingScreen::renderGameBehind()

View File

@@ -10,6 +10,7 @@
#include "../world/entity/player/Inventory.h" #include "../world/entity/player/Inventory.h"
#include "../client/Minecraft.h" #include "../client/Minecraft.h"
#include "../client/gamemode/GameMode.h" #include "../client/gamemode/GameMode.h"
#include "world/item/ItemInstance.h"
#ifndef STANDALONE_SERVER #ifndef STANDALONE_SERVER
#include "../client/gui/screens/DisconnectionScreen.h" #include "../client/gui/screens/DisconnectionScreen.h"
#endif #endif
@@ -385,6 +386,38 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, MovePlay
entity->lerpTo(packet->x, packet->y, packet->z, packet->yRot, packet->xRot, 3); entity->lerpTo(packet->x, packet->y, packet->z, packet->yRot, packet->xRot, 3);
} }
} }
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, TakeItemPacket* packet) {
if (!level) return;
LOGI("TakeItemPacket\n");
ItemInstance* item;
item->count = packet->count;
item->id = packet->itemId;
item->setAuxValue(packet->auxValue);
// if (minecraft->player->entityId == packet->playerId) {
if (!minecraft->player->inventory->add(item)) {
minecraft->player->drop(new ItemInstance(*item), false);
}
// }
}
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RemoveItemPacket* packet) {
// Idk how it works...
if (!level) return;
ItemInstance item;
item.count = packet->count;
item.id = packet->itemId;
item.setAuxValue(packet->auxValue);
// if (minecraft->player->entityId == packet->playerId) {
minecraft->player->inventory->removeResource(item);
// }
}
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, MoveEntityPacket* packet) void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, MoveEntityPacket* packet)
{ {
@@ -782,6 +815,10 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, AnimateP
} }
} }
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, WantCreatePacket* packet)
{
}
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemPacket* packet) void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemPacket* packet)
{ {
} }

View File

@@ -77,6 +77,10 @@ public:
virtual void handle(const RakNet::RakNetGUID& source, ChatPacket* packet); virtual void handle(const RakNet::RakNetGUID& source, ChatPacket* packet);
virtual void handle(const RakNet::RakNetGUID& source, AdventureSettingsPacket* packet); virtual void handle(const RakNet::RakNetGUID& source, AdventureSettingsPacket* packet);
virtual void handle(const RakNet::RakNetGUID& source, SignUpdatePacket* packet); virtual void handle(const RakNet::RakNetGUID& source, SignUpdatePacket* packet);
virtual void handle(const RakNet::RakNetGUID& source, RemoveItemPacket* packet);
virtual void handle(const RakNet::RakNetGUID& source, TakeItemPacket* packet);
virtual void handle(const RakNet::RakNetGUID& source, WantCreatePacket* packet);
private: private:
void requestNextChunk(); void requestNextChunk();

View File

@@ -18,6 +18,8 @@ class RemovePlayerPacket;
class RemoveEntityPacket; class RemoveEntityPacket;
class MoveEntityPacket; class MoveEntityPacket;
//class TeleportEntityPacket; //class TeleportEntityPacket;
class RemoveItemPacket;
class TakeItemPacket;
class MovePlayerPacket; class MovePlayerPacket;
class PlaceBlockPacket; class PlaceBlockPacket;
class RemoveBlockPacket; class RemoveBlockPacket;
@@ -48,6 +50,7 @@ class ContainerClosePacket;
class ContainerSetSlotPacket; class ContainerSetSlotPacket;
class ContainerSetDataPacket; class ContainerSetDataPacket;
class ContainerSetContentPacket; class ContainerSetContentPacket;
class WantCreatePacket;
class ChatPacket; class ChatPacket;
class SignUpdatePacket; class SignUpdatePacket;
class Minecraft; class Minecraft;
@@ -119,6 +122,9 @@ public:
virtual void handle(const RakNet::RakNetGUID& source, SignUpdatePacket* packet) {} virtual void handle(const RakNet::RakNetGUID& source, SignUpdatePacket* packet) {}
virtual void handle(const RakNet::RakNetGUID& source, AdventureSettingsPacket* packet) {} virtual void handle(const RakNet::RakNetGUID& source, AdventureSettingsPacket* packet) {}
virtual void handle(const RakNet::RakNetGUID& source, AnimatePacket* packet) {} virtual void handle(const RakNet::RakNetGUID& source, AnimatePacket* packet) {}
virtual void handle(const RakNet::RakNetGUID& source, RemoveItemPacket* packet) {}
virtual void handle(const RakNet::RakNetGUID& source, TakeItemPacket* packet) {}
virtual void handle(const RakNet::RakNetGUID& source, WantCreatePacket* packet) {}
// //
// Common implementation for Client and Server // Common implementation for Client and Server

View File

@@ -2,6 +2,7 @@
#include "Packet.h" #include "Packet.h"
#include "../world/level/chunk/LevelChunk.h" #include "../world/level/chunk/LevelChunk.h"
#include "network/packet/TakeItemPacket.h"
#include "packet/PacketInclude.h" #include "packet/PacketInclude.h"
Packet::Packet() Packet::Packet()
@@ -41,6 +42,12 @@ Packet* MinecraftPackets::createPacket(int id)
case PACKET_ADDITEMENTITY: case PACKET_ADDITEMENTITY:
packet = new AddItemEntityPacket(); packet = new AddItemEntityPacket();
break; break;
case PACKET_REMOVEITEM:
packet = new RemoveItemPacket();
break;
case PACKET_TAKEITEM:
packet = new TakeItemPacket();
break;
case PACKET_TAKEITEMENTITY: case PACKET_TAKEITEMENTITY:
packet = new TakeItemEntityPacket(); packet = new TakeItemEntityPacket();
break; break;
@@ -68,6 +75,9 @@ Packet* MinecraftPackets::createPacket(int id)
case PACKET_RESPAWN: case PACKET_RESPAWN:
packet = new RespawnPacket(); packet = new RespawnPacket();
break; break;
case PACKET_WANTCREATEITEM:
packet = new WantCreatePacket();
break;
case PACKET_REMOVEENTITY: case PACKET_REMOVEENTITY:
packet = new RemoveEntityPacket(); packet = new RemoveEntityPacket();
break; break;

View File

@@ -33,6 +33,9 @@ enum MinecraftPacketIds
PACKET_REMOVEENTITY, PACKET_REMOVEENTITY,
PACKET_ADDITEMENTITY, PACKET_ADDITEMENTITY,
PACKET_TAKEITEMENTITY, PACKET_TAKEITEMENTITY,
PACKET_TAKEITEM,
PACKET_REMOVEITEM,
PACKET_WANTCREATEITEM,
PACKET_MOVEENTITY, PACKET_MOVEENTITY,
PACKET_MOVEENTITY_POS, PACKET_MOVEENTITY_POS,

View File

@@ -5,6 +5,9 @@
#include "../world/entity/player/Inventory.h" #include "../world/entity/player/Inventory.h"
#include "../world/Container.h" #include "../world/Container.h"
#include "../world/inventory/BaseContainerMenu.h" #include "../world/inventory/BaseContainerMenu.h"
#include "network/packet/RemoveItemPacket.h"
#include "network/packet/TakeItemPacket.h"
#include "network/packet/WantCreatePacket.h"
#include "packet/PacketInclude.h" #include "packet/PacketInclude.h"
#include "RakNetInstance.h" #include "RakNetInstance.h"
@@ -13,6 +16,11 @@
#include "../client/gamemode/GameMode.h" #include "../client/gamemode/GameMode.h"
#include "../raknet/RakPeerInterface.h" #include "../raknet/RakPeerInterface.h"
#include "../raknet/PacketPriority.h" #include "../raknet/PacketPriority.h"
#include "platform/log.h"
#include "world/item/ItemInstance.h"
#include "world/item/crafting/Recipe.h"
#include "world/item/crafting/Recipes.h"
#include <cstddef>
#ifndef STANDALONE_SERVER #ifndef STANDALONE_SERVER
#include "../client/sound/SoundEngine.h" #include "../client/sound/SoundEngine.h"
#endif #endif
@@ -180,6 +188,7 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, LoginPac
LOGI("LoginPacket\n"); LOGI("LoginPacket\n");
printf("%d", packet->clientNetworkVersion);
int loginStatus = LoginStatus::Success; int loginStatus = LoginStatus::Success;
// //
// Bad/incompatible client version // Bad/incompatible client version
@@ -244,6 +253,8 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ReadyPac
if (packet->type == ReadyPacket::READY_REQUESTEDCHUNKS) if (packet->type == ReadyPacket::READY_REQUESTEDCHUNKS)
onReady_RequestedChunks(source); onReady_RequestedChunks(source);
LOGI("Ready player two ready ready player two!!\n ");
} }
void ServerSideNetworkHandler::onReady_ClientGeneration(const RakNet::RakNetGUID& source) void ServerSideNetworkHandler::onReady_ClientGeneration(const RakNet::RakNetGUID& source)
@@ -374,6 +385,8 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RemoveBl
oldTile->destroy(level, x, y, z, data); oldTile->destroy(level, x, y, z, data);
} }
LOGI("Remove block [%i, %i, %i]\n", packet->x, packet->y, packet->z);
} }
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RequestChunkPacket* packet) void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RequestChunkPacket* packet)
@@ -403,6 +416,8 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RequestC
raknetInstance->send(source, p); raknetInstance->send(source, p);
} }
} }
// LOGI("Requested chunk [%i, %i]\n", packet->x, packet->z);
} }
void ServerSideNetworkHandler::levelGenerated( Level* level ) void ServerSideNetworkHandler::levelGenerated( Level* level )
@@ -429,23 +444,36 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, PlayerEq
if (!player) return; if (!player) return;
if (rakPeer->GetMyGUID() == player->owner) return; if (rakPeer->GetMyGUID() == player->owner) return;
LOGI("Equip item: id %i aux %i\n", packet->itemId, packet->itemAuxValue);
// override the player's inventory // override the player's inventory
//int slot = player->inventory->getSlot(packet->itemId, packet->itemAuxValue); int slot = player->inventory->getSlot(packet->itemId, packet->itemAuxValue);
int slot = Inventory::MAX_SELECTION_SIZE;
if (slot >= 0) { if (slot >= 0) {
if (packet->itemId == 0) { // if (packet->itemId == 0) {
player->inventory->clearSlot(slot); // player->inventory->clearSlot(slot);
} else { // } else {
// @note: 128 is an ugly hack for depletable items. // // @note: 128 is an ugly hack for depletable items.
// @todo: fix // // @todo: fix
ItemInstance newItem(packet->itemId, 128, packet->itemAuxValue); // ItemInstance newItem(packet->itemId, 128, packet->itemAuxValue);
player->inventory->replaceSlot(slot, &newItem); // player->inventory->replaceSlot(slot, &newItem);
} // }
player->inventory->moveToSelectedSlot(slot, true); player->inventory->moveToSelectedSlot(slot, true);
redistributePacket(packet, source); } else if (packet->itemId == 0) {
player->inventory->linkEmptySlot(player->inventory->selected);
} else { } else {
LOGW("Warning: Remote player doesn't have his thing, Odd!\n"); LOGW("Warning: Remote player doesn't have his thing (or crafted it)!\n");
return;
} }
LOGI("Inventory:\n");
for (int i = 0; i < player->inventory->numTotalSlots; i++) {
auto item = player->inventory->getItem(i);
if (item) LOGI("\t %i: %s (%i)\n", i, item->getName().c_str(), item->count);
}
redistributePacket(packet, source);
} }
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, PlayerArmorEquipmentPacket* packet) { void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, PlayerArmorEquipmentPacket* packet) {
@@ -455,6 +483,8 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, PlayerAr
if (!player) return; if (!player) return;
if (rakPeer->GetMyGUID() == player->owner) return; if (rakPeer->GetMyGUID() == player->owner) return;
LOGI("Equip armor: %i %i %i %i\n", packet->head, packet->torso, packet->legs, packet->feet);
packet->fillIn(player); packet->fillIn(player);
redistributePacket(packet, source); redistributePacket(packet, source);
} }
@@ -466,6 +496,8 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, Interact
Entity* entity = level->getEntity(packet->targetId); Entity* entity = level->getEntity(packet->targetId);
if (src && entity && src->isPlayer()) if (src && entity && src->isPlayer())
{ {
LOGI("Interact: source %i target %i\n", packet->sourceId, packet->targetId);
Player* player = (Player*) src; Player* player = (Player*) src;
if (InteractPacket::Attack == packet->action) { if (InteractPacket::Attack == packet->action) {
player->swing(); player->swing();
@@ -506,6 +538,63 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, AnimateP
} }
redistributePacket(packet, source); redistributePacket(packet, source);
} }
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, WantCreatePacket* packet) {
LOGI("WantCreatePacket\n");
Entity* entity = level->getEntity(packet->playerId);
if (entity && entity->isPlayer()) {
Player* p = (Player*)entity;
auto playerInv = p->inventory;
ItemInstance wantCreate;
wantCreate.id = packet->itemId;
wantCreate.count = packet->count;
wantCreate.setAuxValue(packet->auxValue);
Recipe* recipe = Recipes::getInstance()->getRecipeFor(wantCreate);
std::vector<ItemInstance> items = recipe->getItemPack().getItemInstances();
std::vector<int> checkForExists = {};
for (int i = Inventory::MAX_SELECTION_SIZE; i < p->inventory->getContainerSize(); ++i) {
auto itm = p->inventory->getItem(i);
if (itm != NULL) {
for (int y = 0; y < items.size(); y++) {
auto itmRecipe = items.at(y);
if (itmRecipe.id == itm->id && itmRecipe.count == itm->count) {
checkForExists.push_back(itm->id);
}
}
}
}
for (int i = 0; i < items.size(); i++) {
auto item = items.at(i);
auto it = std::find(checkForExists.begin(), checkForExists.end(), item.id);
if (it == checkForExists.end()) {
return;
}
}
for (int i = 0; i < items.size(); i++) {
RemoveItemPacket removePacket(packet->playerId, items.at(i).count, items.at(i).getAuxValue(), items.at(i).id);
raknetInstance->send(source, removePacket);
p->inventory->removeItem(new ItemInstance(items.at(i).id, items.at(i).count, items.at(i).getAuxValue()));
}
TakeItemPacket itemAdd(p->entityId, wantCreate.count, wantCreate.getAuxValue(), wantCreate.id);
raknetInstance->send(source, itemAdd);
p->inventory->add(new ItemInstance(wantCreate.id, wantCreate.count, wantCreate.getAuxValue()));
}
}
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemPacket* packet) void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemPacket* packet)
{ {
@@ -544,6 +633,8 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemP
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, EntityEventPacket* packet) { void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, EntityEventPacket* packet) {
if (!level) return; if (!level) return;
LOGI("EntityEventPacket: id %i\n", packet->eventId);
if (Entity* e = level->getEntity(packet->entityId)) if (Entity* e = level->getEntity(packet->entityId))
e->handleEntityEvent(packet->eventId); e->handleEntityEvent(packet->eventId);
} }
@@ -577,6 +668,11 @@ void ServerSideNetworkHandler::handle( const RakNet::RakNetGUID& source, SendInv
{ {
if (!level) return; if (!level) return;
LOGI("Sent inventory:\n");
for (int i = 0; i < packet->numItems; i++) {
LOGI("\t %i: %s (%i)\n", i, packet->items.at(i).getName().c_str(), packet->items.at(i).count);
}
Entity* entity = level->getEntity(packet->entityId); Entity* entity = level->getEntity(packet->entityId);
if (entity && entity->isPlayer()) { if (entity && entity->isPlayer()) {
Player* p = (Player*)entity; Player* p = (Player*)entity;
@@ -592,6 +688,8 @@ void ServerSideNetworkHandler::handle( const RakNet::RakNetGUID& source, DropIte
{ {
if (!level) return; if (!level) return;
LOGI("DropItemPacket\n");
Entity* entity = level->getEntity(packet->entityId); Entity* entity = level->getEntity(packet->entityId);
if (entity && entity->isPlayer()) { if (entity && entity->isPlayer()) {
Player* p = (Player*)entity; Player* p = (Player*)entity;
@@ -601,6 +699,7 @@ void ServerSideNetworkHandler::handle( const RakNet::RakNetGUID& source, DropIte
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ContainerClosePacket* packet) { void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ContainerClosePacket* packet) {
if (!level) return; if (!level) return;
LOGI("ContainerClosePacket\n");
Player* p = findPlayer(level, &source); Player* p = findPlayer(level, &source);
if (!p) return; if (!p) return;
@@ -611,6 +710,7 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, Containe
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ContainerSetSlotPacket* packet) { void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ContainerSetSlotPacket* packet) {
if (!level) return; if (!level) return;
LOGI("ContainerSetSlot: slot %i item %s\n", packet->slot, packet->item.getName().c_str());
Player* p = findPlayer(level, &source); Player* p = findPlayer(level, &source);
if (!p) return; if (!p) return;
@@ -639,6 +739,8 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, Containe
void ServerSideNetworkHandler::handle( const RakNet::RakNetGUID& source, SetHealthPacket* packet ) void ServerSideNetworkHandler::handle( const RakNet::RakNetGUID& source, SetHealthPacket* packet )
{ {
LOGI("SetHealthPacket\n");
for (unsigned int i = 0; i < level->players.size(); ++i) { for (unsigned int i = 0; i < level->players.size(); ++i) {
Player* p = level->players[i]; Player* p = level->players[i];
if (p->owner == source) { if (p->owner == source) {
@@ -657,6 +759,8 @@ void ServerSideNetworkHandler::handle( const RakNet::RakNetGUID& source, SignUpd
if (!level) if (!level)
return; return;
LOGI("SignUpdate: [%i, %i, %i]\n", packet->x, packet->y, packet->z);
TileEntity* te = level->getTileEntity(packet->x, packet->y, packet->z); TileEntity* te = level->getTileEntity(packet->x, packet->y, packet->z);
if (TileEntity::isType(te, TileEntityType::Sign)) { if (TileEntity::isType(te, TileEntityType::Sign)) {
SignTileEntity* ste = (SignTileEntity*) te; SignTileEntity* ste = (SignTileEntity*) te;

View File

@@ -58,6 +58,7 @@ public:
virtual void handle(const RakNet::RakNetGUID& source, ContainerClosePacket* packet); virtual void handle(const RakNet::RakNetGUID& source, ContainerClosePacket* packet);
virtual void handle(const RakNet::RakNetGUID& source, SignUpdatePacket* packet); virtual void handle(const RakNet::RakNetGUID& source, SignUpdatePacket* packet);
virtual void handle(const RakNet::RakNetGUID& source, ChatPacket* packet); virtual void handle(const RakNet::RakNetGUID& source, ChatPacket* packet);
virtual void handle(const RakNet::RakNetGUID& source, WantCreatePacket* packet);
bool allowsIncomingConnections() { return _allowIncoming; } bool allowsIncomingConnections() { return _allowIncoming; }
void allowIncomingConnections(bool doAllow); void allowIncomingConnections(bool doAllow);

View File

@@ -50,5 +50,7 @@
#include "TileEventPacket.h" #include "TileEventPacket.h"
#include "UpdateBlockPacket.h" #include "UpdateBlockPacket.h"
#include "UseItemPacket.h" #include "UseItemPacket.h"
#include "RemoveItemPacket.h"
#include "WantCreatePacket.h"
#include "TakeItemPacket.h"
#endif /*NET_MINECRAFT_NETWORK_PACKET__PacketInclude_H__*/ #endif /*NET_MINECRAFT_NETWORK_PACKET__PacketInclude_H__*/

View File

@@ -0,0 +1,54 @@
#ifndef NET_MINECRAFT_NETWORK_PACKET__RemoveItemPacket_H__
#define NET_MINECRAFT_NETWORK_PACKET__RemoveItemPacket_H__
//package net.minecraft.network.packet;
#include "../Packet.h"
class RemoveItemPacket: public Packet
{
public:
RemoveItemPacket() {
}
RemoveItemPacket(int playerId, int count, int auxValue, int itemId)
:
playerId(playerId),
count(count),
auxValue(auxValue),
itemId(itemId)
{
}
void write(RakNet::BitStream* bitStream)
{
bitStream->Write((RakNet::MessageID)(ID_USER_PACKET_ENUM + PACKET_REMOVEITEM));
bitStream->Write(itemId);
bitStream->Write(count);
bitStream->Write(auxValue);
bitStream->Write(playerId);
}
void read(RakNet::BitStream* bitStream)
{
bitStream->Read(itemId);
bitStream->Read(count);
bitStream->Read(auxValue);
bitStream->Read(playerId);
}
void handle(const RakNet::RakNetGUID& source, NetEventCallback* callback)
{
callback->handle(source, (RemoveItemPacket*)this);
}
int playerId;
int itemId;
int count;
int auxValue;
};
#endif /*NET_MINECRAFT_NETWORK_PACKET__RemoveItemPacket_H__*/

View File

@@ -2,6 +2,7 @@
#define NET_MINECRAFT_NETWORK_PACKET__SendInventoryPacket_H__ #define NET_MINECRAFT_NETWORK_PACKET__SendInventoryPacket_H__
#include "../Packet.h" #include "../Packet.h"
#include "world/entity/player/Inventory.h"
class SendInventoryPacket: public Packet class SendInventoryPacket: public Packet
{ {

View File

@@ -0,0 +1,54 @@
#ifndef NET_MINECRAFT_NETWORK_PACKET__TakeItemPacket_H__
#define NET_MINECRAFT_NETWORK_PACKET__TakeItemPacket_H__
//package net.minecraft.network.packet;
#include "../Packet.h"
class TakeItemPacket: public Packet
{
public:
TakeItemPacket() {
}
TakeItemPacket(int playerId, int count, int auxValue, int itemId)
:
playerId(playerId),
count(count),
auxValue(auxValue),
itemId(itemId)
{
}
void write(RakNet::BitStream* bitStream)
{
bitStream->Write((RakNet::MessageID)(ID_USER_PACKET_ENUM + PACKET_TAKEITEM));
bitStream->Write(itemId);
bitStream->Write(count);
bitStream->Write(auxValue);
bitStream->Write(playerId);
}
void read(RakNet::BitStream* bitStream)
{
bitStream->Read(itemId);
bitStream->Read(count);
bitStream->Read(auxValue);
bitStream->Read(playerId);
}
void handle(const RakNet::RakNetGUID& source, NetEventCallback* callback)
{
callback->handle(source, (TakeItemPacket*)this);
}
int playerId;
int itemId;
int count;
int auxValue;
};
#endif /*NET_MINECRAFT_NETWORK_PACKET__TakeItemPacket_H__*/

View File

@@ -0,0 +1,54 @@
#ifndef NET_MINECRAFT_NETWORK_PACKET__WantCreatePacket_H__
#define NET_MINECRAFT_NETWORK_PACKET__WantCreatePacket_H__
//package net.minecraft.network.packet;
#include "../Packet.h"
class WantCreatePacket: public Packet
{
public:
WantCreatePacket() {
}
WantCreatePacket(int playerId, int count, int auxValue, int itemId)
:
playerId(playerId),
count(count),
auxValue(auxValue),
itemId(itemId)
{
}
void write(RakNet::BitStream* bitStream)
{
bitStream->Write((RakNet::MessageID)(ID_USER_PACKET_ENUM + PACKET_WANTCREATEITEM));
bitStream->Write(itemId);
bitStream->Write(count);
bitStream->Write(auxValue);
bitStream->Write(playerId);
}
void read(RakNet::BitStream* bitStream)
{
bitStream->Read(itemId);
bitStream->Read(count);
bitStream->Read(auxValue);
bitStream->Read(playerId);
}
void handle(const RakNet::RakNetGUID& source, NetEventCallback* callback)
{
callback->handle(source, (WantCreatePacket*)this);
}
int playerId;
int itemId;
int count;
int auxValue;
};
#endif /*NET_MINECRAFT_NETWORK_PACKET__WantCreatePacket_H__*/

View File

@@ -19,6 +19,8 @@
#include "../network/packet/AnimatePacket.h" #include "../network/packet/AnimatePacket.h"
#include "../world/level/tile/entity/ChestTileEntity.h" #include "../world/level/tile/entity/ChestTileEntity.h"
#include "../network/packet/HurtArmorPacket.h" #include "../network/packet/HurtArmorPacket.h"
#include "network/packet/SendInventoryPacket.h"
#include "world/entity/player/Inventory.h"
ServerPlayer::ServerPlayer( Minecraft* minecraft, Level* level ) ServerPlayer::ServerPlayer( Minecraft* minecraft, Level* level )
: super(level, minecraft->isCreativeMode()), : super(level, minecraft->isCreativeMode()),
@@ -26,7 +28,7 @@ ServerPlayer::ServerPlayer( Minecraft* minecraft, Level* level )
_prevHealth(-999), _prevHealth(-999),
_containerCounter(0) _containerCounter(0)
{ {
hasFakeInventory = true; // hasFakeInventory = true;
footSize = 0; footSize = 0;
} }
@@ -67,8 +69,16 @@ void ServerPlayer::tick() {
void ServerPlayer::take( Entity* e, int orgCount ) { void ServerPlayer::take( Entity* e, int orgCount ) {
TakeItemEntityPacket packet(e->entityId, entityId); TakeItemEntityPacket packet(e->entityId, entityId);
// SendInventoryPacket packet(this, false);
_mc->raknetInstance->send(packet); _mc->raknetInstance->send(packet);
LOGI("Inventory:\n");
for (int i = 0; i < inventory->numLinkedSlots; i++) {
auto item = inventory->getItem(i);
if (item)
LOGI("\t %i: %s (%i)\n", i, item->getName().c_str(), item->count);
}
super::take(e, orgCount); super::take(e, orgCount);
} }
@@ -118,20 +128,20 @@ bool ServerPlayer::hasResource( int id ) {
void ServerPlayer::setContainerData( BaseContainerMenu* menu, int id, int value ) { void ServerPlayer::setContainerData( BaseContainerMenu* menu, int id, int value ) {
ContainerSetDataPacket p(menu->containerId, id, value); ContainerSetDataPacket p(menu->containerId, id, value);
_mc->raknetInstance->send(owner, p); _mc->raknetInstance->send(owner, p);
//LOGI("Setting container data for id %d: %d\n", id, value); LOGI("Setting container data for id %d: %d\n", id, value);
} }
void ServerPlayer::slotChanged( BaseContainerMenu* menu, int slot, const ItemInstance& item, bool isResultSlot ) { void ServerPlayer::slotChanged( BaseContainerMenu* menu, int slot, const ItemInstance& item, bool isResultSlot ) {
if (isResultSlot) return; if (isResultSlot) return;
ContainerSetSlotPacket p(menu->containerId, slot, item); ContainerSetSlotPacket p(menu->containerId, slot, item);
_mc->raknetInstance->send(owner, p); _mc->raknetInstance->send(owner, p);
//LOGI("Slot %d changed\n", slot); LOGI("Slot %d changed\n", slot);
} }
void ServerPlayer::refreshContainer( BaseContainerMenu* menu, const std::vector<ItemInstance>& items ) { void ServerPlayer::refreshContainer( BaseContainerMenu* menu, const std::vector<ItemInstance>& items ) {
ContainerSetContentPacket p(menu->containerId, menu->getItems()); ContainerSetContentPacket p(menu->containerId, menu->getItems());
_mc->raknetInstance->send(owner, p); _mc->raknetInstance->send(owner, p);
//LOGI("Refreshing container with %d items\n", items.size()); LOGI("Refreshing container with %zu items\n", items.size());
} }
void ServerPlayer::nextContainerCounter() { void ServerPlayer::nextContainerCounter() {

View File

@@ -141,6 +141,11 @@ bool FillingContainer::add( ItemInstance* item )
// // silently destroy the item when having a full inventory // // silently destroy the item when having a full inventory
// item->count = 0; // item->count = 0;
// return true; // return true;
LOGI("Inventory:\n");
for (int i = 0; i < numTotalSlots; i++) {
LOGI("\t %i: %s (%i)\n", i, items.at(i)->getName().c_str(), items.at(i)->count);
}
} }
return false; return false;