Skip to content

Commit

Permalink
feat: [game_outfit] Shader (#9)
Browse files Browse the repository at this point in the history
  • Loading branch information
kokekanon authored Apr 16, 2024
1 parent 942c718 commit e4112bf
Show file tree
Hide file tree
Showing 19 changed files with 508 additions and 9 deletions.
9 changes: 9 additions & 0 deletions data/XML/shaders.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<shaders>
<shader id="1" name="Outfit - Rainbow" premium="no" />
<shader id="2" name="Outfit - Ghost" premium="no" />
<shader id="3" name="Outfit - Jelly" premium="no" />
<shader id="4" name="Outfit - Fragmented" premium="no" />
<shader id="5" name="Outfit - Outline" premium="no" />

</shaders>
3 changes: 3 additions & 0 deletions data/talkactions/scripts/reload.lua
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ local reloadTypes = {
["aura"] = RELOAD_TYPE_AURA,
["auras"] = RELOAD_TYPE_AURA,

["shader"] = RELOAD_TYPE_SHADERS,
["shaders"] = RELOAD_TYPE_SHADERS,

["move"] = RELOAD_TYPE_MOVEMENTS,
["movement"] = RELOAD_TYPE_MOVEMENTS,
["movements"] = RELOAD_TYPE_MOVEMENTS,
Expand Down
9 changes: 9 additions & 0 deletions schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ CREATE TABLE IF NOT EXISTS `players` (
`randomizeaura` tinyint NOT NULL DEFAULT '0',
`currenteffect` smallint UNSIGNED NOT NULL DEFAULT '0',
`randomizeeffect` tinyint NOT NULL DEFAULT '0',
`currentshader` smallint UNSIGNED NOT NULL DEFAULT '0',
`randomizeshader` tinyint NOT NULL DEFAULT '0';
`direction` tinyint unsigned NOT NULL DEFAULT '2',
`maglevel` int NOT NULL DEFAULT '0',
`mana` int NOT NULL DEFAULT '0',
Expand Down Expand Up @@ -385,6 +387,13 @@ CREATE TABLE IF NOT EXISTS `player_auras` (
FOREIGN KEY (`player_id`) REFERENCES `players`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;

CREATE TABLE IF NOT EXISTS `player_shaders` (
`player_id` int(11) NOT NULL DEFAULT 0,
`shader_id` smallint(5) UNSIGNED NOT NULL DEFAULT 0
PRIMARY KEY (`player_id`, `shader_id`),
FOREIGN KEY (`player_id`) REFERENCES `players`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;

CREATE TABLE IF NOT EXISTS `server_config` (
`config` varchar(50) NOT NULL,
`value` varchar(256) NOT NULL DEFAULT '',
Expand Down
1 change: 1 addition & 0 deletions src/const.h
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,7 @@ enum ReloadTypes_t : uint8_t
RELOAD_TYPE_WINGS,
RELOAD_TYPE_AURAS,
RELOAD_TYPE_EFFECTS,
RELOAD_TYPE_SHADERS,
RELOAD_TYPE_MOVEMENTS,
RELOAD_TYPE_NPCS,
RELOAD_TYPE_QUESTS,
Expand Down
1 change: 1 addition & 0 deletions src/creature.h
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,7 @@ class Creature : virtual public Thing
uint16_t currentWing;
uint16_t currentAura;
uint16_t currentEffect;
uint16_t currentShader;

Position lastPosition;
LightInfo internalLight;
Expand Down
2 changes: 2 additions & 0 deletions src/enums.h
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,8 @@ struct Outfit_t
uint16_t lookWing = 0;
uint16_t lookAura = 0;
uint16_t lookEffect = 0;
uint16_t lookShader = 0;

uint8_t lookHead = 0;
uint8_t lookBody = 0;
uint8_t lookLegs = 0;
Expand Down
25 changes: 24 additions & 1 deletion src/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ void Game::setGameState(GameState_t newState)
wings.loadFromXml();
auras.loadFromXml();
effects.loadFromXml();
shaders.loadFromXml();

raids.loadFromXml();
raids.startup();
Expand Down Expand Up @@ -3526,7 +3527,29 @@ void Game::playerChangeOutfit(uint32_t playerId, Outfit_t outfit, bool randomize
player->detachEffectById(player->getCurrentAura());
player->wasAuraed = false;
}
// @
// @
/// shaders
if (outfit.lookShader != 0) {
Shader* shader = shaders.getShaderByID(outfit.lookShader);
if (!shader) {
return;
}

if (!player->hasShader(shader)) {
return;
}

player->setCurrentShader(shader->id);
player->sendShader(player, shader->name);


} else {
if (player->isShadered()) {
player->disshader();
}
player->sendShader(player, "Outfit - Default");
player->wasShadered = false;
}

if (player->canWear(outfit.lookType, outfit.lookAddons)) {
player->defaultOutfit = outfit;
Expand Down
5 changes: 4 additions & 1 deletion src/game.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include "wings.h"
#include "auras.h"
#include "effects.h"
#include "shaders.h"
#include "npc.h"
#include "player.h"
#include "position.h"
Expand Down Expand Up @@ -490,8 +491,10 @@ class Game
Raids raids;
Mounts mounts;
Wings wings;
Effects effects;
Auras auras;
Effects effects;
Shaders shaders;


std::forward_list<Item*> toDecayItems;

Expand Down
43 changes: 41 additions & 2 deletions src/iologindata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ bool IOLoginData::loadPlayerById(Player* player, uint32_t id)
return loadPlayer(
player,
db.storeQuery(fmt::format(
"SELECT `id`, `name`, `account_id`, `group_id`, `sex`, `vocation`, `experience`, `level`, `maglevel`, `health`, `healthmax`, `blessings`, `mana`, `manamax`, `manaspent`, `soul`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`, `lookaddons`, `currentmount`, `randomizemount`, `currentwing`, `randomizewing`,`currenteffect`, `randomizeeffect`,`currentaura`, `randomizeaura`, `posx`, `posy`, `posz`, `cap`, `lastlogin`, `lastlogout`, `lastip`, `conditions`, `skulltime`, `skull`, `town_id`, `balance`, `stamina`, `skill_fist`, `skill_fist_tries`, `skill_club`, `skill_club_tries`, `skill_sword`, `skill_sword_tries`, `skill_axe`, `skill_axe_tries`, `skill_dist`, `skill_dist_tries`, `skill_shielding`, `skill_shielding_tries`, `skill_fishing`, `skill_fishing_tries`, `direction` FROM `players` WHERE `id` = {:d}",
"SELECT `id`, `name`, `account_id`, `group_id`, `sex`, `vocation`, `experience`, `level`, `maglevel`, `health`, `healthmax`, `blessings`, `mana`, `manamax`, `manaspent`, `soul`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`, `lookaddons`, `currentmount`, `randomizemount`, `currentwing`, `randomizewing`,`currenteffect`, `randomizeeffect`,`currentaura`, `randomizeaura`,`currentshader`, `randomizeshader`, `posx`, `posy`, `posz`, `cap`, `lastlogin`, `lastlogout`, `lastip`, `conditions`, `skulltime`, `skull`, `town_id`, `balance`, `stamina`, `skill_fist`, `skill_fist_tries`, `skill_club`, `skill_club_tries`, `skill_sword`, `skill_sword_tries`, `skill_axe`, `skill_axe_tries`, `skill_dist`, `skill_dist_tries`, `skill_shielding`, `skill_shielding_tries`, `skill_fishing`, `skill_fishing_tries`, `direction` FROM `players` WHERE `id` = {:d}",
id)));
}

Expand All @@ -239,7 +239,7 @@ bool IOLoginData::loadPlayerByName(Player* player, std::string_view name)
return loadPlayer(
player,
db.storeQuery(fmt::format(
"SELECT `id`, `name`, `account_id`, `group_id`, `sex`, `vocation`, `experience`, `level`, `maglevel`, `health`, `healthmax`, `blessings`, `mana`, `manamax`, `manaspent`, `soul`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`, `lookaddons`, `currentmount`, `randomizemount`, `currentwing`, `randomizewing`,`currenteffect`, `randomizeeffect`,`currentaura`, `randomizeaura`, `posx`, `posy`, `posz`, `cap`, `lastlogin`, `lastlogout`, `lastip`, `conditions`, `skulltime`, `skull`, `town_id`, `balance`, `stamina`, `skill_fist`, `skill_fist_tries`, `skill_club`, `skill_club_tries`, `skill_sword`, `skill_sword_tries`, `skill_axe`, `skill_axe_tries`, `skill_dist`, `skill_dist_tries`, `skill_shielding`, `skill_shielding_tries`, `skill_fishing`, `skill_fishing_tries`, `direction` FROM `players` WHERE `name` = {:s}",
"SELECT `id`, `name`, `account_id`, `group_id`, `sex`, `vocation`, `experience`, `level`, `maglevel`, `health`, `healthmax`, `blessings`, `mana`, `manamax`, `manaspent`, `soul`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`, `lookaddons`, `currentmount`, `randomizemount`, `currentwing`, `randomizewing`,`currenteffect`, `randomizeeffect`,`currentaura`, `randomizeaura`,`currentshader`, `randomizeshader`, `posx`, `posy`, `posz`, `cap`, `lastlogin`, `lastlogout`, `lastip`, `conditions`, `skulltime`, `skull`, `town_id`, `balance`, `stamina`, `skill_fist`, `skill_fist_tries`, `skill_club`, `skill_club_tries`, `skill_sword`, `skill_sword_tries`, `skill_axe`, `skill_axe_tries`, `skill_dist`, `skill_dist_tries`, `skill_shielding`, `skill_shielding_tries`, `skill_fishing`, `skill_fishing_tries`, `direction` FROM `players` WHERE `name` = {:s}",
db.escapeString(name))));
}

Expand Down Expand Up @@ -364,11 +364,13 @@ bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result)
player->currentWing = result->getNumber<uint16_t>("currentwing");
player->currentEffect = result->getNumber<uint16_t>("currenteffect");
player->currentAura = result->getNumber<uint16_t>("currentaura");
player->currentShader = result->getNumber<uint16_t>("currentshader");
player->direction = static_cast<Direction>(result->getNumber<uint16_t>("direction"));
player->randomizeMount = result->getNumber<uint8_t>("randomizemount") != 0;
player->randomizeWing = result->getNumber<uint8_t>("randomizewing") != 0;
player->randomizeAura = result->getNumber<uint8_t>("randomizeaura") != 0;
player->randomizeEffect = result->getNumber<uint8_t>("randomizeeffect") != 0;
player->randomizeShader = result->getNumber<uint8_t>("randomizeshader") != 0;
if (g_game.getWorldType() != WORLD_TYPE_PVP_ENFORCED) {
const time_t skullSeconds = result->getNumber<time_t>("skulltime") - time(nullptr);
if (skullSeconds > 0) {
Expand Down Expand Up @@ -647,6 +649,24 @@ bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result)
}
// @--

// load Shaders
if ((result = db.storeQuery(
fmt::format("SELECT `shader_id` FROM `player_shaders` WHERE `player_id` = {:d}", player->getGUID())))) {
do {
player->tameShader(result->getNumber<uint16_t>("shader_id"));
} while (result->next());
}

auto currentShaderID = player->getCurrentShader();

if (currentShaderID && currentShaderID != 0) {
Shader* shader = g_game.shaders.getShaderByID(currentShaderID);

if (shader && shader->name != "Outfit - Default") {
player->setShader(shader->name);
}
}

player->updateBaseSpeed();
player->updateInventoryWeight();
player->updateItemsLight(true);
Expand Down Expand Up @@ -760,6 +780,8 @@ bool IOLoginData::savePlayer(Player* player)
query << "`randomizeeffect` = " << player->randomizeEffect << ",";
query << "`currentaura` = " << static_cast<uint16_t>(player->currentAura) << ',';
query << "`randomizeaura` = " << player->randomizeAura << ",";
query << "`currentshader` = " << static_cast<uint16_t>(player->currentShader) << ',';
query << "`randomizeshader` = " << player->randomizeShader << ",";
query << "`maglevel` = " << player->magLevel << ',';
query << "`mana` = " << player->mana << ',';
query << "`manamax` = " << player->manaMax << ',';
Expand Down Expand Up @@ -1029,6 +1051,23 @@ bool IOLoginData::savePlayer(Player* player)
}
// --@

// save shaders
if (!db.executeQuery(fmt::format("DELETE FROM `player_shaders` WHERE `player_id` = {:d}", player->getGUID()))) {
return false;
}

DBInsert shaderQuery("INSERT INTO `player_shaders` (`player_id`, `shader_id`) VALUES ");

for (const auto& it : player->shaders) {
if (!shaderQuery.addRow(fmt::format("{:d}, {:d}", player->getGUID(), it))) {
return false;
}
}

if (!shaderQuery.execute()) {
return false;
}

// End the transaction
return transaction.commit();
}
Expand Down
16 changes: 16 additions & 0 deletions src/luagame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,21 @@ int luaGameGetWings(lua_State* L)

return 1;
}
// shaders
int luaGameGetShaders(lua_State* L)
{
// Game.getShaders()
const auto& shaders = g_game.shaders.getShaders();
lua_createtable(L, shaders.size(), 0);

int index = 0;
for (const auto& shader : shaders) {
pushShader(L, &shader);
lua_rawseti(L, -2, ++index);
}

return 1;
}

int luaGameGetAuras(lua_State* L)
{
Expand Down Expand Up @@ -738,6 +753,7 @@ void LuaScriptInterface::registerGame()
registerMethod("Game", "getWings", luaGameGetWings);
registerMethod("Game", "getEffects", luaGameGetEffects);
registerMethod("Game", "getAuras", luaGameGetAuras);
registerMethod("Game", "getShaders", luaGameGetShaders);

registerMethod("Game", "getGameState", luaGameGetGameState);
registerMethod("Game", "setGameState", luaGameSetGameState);
Expand Down
92 changes: 92 additions & 0 deletions src/luaplayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include "wings.h"
#include "auras.h"
#include "effects.h"
#include "shaders.h"

extern Chat* g_chat;
extern Game g_game;
Expand Down Expand Up @@ -1869,6 +1870,93 @@ int luaPlayerToggleEffect(lua_State* L)
}

// @
int luaPlayerAddShader(lua_State* L)
{
// player:addShader(shaderId or shaderName)
Player* player = getUserdata<Player>(L, 1);
if (!player) {
lua_pushnil(L);
return 1;
}

uint16_t shaderId;
if (isInteger(L, 2)) {
shaderId = getInteger<uint16_t>(L, 2);
} else {
Shader* shader = g_game.shaders.getShaderByName(getString(L, 2));
if (!shader) {
lua_pushnil(L);
return 1;
}
shaderId = shader->id;
}

pushBoolean(L, player->tameShader(shaderId));
return 1;
}

int luaPlayerRemoveShader(lua_State* L)
{
// player:removeShader(shaderId or shaderName)
Player* player = getUserdata<Player>(L, 1);
if (!player) {
lua_pushnil(L);
return 1;
}

uint16_t shaderId;
if (isInteger(L, 2)) {
shaderId = getInteger<uint16_t>(L, 2);
} else {
Shader* shader = g_game.shaders.getShaderByName(getString(L, 2));
if (!shader) {
lua_pushnil(L);
return 1;
}
shaderId = shader->id;
}

pushBoolean(L, player->untameShader(shaderId));
return 1;
}

int luaPlayerHasShader(lua_State* L)
{
// player:hasShader(shaderId or shaderName)
const Player* player = getUserdata<const Player>(L, 1);
if (!player) {
lua_pushnil(L);
return 1;
}

Shader* shader = nullptr;
if (isInteger(L, 2)) {
shader = g_game.shaders.getShaderByID(getInteger<uint16_t>(L, 2));
} else {
shader = g_game.shaders.getShaderByName(getString(L, 2));
}

if (shader) {
pushBoolean(L, player->hasShader(shader));
} else {
lua_pushnil(L);
}
return 1;
}

int luaPlayerToggleShader(lua_State* L)
{
// player:toggleShader(shader)
Player* player = getUserdata<Player>(L, 1);
if (!player) {
lua_pushnil(L);
return 1;
}

bool shader = getBoolean(L, 2);
pushBoolean(L, player->toggleShader(shader));
return 1;
}

int luaPlayerGetPremiumEndsAt(lua_State* L)
{
Expand Down Expand Up @@ -2661,6 +2749,10 @@ void LuaScriptInterface::registerPlayer()
registerMethod("Player", "hasEffect", luaPlayerHasEffect);
registerMethod("Player", "toggleEffect", luaPlayerToggleEffect);
// @
registerMethod("Player", "addShader", luaPlayerAddShader);
registerMethod("Player", "removeShader", luaPlayerRemoveShader);
registerMethod("Player", "hasShader", luaPlayerHasShader);
registerMethod("Player", "toggleShader", luaPlayerToggleShader);

registerMethod("Player", "getPremiumEndsAt", luaPlayerGetPremiumEndsAt);
registerMethod("Player", "setPremiumEndsAt", luaPlayerSetPremiumEndsAt);
Expand Down
10 changes: 10 additions & 0 deletions src/luascript.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1007,6 +1007,7 @@ void Lua::pushOutfit(lua_State* L, const Outfit_t& outfit)
setField(L, "lookWing", outfit.lookWing);
setField(L, "lookAura", outfit.lookAura);
setField(L, "lookEffect", outfit.lookEffect);
setField(L, "lookShader", outfit.lookShader);
setField(L, "lookHead", outfit.lookHead);
setField(L, "lookBody", outfit.lookBody);
setField(L, "lookLegs", outfit.lookLegs);
Expand Down Expand Up @@ -1043,6 +1044,14 @@ void Lua::pushWing(lua_State* L, const Wing* wing)
setField(L, "id", wing->id);
setField(L, "premium", wing->premium);
}
void Lua::pushShader(lua_State* L, const Shader* shader)
{
lua_createtable(L, 0, 5);
setField(L, "name", shader->name);
setField(L, "id", shader->id);
setField(L, "premium", shader->premium);
}

void Lua::pushAura(lua_State* L, const Aura* aura)
{
lua_createtable(L, 0, 5);
Expand Down Expand Up @@ -1977,6 +1986,7 @@ void LuaScriptInterface::registerFunctions()
registerEnum(RELOAD_TYPE_ITEMS);
registerEnum(RELOAD_TYPE_MONSTERS);
registerEnum(RELOAD_TYPE_MOUNTS);
registerEnum(RELOAD_TYPE_SHADERS);
registerEnum(RELOAD_TYPE_WINGS);
registerEnum(RELOAD_TYPE_AURAS);
registerEnum(RELOAD_TYPE_EFFECTS);
Expand Down
Loading

0 comments on commit e4112bf

Please sign in to comment.