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:  
Sign in to follow this  
Wolf Officious

[C++] World of Colors (v0.3) - TrinityCore

Recommended Posts

Ty se opravdu nikdy nenudíš :D Mě se to líbí, používal bych to i jako super odreagování :P Jenom škoda že opět neletím na TrinityKór, nýbrž Mangosákovi :crybaby: Čili verzi pro MaNGOS asi nechystáš co? ... :mf_farmer:

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

    // pole RGB
   uint8 color[3] = {0, 0, 0} ;


2>Compiling...
2>world_of_colors.cpp
2>..\..\..\..\src\server\scripts\Custom\world_of_colors.cpp(41) : error C2059: syntax error : '{'
2>..\..\..\..\src\server\scripts\Custom\world_of_colors.cpp(41) : error C2334: unexpected token(s) preceding '{'; skipping apparent function body

Gratuluji! Vyhrál jste syntax error! ;):D

Od kdy se ve třídě definujou hodnoty proměných mimo konstruktor? :D

 

IsNotValidGamemaster()? Kdybych tam napsal ehr21jrngbjdvh31bf95jc6() tak je to uplně jedno. Zachování is jsem plánoval, byla to původně funkce ověřující combat..

 

    inline bool isInCombat(Player *player)
   {
       if(player->isInCombat())
       {
           player->GetSession()->SendNotification("You are in combat!");
           return true;
       }
       return false;
   }

 

 

// ostringstream stačí

mě stačí stringstream.. :P

 

// po změně GetStringStep (níže) není nutné volat c_str()

věř tomu že je, pokud se budu chtít spoléhat na výsledek..

 

// string je zbytečné plýtvání pamětí a časem procesoru pro neustále inicializace ....

// předělat na "static const char* hexSteps[]" ....

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

 

    const char* GetStringStep(uint8 step)
   {
       static const char* 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"};

       return hexSteps[step];
   }

 

 

Takhle by odpadl i c_str() převod na const char*, protože už to const char dávno je.. Takže jenom u returnu..

 

    const char* GetTestMessage()
   {
       std::stringstream ss;
       ss << "|cff"
          << GetStringStep(colorR)
          << GetStringStep(colorG)
          << GetStringStep(colorB)
          << " WORLD OF COLORS: #"
          << GetStringStep(colorR)
          << GetStringStep(colorG)
          << GetStringStep(colorB)
          << " TEST MESSAGE..";
       return ss.str().c_str();
   }

 

 

// lenost nadevše

#define ...

// lépe - inline funkce + enum pro indexy

 

enum Colors
{
   COLOR_R = 0,
   COLOR_G = 1,
   COLOR_B = 2
};

    inline void ColorValueIncrease(uint8 index)
   {
       if(color[index] < (STEP_COLOR_MAX - 1))
           ++color[index];
   }

   inline void ColorValueDecrease(uint8 index)
   {
       if(color[index] > NULL)
           --color[index];
   }

 

 

Je to všechno fajn jenom do tý doby, dokud nespustím core a nezjistím, že při kliknutí na NPC core crashne a je po srandě. :D

 

EDIT: A ten bordel co dělá ten pitomej static const char, to jsem fakt nezažil :D Generuje si to jak chce. Takže zůstávam při starým protože ten script nechci zničit.. :P

Edited by Wolf Officious

Share this post


Link to post
Share on other sites
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.

Edited by bLuma
  • Upvote 1

Share this post


Link to post
Share on other sites

To si domysli :) V hlavě kompilátor C/C++ vážně nevedu.

class npc_world_of_colors : public CreatureScript
{
private:
   uint8 color[3];

   // Gamemaster Checker
   inline bool isNotValidGamemaster(Player *player)
   {

public:
   npc_world_of_colors() : CreatureScript("npc_world_of_colors")
   {
       color[color_R] = 0;
       color[color_G] = 0;
       color[color_B] = 0;
   }

   bool OnGossipHello(Player *player, Creature *creature)
   {

 

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.

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

 

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.

Jo, na to jsem záhy přišel taky. :D A debugging nedělám, to bych tu strávil mládí a dvacet kuřat k obědu :D

Edited by Wolf Officious

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

BUMP :diablo:

 

Trochu jsem to pozměnil, hlavně kašlu na pole s hodnotama, když můžu hodnoty barev rovnou převádět na hex. Myslim že je to tak lepší.. :D Můžete mě zase něco vytknout.. :lol:

 

Jo a málem bych zapoměl. Přidal jsem položky RESET, ALL <+> a ALL <->.. :D

 

 

Ty se opravdu nikdy nenudíš :D Mě se to líbí, používal bych to i jako super odreagování :P Jenom škoda že opět neletím na TrinityKór, nýbrž Mangosákovi :crybaby: Čili verzi pro MaNGOS asi nechystáš co? ... :mf_farmer:

Pro ten mangos jsem to nakonec přepsal. Snad to bude sedět. Je tam jenom jedna změna, že do chatu se to vypisuje přes MonsterWhisp.. (je zajímavý, když postava whispuje sama sobě :D) >> Zde << Edited by Wolf Officious
  • Upvote 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Jo, to je vlastně fakt. :D Upravim to, jenom s tim rozdílem, že to přetypuju na string.. Myslíš že to bude cajk?

return std::string(buf);

Všechno to funguje, kompilace v klidu, in-game taky pohodička. :D Já jenom abys nenapsal že to mam zase blbě :teehee: Vracet chary se mi nechce, s tim mám blbý zkušenosti :D

 

PS: A na konci jsou 2 tečky :D na buf[50] se líp kouká :D No nic, to je konina, neřeš. :blink: A hele, proč musí bejt ten char o jeden znak větší? Je to kvůli nějakýmu pitomýmu end-line znaku? \0 :huh:

Edited by Wolf Officious

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Jo,

return buf;

taky jde.. :blink:

 

Dvojtečka je moje specialita, používám to často.. :D To je tak, když 1 je ti málo, a 3 jsou ti už moc. :D Dvojtečka vertikální : dvojtečka horizontální .. :lol:

..ale budeme se přít kvůli tečce? Psal jsem abys to neřešil, vždyť je to fuk, napadaj mě kraviny. :mid_bow_arrow:

 

Ty nuly jsou zajímavý. Já jsem něco tušil, ale nevědl jsem že je to až takový vzrůšo :D

Share this post


Link to post
Share on other sites

Zdar! :) Je tu vůbec ještě někdo, kdo si to pamatuje a kdo to někdy použil? :P

Edited by Wolf Officious

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×