Codefox icon

Untitled

Codefox | PRO | 10/31/13 11:37:28 AM UTC | 0 ⭐ | 756 👁️ | Never ⏰ | []
C++ |

8.04 KB

|

None

|

0 👍

/

0 👎

 
 
class CLevelBot
{
    CTeleport m_teleport_engine;
    uint m_player_vid;
    uint m_current_time;
    uint m_dead_time;
    array <uint> m_enemies;
    array <uint> m_pots;
    uint m_last_attack;
    int m_start_x;
    int m_start_y;
    int m_point_x;
    int m_point_y;
    int m_cur_tp;
    int m_max_tp;
    int m_tp_percent;
    bool m_enabled;
    bool m_player_at_point;
    bool m_cur_tp_set;
    bool m_was_dead;
    bool m_first_start;
    
    array<item@> m_items;
    uint m_pick_vid;
    
    CLevelBot()
    {
        this.m_enabled = false;
        this.m_start_x = 0;
        this.m_start_y = 0;
        this.m_point_x = 0;
        this.m_point_y = 0;
        this.m_last_attack = 0;
        this.m_dead_time = 0;
        this.m_current_time = 0;
        this.m_player_vid = 0;
        this.m_player_at_point = false;
        this.m_cur_tp_set = false;
        this.m_was_dead = false;
        this.m_first_start = true;
        
        this.m_pick_vid = 0;
        
        this.m_cur_tp = 0;
        this.m_max_tp = 0;
        this.m_tp_percent = 0;
        
        for(int i = 0; i < 90; i++)
        {
            this.m_pots.insertLast(0);
        }
        
    }
    
    void Enable(bool enabled)
    {
        this.m_enabled = enabled;
        if(enabled)
            SYSLOG("Level Bot enabled!");
        else
            SYSLOG("Level Bot disabled!");
    };
    
    void SetPlayerVID(uint vid)
    {
        this.m_player_vid = vid;
        this.m_start_x = find_entity(vid).get_x();
        this.m_start_y = find_entity(vid).get_y();
        this.m_teleport_engine.set_vid(vid);
    };
    
    void OnStartup()
    {
        if(cfg.get_string("bot.type","") == "levelbot")
            this.Enable(true);
    };
    
    void OnCleanup()
    {
    };
    
    void SetLevelPos(entity@ p)
    {
        int level = p.get_level();
        int map = maps.GetMapByPos(p.get_x(), p.get_y());
        int point_x = 0;
        int point_y = 0;
        
        for(uint i = 0; i < cfg.get_int("point." + map + ".PointCount", 0); i++)
        {
            
            if(cfg.get_int("point." + map+ "." + i + ".Type", 0) == 3 
                && level >= cfg.get_int("point." + map + "." + i + ".LvMin", 0)
                && level <= cfg.get_int("point." + map + "." + i + ".LvMax", 0))
            {
                point_x = ((cfg.get_int("point." + map + "." + i + ".PosX", 0)*100) + maps.m_map_base[map][0]);
                point_y = ((cfg.get_int("point." + map + "." + i + ".PosY", 0)*100) + maps.m_map_base[map][1]);
                
                //DEVLOG("LEVELPOINT FOUND! X: " + point_x + " Y: " + point_y + " Lv: " + level);
                //DEVLOG("this.m_first_start: " + this.m_first_start + " this.m_player_at_point: " + this.m_player_at_point);
 
                if((abs(p.get_x() - this.m_point_x) < 10000 && abs(p.get_y() - this.m_point_y) < 10000) && !this.m_first_start)
                    this.m_player_at_point = true;
                else if((point_x != 0 && point_y != 0))
                {
                    this.m_point_x = point_x;
                    this.m_point_y = point_y;
                    this.m_teleport_engine.set_destination(this.m_point_x, this.m_point_y);
                    DEVLOG("Setting destination..");
                    this.m_player_at_point = false;
                    this.m_first_start = false;
                } else {
                    this.m_player_at_point = true;
                }
            };
        };              
    };
    
    void OnTick(uint current)
    {
        if(!this.m_enabled || this.m_player_vid == 0)
            return;
            
        entity@ p = find_entity(this.m_player_vid);
        SetLevelPos(p);
        
        if(!this.m_teleport_engine.is_teleporting() && !UsePotions() && !this.m_first_start) {
            
            if(this.m_was_dead)
                if(this.m_tp_percent < 80)
                    return;
            
            this.m_was_dead = false;
            
            PickItems(p);
            
            if(current - this.m_last_attack >= 125 && this.m_player_at_point) {
                uint hit_count = 0;
                for(uint x = 0; x < get_entity_count(); ++x) {
                    entity@ e = get_entity(x);
                    if(e.get_type() != entity_mob)
                        continue;
                    if(this.m_enemies.find(e.get_vid())==-1)
                        continue;
                    
                    int64 moblevel = parseInt(mob_proto_get(e.get_race(),"level"));
                    if(moblevel > p.get_level()+5)
                        continue;
                    
                    uint distx = abs(p.get_x()-e.get_x());
                    uint disty = abs(p.get_y()-e.get_y());
                    uint distance = sqrt((distx*distx)+(disty*disty));
                    
                    if(distance > 500)
                        continue;
                    
                    net.send_attack(0,e.get_vid());
                    ++hit_count;
                    this.m_last_attack = current;
                }
 
                if(hit_count == 0 && this.m_player_at_point) {
                    for(uint x = 0; x < get_entity_count(); ++x) {
                        entity@ e = get_entity(x);
                        if(e.get_type() != entity_mob)
                            continue;
                        if(this.m_enemies.find(e.get_vid())==-1)
                            continue;
                    
                        int64 moblevel = parseInt(mob_proto_get(e.get_race(),"level"));
                        if(moblevel > p.get_level()+3)
                            continue;
 
                        uint distance_x = abs(e.get_x() - this.m_point_x);
                        uint distance_y = abs(e.get_y() - this.m_point_y);
                        uint distance = sqrt((distance_x*distance_x)+(distance_y*distance_y));
 
                        if(distance < 10000) {
                            this.m_teleport_engine.set_destination(e.get_x(),e.get_y());
                            break;
                        }
                    }
                    
                    this.m_last_attack = 0;
                }
            }
        }
        
        this.m_teleport_engine.tick();
        this.m_current_time = current;
    };
 
    void OnPointChange(uint vid, uint type, int amount, int value)
    {
        if(type >= 83886090 && type <= 83886999) // HP
        {
            this.m_cur_tp = value;
            this.m_cur_tp_set = true;
        }
        
        if(!this.m_cur_tp_set)
            this.m_cur_tp = this.m_max_tp;
        
        if(this.m_max_tp != 0 && this.m_cur_tp != 0)    
            this.m_tp_percent = ceil((this.m_cur_tp*100)/this.m_max_tp);
        
        DEVLOG("tp_percent: " + this.m_tp_percent + ", cur_tp: " + this.m_cur_tp + ", max_tp: " + this.m_max_tp);
        DEVLOG("type: " + type + ", amount: " + amount + ", value: " + value);
    };
    
    void OnItemSet(uint8 pos, uint vnum, uint8 count, uint flags)
    {
        DEVLOG("ITEM SET - " + pos + ", " + vnum + ", " + count + ", " + flags);
        
        if(vnum == 27001 || vnum == 27002 || vnum == 27003)
            this.m_pots[pos] = count;
    };
    
    bool UsePotions()
    {
        if(this.m_tp_percent < 70 && this.m_max_tp > 10 && this.m_cur_tp_set)
        {
            for(int i = 0; i < 90; i++)
                if(this.m_pots[i] > 0)
                    net.send_item_use(i);
        }
        return false;
    };
    
    void PickItems(entity@ p)
    {
        int old_x = p.get_x();
        int old_y = p.get_y();
        
        if(this.m_player_at_point && !this.m_teleport_engine.is_teleporting())
        {
        
            if(this.m_pick_vid == 0 && this.m_items.length() > 0 && !this.m_teleport_engine.is_teleporting()) {
                item@ i = this.m_items[0];
 
                this.m_pick_vid = i.get_vid();
                this.m_teleport_engine.set_destination(i.get_x(),i.get_y());
            }
 
            if(this.m_pick_vid != 0 && !this.m_teleport_engine.is_teleporting()) {
            
                item@ i = find_item(this.m_pick_vid);
                
                if(i.get_vnum() == 27001 || i.get_vnum() == 27002 || i.get_vnum() == 27003 || i.get_vnum() == 1)
                    net.send_pick_up(this.m_pick_vid);  
                        
                int idx = this.m_items.find(i);
                if(idx != -1)
                    this.m_items.removeAt(idx);
                        
                this.m_pick_vid = 0;
            }
        }
    
    };
    
    void OnCharacterAdd(entity@ e)
    {
        this.m_enemies.insertLast(e.get_vid());
    };
    
    void OnCharacterDelete(entity@ e)
    {
        int idx = this.m_enemies.find(e.get_vid());
        if(idx != -1)
            this.m_enemies.removeAt(idx);
    };
    void OnCharacterDead(entity@ e)
    {
        if(e.get_vid() == this.m_player_vid) {
            while(this.m_enemies.length() > 0)
                this.m_enemies.removeAt(0);
            this.m_player_vid = 0;
            this.m_teleport_engine.set_vid(0);
            this.m_was_dead = true;
            net.connect(net.get_ip(),net.get_port());
        }
        int idx = this.m_enemies.find(e.get_vid());
        if(idx != -1)
            this.m_enemies.removeAt(idx);
    };
    
    void OnCharacterUpdate(entity@ e)
    {
    };
    
    void OnWarp(int x, int y, string addr, uint port)
    {
    };
    
    void OnItemGroundAdd(item@ i)
    {
        this.m_items.insertLast(i);
    };
 
    void OnItemGroundDelete(item@ i)
    {
        int idx = this.m_items.find(i);
        if(i.get_vid() == this.m_pick_vid)
            this.m_pick_vid = 0;
 
        if(idx != -1)
            this.m_items.removeAt(idx);
    };
 
    void OnItemOwnership(item@ i)
    {
        int idx = this.m_items.find(i);
        if(i.get_owner() == this.m_player_vid || i.get_owner() == 0) {
            if(idx == -1)
                this.m_items.insertLast(i);
        } else {
            if(i.get_vid() == this.m_pick_vid)
                this.m_pick_vid = 0;
 
            if(idx != -1)
                this.m_items.removeAt(idx);
        }
    };
    
    void OnPointsSet(array<int> pts)
    {
        if(pts[6] != 0)
            this.m_max_tp = pts[6];
    };
};

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎