GenisysPro  for Minecraft PE/Windows 10 v1.1.x
Feature-rich server software for Minecraft PE and Windows 10 Edition
PlayerInventory Class Reference

Public Member Functions

 __construct (Human $player, $contents=null)
 
 getSize ()
 
 setSize ($size)
 
 getHotbarSlotIndex ($index)
 
 setHotbarSlotIndex ($index, $slot)
 
 getHeldItemIndex ()
 
 setHeldItemIndex ($hotbarSlotIndex, $sendToHolder=true, $slotMapping=null)
 
 getItemInHand ()
 
 setItemInHand (Item $item)
 
 getHotbar ()
 
 getHeldItemSlot ()
 
 setHeldItemSlot ($slot)
 
 sendHeldItem ($target)
 
 onSlotChange ($index, $before, $send)
 
 getHotbarSize ()
 
 getArmorItem ($index)
 
 setArmorItem ($index, Item $item)
 
 damageArmor ($index, $cost)
 
 getHelmet ()
 
 getChestplate ()
 
 getLeggings ()
 
 getBoots ()
 
 setHelmet (Item $helmet)
 
 setChestplate (Item $chestplate)
 
 setLeggings (Item $leggings)
 
 setBoots (Item $boots)
 
 setItem ($index, Item $item, $send=true)
 
 clear ($index, $send=true)
 
 getArmorContents ()
 
 clearAll ($send=true)
 
 sendArmorContents ($target)
 
 setArmorContents (array $items)
 
 sendContents ($target)
 
 getHolder ()
 
- Public Member Functions inherited from BaseInventory
 __construct (InventoryHolder $holder, InventoryType $type, array $items=[], $overrideSize=null, $overrideTitle=null)
 
 __destruct ()
 
 getSize ()
 
 getHotbarSize ()
 
 setSize ($size)
 
 getMaxStackSize ()
 
 getName ()
 
 getTitle ()
 
 getItem ($index)
 
 getContents ()
 
 setContents (array $items, $send=true)
 
 setItem ($index, Item $item, $send=true)
 
 contains (Item $item)
 
 slotContains ($slot, Item $item, $matchCount=false)
 
 all (Item $item)
 
 remove (Item $item, $send=true)
 
 first (Item $item)
 
 firstEmpty ()
 
 firstOccupied ()
 
 canAddItem (Item $item)
 
 clear ($index, $send=true)
 
 clearAll ($send=true)
 
 getViewers ()
 
 getHolder ()
 
 setMaxStackSize ($size)
 
 open (Player $who)
 
 close (Player $who)
 
 onOpen (Player $who)
 
 onClose (Player $who)
 
 onSlotChange ($index, $before, $send)
 
 processSlotChange (Transaction $transaction)
 
 sendContents ($target)
 
 sendSlot ($index, $target)
 
 getType ()
 
- Public Member Functions inherited from Inventory
 setItem ($index, Item $item)
 
 addItem (... $slots)
 
 removeItem (... $slots)
 
 setContents (array $items)
 
 remove (Item $item)
 
 clear ($index)
 
 clearAll ()
 

Protected Attributes

 $itemInHandIndex = 0
 
 $hotbar
 
- Protected Attributes inherited from BaseInventory
 $type
 
 $maxStackSize = Inventory::MAX_STACK
 
 $size
 
 $name
 
 $title
 
 $slots = []
 
 $viewers = []
 
 $holder
 

Additional Inherited Members

- Data Fields inherited from Inventory
const MAX_STACK = 64
 

Constructor & Destructor Documentation

◆ __construct()

__construct ( Human  $player,
  $contents = null 
)

PlayerInventory constructor.

Parameters
Human$player
null$contents
49  {
50  $this->hotbar = range(0, $this->getHotbarSize() - 1, 1);
51  parent::__construct($player, InventoryType::get(InventoryType::PLAYER));
52 
53  if($contents !== null){
54  if($contents instanceof ListTag){ //Saved data to be loaded into the inventory
55  foreach($contents as $item){
56  if($item["Slot"] >= 0 and $item["Slot"] < $this->getHotbarSize()){ //Hotbar
57  if(isset($item["TrueSlot"])){
58 
59  //Valid slot was found, change the linkage to this slot
60  if(0 <= $item["TrueSlot"] and $item["TrueSlot"] < $this->getSize()){
61  $this->hotbar[$item["Slot"]] = $item["TrueSlot"];
62 
63  }elseif($item["TrueSlot"] < 0){ //Link to an empty slot (empty hand)
64  $this->hotbar[$item["Slot"]] = -1;
65  }
66  }
67  /* If TrueSlot is not set, leave the slot index as its default which was filled in above
68  * This only overwrites slot indexes for valid links */
69  }elseif($item["Slot"] >= 100 and $item["Slot"] < 104){ //Armor
70  $this->setItem($this->getSize() + $item["Slot"] - 100, Item::nbtDeserialize($item), false);
71  }else{
72  $this->setItem($item["Slot"] - $this->getHotbarSize(), Item::nbtDeserialize($item), false);
73  }
74  }
75  }else{
76  throw new \InvalidArgumentException("Expecting ListTag, received " . gettype($contents));
77  }
78  }
79  }

Member Function Documentation

◆ clear()

clear (   $index,
  $send = true 
)
Parameters
int$index
bool$send
Returns
bool
432  {
433  if(isset($this->slots[$index])){
434  $item = Item::get(Item::AIR, 0, 0);
435  $old = $this->slots[$index];
436  if($index >= $this->getSize() and $index < $this->size){ //Armor change
437  Server::getInstance()->getPluginManager()->callEvent($ev = new EntityArmorChangeEvent($this->getHolder(), $old, $item, $index));
438  if($ev->isCancelled()){
439  if($index >= $this->size){
440  $this->sendArmorSlot($index, $this->getViewers());
441  }else{
442  $this->sendSlot($index, $this->getViewers());
443  }
444  return false;
445  }
446  $item = $ev->getNewItem();
447  }else{
448  Server::getInstance()->getPluginManager()->callEvent($ev = new EntityInventoryChangeEvent($this->getHolder(), $old, $item, $index));
449  if($ev->isCancelled()){
450  if($index >= $this->size){
451  $this->sendArmorSlot($index, $this->getViewers());
452  }else{
453  $this->sendSlot($index, $this->getViewers());
454  }
455  return false;
456  }
457  $item = $ev->getNewItem();
458  }
459  if($item->getId() !== Item::AIR){
460  $this->slots[$index] = clone $item;
461  }else{
462  unset($this->slots[$index]);
463  }
464 
465  $this->onSlotChange($index, $old, $send);
466  }
467 
468  return true;
469  }

◆ clearAll()

clearAll (   $send = true)
484  {
485  $limit = $this->getSize() + 4;
486  for($index = 0; $index < $limit; ++$index){
487  $this->clear($index, false);
488  }
489  $this->hotbar = range(0, $this->getHotbarSize() - 1, 1);
490  $this->sendContents($this->getViewers());
491  }

◆ damageArmor()

damageArmor (   $index,
  $cost 
)
Parameters
$index
$cost
316  {
317  $this->slots[$this->getSize() + $index]->useOn($this->slots[$this->getSize() + $index], $cost);
318  if($this->slots[$this->getSize() + $index]->getDamage() >= $this->slots[$this->getSize() + $index]->getMaxDurability()){
319  $this->setItem($this->getSize() + $index, Item::get(Item::AIR, 0, 0));
320  }
321  $this->sendArmorContents($this->getViewers());
322  }

◆ getArmorContents()

getArmorContents ( )
Returns
Item[]
474  {
475  $armor = [];
476 
477  for($i = 0; $i < 4; ++$i){
478  $armor[$i] = $this->getItem($this->getSize() + $i);
479  }
480 
481  return $armor;
482  }

◆ getArmorItem()

getArmorItem (   $index)
Parameters
$index
Returns
Item
298  {
299  return $this->getItem($this->getSize() + $index);
300  }

◆ getBoots()

getBoots ( )
Returns
Item
348  {
349  return $this->getItem($this->getSize() + 3);
350  }

◆ getChestplate()

getChestplate ( )
Returns
Item
334  {
335  return $this->getItem($this->getSize() + 1);
336  }

◆ getHeldItemIndex()

getHeldItemIndex ( )
Returns
int

Returns the index of the inventory slot the player is currently holding

126  {
127  return $this->itemInHandIndex;
128  }

◆ getHeldItemSlot()

getHeldItemSlot ( )
Returns
int

Returns the inventory slot index of the currently equipped slot

222  {
223  return $this->getHotbarSlotIndex($this->itemInHandIndex);
224  }

◆ getHelmet()

getHelmet ( )
Returns
Item
327  {
328  return $this->getItem($this->getSize());
329  }

◆ getHolder()

getHolder ( )
Returns
Human|Player

Implements Inventory.

640  {
641  return parent::getHolder();
642  }

◆ getHotbar()

getHotbar ( )
Returns
int[]

Returns an array of hotbar indices

213  {
214  return $this->hotbar;
215  }

◆ getHotbarSize()

getHotbarSize ( )
Returns
int
289  {
290  return 9;
291  }

◆ getHotbarSlotIndex()

getHotbarSlotIndex (   $index)
Parameters
int$index
Returns
int

Returns the index of the inventory slot linked to the specified hotbar slot

103  {
104  return ($index >= 0 and $index < $this->getHotbarSize()) ? $this->hotbar[$index] : -1;
105  }

◆ getItemInHand()

getItemInHand ( )
Returns
Item

Returns the item the player is currently holding

188  {
189  $item = $this->getItem($this->getHeldItemSlot());
190  if($item instanceof Item){
191  return $item;
192  }else{
193  return Item::get(Item::AIR, 0, 0);
194  }
195  }

◆ getLeggings()

getLeggings ( )
Returns
Item
341  {
342  return $this->getItem($this->getSize() + 2);
343  }

◆ getSize()

getSize ( )
Returns
int

Implements Inventory.

84  {
85  return parent::getSize() - 4; //Remove armor slots
86  }

◆ onSlotChange()

onSlotChange (   $index,
  $before,
  $send 
)
Parameters
int$index
Item$before
bool$send

Implements Inventory.

265  {
266  if($send){
267  $holder = $this->getHolder();
268  if(!$holder instanceof Player or !$holder->spawned){
269  return;
270  }
271 
272  parent::onSlotChange($index, $before, $send);
273  }
274  if($index === $this->itemInHandIndex){
275  $this->sendHeldItem($this->getHolder()->getViewers());
276  if($send){
277  $this->sendHeldItem($this->getHolder());
278  }
279 
280  }elseif($index >= $this->getSize()){ //Armour equipment
281  $this->sendArmorSlot($index, $this->getViewers());
282  $this->sendArmorSlot($index, $this->getHolder()->getViewers());
283  }
284  }

◆ sendArmorContents()

sendArmorContents (   $target)
Parameters
Player|Player[]$target
496  {
497  if($target instanceof Player){
498  $target = [$target];
499  }
500 
501  $armor = $this->getArmorContents();
502 
503  $pk = new MobArmorEquipmentPacket();
504  $pk->eid = $this->getHolder()->getId();
505  $pk->slots = $armor;
506  $pk->encode();
507  $pk->isEncoded = true;
508 
509  foreach($target as $player){
510  if($player === $this->getHolder()){
511  $pk2 = new ContainerSetContentPacket();
513  $pk2->slots = $armor;
514  $pk2->targetEid = $player->getId();
515  $player->dataPacket($pk2);
516  }else{
517  $player->dataPacket($pk);
518  }
519  }
520  }

◆ sendContents()

sendContents (   $target)
Parameters
Player|Player[]$target

Implements Inventory.

574  {
575  if($target instanceof Player){
576  $target = [$target];
577  }
578 
579  $pk = new ContainerSetContentPacket();
580  $pk->slots = [];
581  for($i = 0; $i < $this->getSize(); ++$i){ //Do not send armor by error here
582  $pk->slots[$i] = $this->getItem($i);
583  }
584 
585  //Because PE is stupid and shows 9 less slots than you send it, give it 9 dummy slots so it shows all the REAL slots.
586  for($i = $this->getSize(); $i < $this->getSize() + $this->getHotbarSize(); ++$i){
587  $pk->slots[$i] = Item::get(Item::AIR, 0, 0);
588  }
589 
590  foreach($target as $player){
591  $pk->hotbar = [];
592  if($player === $this->getHolder()){
593  for($i = 0; $i < $this->getHotbarSize(); ++$i){
594  $index = $this->getHotbarSlotIndex($i);
595  $pk->hotbar[$i] = $index <= -1 ? -1 : $index + $this->getHotbarSize();
596  }
597  }
598  if(($id = $player->getWindowId($this)) === -1 or $player->spawned !== true){
599  $this->close($player);
600  continue;
601  }
602  $pk->windowid = $id;
603  $pk->targetEid = $player->getId();
604  $player->dataPacket(clone $pk);
605  }
606  }

◆ sendHeldItem()

sendHeldItem (   $target)
Parameters
Player|Player[]$target
237  {
238  $item = $this->getItemInHand();
239 
240  $pk = new MobEquipmentPacket();
241  $pk->eid = $this->getHolder()->getId();
242  $pk->item = $item;
243  $pk->slot = $this->getHeldItemSlot();
244  $pk->selectedSlot = $this->getHeldItemIndex();
246 
247  if(!is_array($target)){
248  $target->dataPacket($pk);
249  if($this->getHeldItemSlot() !== -1 and $target === $this->getHolder()){
250  $this->sendSlot($this->getHeldItemSlot(), $target);
251  }
252  }else{
253  $this->getHolder()->getLevel()->getServer()->broadcastPacket($target, $pk);
254  if($this->getHeldItemSlot() !== -1 and in_array($this->getHolder(), $target)){
255  $this->sendSlot($this->getHeldItemSlot(), $this->getHolder());
256  }
257  }
258  }

◆ setArmorContents()

setArmorContents ( array  $items)
Parameters
Item[]$items
525  {
526  for($i = 0; $i < 4; ++$i){
527  if(!isset($items[$i]) or !($items[$i] instanceof Item)){
528  $items[$i] = Item::get(Item::AIR, 0, 0);
529  }
530 
531  if($items[$i]->getId() === Item::AIR){
532  $this->clear($this->getSize() + $i);
533  }else{
534  $this->setItem($this->getSize() + $i, $items[$i]);
535  }
536  }
537  }

◆ setArmorItem()

setArmorItem (   $index,
Item  $item 
)
Parameters
$index
Item$item
Returns
bool
308  {
309  return $this->setItem($this->getSize() + $index, $item);
310  }

◆ setBoots()

setBoots ( Item  $boots)
Parameters
Item$boots
Returns
bool
384  {
385  return $this->setItem($this->getSize() + 3, $boots);
386  }

◆ setChestplate()

setChestplate ( Item  $chestplate)
Parameters
Item$chestplate
Returns
bool
366  {
367  return $this->setItem($this->getSize() + 1, $chestplate);
368  }

◆ setHeldItemIndex()

setHeldItemIndex (   $hotbarSlotIndex,
  $sendToHolder = true,
  $slotMapping = null 
)
Parameters
int$hotbarSlotIndex
bool$sendToHolder
int$slotMappingSets which hotbar slot the player is currently holding. Allows slot remapping as specified by a MobEquipmentPacket. DO NOT CHANGE SLOT MAPPING IN PLUGINS! This new implementation is fully compatible with older APIs. NOTE: Slot mapping is the raw slot index sent by MCPE, which will be between 9 and 44.
140  {
141  if($slotMapping !== null){
142  //Get the index of the slot in the actual inventory
143  $slotMapping -= $this->getHotbarSize();
144  }
145  if(0 <= $hotbarSlotIndex and $hotbarSlotIndex < $this->getHotbarSize()){
146  $this->itemInHandIndex = $hotbarSlotIndex;
147  if($slotMapping !== null){
148  /* Handle a hotbar slot mapping change. This allows PE to select different inventory slots.
149  * This is the only time slot mapping should ever be changed. */
150 
151  if($slotMapping < 0 or $slotMapping >= $this->getSize()){
152  //Mapping was not in range of the inventory, set it to -1
153  //This happens if the client selected a blank slot (sends 255)
154  $slotMapping = -1;
155  }
156 
157  $item = $this->getItem($slotMapping);
158  if($this->getHolder() instanceof Player){
159  Server::getInstance()->getPluginManager()->callEvent($ev = new PlayerItemHeldEvent($this->getHolder(), $item, $slotMapping, $hotbarSlotIndex));
160  if($ev->isCancelled()){
161  $this->sendHeldItem($this->getHolder());
162  $this->sendContents($this->getHolder());
163  return;
164  }
165  }
166 
167  if(($key = array_search($slotMapping, $this->hotbar)) !== false and $slotMapping !== -1){
168  /* Do not do slot swaps if the slot was null
169  * Chosen slot is already linked to a hotbar slot, swap the two slots around.
170  * This will already have been done on the client-side so no changes need to be sent. */
171  $this->hotbar[$key] = $this->hotbar[$this->itemInHandIndex];
172  }
173 
174  $this->hotbar[$this->itemInHandIndex] = $slotMapping;
175  }
176  $this->sendHeldItem($this->getHolder()->getViewers());
177  if($sendToHolder){
178  $this->sendHeldItem($this->getHolder());
179  }
180  }
181  }

◆ setHeldItemSlot()

setHeldItemSlot (   $slot)
Deprecated:
Parameters
int$slot
231  {
232  }

◆ setHelmet()

setHelmet ( Item  $helmet)
Parameters
Item$helmet
Returns
bool
357  {
358  return $this->setItem($this->getSize(), $helmet);
359  }

◆ setHotbarSlotIndex()

setHotbarSlotIndex (   $index,
  $slot 
)
Deprecated:

Changes the linkage of the specified hotbar slot. This should never be done unless it is requested by the client.

Parameters
int$index
int$slot
115  {
116  if($this->getHolder()->getServer()->getProperty("settings.deprecated-verbose") !== false){
117  trigger_error("Do not attempt to change hotbar links in plugins!", E_USER_DEPRECATED);
118  }
119  }

◆ setItem()

setItem (   $index,
Item  $item,
  $send = true 
)
Parameters
int$index
Item$item
bool$send
Returns
bool
395  {
396  if($index < 0 or $index >= $this->size){
397  return false;
398  }elseif($item->getId() === 0 or $item->getCount() <= 0){
399  return $this->clear($index, $send);
400  }
401 
402  if($index >= $this->getSize()){ //Armor change
403  Server::getInstance()->getPluginManager()->callEvent($ev = new EntityArmorChangeEvent($this->getHolder(), $this->getItem($index), $item, $index));
404  if($ev->isCancelled() and $this->getHolder() instanceof Human){
405  $this->sendArmorSlot($index, $this->getViewers());
406  return false;
407  }
408  $item = $ev->getNewItem();
409  }else{
410  Server::getInstance()->getPluginManager()->callEvent($ev = new EntityInventoryChangeEvent($this->getHolder(), $this->getItem($index), $item, $index));
411  if($ev->isCancelled()){
412  $this->sendSlot($index, $this->getViewers());
413  return false;
414  }
415  $item = $ev->getNewItem();
416  }
417 
418 
419  $old = $this->getItem($index);
420  $this->slots[$index] = clone $item;
421  $this->onSlotChange($index, $old, $send);
422 
423  return true;
424  }

◆ setItemInHand()

setItemInHand ( Item  $item)
Parameters
Item$item
Returns
bool

Sets the item in the inventory slot the player is currently holding.

204  {
205  return $this->setItem($this->getHeldItemSlot(), $item);
206  }

◆ setLeggings()

setLeggings ( Item  $leggings)
Parameters
Item$leggings
Returns
bool
375  {
376  return $this->setItem($this->getSize() + 2, $leggings);
377  }

◆ setSize()

setSize (   $size)
Parameters
$size
91  {
92  parent::setSize($size + 4);
93  $this->sendContents($this->getViewers());
94  }

Field Documentation

◆ $hotbar

$hotbar
protected

◆ $itemInHandIndex

$itemInHandIndex = 0
protected

The documentation for this class was generated from the following file: