diff --git a/server/bin/gmtool.sh b/server/bin/gmtool.sh index d3050ab..f7716be 100755 --- a/server/bin/gmtool.sh +++ b/server/bin/gmtool.sh @@ -1,5 +1,5 @@ #!/bin/bash cd ../tools/robot/virtualclient -python robot3.py ws://192.168.100.21:7101 hao1069 hao1069 $1 +python robot.py ws://192.168.100.21:7101 hao1069 hao1069 $1 diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index 191d472..22211ed 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -102,6 +102,7 @@ void AndroidAI::DoMove() } break; } + hum->room->grid_service.MoveHuman(hum); } } } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index bd401c6..9a31937 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -715,7 +715,7 @@ bool Human::HasNoDownedTeammate() { if (team_members) { for (auto& hum : *team_members) { - if (hum != this && (!hum->dead || !hum->downed)) { + if (hum != this && !hum->dead && !hum->downed) { return true; } } diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index f016656..0f6d885 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -209,7 +209,6 @@ private: } { - int building_id = 0; for (auto& meta : building_meta_list) { MetaData::Building& item = a8::FastAppend(building_list); item.i = &meta; diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index d3cdf2c..81b8c72 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -89,7 +89,7 @@ void Obstacle::FillMFObjectFull(cs::MFObjectFull* full_data) p->set_obstacle_id(meta->i->thing_id()); p->set_health(health); p->set_dead(dead); - p->set_dead_at_thisframe(dead ? dead_frameno < room->frame_no : false); + p->set_dead_at_thisframe(dead ? dead_frameno <= room->frame_no : false); p->set_is_door(is_door); if (is_door) { diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 1232b9a..c4f3086 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -53,6 +53,9 @@ void Player::Update(int delta_time) if (shot_start || shot_hold) { UpdateShot(); } + if (drop_weapon) { + UpdateDropWeapon(); + } if (interaction_objids.size() > 0) { ProcInteraction(); } @@ -62,9 +65,6 @@ void Player::Update(int delta_time) if (select_weapon) { UpdateSelectWeapon(); } - if (drop_weapon) { - UpdateDropWeapon(); - } if (use_scope) { UpdateUseScope(); } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index f7d7d7b..2c53a55 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -497,17 +497,17 @@ void Room::CreateLoot(int equip_id, Vector2D pos, int count, int equip_lv) entity->pos = pos; #if 1 { - if (entity->pos.x > MAP_WIDTH) { - entity->pos.x = MAP_WIDTH; + if (entity->pos.x >= MAP_WIDTH) { + entity->pos.x = MAP_WIDTH - 1; } - if (entity->pos.x <= 0.001f) { - entity->pos.x = 0.0f; + if (entity->pos.x < 1.0f) { + entity->pos.x = 1.0f; } - if (entity->pos.y > MAP_HEIGHT) { - entity->pos.y = MAP_HEIGHT; + if (entity->pos.y >= MAP_HEIGHT) { + entity->pos.y = MAP_HEIGHT - 1; } - if (entity->pos.y < 0.0001f) { - entity->pos.y = 0.0f; + if (entity->pos.y < 1.0f) { + entity->pos.y = 1.0f; } } #endif diff --git a/server/tools/robot/virtualclient/bat/robot1.bat b/server/tools/robot/virtualclient/bat/robot1.bat deleted file mode 100644 index 8037e0d..0000000 --- a/server/tools/robot/virtualclient/bat/robot1.bat +++ /dev/null @@ -1,2 +0,0 @@ -cd .. -start python robot.py ws://118.31.73.76:82 test0001 123456 diff --git a/server/tools/robot/virtualclient/bat/robot2.bat b/server/tools/robot/virtualclient/bat/robot2.bat deleted file mode 100644 index 8363860..0000000 --- a/server/tools/robot/virtualclient/bat/robot2.bat +++ /dev/null @@ -1,2 +0,0 @@ -cd .. -start python robot.py ws://192.144.140.87:8999 test0002 123456 diff --git a/server/tools/robot/virtualclient/client.py b/server/tools/robot/virtualclient/client.py deleted file mode 100644 index 51c6177..0000000 --- a/server/tools/robot/virtualclient/client.py +++ /dev/null @@ -1,110 +0,0 @@ -import websocket -import sys -import time - -import vs_proto_pb2 -import vs_msgid_pb2 - -try: - import thread -except ImportError: - import _thread as thread -import time - -def on_open (ws): - print 'on open' - -class Client: - - def __init__(self, accountid, user_profile, remote_ip, remote_port): - self._recv_buf = bytearray() - self._accountid = accountid - self._sessionid = '' - self._user_profile = user_profile - self._ws = websocket.WebSocketApp ("ws://127.0.0.1:" + sys.argv[1], - on_message = self.onMessage, - on_error = self.onError, - on_close = self.onClose) -# self._ws.on_open = on_open - self._ws.on_open = self.onOpen - - def sendMsg(self, msgid, msg): - PACK_SIGN = 0xAABBCCAA - enmsg = bytearray(msg.SerializeToString()) - pktlen_str = chr(len(enmsg) & 0xFF) + chr(len(enmsg) >> 8 & 0xFF) - msgid_str = chr(msgid & 0xFF) + chr(msgid >> 8 & 0xFF) - sign_str = chr(PACK_SIGN & 0xFF) + chr(PACK_SIGN >> 8 & 0xFF) + \ - chr(PACK_SIGN >> 16 & 0xFF) + chr(PACK_SIGN >> 24 & 0xFF) - buff = pktlen_str + msgid_str + sign_str + enmsg - self._ws.send (buff, 2) - - def parsePacket(self): - while len(self._recv_buf) >= 8: - pktlen = self._recv_buf[0] + (self._recv_buf[1] << 8) - msgid = self._recv_buf[2] + (self._recv_buf[3] << 8) - magiccode = self._recv_buf[4] + \ - (self._recv_buf[5] << 8) + \ - (self._recv_buf[6] << 16) + \ - (self._recv_buf[7] << 24) - print 'pkglen:', pktlen, ' msgid:', msgid, ' magiccode:', magiccode - if len(self._recv_buf) >= 8 + pktlen: - msgbody = self._recv_buf[8 : 8 + pktlen] - self.onUserPacket(msgid, msgbody) - self._recv_buf = self._recv_buf[8 + pktlen:] - - def onUserPacket(self): - try: - msgid_class_hash = { - vs_msgid_pb2._SMLogin: vs_proto_pb2.SMLogin, - vs_msgid_pb2._SMCreateRoom: vs_proto_pb2.SMCreateRoom - } - if not msgid_class_hash.has_key(msgid): - print 'not found msgclass:', msgid - return - msg = msgid_class_hash[msgid]() - ret = msg.ParseFromString(str(msgbody)) - print str(msg) - except Exception, e: - print 'on_user_packet', e - - def onMessage(self, message): - data = bytearray(message) - self._recv_buf += data - print 'on_message ', len(recv_buf) - self._ws.parsePacket(); - - def onError(self, error): - print error - - def onClose(self): - print 'onclose' - - def onOpen(self): - print 'ok' - def run (*args): - msg = vs_proto_pb2.CMLogin() - msg.account_id = '1234567' - msg.session_id = 'dsjfkasjkfljfsklfd' - print msg - sendmsg(ws, vs_msgid_pb2._CMLogin, msg) - testCMCreateRoom(ws) - while True: - testSendRoomEvent(ws) - time.sleep(10) - - time.sleep(500) - ws.close () - print ("thread terminating...") - thread.start_new_thread (run, ()) - - def runForever(self): - self._ws.run_forever() - -if __name__ == "__main__": - client = Client( - '123456', - '', - '127.0.0.1', - 82 - ) - client.runForever() diff --git a/server/tools/robot/virtualclient/new_robot.py b/server/tools/robot/virtualclient/new_robot.py index e6165ad..cda75e1 100644 --- a/server/tools/robot/virtualclient/new_robot.py +++ b/server/tools/robot/virtualclient/new_robot.py @@ -21,7 +21,7 @@ def main(): help = "account info") (options, args) = parser.parse_args() - ws_url = args if args else 'ws://127.0.0.1:83/websocket' + ws_url = args if args else 'ws://192.168.100.21:7101/websocket' for account in options.accounts.split(','): ioloop.IOLoop.current().spawn_callback(createVirtualClient, account, ws_url) diff --git a/server/tools/robot/virtualclient/robot.bat b/server/tools/robot/virtualclient/robot.bat deleted file mode 100644 index 5ba8b65..0000000 --- a/server/tools/robot/virtualclient/robot.bat +++ /dev/null @@ -1,9 +0,0 @@ -protoc.exe --proto_path=../../protobuild --python_out=. ../../protobuild/kingsomevs.proto -protoc.exe --proto_path=../../protobuild --python_out=. ../../protobuild/messages.proto -rename kingsomevs_pb2.py vs_proto_pb2.py -rename messages_pb2.py vs_msgid_pb2.py - -start python robot.py ws://118.31.73.76:82 test0001 123456 -start python robot.py ws://118.31.73.76:82 test0002 123456 -start python robot.py ws://118.31.73.76:82 test0003 123456 -start python robot.py ws://118.31.73.76:82 test0004 123456 \ No newline at end of file diff --git a/server/tools/robot/virtualclient/robot.py b/server/tools/robot/virtualclient/robot.py index 7f112b3..ba6ede3 100644 --- a/server/tools/robot/virtualclient/robot.py +++ b/server/tools/robot/virtualclient/robot.py @@ -2,7 +2,9 @@ import websocket import sys import ssl +import json import datetime +import urllib.request import cs_proto_pb2 import cs_msgid_pb2 @@ -16,8 +18,22 @@ except ImportError: import _thread as thread import time +def getSession(account_id): + url = 'https://login-test.kingsome.cn/webapp/index.php?c=Login&a=auth&' + params = { + 'openid': sys.argv[2], + 'token': sys.argv[2], + 'gameid': 1008, + 'channel': '6000' + } + real_url = url + urllib.parse.urlencode(params) + print(real_url) + req = urllib.request.Request(real_url) + data = urllib.request.urlopen(req).read() + return json.loads(data.decode('utf-8'))['session_id'] + def inputCommand(ws): - cmdline= raw_input('') + cmdline= input('') idx = cmdline.find(' ') if idx <= 0: cmdline += '()' @@ -41,36 +57,38 @@ def getSMMsg(sm_msgid): #g_remote_ip = "ws://127.0.0.1:" + sys.argv[1] g_remote_ip = sys.argv[1] -g_account_id = sys.argv[2] +g_account_id = '6000_1008_' + sys.argv[2] g_session_id = sys.argv[3] +g_server_id = sys.argv[4] g_seqid = 1000 recv_buf = bytearray() def sendMsg(ws, msg): - print datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')) global g_seqid ++g_seqid msgid = eval('cs_msgid_pb2._' + msg.DESCRIPTOR.name) - PACK_SIGN = 'KS' - enmsg = bytearray(msg.SerializeToString()) - pktlen_str = chr(len(enmsg) & 0xFF) + chr(len(enmsg) >> 8 & 0xFF) - msgid_str = chr(msgid & 0xFF) + chr(msgid >> 8 & 0xFF) - seqid_str = chr(g_seqid & 0xFF) + chr(g_seqid >> 8 & 0xFF) + \ - chr(g_seqid >> 16 & 0xFF) + chr(g_seqid >> 24 & 0xFF) - sign_str = PACK_SIGN - reserved_str = chr(0) + chr(0) + + enmsg = msg.SerializeToString() + pktlen_str = bytes([(len(enmsg) & 0xFF) , (len(enmsg) >> 8 & 0xFF)]) + msgid_str = bytes([(msgid & 0xFF) , (msgid >> 8 & 0xFF)]) + seqid_str = bytes([(g_seqid & 0xFF) , (g_seqid >> 8 & 0xFF) , \ + (g_seqid >> 16 & 0xFF) , (g_seqid >> 24 & 0xFF)]) + sign_str = bytes([ord('K'), ord('S')]) + reserved_str = bytes([0, 0]) buff = pktlen_str + msgid_str + seqid_str + sign_str + reserved_str + enmsg + ws.send (buff, 2) - print time.time(), time.strftime('[%H:%M:%S]'), msg.DESCRIPTOR.name + '{' - print str(msg), - print '}' - print '' + print(time.time(), time.strftime('[%H:%M:%S]'), msg.DESCRIPTOR.name + '{') + print(str(msg),) + print('}') + print('') def onMessage(ws, message): global recv_buf - print 'onMessage', len(message) + print('onMessage', len(message)) data = bytearray(message) recv_buf += data parserPacket(ws) @@ -93,18 +111,16 @@ def parserPacket(ws): def onUserPacket(ws, msgid, msgbody): try: - print datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')) msg = getSMMsg(msgid) - ret = msg.ParseFromString(str(msgbody)) - print len(msgbody) - print time.time(), time.strftime('[%H:%M:%S]'), msg.DESCRIPTOR.name + '{' - print str(msg), - print '}' - print '' - if msgid == cs_msgid_pb2._SMTestAward: - print msg.default_123456 - except Exception, e: - print 'onUserPacket', e + ret = msg.ParseFromString(msgbody) + print(len(msgbody)) + print(time.time(), time.strftime('[%H:%M:%S]'), msg.DESCRIPTOR.name + '{') + print(str(msg),) + print('}') + print('') + except Exception as e: + print('onUserPacket', e) def onError (ws, error): print (error) @@ -113,17 +129,17 @@ def onClose (ws): print ("### closed ###") def opOpen (ws): - print 'opOpen', time.time() + print('opOpen', time.time()) def run (*args): global g_remote_ip global g_account_id global g_session_id - msg = cs_proto_pb2.CMLogin() - msg.server_id = 1 + global g_server_id + msg = cs_proto_pb2.CMJoin() + msg.server_id = int(g_server_id) msg.account_id = g_account_id - msg.session_id = g_session_id - msg.device_id = '123456' - print msg.DESCRIPTOR.name, 'zzzzz' + msg.name = "测试" + print(msg.DESCRIPTOR.name, 'zzzzz') sendMsg(ws, msg) while True: inputCommand(ws) @@ -132,8 +148,8 @@ def opOpen (ws): print ("thread terminating...") thread.start_new_thread (run, ()) -print time.time() -print g_remote_ip +print(time.time()) +print(g_remote_ip) if __name__ == "__main__": websocket.enableTrace(True) diff --git a/server/tools/robot/virtualclient/robot1.sh b/server/tools/robot/virtualclient/robot1.sh deleted file mode 100755 index 3e19d7b..0000000 --- a/server/tools/robot/virtualclient/robot1.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -python robot.py ws://127.0.0.1:8999 test0001 123456 diff --git a/server/tools/robot/virtualclient/robot2.bat b/server/tools/robot/virtualclient/robot2.bat deleted file mode 100644 index 23d44af..0000000 --- a/server/tools/robot/virtualclient/robot2.bat +++ /dev/null @@ -1,9 +0,0 @@ -protoc.exe --proto_path=../../protobuild --python_out=. ../../protobuild/kingsomevs.proto -protoc.exe --proto_path=../../protobuild --python_out=. ../../protobuild/messages.proto -rename kingsomevs_pb2.py vs_proto_pb2.py -rename messages_pb2.py vs_msgid_pb2.py - -rem start python robot.py wss://matchvs-test.kingsome.cn/websocket test00010 123456 - start python robot.py wss://matchvs-test.kingsome.cn/websocket test0001 123456 - start python robot.py wss://matchvs-test.kingsome.cn/websocket test0003 123456 - start python robot.py wss://matchvs-test.kingsome.cn/websocket test0004 123456 \ No newline at end of file diff --git a/server/tools/robot/virtualclient/robot2.sh b/server/tools/robot/virtualclient/robot2.sh deleted file mode 100755 index 5038ecd..0000000 --- a/server/tools/robot/virtualclient/robot2.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -python robot.py ws://127.0.0.1:8999 test0002 123456 diff --git a/server/tools/robot/virtualclient/robot3.py b/server/tools/robot/virtualclient/robot3.py deleted file mode 100644 index ba6ede3..0000000 --- a/server/tools/robot/virtualclient/robot3.py +++ /dev/null @@ -1,162 +0,0 @@ -# -*- coding: utf-8 -*- -import websocket -import sys -import ssl -import json -import datetime -import urllib.request - -import cs_proto_pb2 -import cs_msgid_pb2 - -#from google.protobuf import json_format -import pprint - -try: - import thread -except ImportError: - import _thread as thread -import time - -def getSession(account_id): - url = 'https://login-test.kingsome.cn/webapp/index.php?c=Login&a=auth&' - params = { - 'openid': sys.argv[2], - 'token': sys.argv[2], - 'gameid': 1008, - 'channel': '6000' - } - real_url = url + urllib.parse.urlencode(params) - print(real_url) - req = urllib.request.Request(real_url) - data = urllib.request.urlopen(req).read() - return json.loads(data.decode('utf-8'))['session_id'] - -def inputCommand(ws): - cmdline= input('') - idx = cmdline.find(' ') - if idx <= 0: - cmdline += '()' - else: - cmdline = cmdline[:idx] + '(' + cmdline[idx + 1:] + ')' - msg = eval('cs_proto_pb2.' + cmdline) - sendMsg(ws, msg) - inputCommand(ws) - -def getSMMsgEnum(sm_msgid): - sm_e = cs_msgid_pb2._SMMESSAGEID_E - for e in sm_e.values: - if e.number == sm_msgid: - return e - return None - -def getSMMsg(sm_msgid): - sm_e = getSMMsgEnum(sm_msgid) - msg = eval('cs_proto_pb2.' + sm_e.name[1:] + '()') - return msg - -#g_remote_ip = "ws://127.0.0.1:" + sys.argv[1] -g_remote_ip = sys.argv[1] -g_account_id = '6000_1008_' + sys.argv[2] -g_session_id = sys.argv[3] -g_server_id = sys.argv[4] -g_seqid = 1000 - -recv_buf = bytearray() - -def sendMsg(ws, msg): - print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')) - global g_seqid - ++g_seqid - msgid = eval('cs_msgid_pb2._' + msg.DESCRIPTOR.name) - - enmsg = msg.SerializeToString() - pktlen_str = bytes([(len(enmsg) & 0xFF) , (len(enmsg) >> 8 & 0xFF)]) - msgid_str = bytes([(msgid & 0xFF) , (msgid >> 8 & 0xFF)]) - seqid_str = bytes([(g_seqid & 0xFF) , (g_seqid >> 8 & 0xFF) , \ - (g_seqid >> 16 & 0xFF) , (g_seqid >> 24 & 0xFF)]) - sign_str = bytes([ord('K'), ord('S')]) - reserved_str = bytes([0, 0]) - buff = pktlen_str + msgid_str + seqid_str + sign_str + reserved_str + enmsg - - ws.send (buff, 2) - print(time.time(), time.strftime('[%H:%M:%S]'), msg.DESCRIPTOR.name + '{') - print(str(msg),) - print('}') - print('') - -def onMessage(ws, message): - global recv_buf - - print('onMessage', len(message)) - data = bytearray(message) - recv_buf += data - parserPacket(ws) - -def parserPacket(ws): - global recv_buf - while len(recv_buf) >= 8: - pktlen = recv_buf[0] + (recv_buf[1] << 8) - msgid = recv_buf[2] + (recv_buf[3] << 8) - seqid = recv_buf[4] + \ - (recv_buf[5] << 8) + \ - (recv_buf[6] << 16) + \ - (recv_buf[7] << 24) - sign = recv_buf[8] + (recv_buf[9] << 8) - resv = recv_buf[10] + (recv_buf[11] << 8) - if len(recv_buf) >= 12 + pktlen: - msgbody = recv_buf[12 : 12 + pktlen] - onUserPacket(ws, msgid, msgbody) - recv_buf = recv_buf[12 + pktlen:] - -def onUserPacket(ws, msgid, msgbody): - try: - print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')) - msg = getSMMsg(msgid) - ret = msg.ParseFromString(msgbody) - print(len(msgbody)) - print(time.time(), time.strftime('[%H:%M:%S]'), msg.DESCRIPTOR.name + '{') - print(str(msg),) - print('}') - print('') - except Exception as e: - print('onUserPacket', e) - -def onError (ws, error): - print (error) - -def onClose (ws): - print ("### closed ###") - -def opOpen (ws): - print('opOpen', time.time()) - def run (*args): - global g_remote_ip - global g_account_id - global g_session_id - global g_server_id - msg = cs_proto_pb2.CMJoin() - msg.server_id = int(g_server_id) - msg.account_id = g_account_id - msg.name = "测试" - print(msg.DESCRIPTOR.name, 'zzzzz') - sendMsg(ws, msg) - while True: - inputCommand(ws) - time.sleep(500) - ws.close () - print ("thread terminating...") - thread.start_new_thread (run, ()) - -print(time.time()) -print(g_remote_ip) - -if __name__ == "__main__": - websocket.enableTrace(True) - ws = websocket.WebSocketApp (g_remote_ip, - on_message = onMessage, - on_error = onError, - on_close = onClose - ) - ws.on_open = opOpen - ws.run_forever () diff --git a/server/tools/robot/virtualclient/robot3.sh b/server/tools/robot/virtualclient/robot3.sh deleted file mode 100755 index cc4d2fd..0000000 --- a/server/tools/robot/virtualclient/robot3.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -python robot.py ws://127.0.0.1:8999 test0003 123456 diff --git a/server/tools/robot/virtualclient/robot4.sh b/server/tools/robot/virtualclient/robot4.sh deleted file mode 100755 index 676901a..0000000 --- a/server/tools/robot/virtualclient/robot4.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -python robot.py ws://127.0.0.1:8999 test0004 123456 diff --git a/server/tools/robot/virtualclient/virtualclient.py b/server/tools/robot/virtualclient/virtualclient.py index e4ccc5e..94e02e3 100644 --- a/server/tools/robot/virtualclient/virtualclient.py +++ b/server/tools/robot/virtualclient/virtualclient.py @@ -57,11 +57,9 @@ class VirtualClient(object): print('') def sendLogin(self, conn): - msg = cs_proto_pb2.CMLogin() - msg.server_id = 1 + msg = cs_proto_pb2.CMJoin() + msg.server_id = 2 msg.account_id = self.account - msg.session_id = '12342' - msg.device_id = '123456' self.sendMsg(conn, msg) def parsePacket(self, conn, recv_buf): diff --git a/third_party/a8engine b/third_party/a8engine index fc99a36..ff8c006 160000 --- a/third_party/a8engine +++ b/third_party/a8engine @@ -1 +1 @@ -Subproject commit fc99a3615db9aabc1a77489e069a4e6af26d50d5 +Subproject commit ff8c00652d5367595c4adee8f95306ae1a46236b diff --git a/third_party/framework b/third_party/framework index 4e612f4..fd72ea5 160000 --- a/third_party/framework +++ b/third_party/framework @@ -1 +1 @@ -Subproject commit 4e612f46cedb1723496662ddeb32c174944041b4 +Subproject commit fd72ea56059dc8545920e33d436dad5a1d3700fb diff --git a/third_party/tools b/third_party/tools index 23026cb..3196cd6 160000 --- a/third_party/tools +++ b/third_party/tools @@ -1 +1 @@ -Subproject commit 23026cb4e2ec630f6d421f742b65de6752a57b9d +Subproject commit 3196cd6696239a11b60f9730af0bad1f73ab0e5d