Phasing
Bonjour, Bonsoir tous dépend de vous Smile !

Je faix ce sujet pour savoir si quelqu'un avait dans l'idée de développer un tutoriel sur le Phasing.

Par exemple: (Ceci est à titre d'exemple)

Je suis dans ma zone "duel", je lance un duel (logique non?) et quand mon adversaire/ou moi a accepté la demande de duel, nous passons dans la phase 2 où ce trouve uniquement lui et moi.

J'espère m'être fais comprendre, si vous avez des questions, posez-les Smile !
Malheureusement, le système de phasing actuel (tel que proposé par Trinity) ne permet pas de faire ce genre de choses à grande échelle (cad que si 2 groupes de 2 joueurs faisaient une telle demande de duel au même endroit, le système actuel enverrait les 4 joueurs dans la même phase).

Le fait est que le système proposé par Trinity ne correspond absolument pas au système proposé sur officiel. De fait, il faudrait à minima redévelopper le système pour exploiter totalement le système de phasing. Je ne pense pas qu'un tutoriel ait un intérêt à la vue des éléments actuellement supportés par le système de phasing Trinity.

Je laisse évidement le soin à d'autres de s'exprimer et peut être infirmer mes propos Wink
Sinon tu as cette solution qui fonctionne très bien.
Ce code m'a été donné par PixelPirate.

class Duel: public PlayerScript
{
public:
    Duel(): PlayerScript("Duel") {}
 
    void OnDuelStart(Player* firstplayer, Player* secondplayer) override{
        Map* map = firstplayer->GetMap();
        if (map->IsDungeon())
            return;
 
        GameObject* go = map->GetGameObject(firstplayer->GetUInt64Value(PLAYER_DUEL_ARBITER));
        if (!go)
            return;
 
        std::list<Player*> playerList;
        Trinity::AnyPlayerInObjectRangeCheck checker(go, 100.0f);
        Trinity::PlayerListSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(go, playerList, checker);
        go->VisitNearbyWorldObject(100.0f, searcher);
 
        uint32 usedPhases = 0;
        if (!playerList.empty())
            for (std::list<Player*>::const_iterator it = playerList.begin(); it != playerList.end(); ++it)
                if (!(*it)->IsGameMaster())
                    usedPhases |= (*it)->GetPhaseMask();

        for (uint32 phase = 2; phase <= ULONG_MAX / 2; phase *= 2){
            if (usedPhases & phase)
                continue;
 
            firstplayer->SetPhaseMask(phase, false);
            secondplayer->SetPhaseMask(phase, false);
            go->SetPhaseMask(phase, true);
            firstplayer->UpdateObjectVisibility();
            secondplayer->UpdateObjectVisibility();
            return;
        }
        firstplayer->GetSession()->SendNotification("Il n'y a aucunes phases de disponibles");
        secondplayer->GetSession()->SendNotification("Il n'y a aucunes phases de disponibles");
    }

    void OnDuelEnd(Player* firstplayer, Player* secondplayer, DuelCompleteType type) override{

        firstplayer->SetPhaseMask(GetNormalPhase(firstplayer), false);
        secondplayer->SetPhaseMask(GetNormalPhase(secondplayer), false);
        firstplayer->UpdateObjectVisibility();
        secondplayer->UpdateObjectVisibility();
    }

    uint32 GetNormalPhase(Player* player) const{
        if (player->IsGameMaster())
            return uint32(PHASEMASK_ANYWHERE);
 
        uint32 phase = PHASEMASK_NORMAL;
        Player::AuraEffectList const& phases = player->GetAuraEffectsByType(SPELL_AURA_PHASE);
        if (!phases.empty())
            phase = phases.front()->GetMiscValue();
        if (uint32 n_phase = phase & ~PHASEMASK_NORMAL)
            return n_phase;
        return PHASEMASK_NORMAL;
    }
};
 
void AddSC_Duel(){
    new Duel();
}
Merci de vos réponses à vous deux !

@Nobodie Dommage qu'il ne soit pas optimisé à ce point ce système

@arediss Merci du bout de code, mais mon exemple été juste un... exemple x), j'ai pris celui-ci car il se rapproche le plus de ce que j'essaye de réaliser Tongue
[Double poste excusez moi]

Et le phasing en général quelqu'un peut-il faire un tutoriel ?

Par exemple: Comment passer d'une phase à une autre etc.

Excusez moi de vous déranger, mais j'ai une soudaine soif d'apprendre :x
Pour le passage d'une phase à une autre tu peux définir une condition en SmartAI je dirais qui va faire l'évènement 'change de phase'

Sinon tu as les spell_area, quand une quête est commencée tu peux avoir un spell qui s'applique sur toi (difficile d'en trouver un compatible dans la région ou tu es) et quand tu termines une autre quête t'es sorti de phase le spell est retiré
Merci de ta réponse Hyakki (Bon anniversaire en retard en passant !) je vais aller regarder ça !
Tu as une fonction de la classe player qui te permet de faire des changements de phase
SetPhaseMask()

Après à toi de faire tes conditions. Si le joueur possède telle quête ou si il a tel item ou bien si le joueur est dans telle zone. Exemple:

Player* plr;

if(plr->GetAreaId() == 9){
    plr->SetPhaseMask(2,true);
}
Après je ne suis pas caler niveau c++, mais tu peux aller demander de l'aide a PixelPirate il t'aidera volontiers, c'est lui qui ma donner ces bouts de script. Je peux te communiquer son skype si tu veux par mp.
Merci de ta réponse Arediss, si jamais je patauge trop je reviendrai, mais il se fait tard, donc je verrai ça demain, bonne nuit à tous x) !

Retourner en haut WoW-Emu