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  
Smrtokvitek

[C++] Arena System 1v1

Recommended Posts

1) Musim urcite rict, dobra prace.

2) Myslim, ze by bylo lepsi na to cely pouzit script system TrinityCore a ne zasahovat do World-u a pripadne jinych. (Navic mi neco rika, ze funkce na zjisteni hracu v zone uz je nekde v Map, ale nevim jiste). V jejich script systemu se da delat opravdu hodne veci :).

3) Kdyz vkladas do databaze, je dobry vypsat sloupce, do kterych zapisujes a do zbytecnych nezapisovat.

Share this post


Link to post
Share on other sites

Velice zajímavé, jestli můžu něco navrhnout tak aby se ty body vypisovali u té creatury, příjdeš k němu a blabla... tvůj bodový stav je 1100 Bodů, v Lize jsi na 1. Místě, Gratuluju ti Lukasas... :rofl: pak by to bylo asi nejvytíženější NPC na serveru :D

Share this post


Link to post
Share on other sites

changelog.pngChangelog 22.01.2011 - 1

 

Úprava tabuľky 'league_score' (Rozdelené Wins - "Wins_Week" & "Wins_All")

 

DROP TABLE IF EXISTS `league_score`;
CREATE TABLE `league_score` (
 `Guid` int(11) default NULL,
 `Name` varchar(50) default NULL,
 `Games` int(11) NOT NULL default '0',
 `Wins_Week` int(11) NOT NULL default '0',
 `Wins_All` int(11) NOT NULL default '0',
 `Points` int(11) NOT NULL default '0',
 PRIMARY KEY  (`Guid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

 

Úprava commandu 'conversion' (Rozdelené Wins - "Wins_Week" & "Wins_All")

 

   m_session->GetPlayer()->StopCastingBindSight();
   return true;
}

+bool ChatHandler::HandleConversionCommand(const char* /*args*/)
+{
+    //Cycle that gives league points to all players
+    CharacterDatabase.PExecute("UPDATE league_score SET Points = Points + Wins_Week");
+    CharacterDatabase.PExecute("UPDATE league_score SET Wins_All = Wins_All + Wins_Week");
+    CharacterDatabase.PExecute("UPDATE league_score SET Wins_Week = 0");
+
+    sWorld->SendWorldText(LANG_1V1_CONVERSION_POINTS);
+    return true;
+}

 

Pridaný Jednoduchý script pre Web 'Top 1v1 League Players'

 

<?php

/* Nastavenia */
$ip = 'localhost'; //Mysql Adresa
$user = 'root'; //Mysql Uživateľ
$pass = 'root'; //Mysql Heslo
$characters = 'chars'; //Char db
$top = 10; //Koľko Najlepších

/* Pripojenie */
$connect = mysql_pconnect($ip, $user, $pass)  or die ("Spojenie so serverom $ip nebolo uspesne");

/* Vybratie Databázy */
mysql_select_db($characters, $connect);

/* Dotaz */
$sql = "SELECT * FROM league_score ORDER BY Wins_All DESC LIMIT $top";
$result = mysql_query($sql);

echo "<center><h1> League 1v1 TOP $top Players</H1>
     <table border='1'>
<tr><td>Name</td><td>Games</td><td>Wins</td>
</tr>";

while ($vypis=mysql_fetch_array($result))
{    
 echo "<tr><td>".$vypis['Name']."</td>
       <td>".$vypis['Games']."</td>
       <td>".$vypis['Wins_All']."</td></tr>";

}

echo "<center></table>";

mysql_close();

?>

 

Pridaný custom PatchFile 'All in One'

 

ArenaSystem1v1.patch

Edited by Smrtokvitek80
  • Upvote 2

Share this post


Link to post
Share on other sites

changelog.pngChangelog 22.01.2011 - 2

 

Pridaná možnosť zobrazenia score v lige 'My Score' (Zobrazuje Počet hier, výhier celkovo, výhier od posledného prepočtu)

 

[ src/server/scripts/Custom/npc_arena.cpp ]

 

           player->ADD_GOSSIP_ITEM( 9,  "I am ready to fight"                , GOSSIP_SENDER_MAIN, 1);
           player->ADD_GOSSIP_ITEM( 10, "Register me to the 1v1 League"      , GOSSIP_SENDER_MAIN, 2);
           player->ADD_GOSSIP_ITEM( 6,  "Sell me some rewards"               , GOSSIP_SENDER_MAIN, 3);
+
+	     QueryResult result = CharacterDatabase.PQuery("SELECT `name` FROM `league_score` WHERE name = '%s' ", player->GetName());
+	     if (result) //If Registered
+            {
+            	    player->ADD_GOSSIP_ITEM( 7,  "My Score"               , GOSSIP_SENDER_MAIN, 4);
+            }
+	      return true;
+        }
+
       player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, _creature->GetGUID());         
       return true;

			ChatHandler(player).SendSysMessage(LANG_1V1_REGISTER_COMPLETE);
            	       }
            return true;
       break;
+
+              case 3://My Score    
+			QueryResult result = CharacterDatabase.PQuery("SELECT `Name`, `Games`, `Wins_Week`, `Wins_All`, `Wins_Points`,  FROM `league_score`");
+		
+		 	if (result)
+       		{
+            			Field *fields = result->Fetch();
+            			return fields[0].GetString() + fields[1].GetInt32() + fields[2].GetInt32() + fields[3].GetInt32() + fields[4].GetInt32();
+		       		ChatHandler(player).SendSysMessage(LANG_1V1_SCORE);
+        		}
+			else
+        		{
+				      ChatHandler(player).SendSysMessage(LANG_1V1_NO_REGISTER);
+        		}
+			return true;
+			player->CLOSE_GOSSIP_MENU();
+	       break;
+
            default:
break;	

 

[ src/server/game/Miscellaneous/Language.h ]

 

  LANG_1V1_REGISTER_COMPLETE           = 11024,
  LANG_1V1_CONVERSION_POINTS           = 11025,
+   LANG_1V1_SCORE           	         = 11026,

// Level 4 (CLI only commands)
LANG_COMMAND_EXIT 

 

[ trinity_strings ]

 

INSERT INTO `trinity_string` VALUES ('11026', '1v1 League Score: %s -- Games: [%u], Wins Week: [%u], Wins Total: [%u], Points: [%u]', null, null, null, null, null, null, null, null);

 

(Niesom si veľmi istý či to bude fungovať, ale malo by. Ale určite sa tam nájde nejaká malinká chyba, hlavne v "case 3://My Score")

 

 

Aktualizovaný custom PatchFile 'All in One'

 

ArenaSystem1v1.patch

Edited by Smrtokvitek80
  • Upvote 1

Share this post


Link to post
Share on other sites

Těch chyb tam je hodně, třeba nevidím důvod tohoto:

return fields[0].GetString() + fields[1].GetInt32() + fields[2].GetInt32() + fields[3].GetInt32() + fields[4].GetInt32();

pod tím máš napsáno ještě něco, co už se ovšem neprovede. Navíc mi není jasný, jak by mohla bool funkce navracet celočíselnou hodnotu která je sečtená se stringem. :D

To samý se stane i tady:

                       return true;
                      player->CLOSE_GOSSIP_MENU();

 

Najde se tam toho víc.. Hlavně v querech, kdy třeba u `Wins_Points` máš na konci čárku, bacha na to. Pozor na zápis dotazů.

Měl bys to dodělat co nejdřív, děláš hodně blbostí kolem, ale nezaměřuješ se na ty hlavní věci. Hlavně přehledně, nebo se v tom časem utopíš. :lol: Chápu že to ještě není hotový, ale je lepší nenapsat nic, než nějakou kravinu. :mellow:

 

EDIT: ..a fakt nevím, co čekáš od tohoto:

QueryResult result = CharacterDatabase.PExecute("INSERT INTO `league_score` VALUES ('%u', '%s', 0, 0, 0)", player->GetGUIDLow(), player->GetName());

PExecute přeci nevrací QueryResult. :diablo:

Edited by Wolf Officious

Share this post


Link to post
Share on other sites

Předem omluva, doublepost BUMPujícího charakteru.

 

Trochu jsem si hrál a vyplodil jsem hrubej nástřel toho nešťasnýho scriptu. Mám to už nějakou dobu ale nevím jestli se ještě budu nějak angažovat a dodělávat to. Snad to poslouží dobrý věci a Smrtokvitek80 něco odkouká, nebo to použije (u soudu proti nám, heh :lol:).

 

/*
* Custom Arena System 1v1 - HEAD NPC SCRIPT
*
* (status: very very hard coded & uncomplete)
*
* Copyright (C) 2011 Wolf Officious (realizer, diletant)
* Copyright (C) 2011 Smrtokvitek80  (base code, no idea)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include "ScriptPCH.h"

class npc_arena_master : public CreatureScript
{
// #############
// # AUXILIARY #
// #############
private:
   struct Coords
   {
       float x;
       float y;
       float z;
       float o;
       uint32 map;
   };

   Coords NullCoords(void)
   {
       Coords coords;
       coords.map, coords.x, coords.y, coords.z, coords.o = 0;
       return coords;
   }

   Coords GetRandomLoc(void)
   {   //                                                  0  1  2  3  4
       QueryResult result = WorldDatabase.PQuery("SELECT map, x, y, z, o FROM league_coords ORDER BY RAND() LIMIT 1");
       Coords coords;

       if(result)
       {
           Field *fields = result->Fetch();
           coords.map  = fields[0].GetUInt32();
           coords.x    = fields[1].GetFloat();
           coords.y    = fields[2].GetFloat();
           coords.z    = fields[3].GetFloat();
           coords.o    = fields[4].GetFloat();
       }
       else
       {
           sLog->outError("PVP 1v1 ERROR: DB table `league_coords` is empty.");
           return NullCoords();
       }
       return coords;
   }

   uint64 RandomPartnerGuid(void)
   {
       QueryResult result = CharacterDatabase.PQuery("SELECT guid FROM league_queue ORDER BY RAND() LIMIT 1");

       if(result)
       {
           Field *fields = result->Fetch();
           return fields[0].GetUInt64();
       }
       else
       {
           sLog->outError("PVP 1v1 ERROR: DB table `league_coords` is empty.");
           return NULL;
       }
   }

   Player* GetRandomPartner(Player *me)
   {
       for(int itr = 0; itr < 3; ++itr)
       {
           uint64 partner_guid = RandomPartnerGuid();
           if(partner_guid != me->GetGUID() || partner_guid != NULL)
               return ObjectAccessor::FindPlayer(partner_guid);
       }
       return NULL;
   }

// ########
// # MAIN #
// ########
   void ReadyToFight(Player *player, Creature *creature)
   {
       QueryResult result = CharacterDatabase.PQuery("SELECT guid FROM league_queue WHERE guid = %u", player->GetGUID());

       if(result)
       {
           Coords coords = GetRandomLoc();
           player->TeleportTo(coords.map, coords.x, coords.y, coords.z, coords.o);
           Player *partner = GetRandomPartner(player);
           if(!partner)
           {
               creature->MonsterWhisper("Internal error, sorry. (queue is empty?)", player->GetGUID(), false);
               return;
           }
           GetRandomPartner(player)->TeleportTo(coords.map, coords.x, coords.y, coords.z, coords.o);
       }
       else
       {
           CharacterDatabase.PExecute("INSERT INTO league_queue VALUES (%u)", player->GetGUID());
           creature->MonsterWhisper("You have been successfully queued to the league queue list.", player->GetGUID(), false);
       }
   }

   void RegLeague(Player *player, Creature *creature)
   {
       QueryResult result = CharacterDatabase.PQuery("SELECT guid FROM league_score WHERE guid = %u", player->GetGUID());

       if(result)
       {
           creature->MonsterWhisper("You are already registered!", player->GetGUID(), false);
           return;
       }

       CharacterDatabase.PExecute("INSERT INTO league_score VALUES (%u, 0, 0, 0, 0)", player->GetGUID());
       creature->MonsterWhisper("You have been successfully registered in the league.", player->GetGUID(), false);
   }

   void ShowMyScore(Player *player, Creature *creature)
   {   //                                                        0          1         2            3
       QueryResult result = CharacterDatabase.PQuery("SELECT Games, Wins_Week, Wins_All, Wins_Points FROM league_score WHERE guid = %u", player->GetGUID());

       if(result)
       {
           Field *fields = result->Fetch();
           std::stringstream myscore;
           myscore << player->GetName() << "'s 1v1 score:";
           creature->MonsterWhisper(myscore.str().c_str(), player->GetGUID(), false);
           myscore.clear();
           myscore << "Games: "            << fields[0].GetInt32()
                   << " | Wins Week: "     << fields[1].GetInt32()
                   << " | Wins All: "      << fields[2].GetInt32()
                   << " | Wins Points: "   << fields[3].GetInt32();
           creature->MonsterWhisper(myscore.str().c_str(), player->GetGUID(), false);
       }
       else
       {
           creature->MonsterWhisper("You are not registered in the league.", player->GetGUID(), false);
       }
   }

// ##########
// # GOSSIP #
// ##########
public:
   npc_arena_master() : CreatureScript("npc_arena_master") { }

   bool OnGossipHello(Player *player, Creature *creature)
   {
       if(player->isInCombat())
       {
           player->CLOSE_GOSSIP_MENU();
           creature->MonsterWhisper("You are in combat!", player->GetGUID());
           return true;
       }

       player->ADD_GOSSIP_ITEM( 9, "I am ready to fight",           GOSSIP_SENDER_MAIN, 1);
       player->ADD_GOSSIP_ITEM(10, "Register me to the 1v1 League", GOSSIP_SENDER_MAIN, 2);
       player->ADD_GOSSIP_ITEM( 6, "Sell me some rewards",          GOSSIP_SENDER_MAIN, 3);

       QueryResult result = CharacterDatabase.PQuery("SELECT guid FROM league_score WHERE guid = %u", player->GetGUID());

       if(result)
           player->ADD_GOSSIP_ITEM( 7, "My Score",                  GOSSIP_SENDER_MAIN, 4);

       player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID());         
       return true;
   }

   bool OnGossipSelect(Player *player, Creature *creature, uint32 sender, uint32 uiAction)
   {
       if(sender != GOSSIP_SENDER_MAIN)
           return false;

       player->PlayerTalkClass->ClearMenus();

       switch(uiAction)
       {
       case 1: //I am ready to fight
           ReadyToFight(player, creature);
           break;
       case 2: //Register me to the 1v1 League
           RegLeague(player, creature);
           break;
       case 3: //Sell me some rewards
           break;
       case 4: //My Score
           ShowMyScore(player, creature);
           break;
       default:
           break;			 
       }

       player->CLOSE_GOSSIP_MENU();
       return true;
   }
};

void AddSC_npc_arena()
{
   new npc_arena_master();
}

 

Skoro dva dni jsem to "tesal do kamene" na TC, revizi 10866 bez jasný představy co to vlastně píšu. :diablo:

Smrťák :mf_death: je složitej člověk se kterým se domluvit.. ..není v mých silách. :mf_boff:

  • Upvote 4
  • Downvote 1

Share this post


Link to post
Share on other sites

chtel bych to testnout na 2.4.3 musim toho prepsat hodne nebo to bude behat out of box?

(na trinitycore1)

Share this post


Link to post
Share on other sites

No právě teď je to v takový fázi vývoje, že to nevyzkoušíš. Musíme k tomu nějak dojít. Myslím si ale, že tohle je docela velkej krok vpřed. :1eye:

Share this post


Link to post
Share on other sites

MG? Tak třeba na to, aby to nějakej borec bez keců vzal a dodělal. :D Ale na mě tohle není, tohle si zodpovídá zakladatel tématu.

Od začátku to nebylo ani kompilovatelný. Já jsem opravil chyby a dal jsem tomu tvar.

Jasně, je na tom hodně práce, ale to neznamená, že si to budu nechávat pro sebe. Základní kámen komunitní práce, víš? <_<

Můžu se pokusit do toho ještě jednou opřít, ale bez času to jde těžko. :shifty:

Edited by Wolf Officious
  • Upvote 1

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  

×