diff --git a/src/k_roulette.c b/src/k_roulette.c index b1d69c796..6a22f2269 100644 --- a/src/k_roulette.c +++ b/src/k_roulette.c @@ -1208,12 +1208,23 @@ static boolean K_TimingPermitsItem(kartitems_t item, const itemroulette_t *roule return true; } +static void K_LuaHookItemRoulette(player_t *player, itemroulette_t *const roulette) +{ + // Lua can override the final result. + LUA_HookFillItemRoulette(player, roulette); + + // If somehow there's no items, add sad. + if (roulette->itemList.len == 0) { + K_AddItemToReel(player, roulette, KITEM_SAD); + } +} + /*-------------------------------------------------- void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulette, boolean ringbox, boolean dryrun) See header file for description. --------------------------------------------------*/ -void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulette, boolean ringbox, boolean dryrun) +void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, boolean ringbox, boolean dryrun) { UINT32 spawnChance[NUMKARTRESULTS] = {0}; UINT32 totalSpawnChance = 0; @@ -1261,6 +1272,7 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet K_PushToRouletteItemList(roulette, presetlist[i]); } + K_LuaHookItemRoulette(player, roulette); return; } @@ -1269,6 +1281,7 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet if (cv_kartdebugitem.value != KITEM_NONE) { K_PushToRouletteItemList(roulette, cv_kartdebugitem.value); + K_LuaHookItemRoulette(player, roulette); return; } @@ -1282,6 +1295,8 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet { K_PushToRouletteItemList(roulette, K_KartItemReelSpecialEnd[i]); } + + K_LuaHookItemRoulette(player, roulette); return; } } @@ -1292,6 +1307,7 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet K_PushToRouletteItemList(roulette, K_KartItemReelBoss[i]); } + K_LuaHookItemRoulette(player, roulette); return; } else if (K_TimeAttackRules() == true) @@ -1358,6 +1374,8 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet } } + K_LuaHookItemRoulette(player, roulette); + return; } @@ -1366,6 +1384,7 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet if (K_ForcedSPB(player, roulette) == true) { K_AddItemToReel(player, roulette, KITEM_SPB); + K_LuaHookItemRoulette(player, roulette); return; } @@ -1390,6 +1409,7 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet // singleItem = KITEM_SAD by default, // so it will be used when all items are turned off. K_AddItemToReel(player, roulette, singleItem); + K_LuaHookItemRoulette(player, roulette); return; } @@ -1745,6 +1765,8 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet totalSpawnChance--; } + + K_LuaHookItemRoulette(player, roulette); } /*-------------------------------------------------- diff --git a/src/lua_hook.h b/src/lua_hook.h index 1f392d868..c9242d1fd 100644 --- a/src/lua_hook.h +++ b/src/lua_hook.h @@ -80,6 +80,7 @@ automatically. X (PlayerCmd),/* building the player's ticcmd struct */\ X (VoteThinker),/* Y_VoteTicker */\ X (PreFillItemRoulette),/* K_FillItemRouletteData, before special conditions but after roulette speed calc */\ + X (FillItemRoulette),/* K_FillItemRouletteData, right at the end */\ #define STRING_HOOK_LIST(X) \ X (SpecialExecute),\ @@ -148,6 +149,7 @@ void LUA_HookPlayerQuit(player_t *, kickreason_t); int LUA_HookViewpointSwitch(player_t *player, player_t *newdisplayplayer, boolean forced); int LUA_HookSeenPlayer(player_t *player, player_t *seenfriend); int LUA_HookPreFillItemRoulette(player_t *player, itemroulette_t *const roulette, boolean ringbox); +int LUA_HookFillItemRoulette(player_t *player, itemroulette_t *const roulette); #ifdef __cplusplus } // extern "C" diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 0d1771f74..5447276f8 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -1039,4 +1039,9 @@ int LUA_HookPreFillItemRoulette(player_t *player, itemroulette_t *const roulette return roulette_hook(player, roulette, ringbox, HOOK(PreFillItemRoulette), res_true); } +int LUA_HookFillItemRoulette(player_t *player, itemroulette_t *const roulette) +{ + return roulette_hook(player, roulette, false, HOOK(FillItemRoulette), res_true); +} + boolean hook_cmd_running = false;