public function getChange()
{
$sourceItem = $this->getInventory()->getItem($this->slot);
if ($sourceItem->deepEquals($this->targetItem, true, true, true)) {
//This should never happen, somehow a change happened where nothing changed
return null;
} elseif ($sourceItem->deepEquals($this->targetItem)) {
//Same item, change of count
$item = clone $sourceItem;
$countDiff = $this->targetItem->getCount() - $sourceItem->getCount();
$item->setCount(abs($countDiff));
if ($countDiff < 0) {
//Count decreased
return ["in" => null, "out" => $item];
} elseif ($countDiff > 0) {
//Count increased
return ["in" => $item, "out" => null];
} else {
//Should be impossible (identical items and no count change)
//This should be caught by the first condition even if it was possible
return null;
}
} elseif ($sourceItem->getId() !== Item::AIR and $this->targetItem->getId() === Item::AIR) {
//Slot emptied (item removed)
return ["in" => null, "out" => clone $sourceItem];
} elseif ($sourceItem->getId() === Item::AIR and $this->targetItem->getId() !== Item::AIR) {
//Slot filled (item added)
return ["in" => $this->getTargetItem(), "out" => null];
} else {
//Some other slot change - an item swap (tool damage changes will be ignored as they are processed server-side before any change is sent by the client
return ["in" => $this->getTargetItem(), "out" => clone $sourceItem];
}
}