Szorzók

Indította trodhenta, 2019-08-08, 14:22:58

Sziasztok,  questben hogy érdemes a szorzókat megcsinálni?

legyen egy timer ami 24 óránként berakja az adott szorzót?
Ha segítettem vagy akármi érted, akkor a +-t elfogadom.


Nem lenne egyszerűbb az adatbázisban felszorozni az exp-eket?

C++ programmer at Gameloft

Az a baj én questben akarom megoldani dinamikusan hogy egy admin beállít egy fix szorzót azl esz örökké, természetesen szerver indításkor meg berakja az alap szorzót a szervernek ami szintén örröké tart ha lejár akkor ujra berakja az alap szorzot
Ha segítettem vagy akármi érted, akkor a +-t elfogadom.

Idézetet írta: trodhenta Dátum 2019-08-10, 23:36:46
Az a baj én questben akarom megoldani dinamikusan hogy egy admin beállít egy fix szorzót azl esz örökké, természetesen szerver indításkor meg berakja az alap szorzót a szervernek ami szintén örröké tart ha lejár akkor ujra berakja az alap szorzot

Forrás!

“Majdnem minden tudásunkért nem azoknak tartozunk, akik egyetértettek, hanem azoknak, akik nem.”

Már megoldtam quest-ben mivel forrás részéhez nem annyira érték, keresgéltem neten természetesen.
Annyi hátránya van hogy egy loopolt timer megy ami elméletileg lassítsa, + szerver inditásnál mindig bekell rakni egy alap szorzot.
Ha segítettem vagy akármi érted, akkor a +-t elfogadom.


db\src\ClientManager.cpp
Funkció: CClientManager::Initialize()

   if (!__InitializeDefaultPriv())
{
}


ez a funkció fölé:

static bool bCleanOldPriv = true;
static bool __InitializeDefaultPriv()
{
if (bCleanOldPriv)
{
std::auto_ptr<SQLMsg> pCleanStuff(CDBManager::instance().DirectQuery("DELETE FROM priv_settings WHERE value <= 0 OR duration <= NOW();", SQL_COMMON));
printf("DEFAULT_PRIV_EMPIRE: removed %u expired priv settings.\n", pCleanStuff->Get()->uiAffectedRows);
}
std::auto_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery("SELECT priv_type, id, type, value, UNIX_TIMESTAMP(duration) FROM priv_settings", SQL_COMMON));
if (pMsg->Get()->uiNumRows == 0)
return false;
MYSQL_ROW row = NULL;
while ((row = mysql_fetch_row(pMsg->Get()->pSQLResult)))
{
if (!strcmp(row[0], "EMPIRE"))
{
// init
BYTE empire = 0;
BYTE type = 1;
int value = 0;
time_t duration_sec = 0;
// set
str_to_number(empire, row[1]);
str_to_number(type, row[2]);
str_to_number(value, row[3]);
str_to_number(duration_sec, row[4]);
// recalibrate time
time_t now_time_sec = CClientManager::instance().GetCurrentTime();
if (now_time_sec>duration_sec)
duration_sec = 0;
else
duration_sec -= now_time_sec;
// send priv
printf("DEFAULT_PRIV_EMPIRE: set empire(%u), type(%u), value(%d), duration(%u)\n", empire, type, value, duration_sec);
CPrivManager::instance().AddEmpirePriv(empire, type, value, duration_sec);
}
else if (!strcmp(row[0], "GUILD"))
{
// init
DWORD guild_id = 0;
BYTE type = 1;
int value = 0;
time_t duration_sec = 0;
// set
str_to_number(guild_id, row[1]);
str_to_number(type, row[2]);
str_to_number(value, row[3]);
str_to_number(duration_sec, row[4]);
// recalibrate time
time_t now_time_sec = CClientManager::instance().GetCurrentTime();
if (now_time_sec>duration_sec)
duration_sec = 0;
else
duration_sec -= now_time_sec;
// send priv
if (guild_id)
{
printf("DEFAULT_PRIV_GUILD: set guild_id(%u), type(%u), value(%d), duration(%u)\n", guild_id, type, value, duration_sec);
CPrivManager::instance().AddGuildPriv(guild_id, type, value, duration_sec);
}
}
else if (!strcmp(row[0], "PLAYER"))
{
// init
DWORD pid = 0;
BYTE type = 1;
int value = 0;
// set
str_to_number(pid, row[1]);
str_to_number(type, row[2]);
str_to_number(value, row[3]);
// send priv
if (pid)
{
printf("DEFAULT_PRIV_PLAYER: set pid(%u), type(%u), value(%d)\n", pid, type, value);
CPrivManager::instance().AddCharPriv(pid, type, value);
}
}
}
return true;
}

static bool __UpdateDefaultPriv(const char* priv_type, DWORD id, BYTE type, int value, time_t duration_sec)
{
char szQuery[1024];
snprintf(szQuery, 1024,
"REPLACE INTO priv_settings SET priv_type='%s', id=%u, type=%u, value=%d, duration=DATE_ADD(NOW(), INTERVAL %u SECOND);",
priv_type, id, type, value, duration_sec
);
std::auto_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery(szQuery, SQL_COMMON));
return pMsg->Get()->uiAffectedRows;
}


Funkció: CClientManager::AddGuildPriv:

   __UpdateDefaultPriv("GUILD", p->guild_id, p->type, p->value, p->duration_sec);

Funkció:CClientManager::AddEmpirePriv:

   __UpdateDefaultPriv("EMPIRE", p->empire, p->type, p->value, p->duration_sec);

Funkció: CClientManager::AddCharacterPriv:

   __UpdateDefaultPriv("PLAYER", p->pid, p->type, p->value, 0);

mysql common F6 gomb beillesztés:

CREATE TABLE `priv_settings` (
`priv_type`  enum('PLAYER','GUILD','EMPIRE') NOT NULL DEFAULT 'EMPIRE' COMMENT 'GUILD and PLAYER are untested.' ,
`id`  int UNSIGNED NOT NULL DEFAULT 0 COMMENT 'empire_id, player_id vagy guild_id' ,
`type`  int UNSIGNED NOT NULL DEFAULT 4 COMMENT '1:item_drop, 2:gold_drop, 3:gold10_drop, 4:exp (1~4)' ,
`value`  int NOT NULL DEFAULT 0 COMMENT '0~1000%' ,
`duration`  datetime NOT NULL DEFAULT 0 ,
PRIMARY KEY (`priv_type`, `id`, `type`)
)
;



feltöltés F6 nál ugyanúgy:

INSERT INTO `priv_settings` VALUES ('EMPIRE', '0', '1', '200', '2020-08-13 14:26:03');
INSERT INTO `priv_settings` VALUES ('EMPIRE', '0', '2', '200', '2020-08-13 14:26:03');
INSERT INTO `priv_settings` VALUES ('EMPIRE', '0', '3', '200', '2020-08-13 14:26:03');
INSERT INTO `priv_settings` VALUES ('EMPIRE', '0', '4', '200', '2020-08-13 14:26:03');


2020.08.13-ig 200% szorzó lesz.

Adatbázisban betudod vele állítani, a szorzókat, és nem kell naponta szórakozni vele, csak átírod navicatel, és kész is a szorzó!)
Valahol deven találtam azthiszem jópár évvel ezelött, de akkor itt most pont hasznos lesz neked:)
Az ember csak fiatalon találhat ki igazán új dolgokat. Utána már túl tapasztalt, túl híres (...) és túl ostoba.

Köszi ezt láttam valahol epvpn-s, de nagyon nagyon köszi hogy megosztottad. :D  És szerver futás közben is tudom modostiani a szorzokat?! Illetve meghagyhatom a questes megoldásomat is?
Ha segítettem vagy akármi érted, akkor a +-t elfogadom.

DB indulásakor olvassa ki a szorzókat, de van megoldás, hogy futás közben is módosítsd. De ez a legegyszerűbb, én bővítettem magamnak, nem csak egy duration, hanem egy második date oszlopal, ahol amolyan "Tól-ig" olvassa ki, tehát beállíthatom hogy 10 órától 12 ig 500% legyen, elötte utánna pedig 200% vagy bármi. De az alapban úgy működik, hogy amikor elindul a DB, akkor kiolvassa a szorzót:)
Az ember csak fiatalon találhat ki igazán új dolgokat. Utána már túl tapasztalt, túl híres (...) és túl ostoba.

Értem, tehát ez csak szerver indításkor olvassa ki a szorzót tehát ha elindul a szerver akkor berakja az adott szorzót amit talál sql-ben, és ha lejár az adott szorzó akkor következő induláskor nem rak be semmit.. Na mindegy, berakom mert azért mégis csak jobb hogy van egy automatizált szorzó rendszer ami start-nál berakja az alap szorzót. Egyébként oda az évhez gondolmo beírhatok akár 2100-at is ugye? :D + meghagyom mellé a questes megoldást is.
Ha segítettem vagy akármi érted, akkor a +-t elfogadom.

Ezzel rakhatsz szorzót játékosnak is, csak adott játékosnak vagy adott cèhnek is.
Az ember csak fiatalon találhat ki igazán új dolgokat. Utána már túl tapasztalt, túl híres (...) és túl ostoba.