mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-13 09:19:42 +00:00
Added strength, weakness, resistance effects, fixed entity area
This commit is contained in:
parent
c2baaf435d
commit
d5ba2a72a5
@ -33,20 +33,20 @@ class Effect{
|
|||||||
const SWIFTNESS = 3;
|
const SWIFTNESS = 3;
|
||||||
const FATIGUE = 4;
|
const FATIGUE = 4;
|
||||||
const MINING_FATIGUE = 4;
|
const MINING_FATIGUE = 4;
|
||||||
//TODO: const STRENGTH = 5;
|
const STRENGTH = 5;
|
||||||
//TODO: const HEALING = 6;
|
//TODO: const HEALING = 6;
|
||||||
//TODO: const HARMING = 7;
|
//TODO: const HARMING = 7;
|
||||||
const JUMP = 8;
|
const JUMP = 8;
|
||||||
//const CONFUSION = 9;
|
//const CONFUSION = 9;
|
||||||
const REGENERATION = 10;
|
const REGENERATION = 10;
|
||||||
//TODO: const DAMAGE_RESISTANCE = 11;
|
const DAMAGE_RESISTANCE = 11;
|
||||||
const FIRE_RESISTANCE = 12;
|
const FIRE_RESISTANCE = 12;
|
||||||
const WATER_BREATHING = 13;
|
const WATER_BREATHING = 13;
|
||||||
const INVISIBILITY = 14;
|
const INVISIBILITY = 14;
|
||||||
//const BLINDNESS = 15;
|
//const BLINDNESS = 15;
|
||||||
//const NIGHT_VISION = 16;
|
//const NIGHT_VISION = 16;
|
||||||
//const HUNGER = 17;
|
//const HUNGER = 17;
|
||||||
//TODO: const WEAKNESS = 18;
|
const WEAKNESS = 18;
|
||||||
const POISON = 19;
|
const POISON = 19;
|
||||||
const WITHER = 20;
|
const WITHER = 20;
|
||||||
//const HEALTH_BOOST = 21;
|
//const HEALTH_BOOST = 21;
|
||||||
@ -63,16 +63,16 @@ class Effect{
|
|||||||
self::$effects[Effect::SLOWNESS] = new Effect(Effect::SLOWNESS, "Slowness", 90, 108, 129, true);
|
self::$effects[Effect::SLOWNESS] = new Effect(Effect::SLOWNESS, "Slowness", 90, 108, 129, true);
|
||||||
self::$effects[Effect::SWIFTNESS] = new Effect(Effect::SWIFTNESS, "Swiftness", 217, 192, 67);
|
self::$effects[Effect::SWIFTNESS] = new Effect(Effect::SWIFTNESS, "Swiftness", 217, 192, 67);
|
||||||
self::$effects[Effect::FATIGUE] = new Effect(Effect::FATIGUE, "Mining Fatigue", 74, 66, 23, true);
|
self::$effects[Effect::FATIGUE] = new Effect(Effect::FATIGUE, "Mining Fatigue", 74, 66, 23, true);
|
||||||
//self::$effects[Effect::STRENGTH] = new Effect(Effect::STRENGTH, "Strength", 147, 36, 35);
|
self::$effects[Effect::STRENGTH] = new Effect(Effect::STRENGTH, "Strength", 147, 36, 35);
|
||||||
//self::$effects[Effect::HEALING] = new InstantEffect(Effect::HEALING, "Healing", 248, 36, 35);
|
//self::$effects[Effect::HEALING] = new InstantEffect(Effect::HEALING, "Healing", 248, 36, 35);
|
||||||
//self::$effects[Effect::HARMING] = new InstantEffect(Effect::HARMING, "Harming", 67, 10, 9, true);
|
//self::$effects[Effect::HARMING] = new InstantEffect(Effect::HARMING, "Harming", 67, 10, 9, true);
|
||||||
self::$effects[Effect::JUMP] = new Effect(Effect::JUMP, "Jump", 34, 255, 76);
|
self::$effects[Effect::JUMP] = new Effect(Effect::JUMP, "Jump", 34, 255, 76);
|
||||||
self::$effects[Effect::REGENERATION] = new Effect(Effect::REGENERATION, "Regeneration", 205, 92, 171);
|
self::$effects[Effect::REGENERATION] = new Effect(Effect::REGENERATION, "Regeneration", 205, 92, 171);
|
||||||
//self::$effects[Effect::DAMAGE_RESISTANCE] = new Effect(Effect::DAMAGE_RESISTANCE, "Damage Resistance", 153, 69, 58);
|
self::$effects[Effect::DAMAGE_RESISTANCE] = new Effect(Effect::DAMAGE_RESISTANCE, "Damage Resistance", 153, 69, 58);
|
||||||
self::$effects[Effect::FIRE_RESISTANCE] = new Effect(Effect::FIRE_RESISTANCE, "Fire Resistance", 228, 154, 58);
|
self::$effects[Effect::FIRE_RESISTANCE] = new Effect(Effect::FIRE_RESISTANCE, "Fire Resistance", 228, 154, 58);
|
||||||
self::$effects[Effect::WATER_BREATHING] = new Effect(Effect::WATER_BREATHING, "Water Breathing", 46, 82, 153);
|
self::$effects[Effect::WATER_BREATHING] = new Effect(Effect::WATER_BREATHING, "Water Breathing", 46, 82, 153);
|
||||||
self::$effects[Effect::INVISIBILITY] = new Effect(Effect::INVISIBILITY, "Invisibility", 127, 131, 146);
|
self::$effects[Effect::INVISIBILITY] = new Effect(Effect::INVISIBILITY, "Invisibility", 127, 131, 146);
|
||||||
//self::$effects[Effect::WEAKNESS] = new Effect(Effect::WEAKNESS, "Weakness", 72, 77, 72 , true);
|
self::$effects[Effect::WEAKNESS] = new Effect(Effect::WEAKNESS, "Weakness", 72, 77, 72 , true);
|
||||||
self::$effects[Effect::POISON] = new Effect(Effect::POISON, "Poison", 78, 147, 49, true);
|
self::$effects[Effect::POISON] = new Effect(Effect::POISON, "Poison", 78, 147, 49, true);
|
||||||
self::$effects[Effect::WITHER] = new Effect(Effect::WITHER, "Wither", 53, 42, 39, true);
|
self::$effects[Effect::WITHER] = new Effect(Effect::WITHER, "Wither", 53, 42, 39, true);
|
||||||
}
|
}
|
||||||
|
@ -323,10 +323,10 @@ abstract class Entity extends Location implements Metadatable{
|
|||||||
foreach($this->effects as $effect){
|
foreach($this->effects as $effect){
|
||||||
if($effect->isVisible()){
|
if($effect->isVisible()){
|
||||||
$c = $effect->getColor();
|
$c = $effect->getColor();
|
||||||
$color[0] += $c[0];
|
$color[0] += $c[0] * ($effect->getAmplifier() + 1);
|
||||||
$color[1] += $c[1];
|
$color[1] += $c[1] * ($effect->getAmplifier() + 1);
|
||||||
$color[2] += $c[2];
|
$color[2] += $c[2] * ($effect->getAmplifier() + 1);
|
||||||
++$count;
|
$count += $effect->getAmplifier() + 1;
|
||||||
if(!$effect->isAmbient()){
|
if(!$effect->isAmbient()){
|
||||||
$ambient = false;
|
$ambient = false;
|
||||||
}
|
}
|
||||||
@ -1541,11 +1541,6 @@ abstract class Entity extends Location implements Metadatable{
|
|||||||
return (((int) $this->getDataProperty($propertyId)) & (1 << $id)) > 0;
|
return (((int) $this->getDataProperty($propertyId)) & (1 << $id)) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
public function getData(){}
|
|
||||||
|
|
||||||
public function __destruct(){
|
public function __destruct(){
|
||||||
$this->close();
|
$this->close();
|
||||||
}
|
}
|
||||||
|
@ -71,10 +71,6 @@ class FallingSand extends Entity{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getData(){
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function onUpdate($currentTick){
|
public function onUpdate($currentTick){
|
||||||
|
|
||||||
if($this->closed){
|
if($this->closed){
|
||||||
|
@ -148,15 +148,6 @@ class Item extends Entity{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getData(){
|
|
||||||
$flags = 0;
|
|
||||||
$flags |= $this->fireTicks > 0 ? 1 : 0;
|
|
||||||
|
|
||||||
return [
|
|
||||||
0 => ["type" => 0, "value" => $flags]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return ItemItem
|
* @return ItemItem
|
||||||
*/
|
*/
|
||||||
|
@ -59,12 +59,6 @@ class PrimedTNT extends Entity implements Explosive{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getData(){
|
|
||||||
return [
|
|
||||||
16 => ["type" => 0, "value" => $this->fuse],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function saveNBT(){
|
public function saveNBT(){
|
||||||
parent::saveNBT();
|
parent::saveNBT();
|
||||||
$this->namedtag->Fuse = new Byte("Fuse", $this->fuse);
|
$this->namedtag->Fuse = new Byte("Fuse", $this->fuse);
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
namespace pocketmine\event\entity;
|
namespace pocketmine\event\entity;
|
||||||
|
|
||||||
|
use pocketmine\entity\Effect;
|
||||||
use pocketmine\entity\Entity;
|
use pocketmine\entity\Entity;
|
||||||
|
|
||||||
class EntityDamageByEntityEvent extends EntityDamageEvent{
|
class EntityDamageByEntityEvent extends EntityDamageEvent{
|
||||||
@ -41,6 +42,17 @@ class EntityDamageByEntityEvent extends EntityDamageEvent{
|
|||||||
$this->damager = $damager;
|
$this->damager = $damager;
|
||||||
$this->knockBack = $knockBack;
|
$this->knockBack = $knockBack;
|
||||||
parent::__construct($entity, $cause, $damage);
|
parent::__construct($entity, $cause, $damage);
|
||||||
|
$this->addAttackerModifiers($damager);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function addAttackerModifiers(Entity $damager){
|
||||||
|
if($damager->hasEffect(Effect::STRENGTH)){
|
||||||
|
$this->setDamage($this->getDamage(self::MODIFIER_BASE) * 0.3 * ($damager->getEffect(Effect::STRENGTH)->getAmplifier() + 1), self::MODIFIER_STRENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($damager->hasEffect(Effect::WEAKNESS)){
|
||||||
|
$this->setDamage(-($this->getDamage(self::MODIFIER_BASE) * 0.2 * ($damager->getEffect(Effect::WEAKNESS)->getAmplifier() + 1)), self::MODIFIER_WEAKNESS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
namespace pocketmine\event\entity;
|
namespace pocketmine\event\entity;
|
||||||
|
|
||||||
|
use pocketmine\entity\Effect;
|
||||||
use pocketmine\entity\Entity;
|
use pocketmine\entity\Entity;
|
||||||
use pocketmine\event\Cancellable;
|
use pocketmine\event\Cancellable;
|
||||||
|
|
||||||
@ -29,6 +30,9 @@ class EntityDamageEvent extends EntityEvent implements Cancellable{
|
|||||||
|
|
||||||
const MODIFIER_BASE = 0;
|
const MODIFIER_BASE = 0;
|
||||||
const MODIFIER_ARMOR = 1;
|
const MODIFIER_ARMOR = 1;
|
||||||
|
const MODIFIER_STRENGTH = 2;
|
||||||
|
const MODIFIER_WEAKNESS = 3;
|
||||||
|
const MODIFIER_RESISTANCE = 4;
|
||||||
|
|
||||||
const CAUSE_CONTACT = 0;
|
const CAUSE_CONTACT = 0;
|
||||||
const CAUSE_ENTITY_ATTACK = 1;
|
const CAUSE_ENTITY_ATTACK = 1;
|
||||||
@ -76,6 +80,10 @@ class EntityDamageEvent extends EntityEvent implements Cancellable{
|
|||||||
if(!isset($this->modifiers[self::MODIFIER_BASE])){
|
if(!isset($this->modifiers[self::MODIFIER_BASE])){
|
||||||
throw new \InvalidArgumentException("BASE Damage modifier missing");
|
throw new \InvalidArgumentException("BASE Damage modifier missing");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($entity->hasEffect(Effect::DAMAGE_RESISTANCE)){
|
||||||
|
$this->setDamage(-($this->getDamage(self::MODIFIER_BASE) * 0.20 * ($entity->getEffect(Effect::DAMAGE_RESISTANCE)->getAmplifier() + 1)), self::MODIFIER_RESISTANCE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -118,9 +126,6 @@ class EntityDamageEvent extends EntityEvent implements Cancellable{
|
|||||||
* @throws \UnexpectedValueException
|
* @throws \UnexpectedValueException
|
||||||
*/
|
*/
|
||||||
public function setDamage($damage, $type = self::MODIFIER_BASE){
|
public function setDamage($damage, $type = self::MODIFIER_BASE){
|
||||||
if(!isset($this->modifiers[$type])){
|
|
||||||
throw new \UnexpectedValueException($type . " is not applicable to " . $this->getEntity());
|
|
||||||
}
|
|
||||||
$this->modifiers[$type] = $damage;
|
$this->modifiers[$type] = $damage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1492,10 +1492,10 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
$nearby = [];
|
$nearby = [];
|
||||||
|
|
||||||
if($entity === null or $entity->canCollide){
|
if($entity === null or $entity->canCollide){
|
||||||
$minX = Math::floorFloat(($bb->minX - 2) / 16);
|
$minX = Math::ceilFloat(($bb->minX - 2) / 16);
|
||||||
$maxX = Math::floorFloat(($bb->maxX + 2) / 16);
|
$maxX = Math::ceilFloat(($bb->maxX + 2) / 16);
|
||||||
$minZ = Math::floorFloat(($bb->minZ - 2) / 16);
|
$minZ = Math::ceilFloat(($bb->minZ - 2) / 16);
|
||||||
$maxZ = Math::floorFloat(($bb->maxZ + 2) / 16);
|
$maxZ = Math::ceilFloat(($bb->maxZ + 2) / 16);
|
||||||
|
|
||||||
for($x = $minX; $x <= $maxX; ++$x){
|
for($x = $minX; $x <= $maxX; ++$x){
|
||||||
for($z = $minZ; $z <= $maxZ; ++$z){
|
for($z = $minZ; $z <= $maxZ; ++$z){
|
||||||
@ -1522,10 +1522,10 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
public function getNearbyEntities(AxisAlignedBB $bb, Entity $entity = null){
|
public function getNearbyEntities(AxisAlignedBB $bb, Entity $entity = null){
|
||||||
$nearby = [];
|
$nearby = [];
|
||||||
|
|
||||||
$minX = Math::floorFloat(($bb->minX - 2) / 16);
|
$minX = Math::ceilFloat(($bb->minX - 2) / 16);
|
||||||
$maxX = Math::floorFloat(($bb->maxX + 2) / 16);
|
$maxX = Math::ceilFloat(($bb->maxX + 2) / 16);
|
||||||
$minZ = Math::floorFloat(($bb->minZ - 2) / 16);
|
$minZ = Math::ceilFloat(($bb->minZ - 2) / 16);
|
||||||
$maxZ = Math::floorFloat(($bb->maxZ + 2) / 16);
|
$maxZ = Math::ceilFloat(($bb->maxZ + 2) / 16);
|
||||||
|
|
||||||
for($x = $minX; $x <= $maxX; ++$x){
|
for($x = $minX; $x <= $maxX; ++$x){
|
||||||
for($z = $minZ; $z <= $maxZ; ++$z){
|
for($z = $minZ; $z <= $maxZ; ++$z){
|
||||||
@ -2197,7 +2197,7 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
for(; $v->y >= 0 and $v->y < 128; ++$v->y){
|
for(; $v->y >= 0 and $v->y < 128; ++$v->y){
|
||||||
if(!Block::$solid[$chunk->getBlockId($x, $v->y + 1, $z)]){
|
if(!Block::$solid[$chunk->getBlockId($x, $v->y + 1, $z)]){
|
||||||
if(!Block::$solid[$chunk->getBlockId($x, $v->y, $z)]){
|
if(!Block::$solid[$chunk->getBlockId($x, $v->y, $z)]){
|
||||||
return new Position($spawn->x, $v->y === Math::floorFloat($spawn->y) ? $spawn->y : $v->y, $spawn->z, $this);
|
return new Position($spawn->x, $v->y === (int) $spawn->y ? $spawn->y : $v->y, $spawn->z, $this);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
++$v->y;
|
++$v->y;
|
||||||
|
@ -31,4 +31,9 @@ abstract class Math{
|
|||||||
$i = (int) $n;
|
$i = (int) $n;
|
||||||
return $n >= $i ? $i : $i - 1;
|
return $n >= $i ? $i : $i - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function ceilFloat($n){
|
||||||
|
$i = (int) ($n + 1);
|
||||||
|
return $n >= $i ? $i : $i - 1;
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user