mirror of
https://github.com/ErikasKontenis/SabrehavenServer.git
synced 2025-04-30 01:29:21 +02:00
Merge branch '1-research-for-existing-issues-in-nostalrius-repo' into 'master'
Resolve "Research for existing issues in Nostalrius repo" Closes #1 See merge request ErikasKontenis/Sabrehaven!21
This commit is contained in:
commit
0da6ba2269
@ -55,6 +55,17 @@ function Game.isPlayerThere(position)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Game.isMonsterThere(position, monsterName)
|
||||||
|
local tile = Tile(position)
|
||||||
|
local creatures = tile:getCreatures()
|
||||||
|
for _, creature in ipairs(creatures) do
|
||||||
|
if creature:isMonster() and creature:getName():lower() == monsterName:lower() then
|
||||||
|
return creature
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
function Game.broadcastMessage(message, messageType)
|
function Game.broadcastMessage(message, messageType)
|
||||||
if messageType == nil then
|
if messageType == nil then
|
||||||
messageType = MESSAGE_STATUS_WARNING
|
messageType = MESSAGE_STATUS_WARNING
|
||||||
|
@ -1,10 +1,31 @@
|
|||||||
function onRemoveItem(item, tileitem, position)
|
function onRemoveItem(item, tileitem, position)
|
||||||
doRelocate({x = 33336, y = 31954, z = 15},{x = 33060, y = 31623, z = 15})
|
local demonsInRoomCount = 0;
|
||||||
doRelocate({x = 33340, y = 31954, z = 15},{x = 33066, y = 31623, z = 15})
|
local spectators = Game.getSpectators(Position(33063, 31624, 15), false, false, 20, 20, 20, 20)
|
||||||
doRelocate({x = 33340, y = 31958, z = 15},{x = 33066, y = 31627, z = 15})
|
for i = 1, #spectators do
|
||||||
doRelocate({x = 33336, y = 31958, z = 15},{x = 33060, y = 31627, z = 15})
|
local creature = spectators[i]
|
||||||
|
if creature:getName():lower() == "demon" then
|
||||||
|
demonsInRoomCount = demonsInRoomCount + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if (demonsInRoomCount <= 1) then
|
||||||
|
local demon1 = Game.isMonsterThere({x = 33336, y = 31954, z = 15}, "Demon")
|
||||||
|
local demon2 = Game.isMonsterThere({x = 33340, y = 31954, z = 15}, "Demon")
|
||||||
|
local demon3 = Game.isMonsterThere({x = 33340, y = 31958, z = 15}, "Demon")
|
||||||
|
local demon4 = Game.isMonsterThere({x = 33336, y = 31958, z = 15}, "Demon")
|
||||||
|
if demon1 ~= nil and demon2 ~= nil and demon3 ~= nil and demon4 ~= nil then
|
||||||
|
demon1:addHealth(-demon1:getMaxHealth())
|
||||||
|
demon2:addHealth(-demon2:getMaxHealth())
|
||||||
|
demon3:addHealth(-demon3:getMaxHealth())
|
||||||
|
demon4:addHealth(-demon4:getMaxHealth())
|
||||||
|
Game.createMonster("Demon", {x = 33060, y = 31623, z = 15})
|
||||||
|
Game.createMonster("Demon", {x = 33066, y = 31623, z = 15})
|
||||||
|
Game.createMonster("Demon", {x = 33066, y = 31627, z = 15})
|
||||||
|
Game.createMonster("Demon", {x = 33060, y = 31627, z = 15})
|
||||||
Game.sendMagicEffect({x = 33060, y = 31622, z = 15}, 14)
|
Game.sendMagicEffect({x = 33060, y = 31622, z = 15}, 14)
|
||||||
Game.sendMagicEffect({x = 33066, y = 31622, z = 15}, 14)
|
Game.sendMagicEffect({x = 33066, y = 31622, z = 15}, 14)
|
||||||
Game.sendMagicEffect({x = 33066, y = 31628, z = 15}, 14)
|
Game.sendMagicEffect({x = 33066, y = 31628, z = 15}, 14)
|
||||||
Game.sendMagicEffect({x = 33060, y = 31628, z = 15}, 14)
|
Game.sendMagicEffect({x = 33060, y = 31628, z = 15}, 14)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
@ -873,6 +873,10 @@ bool ConditionDamage::startCondition(Creature* creature)
|
|||||||
bool ConditionDamage::executeCondition(Creature* creature, int32_t)
|
bool ConditionDamage::executeCondition(Creature* creature, int32_t)
|
||||||
{
|
{
|
||||||
if (conditionType == CONDITION_FIRE) {
|
if (conditionType == CONDITION_FIRE) {
|
||||||
|
if (creature->isImmune(CONDITION_FIRE)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const int32_t r_cycle = cycle;
|
const int32_t r_cycle = cycle;
|
||||||
if (r_cycle) {
|
if (r_cycle) {
|
||||||
if (count <= 0) {
|
if (count <= 0) {
|
||||||
@ -886,6 +890,10 @@ bool ConditionDamage::executeCondition(Creature* creature, int32_t)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (conditionType == CONDITION_POISON) {
|
} else if (conditionType == CONDITION_POISON) {
|
||||||
|
if (creature->isImmune(CONDITION_POISON)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const int32_t r_cycle = cycle;
|
const int32_t r_cycle = cycle;
|
||||||
if (r_cycle) {
|
if (r_cycle) {
|
||||||
if (count <= 0) {
|
if (count <= 0) {
|
||||||
@ -904,6 +912,10 @@ bool ConditionDamage::executeCondition(Creature* creature, int32_t)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (conditionType == CONDITION_ENERGY) {
|
} else if (conditionType == CONDITION_ENERGY) {
|
||||||
|
if (creature->isImmune(CONDITION_ENERGY)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const int32_t r_cycle = cycle;
|
const int32_t r_cycle = cycle;
|
||||||
if (r_cycle) {
|
if (r_cycle) {
|
||||||
if (count <= 0) {
|
if (count <= 0) {
|
||||||
|
@ -65,10 +65,10 @@ class Container : public Item, public Cylinder
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual DepotLocker* getDepotLocker() {
|
virtual DepotLocker* getDepotLocker() override {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
virtual const DepotLocker* getDepotLocker() const {
|
virtual const DepotLocker* getDepotLocker() const override {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ class Container;
|
|||||||
class Depot;
|
class Depot;
|
||||||
class Teleport;
|
class Teleport;
|
||||||
class Mailbox;
|
class Mailbox;
|
||||||
|
class DepotLocker;
|
||||||
class Door;
|
class Door;
|
||||||
class MagicField;
|
class MagicField;
|
||||||
class BedItem;
|
class BedItem;
|
||||||
@ -376,6 +377,12 @@ class Item : virtual public Thing
|
|||||||
virtual const Mailbox* getMailbox() const {
|
virtual const Mailbox* getMailbox() const {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
virtual DepotLocker* getDepotLocker() {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
virtual const DepotLocker* getDepotLocker() const {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
virtual Door* getDoor() {
|
virtual Door* getDoor() {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -114,7 +114,7 @@ bool Mailbox::sendItem(Item* item) const
|
|||||||
if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER,
|
if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER,
|
||||||
item, item->getItemCount(), nullptr, FLAG_NOLIMIT) == RETURNVALUE_NOERROR) {
|
item, item->getItemCount(), nullptr, FLAG_NOLIMIT) == RETURNVALUE_NOERROR) {
|
||||||
g_game.transformItem(item, item->getID() + 1);
|
g_game.transformItem(item, item->getID() + 1);
|
||||||
player->onReceiveMail();
|
player->onReceiveMail(town->getID());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -567,14 +567,14 @@ bool Player::canSeeCreature(const Creature* creature) const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::onReceiveMail() const
|
void Player::onReceiveMail(uint32_t townId) const
|
||||||
{
|
{
|
||||||
if (isNearDepotBox()) {
|
if (isNearDepotBox(townId)) {
|
||||||
sendTextMessage(MESSAGE_EVENT_ADVANCE, "New mail has arrived.");
|
sendTextMessage(MESSAGE_EVENT_ADVANCE, "New mail has arrived.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Player::isNearDepotBox() const
|
bool Player::isNearDepotBox(uint32_t townId) const
|
||||||
{
|
{
|
||||||
const Position& pos = getPosition();
|
const Position& pos = getPosition();
|
||||||
for (int32_t cx = -1; cx <= 1; ++cx) {
|
for (int32_t cx = -1; cx <= 1; ++cx) {
|
||||||
@ -584,11 +584,13 @@ bool Player::isNearDepotBox() const
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tile->hasFlag(TILESTATE_DEPOT)) {
|
if (DepotLocker* depotLocker = tile->getDepotLocker()) {
|
||||||
|
if (depotLocker->getDepotId() == townId) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -433,8 +433,8 @@ class Player final : public Creature, public Cylinder
|
|||||||
void removeConditionSuppressions(uint32_t conditions);
|
void removeConditionSuppressions(uint32_t conditions);
|
||||||
|
|
||||||
DepotLocker* getDepotLocker(uint32_t depotId, bool autoCreate);
|
DepotLocker* getDepotLocker(uint32_t depotId, bool autoCreate);
|
||||||
void onReceiveMail() const;
|
void onReceiveMail(uint32_t townId) const;
|
||||||
bool isNearDepotBox() const;
|
bool isNearDepotBox(uint32_t townId) const;
|
||||||
|
|
||||||
bool canSee(const Position& pos) const final;
|
bool canSee(const Position& pos) const final;
|
||||||
bool canSeeCreature(const Creature* creature) const final;
|
bool canSeeCreature(const Creature* creature) const final;
|
||||||
|
21
src/tile.cpp
21
src/tile.cpp
@ -212,6 +212,27 @@ Mailbox* Tile::getMailbox() const
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DepotLocker* Tile::getDepotLocker() const
|
||||||
|
{
|
||||||
|
if (!hasFlag(TILESTATE_DEPOT)) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ground && ground->getDepotLocker()) {
|
||||||
|
return ground->getDepotLocker();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (const TileItemVector* items = getItemList()) {
|
||||||
|
for (auto it = items->rbegin(), end = items->rend(); it != end; ++it) {
|
||||||
|
if ((*it)->getDepotLocker()) {
|
||||||
|
return (*it)->getDepotLocker();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
BedItem* Tile::getBedItem() const
|
BedItem* Tile::getBedItem() const
|
||||||
{
|
{
|
||||||
if (!hasFlag(TILESTATE_BED)) {
|
if (!hasFlag(TILESTATE_BED)) {
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
class Creature;
|
class Creature;
|
||||||
class Teleport;
|
class Teleport;
|
||||||
class Mailbox;
|
class Mailbox;
|
||||||
|
class DepotLocker;
|
||||||
class MagicField;
|
class MagicField;
|
||||||
class QTreeLeafNode;
|
class QTreeLeafNode;
|
||||||
class BedItem;
|
class BedItem;
|
||||||
@ -169,6 +170,7 @@ class Tile : public Cylinder
|
|||||||
MagicField* getFieldItem() const;
|
MagicField* getFieldItem() const;
|
||||||
Teleport* getTeleportItem() const;
|
Teleport* getTeleportItem() const;
|
||||||
Mailbox* getMailbox() const;
|
Mailbox* getMailbox() const;
|
||||||
|
DepotLocker* getDepotLocker() const;
|
||||||
BedItem* getBedItem() const;
|
BedItem* getBedItem() const;
|
||||||
|
|
||||||
Creature* getTopCreature() const;
|
Creature* getTopCreature() const;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user