[DB] Flugpunkte für A+H

Frohen Sonntag euch allen!

Ich habe aus Spass mal alle Quests für die Horde und Allianz freigegeben. Das klappt auch wunderbar wenn nicht gerade Fraktionsruf belohnung dabei ist /emoticons/default_smile.png (Wachen etc sind auch freundlich).

Nun habe ich aber das Problem das wenn ein Hordler in SW ist und gerne Blizzard Airline nutzen möchte, das dies nicht geht obwohl dann ein Fenster aufspring und Routen anzeigt.

Nun zu meiner Frage: “Ich möchte gerne die Flugpunkte wie in Nordend für alle Fraktionen freigeben, wie mache ich das am besten? Datenbank? Oder C++”? Weil wenn ich auf einen Flugpunkt klicke, dann heist es der Flugmeister ist zu weit weg. Ist klar… da der wohl vom Hordepunkt ausgeht… ^^.

Herzliche Grüße

Yellow

In uint32 ObjectMgr::GetNearestTaxiNode(float x, float y, float z, uint32 mapid, uint32 team, uint32 searched_node) [src\server\game\Globals\ObjectMgr.cpp]

gibt es

[CODE]if (!node->MountCreatureID[team == ALLIANCE ? 1 : 0] && node->MountCreatureID[0] != 32981) // dk flight

        continue;[/CODE]

Probier mal, diese beiden Zeilen entweder auszukommentieren (// vor if und vor continue einfügen) oder beide Zeilen komplett zu entfernen

Fragt sich nur, ob man gegnerische Flugpunkte beim Ansprechen geaddet bekommt, musst du halt mal ausprobieren

cool danke werde ich mal testen!

EDIT: Ich habe den Bereich mal auskommentiert und neu compiliert. Cache gelöscht und es mit einem Alli mal im Basislager von Grom’Gol im Schlingendorntal ausprobiert. Es kommt die Meldung das der Flugpunkt nun hinzugefügt wurde. Nur wenn ich ihn erneut anklicke, dann öffnet sich ein Fenster in dem z.B. Nur Sturmwind zu sehen ist. Klicke drauf und er sagt mir “Ihr seid zu weit vom Flugmeister entfernt!”.

Fazit: Also Basislager wurde schonmal nicht geaddet. Dewegen dann warscheinlich auch die Meldung mit der Entfernung. Oder was denkt ihr?

Du kannst vom Basislager aber auch nicht zum Basislager fliegen… Du brauchst da schon nen anderen Punkt für (der auch noch in Reichweite liegt, glaub das waren 1000yd’s maximal)

WorldSession::HandleTaxiQueryAvailableNodes ruft WorldSession::SendLearnNewTaxiNode auf, was wiederum die Fraktionsüberprüfung über ObjectMgr::GetNearestTaxiNode löst. Genau diese Überprüfung haben wir mit dem auskommentieren/löschen übersprungen, weshalb uns das keine Probleme macht.

An dem Ally/Horde Unterschied sollte es also nicht liegen. Player::GetNPCIfCanInteractWith wird aufgerufen, bevor das TaxiMenü angezeigt wird, weshalb dieser Check bei dir ebenfalls erfolgreich durchläuft (das ist die Funktion, die anhand des Rufs für die Freund-Feind Relation sorgt)

Wüsste also nicht, woran dein Vorhaben scheitern sollte

Glaub nicht, dass das in Yards gemessen wird, sondern einfach in gibt Route, oder gibt keine Route. Aber wie auch immer, sollte man zum Testen in der Tat zwei benachbarte Flugpunkte nutzen. Ne Variante zum testen, die mir da spontan einfallen würde, wäre Gadgetzan. Als Hordler den Horde FP “erkunden” und dann zum Alli FP auf der anderen Seite laufen. Wobei da wiederum keine Route vorhanden ist. Hmhmhm…Versuch es doch einfach mal über die Configoption, dass direkt ab Start alle Flugpunkte verfügbar sind.

Also das ich alle Flugpunkte Aktivieren kann, das finde ich nicht in der Config. Nur all Maps on Start oder sowas aber nix mit Taxi oder Flight zu finden!

[SPOILER]###################################################################################################

CUSTOM SERVER OPTIONS

PlayerStart.AllReputation

Description: Players will start with most of the high level reputations that are needed

for items, mounts etc.

Default: 0 - (Disabled)

1 - (Enabled)

PlayerStart.AllReputation = 0

PlayerStart.AllSpells

Description: If enabled, players will start with all their class spells (not talents).

You must populate playercreateinfo_spell_custom table with the spells you

want, or this will not work! The table has data for all classes / races up

to TBC expansion.

Default: 0 - (Disabled)

1 - (Enabled)

PlayerStart.AllSpells = 0

PlayerStart.MapsExplored

Description: Characters start with all maps explored.

Default: 0 - (Disabled)

1 - (Enabled)

PlayerStart.MapsExplored = 0

HonorPointsAfterDuel

Description: Amount of honor points the duel winner will get after a duel.

Default: 0 - (Disabled)

1+ - (Enabled)

HonorPointsAfterDuel = 0

AlwaysMaxWeaponSkill

Description: Players will automatically gain max weapon/defense skill when logging in,

or leveling.

Default: 0 - (Disabled)

1 - (Enabled)

AlwaysMaxWeaponSkill = 0

PvPToken.Enable

Description: Character will receive a token after defeating another character that yields

honor.

Default: 0 - (Disabled)

1 - (Enabled)

PvPToken.Enable = 0

PvPToken.MapAllowType

Description: Define where characters can receive tokens.

Default: 4 - (All maps)

3 - (Battlegrounds)

2 - (FFA areas only like Gurubashi arena)

1 - (Battlegrounds and FFA areas)

PvPToken.MapAllowType = 4

PvPToken.ItemID

Description: Item characters will receive after defeating another character if PvP Token

system is enabled.

Default: 29434 - (Badge of justice)

PvPToken.ItemID = 29434

PvPToken.ItemCount

Description: Number of tokens a character will receive.

Default: 1

PvPToken.ItemCount = 1

NoResetTalentsCost

Description: Resetting talents doesn’t cost anything.

Default: 0 - (Disabled)

1 - (Enabled)

NoResetTalentsCost = 0

Guild.AllowMultipleGuildMaster

Description: Allow more than one guild master. Additional Guild Masters must be set using

the “.guild rank” command.

Default: 0 - (Disabled)

1 - (Enabled)

Guild.AllowMultipleGuildMaster = 0

ShowKickInWorld

Description: Determines whether a message is broadcasted to the entire server when a

player gets kicked

Default: 0 - (Disabled)

1 - (Enabled)

ShowKickInWorld = 0

RecordUpdateTimeDiffInterval

Description: Time (in milliseconds) update time diff is written to the log file.

Update diff can be used as a performance indicator. Diff < 300: good

performance. Diff > 600 bad performance, may be caused by high CPU usage.

Default: 60000 - (Enabled, 1 minute)

0 - (Disabled)

RecordUpdateTimeDiffInterval = 60000

MinRecordUpdateTimeDiff

Description: Only record update time diff which is greater than this value.

Default: 100

MinRecordUpdateTimeDiff = 100

PlayerStart.String

Description: String to be displayed at first login of newly created characters.

Default: “” - (Disabled)

PlayerStart.String = “”

LevelReq.Trade

Description: Level requirement for characters to be able to trade.

Default: 1

LevelReq.Trade = 1

LevelReq.Ticket

Description: Level requirement for characters to be able to write tickets.

Default: 1

LevelReq.Ticket = 1

LevelReq.Auction

Description: Level requirement for characters to be able to use the auction house.

Default: 1

LevelReq.Auction = 1

LevelReq.Mail

Description: Level requirement for characters to be able to send and receive mails.

Default: 1

LevelReq.Mail = 1

###################################################################################################

[/SPOILER]

Hey, hier gibts ja Spoiler. Geil. Will auch gleich mal probieren:

[SPOILER]#

AllFlightPaths

Description: Character knows all flight paths (of both factions) after creation.

Default: 0 - (Disabled)

1 - (Enabled)

AllFlightPaths = 0

[/SPOILER]

Cool. Das macht Spaß

lol^^ ich bin blind /emoticons/default_cool.png

PS: Habe das mit dem Spoiler im Englischen Bereich gesehen und mich total drüber gefreut /emoticons/default_biggrin.png

Na gut, ich muss zugeben, dass diese Configoption in der tat irgendwie deplatziert scheint. Für meinen Begriff gehört das auch eher in die Custom Section, aber gut, die Wege des TC Devs sind zumeist unergründlich.

Ok habe es mit den ganzen Flugpaths versucht. Beutebucht alli punkt und Alli lager im Schlingendorntal.

Ich befinde mich im Momment im Rebellenlager der Allianz. Nun klicke ich den an und bekomme als derzeitigen Punkt Grom’Gol angezeigt. Daher dann auch die Meldung das ich zuweit entfernt bin.

Irgendwo muß noch überprüft werden ob ich Horde bin!?

Möchte ich vom Rebellenlager zum Grabmal fliegen, dann heist es zuwenig Geld. Adde ich Geld, dann heist es wie gewohnt “Ihr seid zu weit vom Flugmeister entfernt!”.

Ich habe das Gefühl das die Flugpunkte mit z.B. 1 für Alli gespeichert wird oder 0 für Horde. Denn als Hordler sehe ich immer nur Horde Punkte, egal ob der ali punkt endeckt wurde. Und umgekehrt nur Alli Punkte!

EDIT: Sind die Flugpunkte vieleicht DBC beschränkt? Wenn man einen neuen Flugpunkt erstellen möchte, dann muß man doch auch in den DBC’s rumfummeln oder irre ich mich?

Es werden zwar sHordeTaxiNodesMask und sAllianceTaxiNodesMask definiert, aber nur bei Rasse/Fraktionswechsel benutzt.

Die einzige Horde/Ally Unterscheidung bei den Punkten im Core ist MountCreatureID[x] != 0 (x=1 → Allianz, 0 → Horde).

Dies wird nur 2-mal benutzt: 1. DisplayID’s der Mounts 2. die Überprüfung, die du auskommentieren/löschen solltest

Bist du sicher, dass die beiden Zeilen bei dir nicht mitkompiliert werden?

Ansonsten würde ich vermuten, dass es am Client liegt

Guten Abend Ishigure!

Ich habe die Zeile auskommentiert. Aber ob es mit kompiliert wird, kann ich ja ansich nicht kontrollieren. Außer ich lösche die Zeilen einfach mal… aber warum sollte der Compiler das mitnehmen. Ist ja nun ein Kommentar!

Ich habe aber die Mount Einstellung (DisplayID für horde oder ALLI) nicht auskommentiert.

[CODE]

uint32 ObjectMgr::GetNearestTaxiNode(float x, float y, float z, uint32 mapid, uint32 team)

{

bool found = false;

float dist = 10000;

uint32 id = 0;


for (uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i)

{

    TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(i);


    /*if (!node || node->map_id != mapid || (!node->MountCreatureID[team == ALLIANCE ? 1 : 0] && node->MountCreatureID[0] != 32981)) // dk flight

        continue;*/


    uint8  field   = (uint8)((i - 1) / 32);

    uint32 submask = 1<<((i-1)%32);


    // skip not taxi network nodes

    if ((sTaxiNodesMask[field] & submask) == 0)

        continue;


    float dist2 = (node->x - x)*(node->x - x)+(node->y - y)*(node->y - y)+(node->z - z)*(node->z - z);

    if (found)

    {

        if (dist2 < dist)

        {

            dist = dist2;

            id = i;

        }

    }

    else

    {

        found = true;

        dist = dist2;

        id = i;

    }

}


return id;

}

void ObjectMgr::GetTaxiPath(uint32 source, uint32 destination, uint32 &path, uint32 &cost)

{

TaxiPathSetBySource::iterator src_i = sTaxiPathSetBySource.find(source);

if (src_i == sTaxiPathSetBySource.end())

{

    path = 0;

    cost = 0;

    return;

}


TaxiPathSetForSource& pathSet = src_i->second;


TaxiPathSetForSource::iterator dest_i = pathSet.find(destination);

if (dest_i == pathSet.end())

{

    path = 0;

    cost = 0;

    return;

}


cost = dest_i->second.price;

path = dest_i->second.ID;

}

uint32 ObjectMgr::GetTaxiMountDisplayId(uint32 id, uint32 team, bool allowed_alt_team /* = false */)

{

uint32 mount_id = 0;


// select mount creature id

TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(id);

if (node)

{

    uint32 mount_entry = 0;

    if (team == ALLIANCE)

        mount_entry = node->MountCreatureID[1];

    else

        mount_entry = node->MountCreatureID[0];


    // Fix for Alliance not being able to use Acherus taxi

    // only one mount type for both sides

    if (mount_entry == 0 && allowed_alt_team)

    {

        // Simply reverse the selection. At least one team in theory should have a valid mount ID to choose.

        mount_entry = team == ALLIANCE ? node->MountCreatureID[0] : node->MountCreatureID[1];

    }


    CreatureTemplate const *mount_info = GetCreatureTemplate(mount_entry);

    if (mount_info)

    {

        mount_id = mount_info->GetRandomValidModelId();

        if (!mount_id)

        {

            sLog->outErrorDb("No displayid found for the taxi mount with the entry %u! Can't load it!", mount_entry);

            return false;

        }

    }

}


// minfo is not actually used but the mount_id was updated

sObjectMgr->GetCreatureModelRandomGender(&mount_id);


return mount_id;

}[/CODE]

Hm wenn man vom Grater von Ungruro nach Getgezan fliegt, dann ist ja fast schon nebeneinander ein Horde und ein Alli Flugpunkt. Wenn man als Alli losfliegt, dann wird man beim Alli Master abgeworfen. Und wenn man als Hordler fliegt, dann wird man beim Horde Master abgeworfen. Also woher weiß nun nachdem wir die Fraktionsbeschränkung entfernt haben, welchen Flug Path der nutzen soll? Also muß doch irgendwo noch was überprüft werden oder irre ich mich jetzt total?

Liebe grüße

Yellow

Ich vermute einfach mal, dass die Routen alle clientseitig sind und der Server nur speichert, welche der Teilrouten entdeckt worden sind.

Müsste man sich halt mal in den DBC’s anschauen, was da so alles bezüglich TaxiFlights gespeichert wird.

Wenn das z.B. mit ID’s gelöst wird und Horde und Allianz verschiedene ID’s nutzen, wirst du nicht weiterkommen.

Da müsstest du dir dann schon nen NPC bauen, der die Flüge per Gossipmenü anbietet. Den Char per Script auf ne Flugroute zu packen dürfte nicht das Problem sein

Was genau müßte ich machen damit ich den Char auf eine Flugroute zu bekommen? Das Gossip Menü ist ja nicht das Problem /emoticons/default_smile.png

mit



pPlayer->ActivateTaxiPathTo(627);

benötigt wird die Taxi id die stehen in den dbc feils

Danke schön!

Habt ihr einen Tip für mich wie man am besten die DBC Files ausliest und versteht?

Gibt dafür ebenfalls eine Sektion im Wiki.