Řešení chybových hlášení MaNGOSu
Obsah
- 1 Řešení chyb
- 1.1 Player (GUID: 279) has a broken data in field `characters`.`data`
- 1.2 Table `creature` have creature (GUID: 115913 Entry: 27604) with `creature_template`.`RegenHealth`=1 and low current health (416), `creature_template`.`minhealth`=62000.
- 1.3 Creature (GUID: 128557) does not exist but has a record in `creature_addon`
- 1.4 Table `creature` have creature (GUID: 1518000 Entry: 500002) with `MovementType`=0 (idle) have `spawndist`<>0, set to 0.
- 1.5 Table `quest_end_scripts` has not existing quest (Id: 555051) as script id
- 1.6 Summoned pet (Entry: 6412) not have pet stats data in DB
- 1.7 Table `npc_trainer` for Trainer (Entry: 29194 ) has non existing spell 0, ignore
- 1.8 Player (GUID: 14104) has broken zone-data
- 1.9 InstanceMap* MapInstanced::CreateInstance(uint32, InstanceSave*, Difficulty): Assertion `false' failed.
- 2 Související
Řešení chyb
Player (GUID: 279) has a broken data in field `characters`.`data`
Tato chyba říká, že počet položek ve sloupci data v tabulce characters pro danou postavu neodpovídá předpokládanému což znamená, že došlo k porušení integrity dat této postavy.
Zobrazení:
USE `characters`; CREATE FUNCTION substrCount(x LONGTEXT, delim varchar(12)) returns int return (length(x) - length(REPLACE(x, delim, ''))) / length(delim);
Tímto povelem lze zobrazit kolik postav(RowCount) má kolik položek(DataCount) ve sloupci data. Přitom pouze jedna hodnota může být správná a často se mění při přechodu na novější verzi hry.
SELECT COUNT(*) AS `RowCount`, T1.`DataCount` FROM (SELECT `guid`, `name`, SubstrCount(`data` , ' ' ) AS `DataCount` FROM `characters`) AS T1 GROUP BY T1.`DataCount`
Z tohoto výpisu je pak patrné, u kolika postav neodpovídá počet položek ve sloupci data většině.
Řešení:
Analýza a oprava položek ve sloupci data je složitá a proto nejjednodušším řešením je vymazat všechny poškozené postavy. Za číslo x do SQL dotazu je nutno dosadit správný počet položek ve sloupci data (např. 1700 pro verzi 3.0.x)
DELETE FROM `characters` WHERE SubstrCount(`data` , ' ') != x
Tímto však dojde pouze k odstranění záznamů z tabulky characters. Dále je nutno promazat všechny závislé tabulky na smazaných položkách. To lze provést SQL dotazy pro Údržba MaNGOS databáze.
Table `creature` have creature (GUID: 115913 Entry: 27604) with `creature_template`.`RegenHealth`=1 and low current health (416), `creature_template`.`minhealth`=62000.
Množství zdraví konkrétní bytosti je nastaveno na nižší hodnotu než je definované minimální množství druhu bytosti dané tabulkou creature_template.
Zobrazení:
SELECT `creature`.`guid`, `creature`.`id`, `creature`.`curhealth`, `creature_template`.`minhealth` FROM `creature` JOIN `creature_template` ON `creature_template`.`entry` = `creature`.`id` WHERE `creature`.`curhealth` < `creature_template`.`minhealth`
Řešení:
Nastavit problémovým bytostem odpovídající minimální zdraví.
UPDATE `creature` SET `creature`.`curhealth` = (SELECT `creature_template`.`minhealth` FROM `creature_template` WHERE `creature_template`.`entry` = `creature`.`id`) WHERE `creature`.`curhealth` < (SELECT `creature_template`.`minhealth` FROM `creature_template` WHERE `creature_template`.`entry` = `creature`.`id`)
Creature (GUID: 128557) does not exist but has a record in `creature_addon`
Záznam v tabulce creature_addon pro neexistující bytost.
Zobrazení:
SELECT * FROM `creature_addon` WHERE `guid` NOT IN (SELECT `guid` FROM `creature`)
Řešení:
Buď doplnit chybějící záznamy bytostí a nebo jednoduše smazat odkazy z tabulky creature_addon.
DELETE FROM `creature_addon` WHERE `guid` NOT IN (SELECT `guid` FROM `creature`)
Table `creature` have creature (GUID: 1518000 Entry: 500002) with `MovementType`=0 (idle) have `spawndist`<>0, set to 0.
Zobrazení:
SELECT * FROM `creature` WHERE (`MovementType` = 0) AND (`spawndist` <> 0)
Řešení:
UPDATE `creature` SET `spawndist` = 0 WHERE (`MovementType` = 0) AND (`spawndist` <> 0)
Table `quest_end_scripts` has not existing quest (Id: 555051) as script id
Záznam v tabulce quest_end_scripts pro neexistující quest.
Zobrazení:
SELECT * FROM `quest_end_scripts` WHERE `id` NOT IN (SELECT `entry` FROM `quest_template`)
Řešení:
Buď doplnit chybějící záznamy do quest_template a nebo jednoduše smazat odkazy z tabulky quest_end_scripts.
DELETE FROM `quest_end_scripts` WHERE `id` NOT IN (SELECT `entry` FROM `quest_template`)
Summoned pet (Entry: 6412) not have pet stats data in DB
Pro některé mazlíčky chybí v tabulce mangos.pet_levelstats informace.
Zobrazení:
Tímto zobrazíte, o které bytosti se jedná.
SELECT entry FROM characters.character_pet WHERE `entry` NOT IN (SELECT `creature_entry` FROM mangos.`pet_levelstats`) GROUP BY `character_pet`.`entry` ORDER BY `character_pet`.`entry` ASC
Řešení:
V tomto případě nelze dost dobře smazat položky z character_pet, protože se zde stejně vytvoří časem znova. Naopak je potřeba doplnit údaje do tabulky pet_levelstats. Jak je doplnit, když nejsou k dispozici? Toto je věcí databázových projektů jako je UDB. Ovšem pro vlastní potřeby lze volit nedokonalé řešení a zduplikovat záznamy již existujících bytostí. Ovšem zde je problém, který již existující záznam vybrat, protože jsou tvořené pro různě silné bytosti.
INSERT INTO `pet_levelstats` SELECT x AS creature_entry, level, hp,mana,armor,str,agi,sta,"int",spi FROM `pet_levelstats` WHERE creature_entry = y
Kde x je číslo vkládané bytosti a y číslo zdrojové kopírované.
Table `npc_trainer` for Trainer (Entry: 29194 ) has non existing spell 0, ignore
Chybný odkaz na neexistující kouzlo s id 0.
Zobrazení
SELECT * FROM `npc_trainer` WHERE `spell` = 0
Řešení
Buď zjistíte o jakého učitele se jedná a číslo kouzla nějak opravíte a nebo odkaz smažete.
DELETE FROM `npc_trainer` WHERE `spell` = 0
Player (GUID: 14104) has broken zone-data
Nastává pokud hráč má ve sloupci Zone nulovou hodnotu.
Zobrazení
SELECT * FROM `characters` WHERE `Zone` = 0
Řešení
Nejvhodnější je obnovit řádky těchto hráčů ze zálohy, ovšem pokud není k dispozici záloha, tak lze nastavit tyto řádky např. na 1.
UPDATE `characters SET Zone=1 WHERE` Zone=0
InstanceMap* MapInstanced::CreateInstance(uint32, InstanceSave*, Difficulty): Assertion `false' failed.
Zobrazení
Jde o řádky v tabulkce instance_reset, které mají sloupce mapid s neexistujícím odkazem na tabulku instance_template v databázi mangos.
SELECT * FROM `characters`.`characters` WHERE `characters`.`characters`.`map` NOT IN (SELECT `map` FROM `mangos`.`instance_template`) AND
Řešení
Jednoduše vyprázdněte celou tabulku instance_reset nebo smažte jen ty, které nejsou správné.
DELETE FROM `characters`.`instance_reset` WHERE `characters`.`instance_reset`.`mapid` NOT IN (SELECT `map` FROM `mangos`.`instance_template`)
Podobně je potřeba zkontrolovat tabulku characters a sloupec Map. Pokud vám do logu vypisuje server např.
CreateInstance: no instance template for map 650
Tak máte postavy, které se po přihlášení mají objevit v neexistující instanci, tedy chybějí řádek pro map s daným id.