This repository has been archived by the owner on Nov 9, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
walkto.py
110 lines (80 loc) · 2.33 KB
/
walkto.py
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
import time
import net.mapserv as mapserv
import net.charserv as charserv
import logicmanager
from net.common import distance
from utils import extends
__all__ = [ 'unreachable_ids', 'walkto_and_action', 'target', 'state' ]
_times = {
'arrival_time': 0,
'walk_request_time': 0,
}
unreachable_ids = set()
target = None
action = ''
state = ''
def reset_walkto():
global state
global target
global action
state = ''
target = None
action = ''
def walkto_and_action(obj, action_, min_distance=1):
if obj.id in unreachable_ids:
return
global state
global target
global action
if state == 'waiting_confirmation':
return
target = obj
action = action_
pp = mapserv.player_pos
dist = distance(pp['x'], pp['y'], target.x, target.y)
if dist <= min_distance:
do_action(target, action)
else:
state = 'waiting_confirmation'
_times['walk_request_time'] = time.time()
mapserv.cmsg_player_change_dest(target.x, target.y)
def do_action(target, action):
if action == 'attack':
mapserv.cmsg_player_change_act(target.id, 7)
elif action == 'pickup':
mapserv.cmsg_item_pickup(target.id)
def walkto_logic(ts):
global state
if state == '':
return
elif state == 'waiting_confirmation':
if ts > _times['walk_request_time'] + 0.5:
unreachable_ids.add(target.id)
reset_walkto()
elif state == 'walking':
if ts >= _times['arrival_time']:
state = ''
do_action(target, action)
@extends('smsg_being_remove')
@extends('smsg_item_remove')
def target_removed(data):
unreachable_ids.discard(data.id)
if target and target.id == data.id:
reset_walkto()
if data.id == charserv.server.account:
reset_walkto()
@extends('smsg_player_warp')
def player_warp(data):
reset_walkto()
unreachable_ids.clear()
def calc_walk_time(distance, speed=0.15):
return 0.5 + speed * distance
@extends('smsg_walk_response')
def walk_response(data):
global state
if state == 'waiting_confirmation':
state = 'walking'
cp = data.coor_pair
dist = distance(cp.src_x, cp.src_y, cp.dst_x, cp.dst_y)
_times['arrival_time'] = time.time() + calc_walk_time(dist)
logicmanager.logic_manager.add_logic(walkto_logic)