|
@@ -32,7 +32,7 @@ bool ActionTarget::isEntity(int entityId) const
|
|
return this->entityId == entityId;
|
|
return this->entityId == entityId;
|
|
}
|
|
}
|
|
|
|
|
|
-void ActionTarget::applyItemSkillOnTarget(
|
|
|
|
|
|
+void ActionTarget::useItemSkillOnTarget(
|
|
Entity* zActor, ItemSkill* zItemSkill, Item* zUsedItem)
|
|
Entity* zActor, ItemSkill* zItemSkill, Item* zUsedItem)
|
|
{
|
|
{
|
|
if (entityId >= 0)
|
|
if (entityId >= 0)
|
|
@@ -48,6 +48,40 @@ void ActionTarget::applyItemSkillOnTarget(
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void ActionTarget::interactItemSkillOnTarget(
|
|
|
|
+ Entity* zActor, ItemSkill* zItemSkill, Item* zUsedItem)
|
|
|
|
+{
|
|
|
|
+ if (zItemSkill)
|
|
|
|
+ {
|
|
|
|
+ if (entityId >= 0)
|
|
|
|
+ {
|
|
|
|
+ Entity* target = Game::INSTANCE->zEntity(entityId);
|
|
|
|
+ if (target) zItemSkill->interact(zActor, zUsedItem, target);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ Block* block = Game::INSTANCE->zRealBlockInstance(
|
|
|
|
+ blockPos, zActor->getCurrentDimensionId());
|
|
|
|
+ if (block) zItemSkill->interact(zActor, zUsedItem, block);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ if (entityId >= 0)
|
|
|
|
+ {
|
|
|
|
+ Block* block = Game::INSTANCE->zRealBlockInstance(
|
|
|
|
+ blockPos, zActor->getCurrentDimensionId());
|
|
|
|
+ if (block) block->interact(zUsedItem, zActor);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ Block* block = Game::INSTANCE->zRealBlockInstance(
|
|
|
|
+ blockPos, zActor->getCurrentDimensionId());
|
|
|
|
+ if (block) block->interact(zUsedItem, zActor);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
void ActionTarget::placeBlock(Entity* zActor, Item* zItem)
|
|
void ActionTarget::placeBlock(Entity* zActor, Item* zItem)
|
|
{
|
|
{
|
|
if (zActor->getStamina() > 0.2f)
|
|
if (zActor->getStamina() > 0.2f)
|
|
@@ -190,53 +224,75 @@ void Entity::onDeath()
|
|
new EntityRemovedUpdate(id, currentDimensionId, location));
|
|
new EntityRemovedUpdate(id, currentDimensionId, location));
|
|
}
|
|
}
|
|
|
|
|
|
-void Entity::useItem(int typeId, Item* zItem)
|
|
|
|
|
|
+void Entity::useItem(int typeId, Item* zItem, bool left)
|
|
{
|
|
{
|
|
- if (zItem && zItem->isEatable())
|
|
|
|
- { // eat item
|
|
|
|
- zItem->applyFoodEffects(this);
|
|
|
|
- }
|
|
|
|
- else if (zItem && zItem->isPlaceable())
|
|
|
|
- { // place item
|
|
|
|
- if (placeBlockCooldown <= 0)
|
|
|
|
|
|
+ if (left)
|
|
|
|
+ {
|
|
|
|
+ if (!zItem || zItem->isUsable())
|
|
{
|
|
{
|
|
cs.lock();
|
|
cs.lock();
|
|
if (target)
|
|
if (target)
|
|
{
|
|
{
|
|
- target->placeBlock(this, zItem);
|
|
|
|
- placeBlockCooldown = 15;
|
|
|
|
|
|
+ ItemSkill* selected = zSkill(typeId);
|
|
|
|
+ if (!selected)
|
|
|
|
+ {
|
|
|
|
+ selected
|
|
|
|
+ = StaticRegistry<ItemType>::INSTANCE.zElement(typeId)
|
|
|
|
+ ->createDefaultItemSkill();
|
|
|
|
+ if (selected) skills.add(selected);
|
|
|
|
+ }
|
|
|
|
+ if (!selected)
|
|
|
|
+ {
|
|
|
|
+ selected = zSkill(ItemTypeEnum::PLAYER_HAND);
|
|
|
|
+ }
|
|
|
|
+ target->useItemSkillOnTarget(this, selected, zItem);
|
|
}
|
|
}
|
|
cs.unlock();
|
|
cs.unlock();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- else if (!zItem || zItem->isUsable())
|
|
|
|
- { // use item skill
|
|
|
|
- cs.lock();
|
|
|
|
- if (target)
|
|
|
|
- {
|
|
|
|
- ItemSkill* selected = 0;
|
|
|
|
- for (ItemSkill* skill : skills)
|
|
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ if (zItem && zItem->isEatable())
|
|
|
|
+ { // eat item
|
|
|
|
+ zItem->applyFoodEffects(this);
|
|
|
|
+ }
|
|
|
|
+ else if (zItem && zItem->isPlaceable())
|
|
|
|
+ { // place item
|
|
|
|
+ if (placeBlockCooldown <= 0)
|
|
{
|
|
{
|
|
- if (skill->getTypeId() == typeId)
|
|
|
|
|
|
+ cs.lock();
|
|
|
|
+ if (target)
|
|
{
|
|
{
|
|
- selected = skill;
|
|
|
|
- break;
|
|
|
|
|
|
+ target->placeBlock(this, zItem);
|
|
|
|
+ placeBlockCooldown = 15;
|
|
}
|
|
}
|
|
|
|
+ cs.unlock();
|
|
}
|
|
}
|
|
- if (!selected)
|
|
|
|
|
|
+ }
|
|
|
|
+ else if (!zItem || zItem->isUsable())
|
|
|
|
+ { // use item skill
|
|
|
|
+ cs.lock();
|
|
|
|
+ if (target)
|
|
{
|
|
{
|
|
- selected = StaticRegistry<ItemType>::INSTANCE.zElement(typeId)
|
|
|
|
- ->createDefaultItemSkill();
|
|
|
|
- skills.add(selected);
|
|
|
|
|
|
+ ItemSkill* selected = zSkill(typeId);
|
|
|
|
+ if (!selected)
|
|
|
|
+ {
|
|
|
|
+ selected
|
|
|
|
+ = StaticRegistry<ItemType>::INSTANCE.zElement(typeId)
|
|
|
|
+ ->createDefaultItemSkill();
|
|
|
|
+ if (selected) skills.add(selected);
|
|
|
|
+ }
|
|
|
|
+ target->interactItemSkillOnTarget(this, selected, zItem);
|
|
}
|
|
}
|
|
- target->applyItemSkillOnTarget(this, selected, zItem);
|
|
|
|
|
|
+ cs.unlock();
|
|
}
|
|
}
|
|
- cs.unlock();
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void Entity::onTargetChange() {}
|
|
void Entity::onTargetChange() {}
|
|
|
|
|
|
|
|
+void Entity::interact(Item* zItem, Entity* zActor) {}
|
|
|
|
+
|
|
void Entity::addMovementFrame(MovementFrame& frame)
|
|
void Entity::addMovementFrame(MovementFrame& frame)
|
|
{
|
|
{
|
|
cs.lock();
|
|
cs.lock();
|
|
@@ -260,8 +316,9 @@ void Entity::addMovementFrame(MovementFrame& frame)
|
|
// TODO implement subscription system to notify only interested clients
|
|
// TODO implement subscription system to notify only interested clients
|
|
}
|
|
}
|
|
|
|
|
|
-void Entity::calculateTarget(
|
|
|
|
- Framework::Vec3<float> basePos, Framework::Vec3<float> direction)
|
|
|
|
|
|
+void Entity::calculateTarget(Framework::Vec3<float> basePos,
|
|
|
|
+ Framework::Vec3<float> direction,
|
|
|
|
+ const Item* zItem)
|
|
{
|
|
{
|
|
Vec3<float> headPosition = basePos + faceOffset;
|
|
Vec3<float> headPosition = basePos + faceOffset;
|
|
int px = (int)floor(headPosition.x);
|
|
int px = (int)floor(headPosition.x);
|
|
@@ -273,7 +330,7 @@ void Entity::calculateTarget(
|
|
{
|
|
{
|
|
if (getDefaultBlock(Game::INSTANCE->zBlockAt(
|
|
if (getDefaultBlock(Game::INSTANCE->zBlockAt(
|
|
Vec3<int>{px, py, pz}, currentDimensionId))
|
|
Vec3<int>{px, py, pz}, currentDimensionId))
|
|
- ->isInteractable())
|
|
|
|
|
|
+ ->isInteractable(zItem))
|
|
{
|
|
{
|
|
if (!target || !target->isBlock({px, py, pz}, dir))
|
|
if (!target || !target->isBlock({px, py, pz}, dir))
|
|
{
|
|
{
|
|
@@ -432,6 +489,19 @@ void Entity::notifyStatusBarObservers(NetworkMessage* msg)
|
|
msg->release();
|
|
msg->release();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ItemSkill* Entity::zSkill(int itemType)
|
|
|
|
+{
|
|
|
|
+ ItemSkill* selected = 0;
|
|
|
|
+ for (ItemSkill* skill : skills)
|
|
|
|
+ {
|
|
|
|
+ if (skill->getTypeId() == typeId)
|
|
|
|
+ {
|
|
|
|
+ return skill;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
void Entity::prepareTick(const Dimension* zDimension) {}
|
|
void Entity::prepareTick(const Dimension* zDimension) {}
|
|
|
|
|
|
void Entity::tick(const Dimension* zDimension)
|
|
void Entity::tick(const Dimension* zDimension)
|