mirror of
https://github.com/ErikasKontenis/SabrehavenServer.git
synced 2025-10-18 16:23:27 +02:00
introduce uh trap, never break spear, and config fixes for new server
This commit is contained in:
@@ -80,6 +80,7 @@ bool ConfigManager::load()
|
||||
boolean[TELEPORT_NEWBIES] = getGlobalBoolean(L, "teleportNewbies", true);
|
||||
boolean[STACK_CUMULATIVES] = getGlobalBoolean(L, "autoStackCumulatives", false);
|
||||
boolean[BLOCK_HEIGHT] = getGlobalBoolean(L, "blockHeight", false);
|
||||
boolean[UH_TRAP] = getGlobalBoolean(L, "uhTrap", false);
|
||||
boolean[DROP_ITEMS] = getGlobalBoolean(L, "dropItems", false);
|
||||
boolean[DISTANCE_WEAPONS_DROP_ON_GROUND] = getGlobalBoolean(L, "distanceWeaponsDropOnGround", true);
|
||||
|
||||
|
@@ -47,6 +47,7 @@ class ConfigManager
|
||||
TELEPORT_NEWBIES,
|
||||
STACK_CUMULATIVES,
|
||||
BLOCK_HEIGHT,
|
||||
UH_TRAP,
|
||||
DROP_ITEMS,
|
||||
DISTANCE_WEAPONS_DROP_ON_GROUND,
|
||||
CORPSE_OWNER_ENABLED,
|
||||
|
15
src/game.cpp
15
src/game.cpp
@@ -223,7 +223,12 @@ Thing* Game::internalGetThing(Player* player, const Position& pos, int32_t index
|
||||
if (item && item->isMoveable()) {
|
||||
thing = item;
|
||||
} else {
|
||||
thing = tile->getTopVisibleCreature(player);
|
||||
if (g_config.getBoolean(ConfigManager::UH_TRAP)) {
|
||||
thing = tile->getBottomVisibleCreatureUH(player);
|
||||
}
|
||||
else {
|
||||
thing = tile->getTopVisibleCreature(player);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -239,9 +244,11 @@ Thing* Game::internalGetThing(Player* player, const Position& pos, int32_t index
|
||||
}
|
||||
|
||||
case STACKPOS_USETARGET: {
|
||||
thing = tile->getTopVisibleCreature(player);
|
||||
if (!thing) {
|
||||
thing = tile->getUseItem(index);
|
||||
if (g_config.getBoolean(ConfigManager::UH_TRAP)) {
|
||||
thing = tile->getBottomCreatureUH();
|
||||
}
|
||||
else {
|
||||
thing = tile->getTopCreature();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@@ -1690,6 +1690,7 @@ void LuaScriptInterface::registerFunctions()
|
||||
registerEnumIn("configKeys", ConfigManager::NEWBIE_TOWN)
|
||||
registerEnumIn("configKeys", ConfigManager::NEWBIE_LEVEL_THRESHOLD)
|
||||
registerEnumIn("configKeys", ConfigManager::BLOCK_HEIGHT)
|
||||
registerEnumIn("configKeys", ConfigManager::UH_TRAP)
|
||||
registerEnumIn("configKeys", ConfigManager::DROP_ITEMS)
|
||||
registerEnumIn("configKeys", ConfigManager::CLIENT_VERSION)
|
||||
|
||||
|
@@ -689,6 +689,9 @@ bool Spell::playerRuneSpellCheck(Player* player, const Position& toPos)
|
||||
}
|
||||
|
||||
const Creature* visibleCreature = tile->getTopCreature();
|
||||
if (g_config.getBoolean(ConfigManager::UH_TRAP)) {
|
||||
visibleCreature = tile->getBottomCreature();
|
||||
}
|
||||
if (blockingCreature && visibleCreature) {
|
||||
player->sendCancelMessage(RETURNVALUE_NOTENOUGHROOM);
|
||||
g_game.addMagicEffect(player->getPosition(), CONST_ME_POFF);
|
||||
@@ -1819,6 +1822,9 @@ bool RuneSpell::executeUse(Player* player, Item* item, const Position&, Thing* t
|
||||
Tile* toTile = g_game.map.getTile(toPosition);
|
||||
if (toTile) {
|
||||
const Creature* visibleCreature = toTile->getTopCreature();
|
||||
if (g_config.getBoolean(ConfigManager::UH_TRAP)) {
|
||||
visibleCreature = toTile->getBottomCreature();
|
||||
}
|
||||
if (visibleCreature) {
|
||||
var.number = visibleCreature->getID();
|
||||
}
|
||||
|
39
src/tile.cpp
39
src/tile.cpp
@@ -263,6 +263,16 @@ Creature* Tile::getTopCreature() const
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Creature* Tile::getBottomCreatureUH() const
|
||||
{
|
||||
if (const CreatureVector* creatures = getCreatures()) {
|
||||
if (!creatures->empty()) {
|
||||
return *creatures->rbegin();
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const Creature* Tile::getBottomCreature() const
|
||||
{
|
||||
if (const CreatureVector* creatures = getCreatures()) {
|
||||
@@ -301,6 +311,35 @@ Creature* Tile::getTopVisibleCreature(const Creature* creature) const
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Creature* Tile::getBottomVisibleCreatureUH(const Creature* creature) const
|
||||
{
|
||||
if (const CreatureVector* creatures = getCreatures()) {
|
||||
if (creature) {
|
||||
const Player* player = creature->getPlayer();
|
||||
if (player && player->isAccessPlayer()) {
|
||||
return getBottomCreatureUH();
|
||||
}
|
||||
|
||||
for (auto it = creatures->rbegin(), end = creatures->rend(); it != end; ++it) {
|
||||
if (creature->canSeeCreature(*it)) {
|
||||
return *it;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (auto it = creatures->rbegin(), end = creatures->rend(); it != end; ++it) {
|
||||
if (!(*it)->isInvisible()) {
|
||||
const Player* player = (*it)->getPlayer();
|
||||
if (!player || !player->isInGhostMode()) {
|
||||
return *it;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const Creature* Tile::getBottomVisibleCreature(const Creature* creature) const
|
||||
{
|
||||
if (const CreatureVector* creatures = getCreatures()) {
|
||||
|
@@ -174,8 +174,10 @@ class Tile : public Cylinder
|
||||
BedItem* getBedItem() const;
|
||||
|
||||
Creature* getTopCreature() const;
|
||||
Creature* getBottomCreatureUH() const;
|
||||
const Creature* getBottomCreature() const;
|
||||
Creature* getTopVisibleCreature(const Creature* creature) const;
|
||||
Creature* getBottomVisibleCreatureUH(const Creature* creature) const;
|
||||
const Creature* getBottomVisibleCreature(const Creature* creature) const;
|
||||
Item* getTopTopItem() const;
|
||||
Item* getTopDownItem() const;
|
||||
|
Reference in New Issue
Block a user