Metin2 Hungarian Forum

Metin2 => Szerver készítés => Privát szerverek => Segítség => A témát indította: trodhenta Dátum 2019-08-08, 14:22:58

Cím: Szorzók
Írta: trodhenta Dátum 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?
Cím: Re:Szorzók
Írta: gife974 Dátum 2019-08-08, 21:14:08
Forrásban.  ;D
Cím: Re:Szorzók
Írta: Distraught Dátum 2019-08-09, 01:20:49
Nem lenne egyszerűbb az adatbázisban felszorozni az exp-eket?
Cím: Re:Szorzók
Í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
Cím: Re:Szorzók
Írta: Meli Dátum 2019-08-11, 23:36:37
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!
Cím: Re:Szorzók
Írta: trodhenta Dátum 2019-08-11, 23:45:48
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.
Cím: Re:Szorzók
Írta: Red Dátum 2019-08-13, 13:15:35
Ügyes
Cím: Re:Szorzók
Írta: TheSLESH Dátum 2019-08-13, 15:26:45
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:)
Cím: Re:Szorzók
Írta: trodhenta Dátum 2019-08-13, 23:29:57
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?
Cím: Re:Szorzók
Írta: TheSLESH Dátum 2019-08-14, 09:40:52
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:)
Cím: Re:Szorzók
Írta: trodhenta Dátum 2019-08-14, 13:45:37
É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.
Cím: Re:Szorzók
Írta: TheSLESH Dátum 2019-08-14, 14:26:08
Ezzel rakhatsz szorzót játékosnak is, csak adott játékosnak vagy adott cèhnek is.
EhPortal 1.39 © 2025, WebDev