Jump to content
  • Announcements

    • Xmat

      Pravidlo pro postování v TTT

      Do sekce Tipy, triky, tutoriály nepatří žádné dotazy.   Postujte sem vaše návody, tipy a různé další věci jež uznáte za vhodné sdělit zdejšímu osazenstvu, ale veškeré dotazy směřujte do sekce Všeobecná diskuse.
    • Replik

      Seznam návodů a důležitých témat v této sekci

      Pro lepší přehlednost jsem vytvořil tento seznam, který vás, méně zkušené, lépe provede touto sekcí. Věřím, že zde najdete, co hledáte. Vypsané jsou návody, které jsou oficiálně uznané jako návody. Běžné diskuze, které neposkytují postupy a rady zvěřejněny nejsou.   Instalace vlastního MaNGOS Serveru Díky těmto návodům budete (měli by jste být) schopni vytvořit a následně spustit váš vlastní server. Nastavení je pro verze s i bez datadisku.   Instalace MaNGOS Serveru (bez datadisku TBC) - Autor Benny Instalace MaNGOS Serveru (s datadiskem TBC) - Autor Malfik Instalace MaNGOS Serveru v prostředí Linux - Autor charlie Instalace MaNGOS Serveru v prostředí Linux - Autor kupkoid   Chyby a jejich řešení při přihlašování k serveru - Autor Cybe   Zálohování uživatelských dat   Dávkový soubor (BAT soubor) pro vytvoření SQL záloh - Autor Replik   Kompilování - tvoření vlastních release (revizí)   Tvorba kompilací pro Win32 (MangoScript) - Autor bLuma   Ostatní - těžko zařaditelné, ale neznamená to, že nejsou dobré   VIP Systém - Autor charlie Tvorba Webových stránek pro MaNGOS - Autor zahuba Tvorba teleportačních NPC (MangoScript) - Autor Replik Registrační web (původně předělaná SPORA) Funkční pro Antrix i MaNGOS - Autor Replik Nastavení a spuštění Minimanager pro MaNGOS - Autor BlackMartin Nastavení MaNGOS Website - Autor Artorius   Samozřejmě jsou zde i jiné návody, ale tyto jsou nejvíce používané, proto věřím, že vám budou nápomocné. Tuto sekci budeme upravovat podle potřeby. Pokud by jste něco nenašli nebo si nevěděli rady, hledejte na fóru a teprve potom založte vlastní topik. Pokud nějaký autor vytvoří kvalitní návod a chtěl by ho zveřejnit i v tomto seznamu, doporučuji, aby mi napsal zprávu skrze PM.   Díky a přeji hezký den na WoWResource   Replik
    • Aristo

      Příspěvky tam, kde nemají co dělat

      Dodržujte zákaz přispívání do topiků s repaky pokud si to zakladatelé nepřejí!! Opakované psaní příspěvků bude trestáno warnem.
    • Aristo

      Používání spoilerů

      Poslední dobou má většina uživatelů fora zvláštní nutkání postovat extrémně dlouhé texty nebo kódy, které zabírají v nejedenom případu i 80% obsahu celé stránky a hodně tak zvedají nepřehlednost v topiku. Chtěl bych všechny uživatele požádat, aby při postování citací, jakýchkoliv kódů, errorů, atp... delších než 30 řádků používali funkci spoileru.   Funkci vyvoláte příkazem [spoiler] text [/spoiler]   Ukázka:  

bLuma

Members
  • Content count

    2523
  • Joined

  • Last visited

  • Days Won

    19

Posts posted by bLuma


  1. Tak je mi samozřejmě jasný, že obfuskace se dá úplně krásně rozebrat, jde mi víceméněo to odradit od jejího rozebírání lidi jako je deremi :)

    Co se fsockopenu týče, tak o tom jsem neměl ani nejmenší tušení, snad je to stejně rozšířený jako curl, jinak to budu muset přepsat. Takhle to dopadá, když člověk googlí asynchroní request stránky přes curl. ;)

     

    fsockopen není funkce z rozšíření, je dostupná vždy, pokud není zablokována. Ovšem pokud tímhle způsobem voláš i tento skript u klientů bylo by vhodné nastavit ignore_user_abort(true), jinak se ti skript ukončí jakmile to spojení uzavřeš. Což vzhledem k rychlosti SQL dotazů může způsobit, že ten skript přerušíš v půlce činnosti. A opačně stejný problém by mohl mít i server.


  2. Obsfukace skriptů je sice fajn, ale nikdy nechrání dokonale. Musím si rýpnout, mluvíš tu o curl a přitom to rozšíření vůbec nepoužiješ. Voláš tam sice funkci, kterou někdo pojmenoval curl_request_async, ale ta využívá standardních možností funkcí fsockopen a fwrite.

     

    Na výpočet online hráčů by ti stačil jediný select se seskupením.


  3. kdyz si vezmutreba dam priklad, item Refreshing Spring Water, kdyz se na něj podíváš, tak ti má přidávat manu, což u mě nedělá a já nevím proč

     

    Must remain seated while drinking.

    Aby to mělo účinek musíš během pití zůstat sedět (ve hře, ne na židli u počítače).

    • Upvote 3

  4. UseProcessors říká windowsu, na které procesory se proces může pověsit. To tě nejspíše nijak nevytrhne (v základu mangos/tc využívá jen jedno vlákno na veškeré updaty, pouze obsluha síťových rozhraní jde asynchronně), ale tvé pochopení té hodnoty je chybné. Hodnota je totiž bitová maska jednotlivých jader/procesorů. Aby jsi to povolil pro všechna jádra měl by jsi tam mít hodnotu 255.


  5. Nezkoušel jsem to, ale mám dojem, že string konstruktor nemá definovaný jako explicit a ta konverze by mohla proběhnout implicitně. Schválně to zkus jenom jako "return buf;". Jinak samozřejmě to bylo myšleno, aby to vracelo std::string.

    Cčkové řetězce jsou jen pole znaků, ovšem pro poznání konce tam musí být znak \0. Proto je nutné si alokovat pole o jeden prvek delší, aby jsi tam měl místo na nulu.

    Ad dvě tečky - je to nesmysl. V češtině existuje pouze jedna tečka a poté trojtečka (výpustka, elipsa).

    • Upvote 1

  6. std::string GetTestMessage()
    {
       char hexVal_R[3] = "00"; sprintf(hexVal_R, "%.2X", color[color_R]);
       char hexVal_G[3] = "00"; sprintf(hexVal_G, "%.2X", color[color_G]);
       char hexVal_B[3] = "00"; sprintf(hexVal_B, "%.2X", color[color_B]);
    
       std::ostringstream os;
       os << "|cff"               << hexVal_R << hexVal_G << hexVal_B
          << "WORLD OF COLORS: #" << hexVal_R << hexVal_G << hexVal_B
          << " TEST MESSAGE..";
       return os.str();
    }
    

     

    Stačí 1x sprintf, aby jsi složil celý RGB str. A navíc dokonce jeden sprintf zvládne složit komplet celý rětězec

    char buf[51];
    sprintf(buf, "|cff%.2X%.2X%.2XWORLD OF COLORS: #%.2X%.2X%.2X TEST MESSAGE...", 
       color[color_R], color[color_G], color[color_B], 
       color[color_R], color[color_G], color[color_B]);
    return buf;

    • Upvote 1

  7. Ok, ale jak z ostreamu vymáčknu string? :blink:

     

    Ostream jsem zmiňoval, protože se jedná o předka těchto tříd. Z ostringstreamu dostaneš string stejným způsobem - metodou str() - http://www.cplusplus.com/reference/iostream/ostringstream/'>http://www.cplusplus.com/reference/iostream/ostringstream/

     

    Celá ta hierarchie tříd streamů je znázorněna na http://www.cplusplus.com/reference/iostream/

    • Upvote 1

  8. Od kdy se ve třídě definujou hodnoty proměných mimo konstruktor?
    To si domysli :) V hlavě kompilátor C/C++ vážně nevedu.

     

    mě stačí stringstream.. :P
    Stringstream disponuje funkcemi z istream i ostream. Jediné co však využiješ je ostream část (proto ostringstream), takže alokuješ nějakou pamět navíc a provádíš určité inicilizace navíc.

     

    const char* GetTestMessage()

    Tak přesně tohle jsi dělat neměl. Protože ti to alokuje string na stacku, ze kterého si přečteš adresu ukazatele, vrátíš ji z funkce, string umře a zbylý odpad na dané adrese se pokusíš vložit do gossipu. tady jsi měl nechat vracet string. Jediný důvod proč ti to generuje bordel, je protože jsi provedl tuhle "optimalizaci" navíc, v mých úpravách byl string na tomhle místě ponechán záměrně. :P

    A navíc ten bordel by jsi byl schopen dohledat, kdyby jsi použil debugging tak by jsi našel místo, kde se vrací nesmysl.

     

    Myslim si že to vůbec nehoří..

    Tu metodu voláš 6x v ní provedeš 52x konstrukci stringu. A to pokaždém vybrání volby v menu. Trochu moc zbytečné práce.

    • Upvote 1

  9. Pořád je co kritizovat :) Viz komentáře.

     

    /*******************************************************
    * File:'world_of_colors.cpp'
    * (c)2011 - Wolf Officious ([email protected])
    *******************************************************/
    
    /* ScriptData
    Name: color_palette
    %Complete: 100
    Comment: Color palette test in gossip menu testing.. version 0.2
    Category: cusomscripts
    EndScriptData */
    
    /*
    INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid1`, `modelid2`, `modelid3`, `modelid4`, `name`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `exp`, `faction_A`, `faction_H`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `mindmg`, `maxdmg`, `dmgschool`, `attackpower`, `dmg_multiplier`, `baseattacktime`, `rangeattacktime`, `unit_class`, `unit_flags`, `dynamicflags`, `family`, `trainer_type`, `trainer_spell`, `trainer_class`, `trainer_race`, `minrangedmg`, `maxrangedmg`, `rangedattackpower`, `type`, `type_flags`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `spell5`, `spell6`, `spell7`, `spell8`, `PetSpellDataId`, `VehicleId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `Health_mod`, `Mana_mod`, `Armor_mod`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `equipment_id`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`, `WDBVerified`)
    VALUES('700015','0','0','0','0','0','736','0','0','0','WORLD OF COLORS','(c)Wolf Ofiicious','','0','80','80','1','35','35','1','1','1.14286','2','0','5000','5000','0','35000','10','1','0','1','512','0','0','0','0','0','0','10000','10000','68','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','','0','3','20','20','20','0','0','0','0','0','0','0','0','255','0','0','0','npc_world_of_colors','0');
    */
    
    #include "ScriptPCH.h"
    
    // GOSSIP ACTIONS
    #define GOSSIP_WOC_ROOT_R_PLUS      GOSSIP_ACTION_INFO_DEF + 1
    #define GOSSIP_WOC_ROOT_R_MINUS     GOSSIP_ACTION_INFO_DEF + 2
    #define GOSSIP_WOC_ROOT_G_PLUS      GOSSIP_ACTION_INFO_DEF + 3
    #define GOSSIP_WOC_ROOT_G_MINUS     GOSSIP_ACTION_INFO_DEF + 4
    #define GOSSIP_WOC_ROOT_B_PLUS      GOSSIP_ACTION_INFO_DEF + 5
    #define GOSSIP_WOC_ROOT_B_MINUS     GOSSIP_ACTION_INFO_DEF + 6
    #define GOSSIP_TEST_CHAT            GOSSIP_ACTION_INFO_DEF + 7
    #define GOSSIP_TEST_NOTICE          GOSSIP_ACTION_INFO_DEF + 8
    
    #define STEP_COLOR_MAX              52
    
    // COLOR GLOBALS - globální proměnné? fuj
    //uint8 colorR = 0;
    //uint8 colorG = 0;
    //uint8 colorB = 0;
    
    class npc_world_of_colors : public CreatureScript
    {
    private:
       // pole RGB
       uint8 color[3] = {0, 0, 0} ;
    
       // GAMEMASTER CHECKER
       // je dobré si držet určitou konvenci, když už máš Get, Set 
       // je pro bool příhodné mít Is
       // ValidGamemaster vrací true při chybě?
       // kdyžtak IsNotValidGamemaster()
       inline bool ValidGamemaster(Player *player)
       {
           if(player->GetSession()->GetSecurity() < SEC_GAMEMASTER)
           {
               player->GetSession()->SendNotification("You aren't GameMaster!");
               return true;
           }
           return false;
       }
    
       // Get test message content
       std::string GetTestMessage()
       {
           // ostringstream stačí
           std::stringstream ss;
           ss << "|cff"
              // po změně GetStringStep (níže) není nutné volat c_str()
              << GetStringStep(colorR).c_str()
              << GetStringStep(colorG).c_str()
              << GetStringStep(colorB).c_str()
              << " WORLD OF COLORS: #"
              << GetStringStep(colorR).c_str()
              << GetStringStep(colorG).c_str()
              << GetStringStep(colorB).c_str()
              << " TEST MESSAGE..";
           return ss.str();
       }
    
       // Get string value of color
       // string je zbytečné plýtvání pamětí a časem procesoru pro neustále inicializace
       // lépe vracet const char*
       std::string GetStringStep(uint8 step)
       {
           // předělat na "static const char* hexSteps[]"
           // static zajistí jedinou inicilizaci a setrvání v paměti
           // bez stringu je ta incializace navíc mnohem rychlejší
           std::string hexSteps[sTEP_COLOR_MAX] = {"00","05","0A","0F","14","19","1E","23","28","2D",
                                                   "32","37","3C","41","46","4B","50","55","5A","5F",
                                                   "64","69","6E","73","78","7D","82","87","8C","91",
                                                   "96","9B","A0","A5","AA","AF","B4","B9","BE","C3",
                                                   "C8","CD","D2","D7","DC","E1","E6","EB","F0","F5",
                                                   "FA","FF"};
    
           // a nakonci vrátíš jen ukazatel, nedochází ke kopírování objektu
           return hexSteps[step];
       }
    
    public:
       npc_world_of_colors() : CreatureScript("npc_world_of_colors") { }
    
       bool OnGossipHello(Player *player, Creature *creature)
       {
           if(ValidGamemaster(player))
               return false;
    
           player->PlayerTalkClass->ClearMenus();
    
           player->ADD_GOSSIP_ITEM( 0, GetTestMessage().c_str(), GOSSIP_SENDER_MAIN, NULL);
           player->ADD_GOSSIP_ITEM(10, "|cffff0000R <+>",        GOSSIP_SENDER_MAIN, GOSSIP_WOC_ROOT_R_PLUS);
           player->ADD_GOSSIP_ITEM(10, "|cffff0000R <->",        GOSSIP_SENDER_MAIN, GOSSIP_WOC_ROOT_R_MINUS);
           player->ADD_GOSSIP_ITEM(10, "|cff00ee00G <+>",        GOSSIP_SENDER_MAIN, GOSSIP_WOC_ROOT_G_PLUS);
           player->ADD_GOSSIP_ITEM(10, "|cff00ee00G <->",        GOSSIP_SENDER_MAIN, GOSSIP_WOC_ROOT_G_MINUS);
           player->ADD_GOSSIP_ITEM(10, "|cff0000ffB <+>",        GOSSIP_SENDER_MAIN, GOSSIP_WOC_ROOT_B_PLUS);
           player->ADD_GOSSIP_ITEM(10, "|cff0000ffB <->",        GOSSIP_SENDER_MAIN, GOSSIP_WOC_ROOT_B_MINUS);
           player->ADD_GOSSIP_ITEM( 5, "TEST - CHAT",            GOSSIP_SENDER_MAIN, GOSSIP_TEST_CHAT);
           player->ADD_GOSSIP_ITEM( 5, "TEST - NOTICE",          GOSSIP_SENDER_MAIN, GOSSIP_TEST_NOTICE);
           player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID());
           return true;
       }
    
       bool OnGossipSelect(Player *player, Creature *creature, uint32 sender, uint32 action)
       {
           if(ValidGamemaster(player) || sender != GOSSIP_SENDER_MAIN)
           {
               player->CLOSE_GOSSIP_MENU();
               return true;
           }
    
           player->PlayerTalkClass->ClearMenus();
    
           // lenost nadevše
           #define INC_COLOR(c) if (color[c] < (STEP_COLOR_MAX - 1)) ++color[c]; break;
           #define DEC_COLOR(c) if (color[c]) --color[c]; break;
           // lépe - inline funkce + enum pro indexy
    
           switch(action)
           {
           case GOSSIP_WOC_ROOT_R_PLUS:  INC_COLOR(0); // středník je kosmetická záležitost
           case GOSSIP_WOC_ROOT_R_MINUS: DEC_COLOR(0);
           case GOSSIP_WOC_ROOT_G_PLUS:  INC_COLOR(1);
           case GOSSIP_WOC_ROOT_G_MINUS: DEC_COLOR(1);
           case GOSSIP_WOC_ROOT_B_PLUS:  INC_COLOR(2);
           case GOSSIP_WOC_ROOT_B_MINUS: DEC_COLOR(2);
    
           case GOSSIP_TEST_CHAT:
               sWorld->SendServerMessage(SERVER_MSG_STRING, GetTestMessage().c_str(), player);
               break;
    
           case GOSSIP_TEST_NOTICE:
               player->GetSession()->SendNotification(GetTestMessage().c_str());
               break;
    
           default:
               break;
           }
    
           OnGossipHello(player, creature);
           return true;
       }
    };
    
    void AddSC_npc_world_of_colors()
    {
       new npc_world_of_colors();
    }

     

    • Upvote 3

  10. define(MYSQL_HOST," "); - pomocí define bych rozhodně přístup do mysql nedefinoval, základem bezpečnosti je smazat minimálně heslo hned po připojení do db a to takhle rozhodně nedokážeš.

     

    "html_entity_decode(htmlentities($login))" je blbost, akorát plýtváš výkonem na převedení na entity a zpět.

     

    s těma 3x query, máš pravdu by to stačilo tak jak si napsal ty, ale je to takové pojištění pro špatný spojení DB

    Takže vlastně 3x zvyšuješ šanci, že se to rozpadne. Protože místo jednoho selectu pošleš hned tři, za kterými navíc z nepochopitelných důvodů vnucuješ php cyklus while a děláš tím určitou režii navíc.

     

    session_write_close() je rovněž nepotřebné, děje se to automaticky při ukončení skriptu.

     

    mysql_fetch_array, mysql_fetch_assoc pravděpodobně vůbec netušíš rozdíl mezi těmi funkcemi a svévolně je mixuješ. Rozdíl je v tom, jestli se vrací pole indexované (row), asociativní (assoc) nebo obojí (array).

    • Upvote 2

  11. Použití mapy je v tvém případě zbytečné, její funkce vůbec nevyužíváš a výkonově to degraduješ na klasické iterování přes vektor. Tím, že jsi entry neuložil jako klíč v mTeleportLoctData nemáš možnost přistoupit k tomu přímo. Obdobně v gossip menu by použitím vhodné složitější struktury bylo možné indexovat podle ID menu a pod tím mít vektor, který jenom vypíšeš.

     

    GetTeleportMenuData a GetTeleportLoctData by bylo lepší také označit inline.

     

    Automatické načtení dat by bylo vhodnější detekovat a řešit přímo ve třídě DynamicTeleportMgr, podle těch bool příznaků, které tam už máš. Případné dlouhé načtení z db stejně ovlivní všechny hráče a notifikace by tak měla směřovat do broadcastu, aby měla smysl.

     

    Pro action_type by bylo vhodnější použít vlastní enum a v načítání z DB kontrolovat správnost vstupů.

     

    "#pragma once #ifndef _DYNTEL_H" - totožná funkce pomocí dvou různých způsobů. Vzhledem k lepší kompatibilitě se obvykle používá ifndef, define. Pragma once můžeš klidně smazat.

    • Upvote 2

  12. struct MANGOS_DLL_DECL ScriptedAI: public CreatureAI

    Vytváříš strukturu ScriptedAI, kterou dědíš z CreatureAI. Ovšem v SD2 již ScriptedAI existuje. Ta definice by měla být:

    struct MANGOS_DLL_DECL boss_critter : public ScriptedAI

     

    Což odpovídá tomu, jak máš napsaný konstruktor.

    • Upvote 1

  13. Ak by si chcel aby si to hráči nemuseli kupovať no tak by si musel zmazať funkciu commandu ale potom by si si musel doprogramovať napríklad keď stlačia E tak sa im to zapne.

    Takže myslím že toto stačí zmazať a potom ešte niečo ku tomu a stačí si doprogramovať:

     

    Zbytečně složitý, správná odpověď už tu zazněla. Stačí si nastavit cenu padáku na nulu, protože na reset hudu máš funkci:

    public newSpawn(id)
    {
           if(para_ent[id] > 0) {
                   remove_entity(para_ent[id])
                   set_user_gravity(id, 1.0)
                   para_ent[id] = 0
           }
    
           if (!gCStrike || access(id,PARACHUTE_LEVEL) || get_pcvar_num(pCost) <= 0) { // <-- poslední podmínka
                   has_parachute[id] = true
                   //set_view(id, CAMERA_3RDPERSON)
           }
    }
    

    A padák ti to nastaví automaticky při nulové ceně.


  14. 1) SELECT TOP10 - blbost

    2) FROM arena_team,arena_team_stats - bez omezujících podmínek provedeš akorát kartézský součin a výsledek ti je k ničemu

    3) $riadok = mysql_fetch_row($vysledok); - absence cyklu vypíše pouze první záznam

     

    Když už sem chceš něčím přispět opravdu si to nejdříve ozkoušej.


  15. Ach jo, zase...

    Připojovat se na svůj počítač přes veřejnou IP adresu je kravina, to co od těch low-end zařízeních chcete (aby uměli poslat data do smyčky a pak zpátky) to většinou neumějí. Pokud chceš hrát sám nech si tam všude 127.0.0.1, pokud chceš mít i kamarády, vytvoř si v db realm pro ně (veřejná ip) a tebe (127.0.0.1). Nebo si zaregistruj doménu (i .tk) nastav si tam tuto doménu a na svém PC si přidej do souboru HOSTS "přesměrování" této domény na 127.0.0.1.

×