Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
mattyx14 committed Jan 25, 2024
1 parent 32e699f commit d9435ef
Show file tree
Hide file tree
Showing 72 changed files with 3,276 additions and 795 deletions.
41 changes: 37 additions & 4 deletions config.lua.dist
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,10 @@ forgeCostOneSliver = 20
forgeSliverAmount = 3
forgeCoreCost = 50
forgeMaxDust = 225
forgeFusionCost = 100
forgeTransferCost = 100
forgeFusionDustCost = 100
forgeConvergenceFusionDustCost = 130
forgeTransferDustCost = 100
forgeConvergenceTransferCost = 160
forgeBaseSuccessRate = 50
forgeBonusSuccessRate = 15
forgeTierLossReduction = 50
Expand All @@ -131,6 +133,24 @@ forgeFiendishLimit = 3
forgeFiendishIntervalType = "hour"
forgeFiendishIntervalTime = "1"

ruseChanceFormulaA = 0.0307576
ruseChanceFormulaB = 0.440697
ruseChanceFormulaC = 0.026

onslaughtChanceFormulaA = 0.05
onslaughtChanceFormulaB = 0.4
onslaughtChanceFormulaC = 0.05

momentumChanceFormulaA = 0.05
momentumChanceFormulaB = 1.9
momentumChanceFormulaC = 0.05

transcendanceChanceFormulaA = 0.0127
transcendanceChanceFormulaB = 0.1070
transcendanceChanceFormulaC = 0.0073

transcendanceAvatarDuration = 7000

-- Bestiary & Bosstiary system
-- NOTE: bestiaryKillMultiplier, multiplier value of monster killed, default 1
-- NOTE: bosstiaryKillMultiplier, multiplier value of boss killed, default 1
Expand Down Expand Up @@ -177,6 +197,15 @@ pvpMaxLevelDifference = 0
wheelSystemEnabled = true
wheelPointsPerLevel = 1

-- Gem Atelier
wheelAtelierRotateLesserCost = 125000
wheelAtelierRotateRegularCost = 250000
wheelAtelierRotateGreaterCost = 500000

wheelAtelierRevealLesserCost = 125000
wheelAtelierRevealRegularCost = 1000000
wheelAtelierRevealGreaterCost = 6000000

-- Familiar system
-- NOTE: the time will be divided by 2 to get half the value, the familiar lasts 15 minutes by default and the cooldown of the spell is 30 minutes
-- Only change it here if you know what you are doing or to make testing easier with familiars
Expand Down Expand Up @@ -359,6 +388,8 @@ resetSessionsOnStartup = false

-- Misc.
-- NOTE: experienceDisplayRates: set to false to ignore exp rate or true to include exp rate
-- NOTE: disableLegacyRaids: set to true to disable legacy XML raids
-- NOTE: combatChainDelay: set to minimum 50 miliseconds
allowChangeOutfit = true
toggleMountInProtectionZone = false
freePremium = false
Expand All @@ -370,6 +401,8 @@ coinPacketSize = 25
coinImagesURL = "http://127.0.0.1/images/store/"
classicAttackSpeed = false
showScriptsLogInConsole = false
-- time to suppress negative conditions after being affected by them (ms)
minDelayBetweenConditions = 0
-- configure maximum value of critical imbuement
criticalChance = 10
inventoryGlowOnFiveBless = false
Expand All @@ -382,9 +415,9 @@ experienceDisplayRates = true
toggleAttackSpeedOnFist = false
multiplierSpeedOnFist = 5
maxSpeedOnFist = 500
disableLegacyRaids = false -- disable legacy XML raids
disableLegacyRaids = false
disableMonsterArmor = false
combatChainDelay = 50 -- minimum: 50 miliseconds
combatChainDelay = 50
minElementalResistance = -200
maxElementalResistance = 200
maxDamageReflection = 200
Expand Down
6 changes: 3 additions & 3 deletions metrics/prometheus/prometheus.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
---
global:
scrape_interval: 5s
scrape_timeout: 2s
evaluation_interval: 5s
scrape_interval: 30s
scrape_timeout: 25s
evaluation_interval: 30s
scrape_configs:
- job_name: canary
static_configs:
Expand Down
18 changes: 18 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,24 @@ if(MSVC)
target_sources(${PROJECT_NAME} PRIVATE ../cmake/otxserver.rc)
endif()

if (UNIX)

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
target_compile_options(${PROJECT_NAME}_lib
PRIVATE
-Wall -Wextra -Wpedantic
)
endif()

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
target_compile_options(${PROJECT_NAME}
PRIVATE
-Wall -Wextra -Wpedantic
)
endif()

endif (UNIX)

setup_target(${PROJECT_NAME})
set_output_directory(${PROJECT_NAME})
target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_lib)
2 changes: 1 addition & 1 deletion src/canary_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,7 @@ void CanaryServer::modulesLoadHelper(bool loaded, std::string moduleName) {
}

void CanaryServer::shutdown() {
inject<ThreadPool>().shutdown();
g_dispatcher().shutdown();
g_metrics().shutdown();
inject<ThreadPool>().shutdown();
}
26 changes: 24 additions & 2 deletions src/config/config_definitions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,20 +63,22 @@ enum ConfigKey_t : uint16_t {
FORGE_AMOUNT_MULTIPLIER,
FORGE_BASE_SUCCESS_RATE,
FORGE_BONUS_SUCCESS_RATE,
FORGE_FUSION_DUST_COST,
FORGE_CONVERGENCE_FUSION_DUST_COST,
FORGE_TRANSFER_DUST_COST,
FORGE_CONVERGENCE_TRANSFER_DUST_COST,
FORGE_CORE_COST,
FORGE_COST_ONE_SLIVER,
FORGE_FIENDISH_CREATURES_LIMIT,
FORGE_FIENDISH_INTERVAL_TIME,
FORGE_FIENDISH_INTERVAL_TYPE,
FORGE_FUSION_DUST_COST,
FORGE_INFLUENCED_CREATURES_LIMIT,
FORGE_MAX_DUST,
FORGE_MAX_ITEM_TIER,
FORGE_MAX_SLIVERS,
FORGE_MIN_SLIVERS,
FORGE_SLIVER_AMOUNT,
FORGE_TIER_LOSS_REDUCTION,
FORGE_TRANSFER_DUST_COST,
FRAG_TIME,
FREE_DEPOT_LIMIT,
FREE_PREMIUM,
Expand Down Expand Up @@ -145,7 +147,11 @@ enum ConfigKey_t : uint16_t {
METRICS_ENABLE_PROMETHEUS,
METRICS_OSTREAM_INTERVAL,
METRICS_PROMETHEUS_ADDRESS,
MIN_DELAY_BETWEEN_CONDITIONS,
MIN_ELEMENTAL_RESISTANCE,
MOMENTUM_CHANCE_FORMULA_A,
MOMENTUM_CHANCE_FORMULA_B,
MOMENTUM_CHANCE_FORMULA_C,
MONTH_KILLS_TO_RED,
MULTIPLIER_ATTACKONFIST,
MYSQL_DB,
Expand All @@ -158,6 +164,9 @@ enum ConfigKey_t : uint16_t {
ONE_PLAYER_ON_ACCOUNT,
ONLY_INVITED_CAN_MOVE_HOUSE_ITEMS,
ONLY_PREMIUM_ACCOUNT,
ONSLAUGHT_CHANCE_FORMULA_A,
ONSLAUGHT_CHANCE_FORMULA_B,
ONSLAUGHT_CHANCE_FORMULA_C,
OPTIMIZE_DATABASE,
ORANGE_SKULL_DURATION,
OWNER_EMAIL,
Expand Down Expand Up @@ -221,6 +230,9 @@ enum ConfigKey_t : uint16_t {
RESET_SESSIONS_ON_STARTUP,
REWARD_CHEST_COLLECT_ENABLED,
REWARD_CHEST_MAX_COLLECT_ITEMS,
RUSE_CHANCE_FORMULA_A,
RUSE_CHANCE_FORMULA_B,
RUSE_CHANCE_FORMULA_C,
SAVE_INTERVAL_TIME,
SAVE_INTERVAL_TYPE,
SCRIPTS_CONSOLE_LOGS,
Expand Down Expand Up @@ -274,6 +286,10 @@ enum ConfigKey_t : uint16_t {
TOGGLE_SERVER_IS_RETRO,
TOGGLE_TRAVELS_FREE,
TOGGLE_WHEELSYSTEM,
TRANSCENDANCE_AVATAR_DURATION,
TRANSCENDANCE_CHANCE_FORMULA_A,
TRANSCENDANCE_CHANCE_FORMULA_B,
TRANSCENDANCE_CHANCE_FORMULA_C,
T_CONST,
URL,
USE_ANY_DATAPACK_FOLDER,
Expand All @@ -289,6 +305,12 @@ enum ConfigKey_t : uint16_t {
WEATHER_RAIN,
WEATHER_THUNDER,
WEEK_KILLS_TO_RED,
WHEEL_ATELIER_REVEAL_GREATER_COST,
WHEEL_ATELIER_REVEAL_LESSER_COST,
WHEEL_ATELIER_REVEAL_REGULAR_COST,
WHEEL_ATELIER_ROTATE_GREATER_COST,
WHEEL_ATELIER_ROTATE_LESSER_COST,
WHEEL_ATELIER_ROTATE_REGULAR_COST,
WHEEL_POINTS_PER_LEVEL,
WHITE_SKULL_TIME,
WORLD_TYPE,
Expand Down
38 changes: 34 additions & 4 deletions src/config/configmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ bool ConfigManager::load() {
loadBoolConfig(L, CLEAN_PROTECTION_ZONES, "cleanProtectionZones", false);
loadBoolConfig(L, GLOBAL_SERVER_SAVE_SHUTDOWN, "globalServerSaveShutdown", true);
loadBoolConfig(L, PUSH_WHEN_ATTACKING, "pushWhenAttacking", false);
loadIntConfig(L, MIN_DELAY_BETWEEN_CONDITIONS, "minDelayBetweenConditions", 0);

loadBoolConfig(L, WEATHER_RAIN, "weatherRain", false);
loadBoolConfig(L, WEATHER_THUNDER, "thunderEffect", false);
Expand Down Expand Up @@ -227,16 +228,37 @@ bool ConfigManager::load() {
loadIntConfig(L, FORGE_SLIVER_AMOUNT, "forgeSliverAmount", 3);
loadIntConfig(L, FORGE_CORE_COST, "forgeCoreCost", 50);
loadIntConfig(L, FORGE_MAX_DUST, "forgeMaxDust", 225);
loadIntConfig(L, FORGE_FUSION_DUST_COST, "forgeFusionCost", 100);
loadIntConfig(L, FORGE_TRANSFER_DUST_COST, "forgeTransferCost", 100);
loadIntConfig(L, FORGE_FUSION_DUST_COST, "forgeFusionDustCost", 100);
loadIntConfig(L, FORGE_CONVERGENCE_FUSION_DUST_COST, "forgeConvergenceFusionCost", 130);
loadIntConfig(L, FORGE_TRANSFER_DUST_COST, "forgeTransferDustCost", 100);
loadIntConfig(L, FORGE_CONVERGENCE_TRANSFER_DUST_COST, "forgeConvergenceTransferCost", 160);
loadIntConfig(L, FORGE_BASE_SUCCESS_RATE, "forgeBaseSuccessRate", 50);
loadIntConfig(L, FORGE_BONUS_SUCCESS_RATE, "forgeBonusSuccessRate", 15);
loadIntConfig(L, FORGE_TIER_LOSS_REDUCTION, "forgeTierLossReduction", 50);
loadIntConfig(L, FORGE_AMOUNT_MULTIPLIER, "forgeAmountMultiplier", 3);
loadFloatConfig(L, FORGE_AMOUNT_MULTIPLIER, "forgeAmountMultiplier", 3.0);
loadIntConfig(L, FORGE_MIN_SLIVERS, "forgeMinSlivers", 3);
loadIntConfig(L, FORGE_MAX_SLIVERS, "forgeMaxSlivers", 7);
loadIntConfig(L, FORGE_INFLUENCED_CREATURES_LIMIT, "forgeInfluencedLimit", 300);
loadIntConfig(L, FORGE_FIENDISH_CREATURES_LIMIT, "forgeFiendishLimit", 3);

loadFloatConfig(L, RUSE_CHANCE_FORMULA_A, "ruseChanceFormulaA", 0.0307576);
loadFloatConfig(L, RUSE_CHANCE_FORMULA_B, "ruseChanceFormulaB", 0.440697);
loadFloatConfig(L, RUSE_CHANCE_FORMULA_C, "ruseChanceFormulaC", 0.026);

loadFloatConfig(L, ONSLAUGHT_CHANCE_FORMULA_A, "onslaughtChanceFormulaA", 0.05);
loadFloatConfig(L, ONSLAUGHT_CHANCE_FORMULA_B, "onslaughtChanceFormulaB", 0.4);
loadFloatConfig(L, ONSLAUGHT_CHANCE_FORMULA_C, "onslaughtChanceFormulaC", 0.05);

loadFloatConfig(L, MOMENTUM_CHANCE_FORMULA_A, "momentumChanceFormulaA", 0.05);
loadFloatConfig(L, MOMENTUM_CHANCE_FORMULA_B, "momentumChanceFormulaB", 1.9);
loadFloatConfig(L, MOMENTUM_CHANCE_FORMULA_C, "momentumChanceFormulaC", 0.05);

loadFloatConfig(L, TRANSCENDANCE_CHANCE_FORMULA_A, "transcendanceChanceFormulaA", 0.0127);
loadFloatConfig(L, TRANSCENDANCE_CHANCE_FORMULA_B, "transcendanceChanceFormulaB", 0.1070);
loadFloatConfig(L, TRANSCENDANCE_CHANCE_FORMULA_C, "transcendanceChanceFormulaC", 0.0073);

loadIntConfig(L, TRANSCENDANCE_AVATAR_DURATION, "transcendanceAvatarDuration", 7000);

loadIntConfig(L, DISCORD_WEBHOOK_DELAY_MS, "discordWebhookDelayMs", Webhook::DEFAULT_DELAY_MS);

loadFloatConfig(L, BESTIARY_RATE_CHARM_SHOP_PRICE, "bestiaryRateCharmShopPrice", 1.0);
Expand Down Expand Up @@ -311,7 +333,7 @@ bool ConfigManager::load() {
loadIntConfig(L, HAZARD_PODS_DROP_MULTIPLIER, "hazardPodsDropMultiplier", 87);
loadIntConfig(L, HAZARD_PODS_TIME_TO_DAMAGE, "hazardPodsTimeToDamage", 2000);
loadIntConfig(L, HAZARD_PODS_TIME_TO_SPAWN, "hazardPodsTimeToSpawn", 4000);
loadIntConfig(L, HAZARD_EXP_BONUS_MULTIPLIER, "hazardExpBonusMultiplier", 2);
loadFloatConfig(L, HAZARD_EXP_BONUS_MULTIPLIER, "hazardExpBonusMultiplier", 2.0);
loadIntConfig(L, HAZARD_LOOT_BONUS_MULTIPLIER, "hazardLootBonusMultiplier", 2);
loadIntConfig(L, HAZARD_PODS_DAMAGE, "hazardPodsDamage", 5);
loadIntConfig(L, HAZARD_SPAWN_PLUNDER_MULTIPLIER, "hazardSpawnPlunderMultiplier", 25);
Expand All @@ -326,6 +348,14 @@ bool ConfigManager::load() {
loadBoolConfig(L, TOGGLE_WHEELSYSTEM, "wheelSystemEnabled", true);
loadIntConfig(L, WHEEL_POINTS_PER_LEVEL, "wheelPointsPerLevel", 1);

loadIntConfig(L, WHEEL_ATELIER_ROTATE_LESSER_COST, "wheelAtelierRotateLesserCost", 125000);
loadIntConfig(L, WHEEL_ATELIER_ROTATE_REGULAR_COST, "wheelAtelierRotateRegularCost", 250000);
loadIntConfig(L, WHEEL_ATELIER_ROTATE_GREATER_COST, "wheelAtelierRotateGreaterCost", 500000);

loadIntConfig(L, WHEEL_ATELIER_REVEAL_LESSER_COST, "wheelAtelierRevealLesserCost", 125000);
loadIntConfig(L, WHEEL_ATELIER_REVEAL_REGULAR_COST, "wheelAtelierRevealRegularCost", 1000000);
loadIntConfig(L, WHEEL_ATELIER_REVEAL_GREATER_COST, "wheelAtelierRevealGreaterCost", 6000000);

loadBoolConfig(L, PARTY_AUTO_SHARE_EXPERIENCE, "partyAutoShareExperience", true);
loadBoolConfig(L, PARTY_SHARE_LOOT_BOOSTS, "partyShareLootBoosts", true);
loadFloatConfig(L, PARTY_SHARE_LOOT_BOOSTS_DIMINISHING_FACTOR, "partyShareLootBoostsDimishingFactor", 0.7f);
Expand Down
2 changes: 1 addition & 1 deletion src/core.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ static constexpr auto AUTHENTICATOR_PERIOD = 30U;
// SERVER_MAJOR_VERSION is the actual full version of the server, including minor and patch numbers.
// This is intended for internal use to identify the exact state of the server (release) software.
static constexpr auto SERVER_RELEASE_VERSION = "6.2.0";
static constexpr auto CLIENT_VERSION = 1321;
static constexpr auto CLIENT_VERSION = 1332;

#define CLIENT_VERSION_UPPER (CLIENT_VERSION / 100)
#define CLIENT_VERSION_LOWER (CLIENT_VERSION % 100)
1 change: 1 addition & 0 deletions src/creatures/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,6 @@ target_sources(${PROJECT_NAME}_lib PRIVATE
players/storages/storages.cpp
players/player.cpp
players/wheel/player_wheel.cpp
players/wheel/wheel_gems.cpp
players/vocations/vocation.cpp
)
4 changes: 2 additions & 2 deletions src/creatures/appearance/outfit/outfit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ bool Outfits::loadFromXml() {
if (uint16_t lookType = pugi::cast<uint16_t>(lookTypeAttribute.value());
g_configManager().getBoolean(WARN_UNSAFE_SCRIPTS, __FUNCTION__) && lookType != 0
&& !g_game().isLookTypeRegistered(lookType)) {
g_logger().warn("[Outfits::loadFromXml] An unregistered creature looktype type with id '{}' was blocked to prevent client crash.", lookType);
return false;
g_logger().warn("[Outfits::loadFromXml] An unregistered creature looktype type with id '{}' was ignored to prevent client crash.", lookType);
continue;
}

outfits[type].emplace_back(std::make_shared<Outfit>(
Expand Down
18 changes: 10 additions & 8 deletions src/creatures/combat/combat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -744,7 +744,7 @@ void Combat::CombatConditionFunc(std::shared_ptr<Creature> caster, std::shared_p

// TODO: infight condition until all aggressive conditions has ended
if (target) {
target->addCombatCondition(conditionCopy);
target->addCombatCondition(conditionCopy, caster && caster->getPlayer() != nullptr);
}
}
}
Expand Down Expand Up @@ -1324,6 +1324,7 @@ void Combat::setRuneSpellName(const std::string &value) {
}

std::vector<std::pair<Position, std::vector<uint32_t>>> Combat::pickChainTargets(std::shared_ptr<Creature> caster, const CombatParams &params, uint8_t chainDistance, uint8_t maxTargets, bool backtracking, bool aggressive, std::shared_ptr<Creature> initialTarget /* = nullptr */) {
Benchmark bm_pickChain;
metrics::method_latency measure(__METHOD_NAME__);
if (!caster) {
return {};
Expand All @@ -1342,8 +1343,8 @@ std::vector<std::pair<Position, std::vector<uint32_t>>> Combat::pickChainTargets
maxTargets++;
}

const int maxBacktrackingAttempts = 10; // Can be adjusted as needed
while (!targets.empty() && targets.size() <= maxTargets) {
int backtrackingAttempts = 10;
while (!targets.empty() && targets.size() <= maxTargets && backtrackingAttempts > 0) {
auto currentTarget = targets.back();
auto spectators = Spectators().find<Creature>(currentTarget->getPosition(), false, chainDistance, chainDistance, chainDistance, chainDistance);
g_logger().debug("Combat::pickChainTargets: currentTarget: {}, spectators: {}", currentTarget->getName(), spectators.size());
Expand All @@ -1367,7 +1368,7 @@ std::vector<std::pair<Position, std::vector<uint32_t>>> Combat::pickChainTargets
}

if (closestSpectator) {
g_logger().debug("Combat::pickChainTargets: closestSpectator: {}", closestSpectator->getName());
g_logger().trace("[{}] closestSpectator: {}", __METHOD_NAME__, closestSpectator->getName());

bool found = false;
for (auto &[pos, vec] : resultMap) {
Expand All @@ -1385,14 +1386,15 @@ std::vector<std::pair<Position, std::vector<uint32_t>>> Combat::pickChainTargets
visited.insert(closestSpectator->getID());
continue;
} else if (backtracking) {
g_logger().debug("[{}] backtracking", __METHOD_NAME__);
targets.pop_back();
if (targets.size() <= maxBacktrackingAttempts) {
continue;
}
backtrackingAttempts--;
continue;
}
break;
}

g_logger().debug("[{}] resultMap: {} in {} ms", __METHOD_NAME__, resultMap.size(), bm_pickChain.duration());
return resultMap;
}

Expand Down Expand Up @@ -2069,7 +2071,7 @@ void Combat::applyExtensions(std::shared_ptr<Creature> caster, std::shared_ptr<C
}

bonus += damage.criticalDamage;
double multiplier = 1.0 + static_cast<double>(bonus) / 100;
double multiplier = 1.0 + static_cast<double>(bonus) / 10000;
chance += (uint16_t)damage.criticalChance;

if (chance != 0 && uniform_random(1, 10000) <= chance) {
Expand Down
Loading

0 comments on commit d9435ef

Please sign in to comment.