Înlătură notificare
Bun venit pe all4games.ro, Vizitator.
Distribuie şi tu această comunitate pentru a devenii mai cunoscută. Dacă ai tutoriale şi/sau resurse, nu ezita să le postezi şi aici. Mulţumim!
Înregistrare sau logare.

C++ Ip unic în anumite hărţi

Discuție în 'C++ / DIFF / Surse' creată de Gigiz, 19 Mar 2020.

  1. Gigiz

    Gigiz
    Administrator
    Membru personal

    Înscris:
    15 Mar 2016
    Mesaje:
    318
    Aprecieri primite:
    201
    Aprecieri oferite:
    9
    Deschide char.cpp şi adaugă:
    COD:
    Select All
    #include "map_manager.h"
    Caută:
    COD:
    Select All
    marriage::CManager::instance().Logout(this);
    Adaugă dupa :
    COD:
    Select All
    MapManager::instance().Disconnect(this);
    Deschide input_login.cpp şi adaugă:
    COD:
    Select All
    #include "map_manager.h"
    Caută:
    COD:
    Select All
    else if (ch->GetMapIndex() == 113)
    Adaugă inainte :
    COD:
    Select All
    else if (MapManager::instance().IsUniqueIPMap(ch->GetMapIndex()))MapManager::instance().Enter(ch);
    Deschide main.cpp şi adaugă:
    COD:
    Select All
    #include "map_manager.h"
    Cauta :
    COD:
    Select All
    COXEventManager OXEvent_manager;
    Adaugă inainte :
    COD:
    Select All
    MapManager map_manager;
    Cauta :
    COD:
    Select All
    OXEvent_manager.Initialize();
    Adaugă inainte :
    COD:
    Select All
    map_manager.Initialize();
    Cauta :
    COD:
    Select All
    OXEvent_manager.Destroy();
    Adaugă dupa :
    COD:
    Select All
    map_manager.Destroy();
    In map_manager.cpp :
    COD:
    Select All
    #include "stdafx.h"
    #include "buffer_manager.h"
    #include "char.h"
    #include "char_manager.h"
    #include "map_manager.h"
    #include "desc.h"

    void MapManager::Initialize()
    {
        
    Clear();
    }

    void MapManager::Destroy()
    {
        
    Clear();
    }

    // Removes all elements from the map container (which are destroyed), leaving the container with a size of 0.
    void MapManager::Clear()
    {
        for (
    auto iter m_map_manager.begin(); iter != m_map_manager.end(); ++iter)
            
    iter->second.clear();
    }

    // Count elements with a specific key, return 1 (if the element is found) or zero (otherwise).
    const bool MapManager::IsUniqueIPMap(const DWORD dwMapIndex)
    {
        return 
    m_map_manager.count(dwMapIndex) != 0;
    }

    // Returns the number of elements in the map container.
    const size_t MapManager::GetIPMapCount(const DWORD dwMapIndex)
    {
        return (
    m_map_manager[dwMapIndex]).size();
    }


    void MapManager::Disconnect(const LPCHARACTER ch)
    {
        if (!
    ch)
            return;

        const 
    DWORD dwMapIndex ch->GetMapIndex();   
        if (!
    IsUniqueIPMap(dwMapIndex))
            return;

        
    // Remove the player id from map list if exist.
        
    const auto it std::find(m_map_manager[dwMapIndex].begin(), m_map_manager[dwMapIndex].end(), ch->GetPlayerID());
        if (
    it != m_map_manager[dwMapIndex].end())
            
    m_map_manager[dwMapIndex].erase(it);
    }

    void MapManager::Enter(const LPCHARACTER ch)
    {
        if (!
    ch)
            return;
        
        const 
    DWORD dwPID ch->GetPlayerID();
        const 
    DWORD dwMapIndex ch->GetMapIndex();

        if (!
    IsUniqueIPMap(dwMapIndex))
            return;

        
    // Return iterator to the first element satisfying the condition or last if no such element is found.
        
    const auto it std::find(m_map_manager[dwMapIndex].begin(), m_map_manager[dwMapIndex].end(), dwPID);

        
    // If no element is found in the map, find() returns map.end().
        
    if (it != m_map_manager[dwMapIndex].end())
            return;

        
    // Add the player id into map list.
        
    m_map_manager[dwMapIndex].emplace_back(dwPID);
    }

    const 
    bool MapManager::IsPlayerIPInMap(const LPCHARACTER ch)
    {   
        if (!
    ch)
            return 
    false;

        if (!
    IsUniqueIPMap(ch->GetMapIndex()))
            return 
    false;

        if (
    GetIPMapCount(ch->GetMapIndex()) == 0)
            return 
    false;

        
    LPCHARACTER pkChar NULL;
        
    // Range-based for loop, iterating the std::list with player pids.
        
    for (DWORD dwPID m_map_manager[ch->GetMapIndex()])
        {
            if (!(
    pkChar CHARACTER_MANAGER::instance().FindByPID(dwPID)))
                continue;

            if (!
    strcmp(ch->GetDesc()->GetHostName(), pkChar->GetDesc()->GetHostName()) && ch->GetPlayerID() != pkChar->GetPlayerID())
                return 
    true;
        }
        
        return 
    false;
    }
    In map_manager.h
    COD:
    Select All
    #pragma once

    class MapManager: public singleton<MapManager>
    {
        private:
            
    std::map<DWORDstd::list<DWORD>> m_map_manager = {
                { 
    181, {} },
                { 
    182, {} },
                { 
    183, {} }
            };
            
        public:
            
    void      Initialize();
            
    void            Clear();
            
    void            Destroy();

            
    void            Enter(const LPCHARACTER ch);
            
    void            Disconnect(const LPCHARACTER ch);

            const 
    size_t    GetIPMapCount(const DWORD dwMapIndex);
            const 
    bool      IsPlayerIPInMap(const LPCHARACTER ch);
            const 
    bool      IsUniqueIPMap(const DWORD dwMapIndex);
    };
    In questlua_pc.cpp adaugă :
    COD:
    Select All
    #include "map_manager.h"
    Cauta :
    COD:
    Select All
    ALUA(pc_get_name)
    Adaugă inainte :
    COD:
    Select All
    ALUA(pc_is_player_ip_in_map)
    {
        
    LPCHARACTER ch CQuestManager::instance().GetCurrentCharacterPtr();
        
    lua_pushboolean(LMapManager::instance().IsPlayerIPInMap(ch));
        return 
    1;
    }
    Cauta :
    COD:
    Select All
    "getname",        pc_get_name        },
    Adaugă inainte :
    COD:
    Select All
    "is_pc_ip_in_map",        pc_is_player_ip_in_map    },
    Exemplu de utilizare :
    COD:
    Select All
    when login with pc.is_pc_ip_in_map() begin
        chat
    ("En este mapa solo puede entrar 1 personaje por IP, serás transportado en 5 segundos.")
        
    warp_to_village()
    end
    MAKEFILE :
    COD:
    Select All
    #Busca OXEvent.cpp
    #Agrega despues
    map_manager.cpp

    Sursa: Trebuie să te loghezi pentru a vedea link-ul
     

Distribuie pagina asta