forked from chaos-/rndWalker
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rndWalker.cs
120 lines (102 loc) · 3.91 KB
/
rndWalker.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
* Copyright (C) 2012 k_os <ben.at.hemio.de>, thefreeman, rolle3k
*
* This file is part of rndWalker.
*
* rndWalker 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 3 of the License, or
* (at your option) any later version.
*
* rndWalker 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 Foobar. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using D3;
using rndWalker.Common;
using rndWalker.Bots;
namespace rndWalker {
class rndWalker {
public static rndWalker Instance { get; set; }
private Thread thread;
private Logger logger;
private int gameCounter = 0;
public static int goldInit = 0;
public static int goldEarned = 0;
public static int timeElapsed = 0; // in seconds
private Bot bot;
private String botClass = "Sarkoth";
public rndWalker(string[] args) {
this.thread = new Thread(this.ExecutingThread);
this.logger = new Logger("rndWalker");
if (args != null)
this.botClass = args[0];
Type botType = Type.GetType("rndWalker.Bots." + this.botClass);
if (botType != null) {
bot = (Bot)Activator.CreateInstance(botType);
} else {
//TODO needfix: this will output the error and stop the bot from running, but the file is still loaded.
throw new Exception("Class rndWalker.Bots." + this.botClass + " not found. Exiting.");
}
Game.OnTickEvent += new TickEventHandler(Game_OnTickEvent);
}
private float oldX = 0, oldY = 0;
private float lastMoveTick = 0;
void Game_OnTickEvent(EventArgs e) {
if (Game.Ingame) {
if (Me.X != oldX || Me.Y != oldY) {
oldX = Me.X;
oldY = Me.Y;
lastMoveTick = System.Environment.TickCount;
}
if (System.Environment.TickCount - lastMoveTick > 15 * 1000 || (Me.WorldId != 0 && Me.Life == 0)) {
Console.WriteLine("I died! Exitting game");
Bot.ExitGame();
// hard reset
rndWalker.Instance.Restart();
}
} else {
lastMoveTick = System.Environment.TickCount;
}
}
public void Start() {
this.thread.Start();
}
public void Stop() {
this.thread.Abort();
}
public void Restart() {
this.thread.Abort();
this.thread = new Thread(this.ExecutingThread);
this.thread.Start();
}
private void ExecutingThread() {
Thread.Sleep(500);
while (true) {
Thread.Sleep(1000);
int start = System.Environment.TickCount;
try {
bot.Execute();
Thread.Sleep(5000);
} catch (System.Threading.ThreadAbortException) {
this.logger.Log("Bot thread was killed by watchdog.");
} catch (Exception e) {
this.logger.Log(e);
}
int diff = System.Environment.TickCount - start;
timeElapsed += diff / 1000;
Game.Print(string.Format("Run took {0} seconds. Total Runs: {1}", diff / 1000, (++gameCounter)));
Thread.Sleep(3000);
}
}
}
}