mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-15 18:29:46 +00:00
moar changes
This commit is contained in:
parent
224fa09327
commit
39662bdc3b
@ -145,7 +145,7 @@ abstract class BaseSign extends Transparent{
|
||||
|
||||
private function changeSignGlowingState(bool $glowing, Player $player, Item $item) : bool{
|
||||
if($this->text->isGlowing() !== $glowing && $this->doSignChange(new SignText($this->text->getLines(), $this->text->getBaseColor(), $glowing), $player, $item)){
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new InkSacUseSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new InkSacUseSound());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -183,7 +183,7 @@ abstract class BaseSign extends Transparent{
|
||||
$color->toARGB() !== $this->text->getBaseColor()->toARGB() &&
|
||||
$this->doSignChange(new SignText($this->text->getLines(), $color, $this->text->isGlowing()), $player, $item)
|
||||
){
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new DyeUseSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new DyeUseSound());
|
||||
return true;
|
||||
}
|
||||
}elseif(match($item->getTypeId()){
|
||||
|
@ -128,7 +128,7 @@ class Bed extends Transparent{
|
||||
$player->sendMessage(TextFormat::GRAY . "This bed is incomplete");
|
||||
|
||||
return true;
|
||||
}elseif($playerPos->distanceSquared($this->position->asVector3()) > 4 && $playerPos->distanceSquared($other->position->asVector3()) > 4){
|
||||
}elseif($playerPos->distanceSquared($this->position->center()) > 4 && $playerPos->distanceSquared($other->position->center()) > 4){
|
||||
$player->sendMessage(KnownTranslationFactory::tile_bed_tooFar()->prefix(TextFormat::GRAY));
|
||||
return true;
|
||||
}
|
||||
|
@ -143,10 +143,10 @@ final class Bell extends Transparent{
|
||||
|
||||
public function ring(int $faceHit) : void{
|
||||
$world = $this->position->getWorld();
|
||||
$world->addSound($this->position->asVector3(), new BellRingSound());
|
||||
$world->addSound($this->position->center(), new BellRingSound());
|
||||
$tile = $world->getTile($this->position);
|
||||
if($tile instanceof TileBell){
|
||||
$world->broadcastPacketToViewers($this->position->asVector3(), $tile->createFakeUpdatePacket($faceHit));
|
||||
$world->broadcastPacketOnBlock($this->position, $tile->createFakeUpdatePacket($faceHit));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -93,7 +93,7 @@ class BigDripleafHead extends BaseBigDripleaf{
|
||||
public function onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void{
|
||||
if($this->leafState !== DripleafState::FULL_TILT){
|
||||
$this->setTiltAndScheduleTick(DripleafState::FULL_TILT);
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new DripleafTiltDownSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new DripleafTiltDownSound());
|
||||
}
|
||||
}
|
||||
|
||||
@ -101,13 +101,13 @@ class BigDripleafHead extends BaseBigDripleaf{
|
||||
if($this->leafState !== DripleafState::STABLE){
|
||||
if($this->leafState === DripleafState::FULL_TILT){
|
||||
$this->position->getWorld()->setBlock($this->position, $this->setLeafState(DripleafState::STABLE));
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new DripleafTiltUpSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new DripleafTiltUpSound());
|
||||
}else{
|
||||
$this->setTiltAndScheduleTick(match($this->leafState){
|
||||
DripleafState::UNSTABLE => DripleafState::PARTIAL_TILT,
|
||||
DripleafState::PARTIAL_TILT => DripleafState::FULL_TILT,
|
||||
});
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new DripleafTiltDownSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new DripleafTiltDownSound());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -398,7 +398,7 @@ class Block{
|
||||
* @var Tile $tile
|
||||
* @see Tile::__construct()
|
||||
*/
|
||||
$tile = new $tileType($world, $this->position->asVector3());
|
||||
$tile = new $tileType($this->position);
|
||||
$world->addTile($tile);
|
||||
}
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ abstract class Button extends Flowable{
|
||||
$world = $this->position->getWorld();
|
||||
$world->setBlock($this->position, $this);
|
||||
$world->scheduleDelayedBlockUpdate($this->position, $this->getActivationTime());
|
||||
$world->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), new RedstonePowerOnSound());
|
||||
$world->addSound($this->position->center(), new RedstonePowerOnSound());
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -78,7 +78,7 @@ abstract class Button extends Flowable{
|
||||
$this->pressed = false;
|
||||
$world = $this->position->getWorld();
|
||||
$world->setBlock($this->position, $this);
|
||||
$world->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), new RedstonePowerOffSound());
|
||||
$world->addSound($this->position->center(), new RedstonePowerOffSound());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -76,6 +76,6 @@ class CakeWithCandle extends BaseCake{
|
||||
|
||||
public function onConsume(Living $consumer) : void{
|
||||
parent::onConsume($consumer);
|
||||
$this->position->getWorld()->dropItem($this->position->asVector3()->add(0.5, 0.5, 0.5), $this->getCandle()->asItem());
|
||||
$this->position->getWorld()->dropItem($this->position->center(), $this->getCandle()->asItem());
|
||||
}
|
||||
}
|
||||
|
@ -185,7 +185,7 @@ class Campfire extends Transparent{
|
||||
if($item->getTypeId() === ItemTypeIds::FIRE_CHARGE){
|
||||
$item->pop();
|
||||
$this->ignite();
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new BlazeShootSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new BlazeShootSound());
|
||||
return true;
|
||||
}elseif($item->getTypeId() === ItemTypeIds::FLINT_AND_STEEL || $item->hasEnchantment(VanillaEnchantments::FIRE_ASPECT())){
|
||||
if($item instanceof Durable){
|
||||
@ -205,7 +205,7 @@ class Campfire extends Transparent{
|
||||
$ingredient->setCount(1);
|
||||
if(count($this->inventory->addItem($ingredient)) === 0){
|
||||
$item->pop();
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new ItemFrameAddItemSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new ItemFrameAddItemSound());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -266,19 +266,19 @@ class Campfire extends Transparent{
|
||||
$this->position->getWorld()->setBlock($this->position, $this);
|
||||
}
|
||||
if(mt_rand(1, 6) === 1){
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), $furnaceType->getCookSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), $furnaceType->getCookSound());
|
||||
}
|
||||
$this->position->getWorld()->scheduleDelayedBlockUpdate($this->position, self::UPDATE_INTERVAL_TICKS);
|
||||
}
|
||||
}
|
||||
|
||||
private function extinguish() : void{
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new FireExtinguishSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new FireExtinguishSound());
|
||||
$this->position->getWorld()->setBlock($this->position, $this->setLit(false));
|
||||
}
|
||||
|
||||
private function ignite() : void{
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new FlintSteelSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new FlintSteelSound());
|
||||
$this->position->getWorld()->setBlock($this->position, $this->setLit(true));
|
||||
$this->position->getWorld()->scheduleDelayedBlockUpdate($this->position, self::UPDATE_INTERVAL_TICKS);
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ final class Cauldron extends Transparent{
|
||||
*/
|
||||
private function fill(int $amount, FillableCauldron $result, Item $usedItem, Item $returnedItem, array &$returnedItems) : void{
|
||||
$this->position->getWorld()->setBlock($this->position, $result->setFillLevel($amount));
|
||||
$this->position->getWorld()->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), $result->getFillSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), $result->getFillSound());
|
||||
|
||||
$usedItem->pop();
|
||||
$returnedItems[] = $returnedItem;
|
||||
@ -98,7 +98,7 @@ final class Cauldron extends Transparent{
|
||||
if($this->getSide(Facing::UP)->getTypeId() === BlockTypeIds::WATER){
|
||||
$cauldron = VanillaBlocks::WATER_CAULDRON()->setFillLevel(FillableCauldron::MAX_FILL_LEVEL);
|
||||
$world->setBlock($this->position, $cauldron);
|
||||
$world->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), $cauldron->getFillSound());
|
||||
$world->addSound($this->position->center(), $cauldron->getFillSound());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -90,8 +90,8 @@ class CaveVines extends Flowable{
|
||||
|
||||
public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{
|
||||
if($this->berries){
|
||||
$this->position->getWorld()->dropItem($this->position->asVector3(), $this->asItem());
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new GlowBerriesPickSound());
|
||||
$this->position->getWorld()->dropItem($this->position->center(), $this->asItem());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new GlowBerriesPickSound());
|
||||
|
||||
$this->position->getWorld()->setBlock($this->position, $this->setBerries(false));
|
||||
return true;
|
||||
|
@ -192,10 +192,10 @@ final class ChorusFlower extends Flowable{
|
||||
$ev = new StructureGrowEvent($this, $tx, null);
|
||||
$ev->call();
|
||||
if(!$ev->isCancelled() && $tx->apply()){
|
||||
$world->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), new ChorusFlowerGrowSound());
|
||||
$world->addSound($this->position->center(), new ChorusFlowerGrowSound());
|
||||
}
|
||||
}else{
|
||||
$world->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), new ChorusFlowerDieSound());
|
||||
$world->addSound($this->position->center(), new ChorusFlowerDieSound());
|
||||
$this->position->getWorld()->setBlock($this->position, $this->setAge(self::MAX_AGE));
|
||||
}
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ class Dirt extends Opaque{
|
||||
$item->applyDamage(1);
|
||||
|
||||
$newBlock = $this->dirtType === DirtType::NORMAL ? VanillaBlocks::FARMLAND() : VanillaBlocks::DIRT();
|
||||
$center = $this->position->asVector3()->add(0.5, 0.5, 0.5);
|
||||
$center = $this->position->center();
|
||||
$world->addSound($center, new ItemUseOnBlockSound($newBlock));
|
||||
$world->setBlock($this->position, $newBlock);
|
||||
if($this->dirtType === DirtType::ROOTED){
|
||||
@ -83,7 +83,7 @@ class Dirt extends Opaque{
|
||||
}elseif(($item instanceof Potion || $item instanceof SplashPotion) && $item->getType() === PotionType::WATER){
|
||||
$item->pop();
|
||||
$world->setBlock($this->position, VanillaBlocks::MUD());
|
||||
$world->addSound($this->position->asVector3(), new WaterSplashSound(0.5));
|
||||
$world->addSound($this->position->center(), new WaterSplashSound(0.5));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -152,7 +152,7 @@ class Door extends Transparent{
|
||||
}
|
||||
|
||||
$world->setBlock($this->position, $this);
|
||||
$world->addSound($this->position->asVector3(), new DoorSound());
|
||||
$world->addSound($this->position->center(), new DoorSound());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -74,7 +74,7 @@ class DragonEgg extends Transparent implements Fallable{
|
||||
}
|
||||
|
||||
$blockPos = $ev->getTo();
|
||||
$world->addParticle($this->position->asVector3(), new DragonEggTeleportParticle($this->position->x - $blockPos->getFloorX(), $this->position->y - $blockPos->getFloorY(), $this->position->z - $blockPos->getFloorZ()));
|
||||
$world->addParticle($this->position->center(), new DragonEggTeleportParticle($this->position->x - $blockPos->getFloorX(), $this->position->y - $blockPos->getFloorY(), $this->position->z - $blockPos->getFloorZ()));
|
||||
$world->setBlock($this->position, VanillaBlocks::AIR());
|
||||
$world->setBlockAt($blockPos->getFloorX(), $blockPos->getFloorY(), $blockPos->getFloorZ(), $this);
|
||||
break;
|
||||
|
@ -111,7 +111,7 @@ class FenceGate extends Transparent{
|
||||
|
||||
$world = $this->position->getWorld();
|
||||
$world->setBlock($this->position, $this);
|
||||
$world->addSound($this->position->asVector3(), new DoorSound());
|
||||
$world->addSound($this->position->center(), new DoorSound());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -79,7 +79,7 @@ abstract class FillableCauldron extends Transparent{
|
||||
return;
|
||||
}
|
||||
$this->position->getWorld()->setBlock($this->position, $this->withFillLevel($this->fillLevel + $amount));
|
||||
$this->position->getWorld()->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), $this->getFillSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), $this->getFillSound());
|
||||
|
||||
$usedItem->pop();
|
||||
$returnedItems[] = $returnedItem;
|
||||
@ -94,7 +94,7 @@ abstract class FillableCauldron extends Transparent{
|
||||
}
|
||||
|
||||
$this->position->getWorld()->setBlock($this->position, $this->withFillLevel($this->fillLevel - $amount));
|
||||
$this->position->getWorld()->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), $this->getEmptySound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), $this->getEmptySound());
|
||||
|
||||
$usedItem->pop();
|
||||
$returnedItems[] = $returnedItem;
|
||||
|
@ -111,7 +111,7 @@ class FlowerPot extends Flowable{
|
||||
$removedItems = $player->getInventory()->addItem(...$removedItems);
|
||||
}
|
||||
foreach($removedItems as $drops){
|
||||
$world->dropItem($this->position->asVector3()->add(0.5, 0.5, 0.5), $drops);
|
||||
$world->dropItem($this->position->center(), $drops);
|
||||
}
|
||||
|
||||
$this->setPlant(null);
|
||||
|
@ -73,7 +73,7 @@ class Furnace extends Opaque{
|
||||
$furnace = $world->getTile($this->position);
|
||||
if($furnace instanceof TileFurnace && $furnace->onUpdate()){
|
||||
if(mt_rand(1, 60) === 1){ //in vanilla this is between 1 and 5 seconds; try to average about 3
|
||||
$world->addSound($this->position->asVector3(), $furnace->getFurnaceType()->getCookSound());
|
||||
$world->addSound($this->position->center(), $furnace->getFurnaceType()->getCookSound());
|
||||
}
|
||||
$world->scheduleDelayedBlockUpdate($this->position, 1); //TODO: check this
|
||||
}
|
||||
|
@ -88,7 +88,7 @@ class Grass extends Opaque{
|
||||
$world = $this->position->getWorld();
|
||||
if($item instanceof Fertilizer){
|
||||
$item->pop();
|
||||
TallGrassObject::growGrass($world, $this->position->asVector3(), new Random(mt_rand()), 8, 2);
|
||||
TallGrassObject::growGrass($world, $this->position->center(), new Random(mt_rand()), 8, 2);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -96,14 +96,14 @@ class Grass extends Opaque{
|
||||
if($item instanceof Hoe){
|
||||
$item->applyDamage(1);
|
||||
$newBlock = VanillaBlocks::FARMLAND();
|
||||
$world->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), new ItemUseOnBlockSound($newBlock));
|
||||
$world->addSound($this->position->center(), new ItemUseOnBlockSound($newBlock));
|
||||
$world->setBlock($this->position, $newBlock);
|
||||
|
||||
return true;
|
||||
}elseif($item instanceof Shovel){
|
||||
$item->applyDamage(1);
|
||||
$newBlock = VanillaBlocks::GRASS_PATH();
|
||||
$world->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), new ItemUseOnBlockSound($newBlock));
|
||||
$world->addSound($this->position->center(), new ItemUseOnBlockSound($newBlock));
|
||||
$world->setBlock($this->position, $newBlock);
|
||||
|
||||
return true;
|
||||
|
@ -135,11 +135,11 @@ class ItemFrame extends Flowable{
|
||||
if($this->framedItem !== null){
|
||||
$this->itemRotation = ($this->itemRotation + 1) % self::ROTATIONS;
|
||||
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new ItemFrameRotateItemSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new ItemFrameRotateItemSound());
|
||||
}elseif(!$item->isNull()){
|
||||
$this->framedItem = $item->pop();
|
||||
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new ItemFrameAddItemSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new ItemFrameAddItemSound());
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
@ -155,8 +155,8 @@ class ItemFrame extends Flowable{
|
||||
}
|
||||
$world = $this->position->getWorld();
|
||||
if(Utils::getRandomFloat() <= $this->itemDropChance){
|
||||
$world->dropItem($this->position->asVector3()->add(0.5, 0.5, 0.5), clone $this->framedItem);
|
||||
$world->addSound($this->position->asVector3(), new ItemFrameRemoveItemSound());
|
||||
$world->dropItem($this->position->center(), clone $this->framedItem);
|
||||
$world->addSound($this->position->center(), new ItemFrameRemoveItemSound());
|
||||
}
|
||||
$this->setFramedItem(null);
|
||||
$world->setBlock($this->position, $this);
|
||||
|
@ -76,12 +76,12 @@ class Jukebox extends Opaque{
|
||||
|
||||
public function startSound() : void{
|
||||
if($this->record !== null){
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new RecordSound($this->record->getRecordType()));
|
||||
$this->position->getWorld()->addSound($this->position->center(), new RecordSound($this->record->getRecordType()));
|
||||
}
|
||||
}
|
||||
|
||||
public function stopSound() : void{
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new RecordStopSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new RecordStopSound());
|
||||
}
|
||||
|
||||
public function onBreak(Item $item, ?Player $player = null, array &$returnedItems = []) : bool{
|
||||
|
@ -123,7 +123,7 @@ class Lectern extends Transparent{
|
||||
if($this->book === null && $item instanceof WritableBookBase){
|
||||
$world = $this->position->getWorld();
|
||||
$world->setBlock($this->position, $this->setBook($item));
|
||||
$world->addSound($this->position->asVector3(), new LecternPlaceBookSound());
|
||||
$world->addSound($this->position->center(), new LecternPlaceBookSound());
|
||||
$item->pop();
|
||||
}
|
||||
return true;
|
||||
@ -132,7 +132,7 @@ class Lectern extends Transparent{
|
||||
public function onAttack(Item $item, int $face, ?Player $player = null) : bool{
|
||||
if($this->book !== null){
|
||||
$world = $this->position->getWorld();
|
||||
$world->dropItem($this->position->getSide(Facing::UP)->asVector3(), $this->book);
|
||||
$world->dropItem($this->position->getSide(Facing::UP)->center(), $this->book);
|
||||
$world->setBlock($this->position, $this->setBook(null));
|
||||
}
|
||||
return false;
|
||||
|
@ -95,7 +95,7 @@ class Lever extends Flowable{
|
||||
$world = $this->position->getWorld();
|
||||
$world->setBlock($this->position, $this);
|
||||
$world->addSound(
|
||||
$this->position->asVector3()->add(0.5, 0.5, 0.5),
|
||||
$this->position->center(),
|
||||
$this->activated ? new RedstonePowerOnSound() : new RedstonePowerOffSound()
|
||||
);
|
||||
return true;
|
||||
|
@ -368,7 +368,7 @@ abstract class Liquid extends Transparent{
|
||||
|
||||
protected function liquidCollide(Block $cause, Block $result) : bool{
|
||||
if(BlockEventHelper::form($this, $result, $cause)){
|
||||
$this->position->getWorld()->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), new FizzSound(2.6 + (Utils::getRandomFloat() - Utils::getRandomFloat()) * 0.8));
|
||||
$this->position->getWorld()->addSound($this->position->center(), new FizzSound(2.6 + (Utils::getRandomFloat() - Utils::getRandomFloat()) * 0.8));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -89,7 +89,7 @@ class PinkPetals extends Flowable{
|
||||
if($this->count < self::MAX_COUNT){
|
||||
$grew = BlockEventHelper::grow($this, (clone $this)->setCount($this->count + 1), $player);
|
||||
}else{
|
||||
$this->position->getWorld()->dropItem($this->position->asVector3()->add(0, 0.5, 0), $this->asItem());
|
||||
$this->position->getWorld()->dropItem($this->position->center(), $this->asItem());
|
||||
$grew = true;
|
||||
}
|
||||
if($grew){
|
||||
|
@ -111,7 +111,7 @@ final class PotionCauldron extends FillableCauldron{
|
||||
if($this->getSide(Facing::UP)->getTypeId() === BlockTypeIds::WATER){
|
||||
$cauldron = VanillaBlocks::WATER_CAULDRON()->setFillLevel(FillableCauldron::MAX_FILL_LEVEL);
|
||||
$world->setBlock($this->position, $cauldron);
|
||||
$world->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), $cauldron->getFillSound());
|
||||
$world->addSound($this->position->center(), $cauldron->getFillSound());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -139,7 +139,7 @@ abstract class PressurePlate extends Transparent{
|
||||
if($newState !== null){
|
||||
$world->setBlock($this->position, $newState);
|
||||
if($pressedChange !== null){
|
||||
$world->addSound($this->position->asVector3(), $pressedChange ?
|
||||
$world->addSound($this->position->center(), $pressedChange ?
|
||||
new PressurePlateActivateSound($this) :
|
||||
new PressurePlateDeactivateSound($this)
|
||||
);
|
||||
|
@ -38,7 +38,7 @@ class Pumpkin extends Opaque{
|
||||
$item->applyDamage(1);
|
||||
$world = $this->position->getWorld();
|
||||
$world->setBlock($this->position, VanillaBlocks::CARVED_PUMPKIN()->setFacing($face));
|
||||
$world->dropItem($this->position->asVector3()->add(0.5, 0.5, 0.5), VanillaItems::PUMPKIN_SEEDS()->setCount(1));
|
||||
$world->dropItem($this->position->center(), VanillaItems::PUMPKIN_SEEDS()->setCount(1));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -81,7 +81,7 @@ class SweetBerryBush extends Flowable{
|
||||
}
|
||||
}elseif(($dropAmount = $this->getBerryDropAmount()) > 0){
|
||||
$world->setBlock($this->position, $this->setAge(self::STAGE_BUSH_NO_BERRIES));
|
||||
$posV3 = $this->position->asVector3();
|
||||
$posV3 = $this->position->center();
|
||||
$world->dropItem($posV3, $this->asItem()->setCount($dropAmount));
|
||||
$world->addSound($posV3, new SweetBerriesPickSound());
|
||||
}
|
||||
|
@ -88,7 +88,7 @@ class Trapdoor extends Transparent{
|
||||
$this->open = !$this->open;
|
||||
$world = $this->position->getWorld();
|
||||
$world->setBlock($this->position, $this);
|
||||
$world->addSound($this->position->asVector3(), new DoorSound());
|
||||
$world->addSound($this->position->center(), new DoorSound());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -120,7 +120,7 @@ final class WaterCauldron extends FillableCauldron{
|
||||
}) !== null && ($newColor = $dyeColor->getRgbValue())->toRGBA() !== $this->customWaterColor?->toRGBA()
|
||||
){
|
||||
$world->setBlock($this->position, $this->setCustomWaterColor($this->customWaterColor === null ? $newColor : Color::mix($this->customWaterColor, $newColor)));
|
||||
$world->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), new CauldronAddDyeSound());
|
||||
$world->addSound($this->position->center(), new CauldronAddDyeSound());
|
||||
|
||||
$item->pop();
|
||||
}elseif($item instanceof Potion || $item instanceof SplashPotion){ //TODO: lingering potion
|
||||
@ -140,12 +140,12 @@ final class WaterCauldron extends FillableCauldron{
|
||||
} && $item->getCustomColor()?->toRGBA() !== $this->customWaterColor->toRGBA()){
|
||||
$item->setCustomColor($this->customWaterColor);
|
||||
$world->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::DYE_ARMOR_USE_AMOUNT));
|
||||
$world->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), new CauldronDyeItemSound());
|
||||
$world->addSound($this->position->center(), new CauldronDyeItemSound());
|
||||
}
|
||||
}elseif($item->getCustomColor() !== null){
|
||||
$item->clearCustomColor();
|
||||
$world->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::CLEAN_ARMOR_USE_AMOUNT));
|
||||
$world->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), new CauldronCleanItemSound());
|
||||
$world->addSound($this->position->center(), new CauldronCleanItemSound());
|
||||
}
|
||||
}elseif($item instanceof Banner){
|
||||
$patterns = $item->getPatterns();
|
||||
@ -154,7 +154,7 @@ final class WaterCauldron extends FillableCauldron{
|
||||
$item->setPatterns($patterns);
|
||||
|
||||
$world->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::CLEAN_BANNER_USE_AMOUNT));
|
||||
$world->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), new CauldronCleanItemSound());
|
||||
$world->addSound($this->position->center(), new CauldronCleanItemSound());
|
||||
}
|
||||
}elseif(ItemTypeIds::toBlockTypeId($item->getTypeId()) === BlockTypeIds::DYED_SHULKER_BOX){
|
||||
if($this->customWaterColor === null){
|
||||
@ -165,7 +165,7 @@ final class WaterCauldron extends FillableCauldron{
|
||||
$returnedItems[] = $newItem;
|
||||
|
||||
$world->setBlock($this->position, $this->withFillLevel($this->getFillLevel() - self::CLEAN_SHULKER_BOX_USE_AMOUNT));
|
||||
$world->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), new CauldronCleanItemSound());
|
||||
$world->addSound($this->position->center(), new CauldronCleanItemSound());
|
||||
}
|
||||
}else{
|
||||
match($item->getTypeId()){
|
||||
@ -202,7 +202,7 @@ final class WaterCauldron extends FillableCauldron{
|
||||
}
|
||||
$world = $this->position->getWorld();
|
||||
$world->setBlock($this->position, $this->setCustomWaterColor(null)->setFillLevel(FillableCauldron::MAX_FILL_LEVEL));
|
||||
$world->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), $this->getFillSound());
|
||||
$world->addSound($this->position->center(), $this->getFillSound());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ class Wood extends Opaque{
|
||||
$item->applyDamage(1);
|
||||
$this->stripped = true;
|
||||
$this->position->getWorld()->setBlock($this->position, $this);
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new ItemUseOnBlockSound($this));
|
||||
$this->position->getWorld()->addSound($this->position->center(), new ItemUseOnBlockSound($this));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -50,7 +50,7 @@ trait AnimatedBlockInventoryTrait{
|
||||
if($this->holder->isValid() && $this->getViewerCount() === 1){
|
||||
//TODO: this crap really shouldn't be managed by the inventory
|
||||
$this->animateBlock(true);
|
||||
$this->holder->getWorld()->addSound($this->holder->asVector3()->add(0.5, 0.5, 0.5), $this->getOpenSound());
|
||||
$this->holder->getWorld()->addSound($this->holder->center(), $this->getOpenSound());
|
||||
}
|
||||
}
|
||||
|
||||
@ -60,7 +60,7 @@ trait AnimatedBlockInventoryTrait{
|
||||
if($this->holder->isValid() && $this->getViewerCount() === 1){
|
||||
//TODO: this crap really shouldn't be managed by the inventory
|
||||
$this->animateBlock(false);
|
||||
$this->holder->getWorld()->addSound($this->holder->asVector3()->add(0.5, 0.5, 0.5), $this->getCloseSound());
|
||||
$this->holder->getWorld()->addSound($this->holder->center(), $this->getCloseSound());
|
||||
}
|
||||
parent::onClose($who);
|
||||
}
|
||||
|
@ -51,6 +51,6 @@ class ChestInventory extends SimpleInventory implements BlockInventory{
|
||||
$holder = $this->getHolder();
|
||||
|
||||
//event ID is always 1 for a chest
|
||||
$holder->getWorld()->broadcastPacketToViewers($holder->asVector3(), BlockEventPacket::create(new ProtocolBlockPosition($holder->x, $holder->y, $holder->z), 1, $isOpen ? 1 : 0));
|
||||
$holder->getWorld()->broadcastPacketOnBlock($holder, BlockEventPacket::create(new ProtocolBlockPosition($holder->x, $holder->y, $holder->z), 1, $isOpen ? 1 : 0));
|
||||
}
|
||||
}
|
||||
|
@ -75,8 +75,7 @@ class EnderChestInventory extends DelegateInventory implements BlockInventory{
|
||||
$holder = $this->getHolder();
|
||||
|
||||
//event ID is always 1 for a chest
|
||||
//TODO: maybe broadcast should use BlockPosition
|
||||
$holder->getWorld()->broadcastPacketToViewers($holder->asVector3(), BlockEventPacket::create(new ProtocolBlockPosition($holder->x, $holder->y, $holder->z), 1, $isOpen ? 1 : 0));
|
||||
$holder->getWorld()->broadcastPacketOnBlock($holder, BlockEventPacket::create(new ProtocolBlockPosition($holder->x, $holder->y, $holder->z), 1, $isOpen ? 1 : 0));
|
||||
}
|
||||
|
||||
public function onClose(Player $who) : void{
|
||||
|
@ -63,7 +63,6 @@ class ShulkerBoxInventory extends SimpleInventory implements BlockInventory{
|
||||
$holder = $this->getHolder();
|
||||
|
||||
//event ID is always 1 for a chest
|
||||
//TODO: maybe broadcast should use block position
|
||||
$holder->getWorld()->broadcastPacketToViewers($holder->asVector3(), BlockEventPacket::create(new ProtocolBlockPosition($holder->x, $holder->y, $holder->z), 1, $isOpen ? 1 : 0));
|
||||
$holder->getWorld()->broadcastPacketOnBlock($holder, BlockEventPacket::create(new ProtocolBlockPosition($holder->x, $holder->y, $holder->z), 1, $isOpen ? 1 : 0));
|
||||
}
|
||||
}
|
||||
|
@ -214,7 +214,7 @@ class BrewingStand extends Spawnable implements Container, Nameable{
|
||||
}
|
||||
|
||||
if($anythingBrewed){
|
||||
$this->position->getWorld()->addSound($this->position->asVector3()->add(0.5, 0.5, 0.5), new PotionFinishBrewingSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new PotionFinishBrewingSound());
|
||||
}
|
||||
|
||||
$ingredient->pop();
|
||||
|
@ -102,7 +102,7 @@ trait ContainerTrait{
|
||||
$pos = $this->getPosition();
|
||||
|
||||
$world = $pos->getWorld();
|
||||
$dropPos = $pos->asVector3()->add(0.5, 0.5, 0.5);
|
||||
$dropPos = $pos->center();
|
||||
foreach($inv->getContents() as $k => $item){
|
||||
$world->dropItem($dropPos, $item);
|
||||
}
|
||||
|
@ -65,6 +65,6 @@ class Jukebox extends Spawnable{
|
||||
}
|
||||
|
||||
protected function onBlockDestroyedHook() : void{
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new RecordStopSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new RecordStopSound());
|
||||
}
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ trait AmethystTrait{
|
||||
* @see Block::onProjectileHit()
|
||||
*/
|
||||
public function onProjectileHit(Projectile $projectile, RayTraceResult $hitResult) : void{
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new AmethystBlockChimeSound());
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new BlockPunchSound($this));
|
||||
$this->position->getWorld()->addSound($this->position->center(), new AmethystBlockChimeSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new BlockPunchSound($this));
|
||||
}
|
||||
}
|
||||
|
@ -54,9 +54,9 @@ trait CandleTrait{
|
||||
}elseif($item->getTypeId() === ItemTypeIds::FIRE_CHARGE){
|
||||
$item->pop();
|
||||
//TODO: not sure if this is intentional, but it's what Bedrock currently does as of 1.20.10
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new BlazeShootSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new BlazeShootSound());
|
||||
}
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new FlintSteelSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new FlintSteelSound());
|
||||
$this->position->getWorld()->setBlock($this->position, $this->setLit(true));
|
||||
|
||||
return true;
|
||||
@ -65,7 +65,7 @@ trait CandleTrait{
|
||||
if(!$this->lit){
|
||||
return true;
|
||||
}
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new FireExtinguishSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new FireExtinguishSound());
|
||||
$this->position->getWorld()->setBlock($this->position, $this->setLit(false));
|
||||
|
||||
return true;
|
||||
|
@ -63,7 +63,7 @@ trait CopperTrait{
|
||||
$this->waxed = true;
|
||||
$this->position->getWorld()->setBlock($this->position, $this);
|
||||
//TODO: orange particles are supposed to appear when applying wax
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new CopperWaxApplySound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new CopperWaxApplySound());
|
||||
$item->pop();
|
||||
return true;
|
||||
}
|
||||
@ -73,7 +73,7 @@ trait CopperTrait{
|
||||
$this->waxed = false;
|
||||
$this->position->getWorld()->setBlock($this->position, $this);
|
||||
//TODO: white particles are supposed to appear when removing wax
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new CopperWaxRemoveSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new CopperWaxRemoveSound());
|
||||
$item->applyDamage(1);
|
||||
return true;
|
||||
}
|
||||
@ -83,7 +83,7 @@ trait CopperTrait{
|
||||
$this->oxidation = $previousOxidation;
|
||||
$this->position->getWorld()->setBlock($this->position, $this);
|
||||
//TODO: turquoise particles are supposed to appear when removing oxidation
|
||||
$this->position->getWorld()->addSound($this->position->asVector3(), new ScrapeSound());
|
||||
$this->position->getWorld()->addSound($this->position->center(), new ScrapeSound());
|
||||
$item->applyDamage(1);
|
||||
return true;
|
||||
}
|
||||
|
@ -56,7 +56,7 @@ class Bucket extends Item{
|
||||
$ev->call();
|
||||
if(!$ev->isCancelled()){
|
||||
$player->getWorld()->setBlock($blockClicked->getPosition(), VanillaBlocks::AIR());
|
||||
$player->getWorld()->addSound($blockClicked->getPosition()->asVector3()->add(0.5, 0.5, 0.5), $blockClicked->getBucketFillSound());
|
||||
$player->getWorld()->addSound($blockClicked->getPosition()->center(), $blockClicked->getBucketFillSound());
|
||||
|
||||
$this->pop();
|
||||
$returnedItems[] = $ev->getItem();
|
||||
|
@ -36,7 +36,7 @@ class FireCharge extends Item{
|
||||
if($blockReplace->getTypeId() === BlockTypeIds::AIR){
|
||||
$world = $player->getWorld();
|
||||
$world->setBlock($blockReplace->getPosition(), VanillaBlocks::FIRE());
|
||||
$world->addSound($blockReplace->getPosition()->asVector3()->add(0.5, 0.5, 0.5), new BlazeShootSound());
|
||||
$world->addSound($blockReplace->getPosition()->center(), new BlazeShootSound());
|
||||
|
||||
$this->pop();
|
||||
|
||||
|
@ -36,7 +36,7 @@ class FlintSteel extends Tool{
|
||||
if($blockReplace->getTypeId() === BlockTypeIds::AIR){
|
||||
$world = $player->getWorld();
|
||||
$world->setBlock($blockReplace->getPosition(), VanillaBlocks::FIRE());
|
||||
$world->addSound($blockReplace->getPosition()->asVector3()->add(0.5, 0.5, 0.5), new FlintSteelSound());
|
||||
$world->addSound($blockReplace->getPosition()->center(), new FlintSteelSound());
|
||||
|
||||
$this->applyDamage(1);
|
||||
|
||||
|
@ -66,7 +66,7 @@ class LiquidBucket extends Item{
|
||||
$ev->call();
|
||||
if(!$ev->isCancelled()){
|
||||
$player->getWorld()->setBlock($blockReplace->getPosition(), $resultBlock->getFlowingForm());
|
||||
$player->getWorld()->addSound($blockReplace->getPosition()->asVector3()->add(0.5, 0.5, 0.5), $resultBlock->getBucketEmptySound());
|
||||
$player->getWorld()->addSound($blockReplace->getPosition()->center(), $resultBlock->getBucketEmptySound());
|
||||
|
||||
$this->pop();
|
||||
$returnedItems[] = $ev->getItem();
|
||||
|
@ -74,14 +74,13 @@ class PaintingItem extends Item{
|
||||
$motive = $motives[array_rand($motives)];
|
||||
|
||||
$replacePos = $blockReplace->getPosition();
|
||||
$replaceVec3 = $replacePos->asVector3();
|
||||
$clickedPos = $blockClicked->getPosition();
|
||||
|
||||
$entity = new Painting(Location::fromObject($replaceVec3, $replacePos->getWorld()), $clickedPos, $face, $motive);
|
||||
$entity = new Painting(Location::fromObject($replacePos->asVector3(), $replacePos->getWorld()), $clickedPos, $face, $motive);
|
||||
$this->pop();
|
||||
$entity->spawnToAll();
|
||||
|
||||
$player->getWorld()->addSound($replaceVec3->add(0.5, 0.5, 0.5), new PaintingPlaceSound());
|
||||
$player->getWorld()->addSound($replacePos->center(), new PaintingPlaceSound());
|
||||
return ItemUseResult::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
@ -1004,7 +1004,7 @@ class InGamePacketHandler extends PacketHandler{
|
||||
|
||||
$lectern = $world->getBlockAt($pos->getX(), $pos->getY(), $pos->getZ());
|
||||
$lecternPos = $lectern->getPosition();
|
||||
if($lectern instanceof Lectern && $this->player->canInteract($lecternPos->asVector3(), 15)){
|
||||
if($lectern instanceof Lectern && $this->player->canInteract($lecternPos->center(), 15)){
|
||||
if(!$lectern->onPageTurn($packet->page)){
|
||||
$this->syncBlocksNearby($lecternPos, null);
|
||||
}
|
||||
|
@ -1834,7 +1834,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{
|
||||
$block = $target->getSide($face);
|
||||
if($block->hasTypeTag(BlockTypeTags::FIRE)){
|
||||
$this->getWorld()->setBlock($block->getPosition(), VanillaBlocks::AIR());
|
||||
$this->getWorld()->addSound($block->getPosition()->asVector3()->add(0.5, 0.5, 0.5), new FireExtinguishSound());
|
||||
$this->getWorld()->addSound($block->getPosition()->center(), new FireExtinguishSound());
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1865,7 +1865,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{
|
||||
public function breakBlock(BlockPosition $pos) : bool{
|
||||
$this->removeCurrentWindow();
|
||||
|
||||
if($this->canInteract($pos->asVector3()->add(0.5, 0.5, 0.5), $this->isCreative() ? self::MAX_REACH_DISTANCE_CREATIVE : self::MAX_REACH_DISTANCE_SURVIVAL)){
|
||||
if($this->canInteract($pos->center(), $this->isCreative() ? self::MAX_REACH_DISTANCE_CREATIVE : self::MAX_REACH_DISTANCE_SURVIVAL)){
|
||||
$this->broadcastAnimation(new ArmSwingAnimation($this), $this->getViewers());
|
||||
$this->stopBreakBlock($pos);
|
||||
$item = $this->inventory->getItemInHand();
|
||||
@ -1891,7 +1891,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{
|
||||
public function interactBlock(BlockPosition $pos, int $face, Vector3 $clickOffset) : bool{
|
||||
$this->setUsingItem(false);
|
||||
|
||||
if($this->canInteract($pos->asVector3()->add(0.5, 0.5, 0.5), $this->isCreative() ? self::MAX_REACH_DISTANCE_CREATIVE : self::MAX_REACH_DISTANCE_SURVIVAL)){
|
||||
if($this->canInteract($pos->center(), $this->isCreative() ? self::MAX_REACH_DISTANCE_CREATIVE : self::MAX_REACH_DISTANCE_SURVIVAL)){
|
||||
$this->broadcastAnimation(new ArmSwingAnimation($this), $this->getViewers());
|
||||
$item = $this->inventory->getItemInHand(); //this is a copy of the real item
|
||||
$oldItem = clone $item;
|
||||
|
@ -51,10 +51,9 @@ final class SurvivalBlockBreakHandler{
|
||||
){
|
||||
$this->breakSpeed = $this->calculateBreakProgressPerTick();
|
||||
if($this->breakSpeed > 0){
|
||||
$vector3 = $this->blockPos->asVector3();
|
||||
$this->player->getWorld()->broadcastPacketToViewers(
|
||||
$vector3,
|
||||
LevelEventPacket::create(LevelEvent::BLOCK_START_BREAK, (int) (65535 * $this->breakSpeed), $vector3)
|
||||
$this->player->getWorld()->broadcastPacketOnBlock(
|
||||
$this->blockPos,
|
||||
LevelEventPacket::create(LevelEvent::BLOCK_START_BREAK, (int) (65535 * $this->breakSpeed), $this->blockPos->asVector3())
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -120,11 +119,10 @@ final class SurvivalBlockBreakHandler{
|
||||
}
|
||||
|
||||
public function __destruct(){
|
||||
$vector3 = $this->blockPos->asVector3();
|
||||
if($this->player->getWorld()->isInLoadedTerrain($vector3)){
|
||||
$this->player->getWorld()->broadcastPacketToViewers(
|
||||
$vector3,
|
||||
LevelEventPacket::create(LevelEvent::BLOCK_STOP_BREAK, 0, $vector3)
|
||||
$this->player->getWorld()->broadcastPacketOnBlock(
|
||||
$this->blockPos,
|
||||
LevelEventPacket::create(LevelEvent::BLOCK_STOP_BREAK, 0, $this->blockPos->asVector3())
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -206,7 +206,7 @@ class Explosion{
|
||||
}else{
|
||||
if(mt_rand(0, 100) < $yield){
|
||||
foreach($block->getDrops($air) as $drop){
|
||||
$this->world->dropItem($pos->asVector3()->add(0.5, 0.5, 0.5), $drop);
|
||||
$this->world->dropItem($pos->center(), $drop);
|
||||
}
|
||||
}
|
||||
if(($t = $this->world->getTileAt($pos->x, $pos->y, $pos->z)) !== null){
|
||||
|
@ -712,7 +712,7 @@ class World implements ChunkManager{
|
||||
if(count($pk) > 0){
|
||||
if($players === $this->getViewersForPosition($pos)){
|
||||
foreach($pk as $e){
|
||||
$this->broadcastPacketToViewers($pos, $e);
|
||||
$this->broadcastPacketOnPosition($pos, $e);
|
||||
}
|
||||
}else{
|
||||
NetworkBroadcastUtils::broadcastPackets($this->filterViewersForPosition($pos, $players), $pk);
|
||||
@ -741,7 +741,7 @@ class World implements ChunkManager{
|
||||
if(count($pk) > 0){
|
||||
if($players === $this->getViewersForPosition($pos)){
|
||||
foreach($pk as $e){
|
||||
$this->broadcastPacketToViewers($pos, $e);
|
||||
$this->broadcastPacketOnPosition($pos, $e);
|
||||
}
|
||||
}else{
|
||||
NetworkBroadcastUtils::broadcastPackets($this->filterViewersForPosition($pos, $players), $pk);
|
||||
@ -793,10 +793,14 @@ class World implements ChunkManager{
|
||||
/**
|
||||
* Broadcasts a packet to every player who has the target position within their view distance.
|
||||
*/
|
||||
public function broadcastPacketToViewers(Vector3 $pos, ClientboundPacket $packet) : void{
|
||||
public function broadcastPacketOnPosition(Vector3 $pos, ClientboundPacket $packet) : void{
|
||||
$this->broadcastPacketToPlayersUsingChunk($pos->getFloorX() >> Chunk::COORD_BIT_SIZE, $pos->getFloorZ() >> Chunk::COORD_BIT_SIZE, $packet);
|
||||
}
|
||||
|
||||
public function broadcastPacketOnBlock(BlockPosition $pos, ClientboundPacket $packet) : void{
|
||||
$this->broadcastPacketToPlayersUsingChunk($pos->x >> Chunk::COORD_BIT_SIZE, $pos->z >> Chunk::COORD_BIT_SIZE, $packet);
|
||||
}
|
||||
|
||||
private function broadcastPacketToPlayersUsingChunk(int $chunkX, int $chunkZ, ClientboundPacket $packet) : void{
|
||||
if(!isset($this->packetBuffersByChunk[$index = World::chunkHash($chunkX, $chunkZ)])){
|
||||
$this->packetBuffersByChunk[$index] = [$packet];
|
||||
@ -2101,7 +2105,7 @@ class World implements ChunkManager{
|
||||
$item->onDestroyBlock($target, $returnedItems);
|
||||
|
||||
if(count($drops) > 0){
|
||||
$dropPos = $vector->asVector3()->add(0.5, 0.5, 0.5);
|
||||
$dropPos = $vector->center();
|
||||
foreach($drops as $drop){
|
||||
if(!$drop->isNull()){
|
||||
$this->dropItem($dropPos, $drop);
|
||||
@ -2110,7 +2114,7 @@ class World implements ChunkManager{
|
||||
}
|
||||
|
||||
if($xpDrop > 0){
|
||||
$this->dropExperience($vector->asVector3()->add(0.5, 0.5, 0.5), $xpDrop);
|
||||
$this->dropExperience($vector->center(), $xpDrop);
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -2121,7 +2125,7 @@ class World implements ChunkManager{
|
||||
*/
|
||||
private function destroyBlockInternal(Block $target, Item $item, ?Player $player, bool $createParticles, array &$returnedItems) : void{
|
||||
if($createParticles){
|
||||
$this->addParticle($target->getPosition()->asVector3()->add(0.5, 0.5, 0.5), new BlockBreakParticle($target));
|
||||
$this->addParticle($target->getPosition()->center(), new BlockBreakParticle($target));
|
||||
}
|
||||
|
||||
$target->onBreak($item, $player, $returnedItems);
|
||||
@ -2269,7 +2273,7 @@ class World implements ChunkManager{
|
||||
}
|
||||
|
||||
if($playSound){
|
||||
$this->addSound($hand->getPosition()->asVector3(), new BlockPlaceSound($hand));
|
||||
$this->addSound($hand->getPosition()->center(), new BlockPlaceSound($hand));
|
||||
}
|
||||
|
||||
$item->pop();
|
||||
|
Loading…
x
Reference in New Issue
Block a user