void cRideableMinecart::OnRightClicked(cPlayer & a_Player) { super::OnRightClicked(a_Player); if (m_Attachee != NULL) { if (m_Attachee->GetUniqueID() == a_Player.GetUniqueID()) { // This player is already sitting in, they want out. a_Player.Detach(); return; } if (m_Attachee->IsPlayer()) { // Another player is already sitting in here, cannot attach return; } // Detach whatever is sitting in this minecart now: m_Attachee->Detach(); } // Attach the player to this minecart a_Player.AttachTo(this); }
void cSlotAreaTemporary::TossItems(cPlayer & a_Player, int a_Begin, int a_End) { cItemMap::iterator itr = m_Items.find(a_Player.GetUniqueID()); if (itr == m_Items.end()) { LOGWARNING("Player tossing items (%s) not found in the item map", a_Player.GetName().c_str()); return; } cItems Drops; for (int i = a_Begin; i < a_End; i++) { cItem & Item = itr->second[i]; if (!Item.IsEmpty()) { Drops.push_back(Item); } Item.Empty(); } // for i - itr->second[] double vX = 0, vY = 0, vZ = 0; EulerToVector(-a_Player.GetRotation(), a_Player.GetPitch(), vZ, vX, vY); vY = -vY * 2 + 1.f; a_Player.GetWorld()->SpawnItemPickups(Drops, a_Player.GetPosX(), a_Player.GetPosY() + 1.6f, a_Player.GetPosZ(), vX * 2, vY * 2, vZ * 2); }
void cProtocol125::SendPlayerAnimation(const cPlayer & a_Player, char a_Animation) { cCSLock Lock(m_CSPacket); WriteByte(PACKET_ANIMATION); WriteInt (a_Player.GetUniqueID()); WriteByte(a_Animation); Flush(); }
void cProtocol132::SendCollectEntity(const cEntity & a_Entity, const cPlayer & a_Player) { cCSLock Lock(m_CSPacket); WriteByte(PACKET_COLLECT_PICKUP); WriteInt (a_Entity.GetUniqueID()); WriteInt (a_Player.GetUniqueID()); Flush(); }
void cProtocol125::SendCollectPickup(const cPickup & a_Pickup, const cPlayer & a_Player) { cCSLock Lock(m_CSPacket); WriteByte(PACKET_COLLECT_PICKUP); WriteInt (a_Pickup.GetUniqueID()); WriteInt (a_Player.GetUniqueID()); Flush(); }
void cProtocol_1_11_0::SendCollectEntity(const cEntity & a_Entity, const cPlayer & a_Player, int a_Count) { ASSERT(m_State == 3); // In game mode? cPacketizer Pkt(*this, GetPacketId(sendCollectEntity)); // Collect Item packet Pkt.WriteVarInt32(a_Entity.GetUniqueID()); Pkt.WriteVarInt32(a_Player.GetUniqueID()); Pkt.WriteVarInt32(static_cast<UInt32>(a_Count)); }
void cProtocol132::SendLogin(const cPlayer & a_Player, const cWorld & a_World) { cCSLock Lock(m_CSPacket); WriteByte (PACKET_LOGIN); WriteInt (a_Player.GetUniqueID()); // EntityID of the player WriteString("default"); // Level type WriteByte ((Byte)a_Player.GetGameMode()); WriteByte ((Byte)(a_World.GetDimension())); WriteByte (2); // TODO: Difficulty WriteByte (0); // Unused, used to be world height WriteByte (8); // Client list width or something Flush(); m_LastSentDimension = a_World.GetDimension(); SendCompass(a_World); }
void cProtocol125::SendPlayerSpawn(const cPlayer & a_Player) { const cItem & HeldItem = a_Player.GetEquippedItem(); cCSLock Lock(m_CSPacket); WriteByte (PACKET_PLAYER_SPAWN); WriteInt (a_Player.GetUniqueID()); WriteString(a_Player.GetName()); WriteInt ((int)(a_Player.GetPosX() * 32)); WriteInt ((int)(a_Player.GetPosY() * 32)); WriteInt ((int)(a_Player.GetPosZ() * 32)); WriteChar ((char)((a_Player.GetYaw() / 360.f) * 256)); WriteChar ((char)((a_Player.GetPitch() / 360.f) * 256)); WriteShort (HeldItem.IsEmpty() ? 0 : HeldItem.m_ItemType); Flush(); }
void cProtocol132::SendCollectPickup(const cPickup & a_Pickup, const cPlayer & a_Player) { cCSLock Lock(m_CSPacket); WriteByte(PACKET_COLLECT_PICKUP); WriteInt (a_Pickup.GetUniqueID()); WriteInt (a_Player.GetUniqueID()); Flush(); // Also send the "pop" sound effect with a somewhat random pitch (fast-random using EntityID ;) SendSoundEffect( "random.pop", (int)(a_Pickup.GetPosX() * 8), (int)(a_Pickup.GetPosY() * 8), (int)(a_Pickup.GetPosZ() * 8), 0.5, (float)(0.75 + ((float)((a_Pickup.GetUniqueID() * 23) % 32)) / 64) ); }
void cProtocol125::SendLogin(const cPlayer & a_Player, const cWorld & a_World) { UNUSED(a_World); cCSLock Lock(m_CSPacket); WriteByte (PACKET_LOGIN); WriteInt (a_Player.GetUniqueID()); // EntityID of the player WriteString(""); // Username, not used WriteString("default"); // Level type WriteInt ((int)a_Player.GetGameMode()); WriteInt ((int)(a_World.GetDimension())); WriteByte (2); // TODO: Difficulty WriteByte (0); // Unused WriteByte (60); // Client list width or something Flush(); }
void cSlotAreaCrafting::OnPlayerRemoved(cPlayer & a_Player) { // Toss all items on the crafting grid: TossItems(a_Player, 1, m_NumSlots); // Remove the current recipe from the player -> recipe map: for (cRecipeMap::iterator itr = m_Recipes.begin(), end = m_Recipes.end(); itr != end; ++itr) { if (itr->first == a_Player.GetUniqueID()) { // Remove the player from the recipe map: m_Recipes.erase(itr); return; } } // for itr - m_Recipes[] // Player not found - that is acceptable }
void cHorse::OnRightClicked(cPlayer & a_Player) { super::OnRightClicked(a_Player); if (!m_bIsSaddled && m_bIsTame) { if (a_Player.GetEquippedItem().m_ItemType == E_ITEM_SADDLE) { // Saddle the horse: if (!a_Player.IsGameModeCreative()) { a_Player.GetInventory().RemoveOneEquippedItem(); } m_bIsSaddled = true; m_World->BroadcastEntityMetadata(*this); } else if (!a_Player.GetEquippedItem().IsEmpty()) { // The horse doesn't like being hit, make it rear: m_bIsRearing = true; m_RearTickCount = 0; } } else { if (m_Attachee != nullptr) { if (m_Attachee->GetUniqueID() == a_Player.GetUniqueID()) { a_Player.Detach(); return; } if (m_Attachee->IsPlayer()) { return; } m_Attachee->Detach(); } m_TameAttemptTimes++; a_Player.AttachTo(this); } }
void cSlotAreaTemporary::SetSlot(int a_SlotNum, cPlayer & a_Player, const cItem & a_Item) { cItemMap::iterator itr = m_Items.find(a_Player.GetUniqueID()); if (itr == m_Items.end()) { // Player not found LOGWARNING("cSlotAreaTemporary: player not found!"); return; } if (a_SlotNum >= (int)(itr->second.size())) { LOGERROR("cSlotAreaTemporary: asking for more slots than actually stored!"); return; } itr->second[a_SlotNum] = a_Item; }
void cProtocol132::SendPlayerSpawn(const cPlayer & a_Player) { const cItem & HeldItem = a_Player.GetEquippedItem(); cCSLock Lock(m_CSPacket); WriteByte (PACKET_PLAYER_SPAWN); WriteInt (a_Player.GetUniqueID()); WriteString(a_Player.GetName()); WriteInt ((int)(a_Player.GetPosX() * 32)); WriteInt ((int)(a_Player.GetPosY() * 32)); WriteInt ((int)(a_Player.GetPosZ() * 32)); WriteChar ((char)((a_Player.GetYaw() / 360.f) * 256)); WriteChar ((char)((a_Player.GetPitch() / 360.f) * 256)); WriteShort (HeldItem.IsEmpty() ? 0 : HeldItem.m_ItemType); // Player metadata: just use a default metadata value, since the client doesn't like starting without any metadata: WriteByte (0); // Index 0, byte (flags) WriteByte (0); // Flags, empty WriteByte (0x7f); // End of metadata Flush(); }
void cPig::OnRightClicked(cPlayer & a_Player) { super::OnRightClicked(a_Player); if (m_bIsSaddled) { if (m_Attachee != nullptr) { if (m_Attachee->GetUniqueID() == a_Player.GetUniqueID()) { // This player is already sitting in, they want out. a_Player.Detach(); return; } if (m_Attachee->IsPlayer()) { // Another player is already sitting in here, cannot attach return; } // Detach whatever is sitting in this pig now: m_Attachee->Detach(); } // Attach the player to this pig a_Player.AttachTo(this); } else if (a_Player.GetEquippedItem().m_ItemType == E_ITEM_SADDLE) { if (!a_Player.IsGameModeCreative()) { a_Player.GetInventory().RemoveOneEquippedItem(); } // Set saddle state & broadcast metadata m_bIsSaddled = true; m_World->BroadcastEntityMetadata(*this); } }
void cHorse::OnRightClicked(cPlayer & a_Player) { super::OnRightClicked(a_Player); if (m_bIsTame) { if (a_Player.IsCrouched()) { PlayerOpenWindow(a_Player); return; } auto EquipedItemType = a_Player.GetEquippedItem().m_ItemType; if ( !IsSaddled() && ( (EquipedItemType == E_ITEM_SADDLE) || ItemCategory::IsHorseArmor(EquipedItemType) ) ) { // Player is holding a horse inventory item, open the window: PlayerOpenWindow(a_Player); } else { a_Player.AttachTo(this); } } else if (a_Player.GetEquippedItem().IsEmpty()) { // Check if leashed / unleashed to player before try to ride if (!m_IsLeashActionJustDone) { if (m_Attachee != nullptr) { if (m_Attachee->GetUniqueID() == a_Player.GetUniqueID()) { a_Player.Detach(); return; } if (m_Attachee->IsPlayer()) { return; } m_Attachee->Detach(); } m_TameAttemptTimes++; a_Player.AttachTo(this); } } else { m_bIsRearing = true; m_RearTickCount = 0; m_World->BroadcastSoundEffect("entity.horse.angry", GetPosition(), 1.0f, 0.8f); } }
void cSlotAreaTemporary::OnPlayerAdded(cPlayer & a_Player) { ASSERT(m_Items.find(a_Player.GetUniqueID()) == m_Items.end()); // The player shouldn't be in the itemmap, otherwise we probably have a leak m_Items[a_Player.GetUniqueID()].resize(m_NumSlots); // Make the vector the specified size of empty items }
void cSlotAreaTemporary::OnPlayerRemoved(cPlayer & a_Player) { cItemMap::iterator itr = m_Items.find(a_Player.GetUniqueID()); ASSERT(itr != m_Items.end()); // The player should be in the list, otherwise a call to OnPlayerAdded() was mismatched m_Items.erase(itr); }