|
@@ -23,7 +23,8 @@ bool ActionTarget::isBlock(
|
|
|
Framework::Vec3<int> blockPos, Direction blockSide) const
|
|
|
{
|
|
|
return this->entityId == -1 && this->blockPos == blockPos
|
|
|
- && (this->targetBlockSide == targetBlockSide || blockSide == NO_DIRECTION);
|
|
|
+ && (this->targetBlockSide == targetBlockSide
|
|
|
+ || blockSide == NO_DIRECTION);
|
|
|
}
|
|
|
|
|
|
bool ActionTarget::isEntity(int entityId) const
|
|
@@ -102,8 +103,8 @@ void ActionTarget::toMessage(
|
|
|
*(int*)(message + 10) = zTarget->blockPos.z;
|
|
|
*(int*)(message + 14) = zTarget->targetBlockSide;
|
|
|
short len = (short)targetUIML.getLength();
|
|
|
- *(short*)(message + 18) = len;
|
|
|
- memcpy(message + 20, targetUIML.getText(), len);
|
|
|
+ *(short*)(message + 18) = len;
|
|
|
+ memcpy(message + 20, targetUIML.getText(), len);
|
|
|
zMsg->setMessage(message, 18 + len + 2);
|
|
|
}
|
|
|
}
|
|
@@ -373,6 +374,62 @@ void Entity::calculateTarget(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void Entity::removeStatusBarObserver(Entity* zSource, Framework::Text id)
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ int index = 0;
|
|
|
+ for (auto observer : statusBarObservers)
|
|
|
+ {
|
|
|
+ if (observer.getFirst() == zSource->getId()
|
|
|
+ && observer.getSecond().istGleich(id))
|
|
|
+ {
|
|
|
+ statusBarObservers.remove(index);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+ cs.unlock();
|
|
|
+}
|
|
|
+
|
|
|
+void Entity::addStatusBarObserver(Entity* zSource, Framework::Text id)
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ for (auto observer : statusBarObservers)
|
|
|
+ {
|
|
|
+ if (observer.getFirst() == zSource->getId()
|
|
|
+ && observer.getSecond().istGleich(id))
|
|
|
+ {
|
|
|
+ cs.unlock();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ statusBarObservers.add(ImmutablePair<int, Text>(zSource->getId(), id));
|
|
|
+ cs.unlock();
|
|
|
+}
|
|
|
+
|
|
|
+void Entity::notifyStatusBarObservers(NetworkMessage* msg)
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ int index = 0;
|
|
|
+ Array<int> toDelete;
|
|
|
+ for (auto observer : statusBarObservers)
|
|
|
+ {
|
|
|
+ Entity* e = Game::INSTANCE->zEntity(observer.getFirst());
|
|
|
+ if (e)
|
|
|
+ {
|
|
|
+ msg->addressGui(observer.getSecond());
|
|
|
+ Game::INSTANCE->sendMessage(msg->clone(), e);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ toDelete.add(index, 0);
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+ for (int i : toDelete)
|
|
|
+ statusBarObservers.remove(i);
|
|
|
+ cs.unlock();
|
|
|
+ msg->release();
|
|
|
+}
|
|
|
+
|
|
|
void Entity::prepareTick(const Dimension* zDimension) {}
|
|
|
|
|
|
void Entity::tick(const Dimension* zDimension)
|
|
@@ -413,13 +470,76 @@ void Entity::tick(const Dimension* zDimension)
|
|
|
}
|
|
|
}
|
|
|
if (currentFrame.duration > 0) movements.set(currentFrame, 0);
|
|
|
+ if (getStamina() <= getMaxStamina() - 0.0025f)
|
|
|
+ {
|
|
|
+ if (getThirst() > 0 && getHunger() > 0)
|
|
|
+ {
|
|
|
+ setStamina(getStamina() + 0.0025f);
|
|
|
+ setHunger(getHunger() - 0.0005f);
|
|
|
+ setThirst(getThirst() - 0.0015f);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (getStamina() <= getMaxStamina() - 0.005f)
|
|
|
+ {
|
|
|
+ if (getThirst() > 0 && getHunger() > 0)
|
|
|
+ {
|
|
|
+ setStamina(getStamina() + 0.005f);
|
|
|
+ setHunger(getHunger() - 0.001f);
|
|
|
+ setThirst(getThirst() - 0.003f);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
time.messungStart();
|
|
|
}
|
|
|
|
|
|
-void Entity::api(Framework::StreamReader* zRequest, NetworkMessage* zResponse)
|
|
|
-{}
|
|
|
+void Entity::api(Framework::StreamReader* zRequest,
|
|
|
+ NetworkMessage* zResponse,
|
|
|
+ Entity* zSource)
|
|
|
+{
|
|
|
+ char type;
|
|
|
+ zRequest->lese(&type, 1);
|
|
|
+ switch (type)
|
|
|
+ {
|
|
|
+ case 0: // request status bar state
|
|
|
+ {
|
|
|
+ char len;
|
|
|
+ zRequest->lese(&len, 1);
|
|
|
+ char* guiId = new char[(int)len + 1];
|
|
|
+ zRequest->lese(guiId, len);
|
|
|
+ guiId[(int)len] = 0;
|
|
|
+ zResponse->addressGui(guiId);
|
|
|
+ addStatusBarObserver(zSource, guiId);
|
|
|
+ char* msg = new char[33];
|
|
|
+ msg[0] = 0;
|
|
|
+ *(float*)(msg + 1) = getMaxHP();
|
|
|
+ *(float*)(msg + 5) = getCurrentHP();
|
|
|
+ *(float*)(msg + 9) = getMaxStamina();
|
|
|
+ *(float*)(msg + 13) = getStamina();
|
|
|
+ *(float*)(msg + 17) = getMaxHunger();
|
|
|
+ *(float*)(msg + 21) = getHunger();
|
|
|
+ *(float*)(msg + 25) = getMaxThirst();
|
|
|
+ *(float*)(msg + 29) = getThirst();
|
|
|
+ zResponse->setMessage(msg, 33);
|
|
|
+ delete[] guiId;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 1: // remove status bar observer
|
|
|
+ {
|
|
|
+ char len;
|
|
|
+ zRequest->lese(&len, 1);
|
|
|
+ char* guiId = new char[(int)len + 1];
|
|
|
+ zRequest->lese(guiId, len);
|
|
|
+ guiId[(int)len] = 0;
|
|
|
+ removeStatusBarObserver(zSource, guiId);
|
|
|
+ delete[] guiId;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
void Entity::onFall(float collisionSpeed)
|
|
|
{
|
|
@@ -434,6 +554,54 @@ void Entity::setPosition(Framework::Vec3<float> pos)
|
|
|
location = pos;
|
|
|
}
|
|
|
|
|
|
+void Entity::setHP(float hp)
|
|
|
+{
|
|
|
+ currentHP = MIN(MAX(hp, 0), maxHP);
|
|
|
+ NetworkMessage* msg = new NetworkMessage();
|
|
|
+ char* message = new char[9];
|
|
|
+ message[0] = 1;
|
|
|
+ *(float*)(message + 1) = getMaxHP();
|
|
|
+ *(float*)(message + 5) = getCurrentHP();
|
|
|
+ msg->setMessage(message, 9);
|
|
|
+ notifyStatusBarObservers(msg);
|
|
|
+}
|
|
|
+
|
|
|
+void Entity::setStamina(float stamina)
|
|
|
+{
|
|
|
+ this->stamina = MIN(MAX(stamina, 0), maxStamina);
|
|
|
+ NetworkMessage* msg = new NetworkMessage();
|
|
|
+ char* message = new char[9];
|
|
|
+ message[0] = 2;
|
|
|
+ *(float*)(message + 1) = getMaxStamina();
|
|
|
+ *(float*)(message + 5) = getStamina();
|
|
|
+ msg->setMessage(message, 9);
|
|
|
+ notifyStatusBarObservers(msg);
|
|
|
+}
|
|
|
+
|
|
|
+void Entity::setHunger(float hunger)
|
|
|
+{
|
|
|
+ this->hunger = MIN(MAX(hunger, 0), maxHunger);
|
|
|
+ NetworkMessage* msg = new NetworkMessage();
|
|
|
+ char* message = new char[9];
|
|
|
+ message[0] = 3;
|
|
|
+ *(float*)(message + 1) = getMaxHunger();
|
|
|
+ *(float*)(message + 5) = getHunger();
|
|
|
+ msg->setMessage(message, 9);
|
|
|
+ notifyStatusBarObservers(msg);
|
|
|
+}
|
|
|
+
|
|
|
+void Entity::setThirst(float thirst)
|
|
|
+{
|
|
|
+ this->thirst = MIN(MAX(thirst, 0), maxThirst);
|
|
|
+ NetworkMessage* msg = new NetworkMessage();
|
|
|
+ char* message = new char[9];
|
|
|
+ message[0] = 4;
|
|
|
+ *(float*)(message + 1) = getMaxThirst();
|
|
|
+ *(float*)(message + 5) = getThirst();
|
|
|
+ msg->setMessage(message, 9);
|
|
|
+ notifyStatusBarObservers(msg);
|
|
|
+}
|
|
|
+
|
|
|
float Entity::getMaxHP() const
|
|
|
{
|
|
|
return maxHP;
|