forked from hipstercat/giantsd
New opcodes, new logic, WIP instagib
This commit is contained in:
parent
892b7c8ad4
commit
6cb80fd276
190
dpnet/gamepackets.py
Normal file
190
dpnet/gamepackets.py
Normal file
@ -0,0 +1,190 @@
|
||||
from dpnet.packet import Packet
|
||||
|
||||
|
||||
class MSG_CHANGE_TEAM():
|
||||
def __init__(self, player, teamid: int, respawn: bool = True):
|
||||
self.player = player
|
||||
self.teamid = teamid
|
||||
self.respawn = respawn
|
||||
if self.teamid > 255:
|
||||
raise ValueError("Team ID must be < 256")
|
||||
|
||||
def to_packet(self):
|
||||
p = Packet()
|
||||
p.putByte(0x10) # opcode
|
||||
p.putByte(self.teamid)
|
||||
p.putULong(self.player.id)
|
||||
p.putByte(self.respawn)
|
||||
p.putByte(0x00) # end
|
||||
return p.getvalue()
|
||||
|
||||
|
||||
class MSG_MOVE_PLAYER():
|
||||
def __init__(self, player, direction, orientation):
|
||||
self.player = player
|
||||
self.direction = direction
|
||||
self.orientation = orientation
|
||||
|
||||
def to_packet(self):
|
||||
p = Packet()
|
||||
p.putByte(0x0f) # opcode
|
||||
p.putByte(0x12) # opcode2?
|
||||
p.putByte(0x00) # unknown
|
||||
p.putByte(0x00) # unknown
|
||||
p.putByte(0x00) # unknown
|
||||
p.putByte(self.player) # player index
|
||||
p.putShort(self.player.oid)
|
||||
p.putByte(0x00) # unknown
|
||||
p.putByte(0x00) # unknown
|
||||
p.putULong(self.player.model())
|
||||
p.putShort(self.direction)
|
||||
p.putShort(self.orientation)
|
||||
p.putByte(0x00) # end
|
||||
return p.getvalue()
|
||||
|
||||
|
||||
class MSG_PLAYER_PING():
|
||||
def __init__(self, player, ping):
|
||||
self.player = player
|
||||
self.ping = ping
|
||||
|
||||
def to_packet(self):
|
||||
p = Packet()
|
||||
p.putByte(0x2f) # opcode
|
||||
p.putByte(self.player.get_index())
|
||||
p.putByte(0x00) # unknown
|
||||
p.putByte(0x00) # unknown
|
||||
p.putShort(self.ping) # ping
|
||||
p.putByte(0x00) # end
|
||||
return p.getvalue()
|
||||
|
||||
|
||||
class MSG_SWITCH_WEAPON():
|
||||
def __init__(self, player, newweapon):
|
||||
self.player = player
|
||||
self.newweapon = newweapon
|
||||
|
||||
def to_packet(self):
|
||||
p = Packet()
|
||||
p.putByte(0x09) # opcode
|
||||
p.putByte(0x0f) # opcode2?
|
||||
p.putByte(0x00)
|
||||
p.putShort(0x0000)
|
||||
p.putByte(self.player.get_index())
|
||||
p.putShort(self.player.oid)
|
||||
p.putByte(0x00)
|
||||
p.putByte(0x0a)
|
||||
p.putULong(0x02)
|
||||
p.putByte(self.newweapon)
|
||||
p.putByte(0x00) # end
|
||||
return p.getvalue()
|
||||
|
||||
|
||||
class MSG_DROP_WEAPON():
|
||||
def __init__(self, player, oid, weapon, ammo):
|
||||
self.player = player
|
||||
self.weapon = weapon
|
||||
self.ammo = ammo
|
||||
self.oid = oid
|
||||
|
||||
def to_packet(self):
|
||||
p = Packet()
|
||||
p.putByte(0x20) # opcode
|
||||
# TODO: fixit
|
||||
p.putShort(0x012e) # can also be 1303 ... oid? my oid was 7 at the time
|
||||
#p.putShort(self.oid) # can also be 1303 ... oid? my oid was 7 at the time
|
||||
p.putShort(0x0000)
|
||||
p.putByte(self.player.get_index())
|
||||
p.putByte(0x38)
|
||||
p.putShort(0x0000)
|
||||
p.putFloat(self.player.x)
|
||||
p.putFloat(self.player.y)
|
||||
p.putFloat(self.player.z)
|
||||
p.putFloat(self.player.o)
|
||||
p.putFloat(0xc79e28c1) # ??
|
||||
p.putShort(0x0000)
|
||||
p.putULong(0x70410000)
|
||||
p.putByte(self.weapon)
|
||||
p.putByte(0x00)
|
||||
p.putULong(self.ammo)
|
||||
p.putShort(0x0000)
|
||||
p.putShort(0x0000)
|
||||
p.putByte(0x00)
|
||||
return p.getvalue()
|
||||
|
||||
class MSG_BULLET_EXPLOSION():
|
||||
def __init__(self, player, projectile, x, y, z):
|
||||
self.player = player
|
||||
self.projectile = projectile
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.z = z
|
||||
|
||||
def to_packet(self):
|
||||
p = Packet()
|
||||
p.putByte(0x09) # opcode
|
||||
p.putULong(0x1a)
|
||||
p.putByte(self.player.get_index())
|
||||
p.putShort(0x0631)
|
||||
p.putByte(0x00)
|
||||
p.putByte(0x03)
|
||||
p.putULong(0x4d)
|
||||
p.putFloat(self.x)
|
||||
p.putFloat(self.y)
|
||||
p.putFloat(self.z)
|
||||
p.putByte(0x00)
|
||||
return p.getvalue()
|
||||
|
||||
class MSG_PLAYER_DIE():
|
||||
def __init__(self, player, deathtype):
|
||||
self.player = player
|
||||
self.deathtype = deathtype
|
||||
|
||||
def to_packet(self):
|
||||
p = Packet()
|
||||
p.putByte(0x0b) # opcode
|
||||
p.putULong(0x1a)
|
||||
p.putByte(0x00)
|
||||
p.putByte(self.player.get_index())
|
||||
p.putByte(0x07)
|
||||
p.putShort(0x0000)
|
||||
p.putFloat(self.player.x)
|
||||
p.putFloat(self.player.y)
|
||||
p.putFloat(self.player.z)
|
||||
p.putFloat(self.player.o)
|
||||
p.putShort(0x1409) # oid?
|
||||
p.putByte(0x00)
|
||||
p.putShort(0x0000)
|
||||
p.putByte(self.player.get_index())
|
||||
p.putByte(0x07)
|
||||
p.putShort(0x0000)
|
||||
p.putByte(0x04)
|
||||
p.putByte(0x02)
|
||||
p.putShort(0x0000)
|
||||
p.putByte(0x00)
|
||||
p.putULong(self.deathtype)
|
||||
p.putByte(0x00)
|
||||
p.putByte(0x00) # end
|
||||
return p.getvalue()
|
||||
|
||||
|
||||
class MSG_PLAYER_TELEPORT():
|
||||
def __init__(self, player, newx, newy, newz, newo):
|
||||
self.player = player
|
||||
self.newx = newx
|
||||
self.newy = newy
|
||||
self.newz = newz
|
||||
self.newo = newo
|
||||
|
||||
def to_packet(self):
|
||||
p = Packet()
|
||||
p.putByte(0x13) # opcode
|
||||
p.putByte(self.player.get_index())
|
||||
p.putShort(self.player.oid)
|
||||
p.putByte(0x00)
|
||||
p.putFloat(0x00000000)
|
||||
p.putFloat(self.newx)
|
||||
p.putFloat(self.newy)
|
||||
p.putFloat(self.newz)
|
||||
p.putByte(0x00)
|
||||
return p.getvalue()
|
@ -20,6 +20,7 @@ from giants import APPLICATION_GUID
|
||||
import random
|
||||
from .DN_MSG_INTERNAL_SEND_CONNECT_INFO import DN_MSG_INTERNAl_SEND_CONNECT_INFO
|
||||
import asyncio
|
||||
from dpnet.gamepackets import *
|
||||
|
||||
logger = setup_logger(__name__)
|
||||
|
||||
@ -317,6 +318,10 @@ class Netserver(asyncio.DatagramProtocol):
|
||||
#logger.debug("OPCODE: %s VALUES: %s", struct.pack("<B", payload[0]).hex(), payload[1:].hex())
|
||||
#await self.server.broadcast_message("SENT OPCODE: %s VALUES: %s" % (struct.pack("<B", payload[0]).hex(), payload[1:].hex()))
|
||||
|
||||
event_player = self.get_player(session)
|
||||
if event_player:
|
||||
await self.server.broadcast_event("on_player_gamedata", player, payload)
|
||||
|
||||
if payload[0] == 0xc1:
|
||||
if not player or not player.phase == PlayerPhases.CFRAME_CONNECTED:
|
||||
logger.error("Fuck you. Playerphase was %s", player.phase)
|
||||
@ -451,9 +456,13 @@ class Netserver(asyncio.DatagramProtocol):
|
||||
return
|
||||
playerping = 1
|
||||
await player.session.send_gamedata(b"\x2f\x02\x00\x00" + struct.pack("<H", playerping) + b"\x00", acknow=False) # acknow=True
|
||||
for i in range(0x06):
|
||||
ack = (i % 2 == 0)
|
||||
await player.session.send_gamedata(b"\x04" + struct.pack("<B", i) + b"\x00\x00\x00\x00" + struct.pack("<B", i+0x07) + b"\x00\x00\x00",acknow=ack)
|
||||
|
||||
# TODO: Understand this vv SPAWN TREES vv
|
||||
#for i in range(0x06):
|
||||
# ack = (i % 2 == 0)
|
||||
# await player.session.send_gamedata(b"\x04" + struct.pack("<B", i) + b"\x00\x00\x00\x00" + struct.pack("<B", i+0x07) + b"\x00\x00\x00",acknow=ack)
|
||||
|
||||
await player.session.send_gamedata(b"\x04" + struct.pack("<B", 0) + b"\x00\x00\x00\x00" + struct.pack("<B", 0 + 0x07) + b"\x00\x00\x00")
|
||||
|
||||
# needed to avoid crash after Loading textures
|
||||
await player.session.send_gamedata(b"\x1a\xee\x02\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x83\x5f\xa4\x44\x00\xf9\xa3\xc2\x00\x00\x00\x00\xff\xff\x33\x43\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x9e\xdc\x07\x00", acknow=True)
|
||||
@ -500,9 +509,6 @@ class Netserver(asyncio.DatagramProtocol):
|
||||
# TODO: spawn all players except himself
|
||||
await self.spawn_all_players_except(player)
|
||||
|
||||
# TODO: spawn player in other sessions
|
||||
#await self.spawn_player_except(player)
|
||||
|
||||
# spawn Bot 3 as <id>
|
||||
objid = "75"
|
||||
plix = "01"
|
||||
@ -520,6 +526,8 @@ class Netserver(asyncio.DatagramProtocol):
|
||||
await player.session.send_gamedata(bytes.fromhex("090f000000015500000a02000000ff090f000000015500000a0200000001090f000000015500000a020000000300"), acknow=False)
|
||||
await player.session.send_gamedata(bytes.fromhex("2b0000000066fe954400"), acknow=False)
|
||||
|
||||
await self.server.broadcast_event("on_player_spawn", player)
|
||||
|
||||
player.phase = PlayerPhases.INGAME
|
||||
|
||||
elif payload[0] == 0x0a and payload[1] == 0x32:
|
||||
@ -553,10 +561,6 @@ class Netserver(asyncio.DatagramProtocol):
|
||||
player.z = playerz
|
||||
player.oid = objid
|
||||
player.o = orientation
|
||||
|
||||
#logger.info("%s is now at coords (%s,%s,%s)", player.name, player.x, player.y, player.z)
|
||||
if player.opts["debug"]:
|
||||
await player.send_message("%s is now at coords (%s,%s,%s, %s). Model: %s" % (player.name, player.x, player.y, player.z, player.o, model))
|
||||
await self.server.broadcast_gamedata_except(player, payload)
|
||||
|
||||
elif payload[0] == 0x3a:
|
||||
@ -638,29 +642,7 @@ class Netserver(asyncio.DatagramProtocol):
|
||||
if not direction == 0:
|
||||
if player.opts["debug"]:
|
||||
await player.send_message("ObjID %s went: %s, o: %s" % (objid, direction, orientation))
|
||||
await self.server.broadcast_gamedata_except(player, payload)
|
||||
elif payload[0] == 0x0a and payload[1] == 0x12:
|
||||
player = self.get_player(session)
|
||||
if not player:
|
||||
logger.debug("Fuck that no player wtf man")
|
||||
return
|
||||
p = Packet(payload)
|
||||
opcode = p.getByte()
|
||||
length = p.getByte() # length?
|
||||
unknown1 = p.getByte()
|
||||
unknown2 = p.getByte()
|
||||
unknown3 = p.getByte()
|
||||
playerindex = p.getByte()
|
||||
objid = p.getShort()
|
||||
unknown5 = p.getByte()
|
||||
unknown6 = p.getByte()
|
||||
model = p.getULong()
|
||||
direction = p.getShort()
|
||||
orientation = p.getShort()
|
||||
|
||||
if not direction == 0:
|
||||
if player.opts["debug"]:
|
||||
await player.send_message("ObjID %s went: %s, o: %s" % (objid, direction, orientation))
|
||||
# TODO: Replace with MSG_MOVE_PLAYER
|
||||
await self.server.broadcast_gamedata_except(player, payload)
|
||||
|
||||
elif payload[0] == 0x05: # SPAWN OBJECT
|
||||
@ -678,6 +660,56 @@ class Netserver(asyncio.DatagramProtocol):
|
||||
player.oid = oid
|
||||
|
||||
await self.server.broadcast_gamedata_except(player, payload)
|
||||
await player.send_message("SPAWN: %s" % payload.hex())
|
||||
elif payload[0] == 0x09 and payload[1] == 0x23:
|
||||
player = self.get_player(session)
|
||||
if not player:
|
||||
logger.debug("Fuck that no player wtf man")
|
||||
return
|
||||
await player.send_message("PROJECTILE SHOOT: %s" % payload.hex())
|
||||
await self.server.broadcast_gamedata_except(player, payload)
|
||||
await self.server.broadcast_event("on_player_shoot", player)
|
||||
elif payload[0] == 0x09 and payload[1] == 0x1a:
|
||||
player = self.get_player(session)
|
||||
if not player:
|
||||
logger.debug("Fuck that no player wtf man")
|
||||
return
|
||||
await player.send_message("PROJECTILE EXPLOSION: %s" % payload.hex())
|
||||
#await self.server.broadcast_gamedata_except(player, payload)
|
||||
x = struct.unpack("<f", payload[14:18])[0]
|
||||
y = struct.unpack("<f", payload[18:22])[0]
|
||||
z = struct.unpack("<f", payload[22:26])[0]
|
||||
await self.server.broadcast_gamedata(MSG_BULLET_EXPLOSION(player, 10, x, y, z).to_packet())
|
||||
elif payload[0] == 0x09 and payload[1] == 0x0f:
|
||||
player = self.get_player(session)
|
||||
if not player:
|
||||
logger.debug("Fuck that no player wtf man")
|
||||
return
|
||||
p = Packet(payload)
|
||||
opcode = p.getByte()
|
||||
opcode2 = p.getByte()
|
||||
unknown = p.getByte()
|
||||
unknown = p.getShort()
|
||||
player_index = p.getByte()
|
||||
unknown = p.getShort()
|
||||
unknown = p.getByte()
|
||||
unknown = p.getByte()
|
||||
unknown = p.getULong()
|
||||
weapon = p.getByte()
|
||||
await player.send_message("SWITCH WEAPON: %s" % payload.hex())
|
||||
await self.server.broadcast_gamedata_except(player, MSG_SWITCH_WEAPON(player, weapon).to_packet())
|
||||
elif payload[0] == 0x0b: # MESSAGE_HIT
|
||||
# 0b380437000004070000d48325c32dea66c2c0a0cf429fea0442091a00000004370000034d000000d48325c32dea66c2c0a0cf4200
|
||||
player = self.get_player(session)
|
||||
if not player:
|
||||
logger.debug("Fuck that no player wtf man")
|
||||
return
|
||||
|
||||
await player.send_message("HIT: %s" % payload.hex())
|
||||
for p in self.server.players:
|
||||
if p.name == "[Server]":
|
||||
continue
|
||||
await self.server.broadcast_gamedata(MSG_PLAYER_DIE(p, 1).to_packet())
|
||||
else:
|
||||
player = self.get_player(session)
|
||||
if not player:
|
||||
|
@ -1,3 +1,5 @@
|
||||
from . import *
|
||||
|
||||
APPLICATION_GUID = b"\x10\x5e\x62\xa7\x96\x1a\xd2\x11\x9a\xfc\x00\x60\x08\x45\xe5\x71"
|
||||
|
||||
class Teams:
|
||||
@ -77,3 +79,558 @@ class ChatType:
|
||||
All = 0x00
|
||||
AllFromPlayer = 0xc0
|
||||
TeamFromPlayer = 0xf0
|
||||
|
||||
|
||||
class Models:
|
||||
Generi_object = 0
|
||||
Bases_Mec_Base = 981
|
||||
Bases_Reape_Base = 985
|
||||
Bases_Kabut_base = 1334
|
||||
Markers_Default = 679
|
||||
Markers_Mec_tea_1 = 679
|
||||
Markers_Mec_tea_2 = 679
|
||||
Markers_Reape_tea_1 = 679
|
||||
Markers_Reape_tea_2 = 679
|
||||
Markers_Kabuto = 679
|
||||
Markers_Smarti_tunnel = 522
|
||||
Markers_Vim_tea__wa_point = 679
|
||||
Markers_Marke_Spline = 1052
|
||||
Markers_Buo_Spline = 1098
|
||||
Markers_Arm_Spline = 1162
|
||||
Towers_Tower = 1041
|
||||
Characters_Mecc = 2
|
||||
Characters_Reaper = 3
|
||||
Characters_Kabuto = 1
|
||||
Characters_Vimp_Vimp = 8
|
||||
Characters_Vimp_Foo_Chun_1 = 117
|
||||
Characters_Vimp_Foo_Chun_2 = 1118
|
||||
Characters_Vimp_Foo_Chun_3 = 1119
|
||||
Characters_Smartie_Smartie = 11
|
||||
Characters_Smartie_Femal_Smartie = 216
|
||||
Characters_Shiner = 128
|
||||
Characters_Charger_Charger = 574
|
||||
Characters_Charger_Hotspot = 1064
|
||||
Characters_Reaperman = 215
|
||||
Characters_Sonak_Sonak = 575
|
||||
Characters_Sonak_Seat = 586
|
||||
Characters_Sonak_Ring = 607
|
||||
Characters_Sonak_Reaperma_Shell = 1116
|
||||
Characters_Se_Monster_Se_monster = 75
|
||||
Characters_Se_Monster_Reaperma_Grenade = 276
|
||||
Characters_Se_Monster_Lav_Ball = 1242
|
||||
Ambience_Nea_Beac_ = 1279
|
||||
Ambience_Mn_Beac_ = 1280
|
||||
Ambience_Cliffs_San_ = 1281
|
||||
Ambience_Beach_dar_ = 1282
|
||||
Ambience_Beac_Wave_ = 1283
|
||||
Ambience_Ligh_Rai_ = 1284
|
||||
Ambience_Snow = 1285
|
||||
Ambience_Race = 1286
|
||||
Ambience_Darker = 1287
|
||||
Ambience_Mountain = 1288
|
||||
Ambience_Kabut_Stor_1 = 1289
|
||||
Ambience_Kabut_Stor_5_Storm = 1290
|
||||
Ambience_Crashe_Lander = 1291
|
||||
Ambience_Floatin_Gate = 1293
|
||||
Ambience_Cage = 1295
|
||||
Ambience_Distan_Birds = 1296
|
||||
Ambience_Win_Gusts = 1297
|
||||
Ambience_Singl_Tree = 1298
|
||||
Ambience_Trees = 1299
|
||||
Ambience_Shoreline = 1300
|
||||
Ambience_Pools = 1301
|
||||
Ambience_Pier = 1302
|
||||
Ambience_Bi_Lea_Tree = 1303
|
||||
Ambience_Reape_Tower = 1304
|
||||
Ambience_Interio_Volcano = 1305
|
||||
Ambience_Smarti_Village = 1306
|
||||
Ambience_Hig_Winds = 1308
|
||||
Ambience_Prison = 1309
|
||||
Ambience_Arm_Barracks = 1310
|
||||
Ambience_Fores_Trees = 1312
|
||||
Ambience_Distan_Animals = 1313
|
||||
Ambience_Shoreline_Long = 1315
|
||||
Ambience_Shoreline_Dark_Short = 1316
|
||||
Ambience_Shoreline_Dark_Long = 1317
|
||||
Ambience_River = 1318
|
||||
Ambience_Hig_Wind_Light = 1319
|
||||
Ambience_Col_Win_Gusts = 1320
|
||||
Ambience_Kabut_Stro_2 = 1338
|
||||
Ambience_Kabut_Stro_3 = 1339
|
||||
Ambience_Kabut_Stor_4 = 1340
|
||||
Ambience_Specia_Tree = 1342
|
||||
Ambience_Pools_Large = 1343
|
||||
Ambience_Boat = 1344
|
||||
Ambience_Volcano = 1355
|
||||
Bi_Walls_Archs_Arc_100 = 270
|
||||
Bi_Walls_Archs_Arc_150 = 270
|
||||
Bi_Walls_Archs_Arc_200 = 271
|
||||
Bi_Walls_Corner = 273
|
||||
Bi_Walls_Walls_Wal_100_Withou_Window = 274
|
||||
Bi_Walls_Gate_portcullis = 555
|
||||
Bi_Walls_Walls_Wal_150 = 556
|
||||
Bi_Walls_Walls_Wal_200 = 557
|
||||
Bi_Walls_Parapit = 558
|
||||
Bi_Walls_Se_Reaper_Arc_100 = 559
|
||||
Bi_Walls_Se_Reaper_Corner = 560
|
||||
Bi_Walls_Columns_Colum_20 = 567
|
||||
Bi_Walls_Columns_Colum_30 = 568
|
||||
Bi_Walls_Columns_Colum_40 = 569
|
||||
Bi_Walls_Columns_Colum_60 = 570
|
||||
Bi_Walls_Bunker_Bunke_1 = 578
|
||||
Bi_Walls_To_Platform = 579
|
||||
Bi_Walls_To_Connec_1 = 580
|
||||
Bi_Walls_Walls_Wal_100_Wit_Window = 587
|
||||
Bi_Walls_Bunker_Bunker_Low = 588
|
||||
Bi_Walls_Se_Reaper_Arc_150 = 601
|
||||
Bi_Walls_Se_Reaper_Arc_200 = 602
|
||||
Bi_Walls_Debri_Piec_1 = 611
|
||||
Bi_Walls_Debri_Piec_2 = 612
|
||||
Bi_Walls_Debri_Piec_3 = 613
|
||||
Bi_Walls_Debri_Piec_4 = 614
|
||||
Bi_Walls_Debri_Colum_1 = 615
|
||||
Bi_Walls_Debri_Colum_2 = 616
|
||||
Bi_Walls_Debri_Bunke_1 = 617
|
||||
Bi_Walls_Damaged_Bunke_1_d1 = 652
|
||||
Bi_Walls_Bunker_Bunke_Top = 653
|
||||
Bi_Walls_Damaged_Bunker_Low_d1 = 654
|
||||
Bi_Walls_Damaged_Colum_20_d1 = 655
|
||||
Bi_Walls_Damaged_Columnc30_d1 = 656
|
||||
Bi_Walls_Damaged_Colum_40_d1 = 657
|
||||
Bi_Walls_Damaged_Colum_60_d1 = 658
|
||||
Bi_Walls_Damaged_Parapit_d1 = 659
|
||||
Bi_Walls_Columns_Colum_40_b = 706
|
||||
Bi_Walls_Guar_Center = 1007
|
||||
Bi_Walls_Gat_Swing = 1015
|
||||
Bi_Walls_Fence = 1022
|
||||
Birds_Standard = 210
|
||||
Birds_Flak = 123
|
||||
Birds_Lobird = 124
|
||||
Birds_Feathe_1 = 223
|
||||
Birds_Hitcher = 690
|
||||
Birds_Marke_Spline = 1052
|
||||
Bones_Femur = 977
|
||||
Bones_Rib = 978
|
||||
Bones_Spine = 979
|
||||
Bridge_Bridge = 118
|
||||
Bridge_Bridge_End = 247
|
||||
Bridge_100ft = 256
|
||||
Bridge_200ft = 257
|
||||
Bridge_300ft = 258
|
||||
Bridge_400ft = 528
|
||||
Bridge_500ft = 532
|
||||
Bridge_200ft_d = 705
|
||||
Bridge_Wide = 1413
|
||||
Effects_Dus_Ring = 620
|
||||
Effects_Wate_Spray = 621
|
||||
Effects_Dus_Blast = 622
|
||||
Effects_Dus_Flash = 628
|
||||
Effects_Shrap_Ground = 646
|
||||
Effects_Dus_Ball = 671
|
||||
Effects_Dus_Smoke = 672
|
||||
Effects_Cas_Spell = 696
|
||||
Effects_Rain = 697
|
||||
Formations__Sonak_Guards = 1054
|
||||
Formations___Sonak_Guards = 1058
|
||||
Formations__m_Sonak__Guards = 1059
|
||||
Formations_2x_Guards = 1067
|
||||
Formations__Flyin_Guards = 1174
|
||||
Formations__Ripper = 1176
|
||||
Formations__Rippers = 1177
|
||||
Formations__Kamikazi = 1180
|
||||
Formations__Wid_Guards = 1314
|
||||
Gian_Walls_Giantwal_1 = 1207
|
||||
Gian_Walls_Giantwal_2 = 1208
|
||||
Gian_Walls_Giantwal_3 = 1209
|
||||
Gian_Walls_Giantwal_4 = 1277
|
||||
Gian_Walls_Giantwal_5 = 1333
|
||||
Gian_Walls_Giantwall3_Nick = 1359
|
||||
Gian_Walls_efx_Reference_Giantwal_3 = 1394
|
||||
Gian_Walls_efx_Giantwal_Debr_1 = 1395
|
||||
Gian_Walls_efx_Giantwal_Debr_2 = 1396
|
||||
Gian_Walls_efx_Giantwal_Debr_3 = 1397
|
||||
Gian_Walls_efx_Giantwal_Debr_4 = 1398
|
||||
Gian_Walls_efx_Giantwal_Debr_5 = 1399
|
||||
Gian_Walls_efx_Giantwal_Debr_6 = 1400
|
||||
Gian_Walls_efx_Giantwal_Debr_7 = 1401
|
||||
Gian_Walls_efx_Giantwal_Debr_8 = 1402
|
||||
Gian_Walls_efx_Giantwal_Debr_9 = 1403
|
||||
Gian_Walls_efx_Giantwal_Debr_10 = 1404
|
||||
Gian_Walls_efx_Giantwal_Debr_11 = 1405
|
||||
Gian_Walls_efx_Giantwal_Debr_12 = 1406
|
||||
Gian_Walls_efx_Giantwal_Debr_13 = 1407
|
||||
Gian_Walls_efx_Giantwal_Debr_14 = 1408
|
||||
Gian_Walls_efx_Reference_Giantwal_5 = 1409
|
||||
Gian_Walls_efx_Giantwal_5_Debr_1 = 1410
|
||||
Gian_Walls_efx_Giantwal_3_Debr_s = 1411
|
||||
Guard_Arm_Barracks_Arm_Barracks = 1161
|
||||
Guard_Arm_Barracks_Arm_Barrack_Husk = 1173
|
||||
Guard_Barracks_Barracks = 686
|
||||
Guard_Barracks_Min_Barracks = 1060
|
||||
Guard_Barracks_Barrack_Husk = 1190
|
||||
Guard_Barracks_Rippe_Barracks = 1226
|
||||
Guard_Barracks_Barracks_Stor_2 = 1276
|
||||
Guard_Barracks_efx_Reference_Min_Barracks = 1376
|
||||
Guard_Barracks_efx_Min_Debri_Top = 1377
|
||||
Guard_Barracks_efx_Min_Debr_1 = 1378
|
||||
Guard_Barracks_efx_Min_Debr_2 = 1379
|
||||
Guard_Barracks_efx_Min_Debr_3 = 1380
|
||||
Guard_Barracks_efx_Rippe_Barrack_Debr_1 = 1391
|
||||
Guard_Barracks_efx_Rippe_Barrack_Debr_2 = 1392
|
||||
Guard_Barracks_efx_Rippe_Barrack_Debr_3 = 1393
|
||||
Guard_Buildings_Muzzl_Flash = 662
|
||||
Guard_Buildings_Muzzl_Flas_2 = 663
|
||||
Guard_Buildings_Guar_Towe_1 = 1050
|
||||
Guard_Buildings_Guar_Towe_2 = 1051
|
||||
Guard_Buildings_Guar_Sam = 1061
|
||||
Guard_Buildings_Guar_Turret = 1062
|
||||
Guard_Buildings_Guar_Lift = 1065
|
||||
Guard_Buildings_Guar_Lif_Strut = 1066
|
||||
Guard_Buildings_Guar_Bunker = 1072
|
||||
Guard_Buildings_Guar_Stable = 1074
|
||||
Guard_Buildings_Guar_Shop = 1092
|
||||
Guard_Buildings_Guar_Lif_Base = 1094
|
||||
Guard_Buildings_Guar_Buoy = 1097
|
||||
Guard_Buildings_Guar_Towe_1_d = 1127
|
||||
Guard_Buildings_Guar_Bunker_d = 1128
|
||||
Guard_Buildings_Guar_Towe_2_d = 1129
|
||||
Guard_Buildings_Guar_Stable_d = 1138
|
||||
Guard_Buildings_Guar_Portal = 1211
|
||||
Guard_Buildings_Guar_Portal_m = 1213
|
||||
Guard_Buildings_Guar_Buoy_coll = 1330
|
||||
Guard_Buildings_efx_Reference_Guar_Towe_1 = 1381
|
||||
Guard_Buildings_efx_Towe_Debr_1 = 1382
|
||||
Guard_Buildings_efx_Towe_Debr_2 = 1383
|
||||
Guard_Buildings_efx_Towe_Debr_3 = 1384
|
||||
Guard_Buildings_efx_Towe_Debr_4 = 1385
|
||||
Guard_Buildings_efx_Towe_Debr_5 = 1386
|
||||
Guard_Buildings_efx_Reference_Guar_Towe_2 = 1387
|
||||
Guard_Buildings_efx_Towe_2_Debr_1 = 1388
|
||||
Guard_Buildings_efx_Towe_2_Debr_2 = 1389
|
||||
Guard_Buildings_efx_Towe_2_Debr_3 = 1390
|
||||
Guard_Drawbridge_Drawbridge = 1021
|
||||
Guard_Drawbridge_Drawbridge_Open = 1056
|
||||
Guard_Drawbridge_Drawbridge_coll = 1414
|
||||
Guard_Drawbridge_Drawbridge_Open_coll = 1415
|
||||
Guard_Lo_Launcher_Lo_Carrier = 683
|
||||
Guard_Lo_Launcher_Lo_Launcher = 388
|
||||
Guard_Lo_Launcher_Lo_Launche_Base = 389
|
||||
Guard_Prison_Prison = 1023
|
||||
Guard_Prison_Prinso_Crater = 1063
|
||||
Guard_Reape_Tower = 1077
|
||||
Guard_Turrets_Muzzl_Flash = 662
|
||||
Guard_Turrets_Muzzl_Flas_2 = 663
|
||||
Guard_Turrets_Guar_Sam = 1061
|
||||
Guard_Turrets_Guar_Turret = 1062
|
||||
Jetski_Reape_Jetski = 1076
|
||||
Jetski_Homin_Pic_Up = 1099
|
||||
Jetski_Missil_Pic_Up = 1100
|
||||
Jetski_Turb_Pic_Up = 1101
|
||||
Jetski_Jetski_coll = 1349
|
||||
Jetski_Sign = 1374
|
||||
Jetski_Reaperma_Jetski = 1159
|
||||
Jetski_Reaperma_Jetski_coll = 1331
|
||||
Kabuto_Stuff_Mu_Ball = 677
|
||||
Kabuto_Stuff_Ho_Rock = 678
|
||||
Kabuto_Stuff_Ho_Rock_d = 682
|
||||
Kabuto_Stuff_Magi_Crystal = 1175
|
||||
Kabuto_Stuff_Magi_Crysta_Shard = 1199
|
||||
Kabuto_Stuff_Kabut_Stone = 1204
|
||||
Kabuto_Stuff_Kabut_Ash = 1210
|
||||
Kabuto_Stuff_Roc_Generator = 1215
|
||||
Kabuto_Stuff_Lav_Ball = 1242
|
||||
Kabuto_Stuff_Volcan_Debri = 1243
|
||||
Kabuto_Stuff_Exhaust = 1244
|
||||
Kabuto_Stuff_Roc_Generator_Top = 1246
|
||||
Kabuto_Stuff_Kabut_Pad = 1334
|
||||
Kabuto_Stuff_efx_Crysta_Debri = 1375
|
||||
Kabuto_Stuff_Roc_Generator_coll = 1416
|
||||
Kabuto_Leve_1_Ho_Spot = 749
|
||||
Kabuto_Leve_1_Shield = 1018
|
||||
Kabuto_Stor_5_Pocket = 1216
|
||||
Kabuto_Stor_5_Spike = 1370
|
||||
Kabuto_kstor_5_Kabut_Bridg_1 = 1371
|
||||
Kabuto_kstor_5_Kabut_Bridg_2 = 1372
|
||||
Kabuto_kstor_5_Kabut_Bridg_3 = 1373
|
||||
Kabuto_Offspring_Reaperma_Grenade = 276
|
||||
Kabuto_Offspring_Offspring = 745
|
||||
Kabuto_Offspring_Offsprin_Egg = 746
|
||||
Kabuto_Offspring_Offsprin_Egg_d1 = 747
|
||||
Kabuto_Offspring_Offsprin_Eggshell1 = 748
|
||||
Kabuto_Offspring_Offsprin_Hotspot = 945
|
||||
Lander_Mec_Lander = 4
|
||||
Lander_Mec_Cras_1 = 208
|
||||
Lander_Mothe_Ship = 1198
|
||||
Mecc_Base_Muzzl_Flash_Ob_623 = 623
|
||||
Mecc_Base_Muzzl_Flas_2_Ob_627 = 627
|
||||
Mecc_Base_Muzzl_Flash_Ob_662 = 662
|
||||
Mecc_Base_Muzzl_Flas_2_Ob_663 = 663
|
||||
Mecc_Base_Wood_Wall = 709
|
||||
Mecc_Base_Wood_Gift = 710
|
||||
Mecc_Base_Wood_Pub = 711
|
||||
Mecc_Base_Wood_Shop = 712
|
||||
Mecc_Base_Stone_Wall = 714
|
||||
Mecc_Base_Stone_Gift = 716
|
||||
Mecc_Base_Stone_Shop = 717
|
||||
Mecc_Base_Wood_Gate = 744
|
||||
Mecc_Base_Smarti_Fir_Pit = 750
|
||||
Mecc_Base_Damaged_Wood_Shop = 763
|
||||
Mecc_Base_Damaged_Stone_Gift = 764
|
||||
Mecc_Base_Damaged_Stone_Shop = 765
|
||||
Mecc_Base_Damaged_Wood_Gift = 768
|
||||
Mecc_Base_Damaged_Wood_Wall = 769
|
||||
Mecc_Base_Damaged_Stone_Wall = 771
|
||||
Mecc_Base_Damaged_Wood_Gate = 772
|
||||
Mecc_Base_Damaged_Stone_Gate = 773
|
||||
Mecc_Base_Stone_Gate = 775
|
||||
Mecc_Base_Damaged_Wood_Pub = 779
|
||||
Mecc_Base_Smarti_Dropoff = 834
|
||||
Mecc_Base_Fu_House = 918
|
||||
Mecc_Base_Damaged_Fu_House = 936
|
||||
Mecc_Base_Mec_Bas_Templat_1 = 981
|
||||
Mecc_Base_P_Items_Teleport = 983
|
||||
Mecc_Base_P_Items_Gyr_Pad = 984
|
||||
Mecc_Base_P_Items_Min_Shop = 986
|
||||
Mecc_Base_P_Items_Tower = 988
|
||||
Mecc_Base_P_Items_Gyro = 991
|
||||
Mecc_Base_Stone_Command = 1093
|
||||
Mecc_Base_Wood_Command = 1095
|
||||
Mecc_Base_P_Items_Sa_Turret = 1185
|
||||
Mecc_Base_P_Items_Bul_Do_Turret = 1186
|
||||
Mecc_Base_Damaged_Stone_Command = 1237
|
||||
Mecc_Level1_Mecc = 2
|
||||
Mecc_Level1_Useles_Effects_Bullet_Ob_14 = 14
|
||||
Mecc_Level1_Weapons_Pistol_On_21 = 21
|
||||
Mecc_Level1_Weapons_Shotgun_Ob_22 = 22
|
||||
Mecc_Level1_Weapons_Syringe = 23
|
||||
Mecc_Level1_Useles_Effects_Laser = 25
|
||||
Mecc_Level1_Useles_Effects_Beamring = 28
|
||||
Mecc_Level1_Weapons_Lasergun = 29
|
||||
Mecc_Level1_Sho_Items_Bush = 36
|
||||
Mecc_Level1_Useles_Effects_Zip = 38
|
||||
Mecc_Level1_Weapons_Pistol_Ob_42 = 42
|
||||
Mecc_Level1_Useles_Effects_Bullet_Ob_43 = 43
|
||||
Mecc_Level1_Sho_Items_Turret = 60
|
||||
Mecc_Level1_Useles_Effects_Thrust = 84
|
||||
Mecc_Level1_Useles_Effects_Thrus_2 = 85
|
||||
Mecc_Level1_Flag = 127
|
||||
Mecc_Level1_Sho_Items_Jetpack = 254
|
||||
Mecc_Level1_Weapons_Machinegun_Ob_300 = 300
|
||||
Mecc_Level1_Weapons_Grenade = 301
|
||||
Mecc_Level1_Weapons_Shotgun_Ob_302 = 302
|
||||
Mecc_Level1_Weapons_Machinegun_Ob_303 = 303
|
||||
Mecc_Level1_Pickups_Shells = 647
|
||||
Mecc_Level1_Pickups_Clips = 648
|
||||
Mecc_Level1_Pickups_Health = 649
|
||||
Mecc_Level1_Pickups_Grenades = 650
|
||||
Mecc_Level1_Bullets_Machinegu_Shell = 660
|
||||
Mecc_Level1_Useles_Effects_Muzzl_Flash = 662
|
||||
Mecc_Level1_Useles_Effects_Muzzl_Flas_2 = 663
|
||||
Mecc_Level1_Useles_Effects_Blas_Ring = 667
|
||||
Mecc_Level1_Useles_Effects_Shotgu_Blast = 668
|
||||
Mecc_Level1_Useles_Effects_Nitr_Thrust = 781
|
||||
Mecc_Level1_Weapons_Launcher = 785
|
||||
Mecc_Level1_Weapons_Snipergun = 787
|
||||
Mecc_Level1_Weapons_Mortar = 790
|
||||
Mecc_Level1_Pickups_Snipe_Clip = 792
|
||||
Mecc_Level1_Bullets_Sniper = 793
|
||||
Mecc_Level1_Bullets_Rocket = 800
|
||||
Mecc_Level1_Pickups_Rockets = 801
|
||||
Mecc_Level1_Pickups_Morta_Bombs = 802
|
||||
Mecc_Level1_Bullets_Proximity = 803
|
||||
Mecc_Level1_Pickups_Proximity = 804
|
||||
Mecc_Level1_Weapons_Mine = 805
|
||||
Mecc_Level1_Bullets_Homing = 806
|
||||
Mecc_Level1_Pickups_Homing = 807
|
||||
Mecc_Level1_Bullets_Morta_Bomb = 808
|
||||
Mecc_Level1_Sho_Items_Popupbomb = 822
|
||||
Mecc_Level1_Sho_Items_Jetpac_2 = 892
|
||||
Mecc_Level1_Sho_Items_Repairpack = 897
|
||||
Mecc_Level1_Sho_Items_Repairgun = 898
|
||||
Mecc_Level1_Sho_Items_Shield = 902
|
||||
Mecc_Level1_Sho_Items_Bushpack = 920
|
||||
Mecc_Level1_Bullets_Shotgu_Shell = 1114
|
||||
Mecc_Level1_Pickups_Mines = 1123
|
||||
Menus_mpselect = 1019
|
||||
Menus_efx_Menu = 1020
|
||||
Menus_idselect = 1025
|
||||
Menus_wdselect = 1026
|
||||
Menus_mu_gnselect = 1027
|
||||
Musi_Temp_Kabuto = 1323
|
||||
Musi_Temp_Mecc = 1324
|
||||
Musi_Temp_Mec_Ambient = 1325
|
||||
Musi_Temp_Mec_Battle = 1326
|
||||
Musi_Temp_Mec_Sus = 1327
|
||||
Permanen_Aliens_Explosion_Flash = 44
|
||||
Permanen_Aliens_Explosion_Smok_Ring = 45
|
||||
Permanen_Aliens_M_Invisible = 49
|
||||
Permanen_Aliens_Cleaner = 685
|
||||
Permanen_Aliens_Piranha = 1005
|
||||
Pier_Straight = 533
|
||||
Pier_Ben_90 = 534
|
||||
Pier_Roun_Rings = 535
|
||||
Pier_Pie_Roun_Tile = 536
|
||||
Pier_Square = 537
|
||||
Pier_Pos_20 = 538
|
||||
Pier_Pos_30 = 539
|
||||
Pier_Pos_40 = 540
|
||||
Pier_Canop_1 = 563
|
||||
Pier_Ben_Post = 564
|
||||
Pier_Straigh_80 = 565
|
||||
Pier_Straigh_160 = 566
|
||||
Plants_b_Pod = 92
|
||||
Plants_b_Bush = 93
|
||||
Plants_s_Weeds = 129
|
||||
Plants_b_Lilly = 130
|
||||
Plants_s_Flowe_1 = 138
|
||||
Plants_Mcbush = 245
|
||||
Plants_Shrub_1 = 992
|
||||
Plants_Shrub_2 = 993
|
||||
Plants_Shrub_3 = 994
|
||||
Plants_Shrub_5 = 996
|
||||
Plants_Shrub_6 = 997
|
||||
Plants_Shrub_7 = 998
|
||||
Plants_Shrub_8 = 999
|
||||
Plants_Shrub_9 = 1029
|
||||
Plants_Shrub_10 = 1030
|
||||
Plants_Shrub_11 = 1031
|
||||
Plants_Shrub_5_coll = 1274
|
||||
Plants_Ptree_Ptree = 101
|
||||
Plants_Ptree_Ptre_Bob_Ptre_Bob = 102
|
||||
Plants_Ptree__Lea_1 = 125
|
||||
Plants_Ptree_Simple = 609
|
||||
Plants_Ptree_Ptre_Bob_d1 = 664
|
||||
Plants_Ptree_Ptre_Bob_Busted = 1006
|
||||
Plants_Ptre_Canopy = 1045
|
||||
Plants_Ptree_Ptre_Bob_coll = 1144
|
||||
Raik_Reape_Bow = 30
|
||||
Raik_Reape_Sword = 669
|
||||
Raik_Rai_Hig_LoD = 1080
|
||||
Raik_Rai_Lo_LoD = 1239
|
||||
Raik_Reape_Queen_Hig_LoD = 666
|
||||
Raik_Reape_Queen_Lo_LoD = 1240
|
||||
Reaper_Base_Muzzl_Flas_1_Ob_623 = 623
|
||||
Reaper_Base_Muzzl_Flas_1_Ob_662 = 662
|
||||
Reaper_Base_Muzzl_Flas_2_Ob_627 = 627
|
||||
Reaper_Base_Muzzl_Flas_2_Ob_663 = 663
|
||||
Reaper_Base_1s_Leve_Buildings_Spellshop = 735
|
||||
Reaper_Base_1s_Leve_Buildings_Magi_Wall = 1148
|
||||
Reaper_Base_1s_Leve_Buildings_Magi_Gate = 1150
|
||||
Reaper_Base_1s_Leve_Buildings_Magi_Wal_efx = 1255
|
||||
Reaper_Base_1s_Leve_Buildings_Magi_Gat_efx = 1350
|
||||
Reaper_Base_1s_Leve_Buildings_Extractor_Built = 729
|
||||
Reaper_Base_1s_Leve_Buildings_Extractor_Destroyed = 730
|
||||
Reaper_Base_2n_Leve_Buildings_Spellshop = 736
|
||||
Reaper_Base_2n_Leve_Buildings_Magi_Wall = 1149
|
||||
Reaper_Base_2n_Leve_Buildings_Magi_Gate = 1151
|
||||
Reaper_Base_2n_Leve_Buildings_Magi_Wal_efx = 1332
|
||||
Reaper_Base_2n_Leve_Buildings_Magi_Gat_efx = 1351
|
||||
Reaper_Base_2n_Leve_Buildings_Workshop = 1152
|
||||
Reaper_Base_2n_Leve_Buildings_Generator = 1154
|
||||
Reaper_Base_2n_Leve_Buildings_Command = 1158
|
||||
Reaper_Base_2n_Leve_Buildings_Fu_House = 1156
|
||||
Reaper_Base_Smarti_Waitin_Pad = 851
|
||||
Reaper_Base_Smarti_Buil_Pad = 857
|
||||
Reaper_Base_Smarti_Dropoff = 858
|
||||
Reaper_Base_Sou_Dropoff = 882
|
||||
Reaper_Base_Damaged_1s_Leve_Buildings_Spellshop = 967
|
||||
Reaper_Base_Damaged_1s_Leve_Buildings_Magi_Wall = 1228
|
||||
Reaper_Base_Damaged_1s_Leve_Buildings_Magi_Gate = 1230
|
||||
Reaper_Base_Damaged_1s_Leve_Buildings_Workshop = 1153
|
||||
Reaper_Base_Damaged_1s_Leve_Buildings_Extractor = 970
|
||||
Reaper_Base_Damaged_2n_Leve_Buildings_Spellshop = 968
|
||||
Reaper_Base_Damaged_2n_Leve_Buildings_Magi_Wall = 1229
|
||||
Reaper_Base_Damaged_2n_Leve_Buildings_Magi_Gate = 1231
|
||||
Reaper_Base_Damaged_2n_Leve_Buildings_WorkShop = 1153
|
||||
Reaper_Base_Damaged_2n_Leve_Buildings_Generator = 1155
|
||||
Reaper_Base_Damaged_2n_Leve_Buildings_Command = 1238
|
||||
Reaper_Base_Damaged_2n_Leve_Buildings_Fu_House = 1157
|
||||
Reaper_Base_Reape_Bas_Templat_1 = 985
|
||||
Reaper_Base_P_Items_Shop = 989
|
||||
Reaper_Base_P_Items_Sk_Pier = 1181
|
||||
Reaper_Base_P_Items_Turret = 1187
|
||||
Reaper_Base_P_Items_Sa_Turret = 1188
|
||||
Reaper_Base_P_Items_Tower = 1189
|
||||
Reaper_Base_P_Items_Portal = 1192
|
||||
Reaper_Flick_Reape_Character_1 = 3
|
||||
Reaper_Flick_Reape_Character_2 = 311
|
||||
Reaper_Flick_Bow = 30
|
||||
Reaper_Flick_Sword = 669
|
||||
Reaper_Ship_Ship = 1171
|
||||
Reaper_Ship_Shi_Husk = 1172
|
||||
Reaper_Ship_Galleon = 1214
|
||||
Reaper_Spells_Tornado = 24
|
||||
Reaper_Spells_M_Invisible = 40
|
||||
Reaper_Leve_1_Tornad_Warning = 33
|
||||
Reaper_Leve_1_Arrow = 34
|
||||
Reaper_Leve_1_Reape_Head = 903
|
||||
Reaper_Leve_1_Weapons_Fire = 35
|
||||
Reaper_Leve_1_Weapons_Swor_Trail = 312
|
||||
Reaper_Leve_1_Weapons_Bomb = 702
|
||||
Reaper_Leve_1_Weapons_Homin_Bow = 928
|
||||
Reaper_Leve_1_Weapons_Snipe_Bow = 929
|
||||
Reaper_Leve_1_Weapons_Rp_Bow = 930
|
||||
Reaper_Leve_1_Weapons_Power_u_Bow = 931
|
||||
Reaper_Leve_1_Weapons_Mine = 1222
|
||||
Reaper_Leve_1_Weapons_Health = 1224
|
||||
Reaper_Leve_1_Pickups_Mine = 1223
|
||||
Reaper_Leve_1_Pickups_Health = 1225
|
||||
Reaper_Leve_1_Pickups_Repair = 1233
|
||||
Reaper_Leve_1_Screamer = 934
|
||||
Reaper_rstor_3_R_Star_Finish = 1147
|
||||
Reaper_rstor_3_R_La_Marker = 1160
|
||||
Reaper_rstor_3_Grid = 1164
|
||||
Reaper_rstor_4_rstory4 = 1146
|
||||
Reaper_rstor_5_Cave = 1166
|
||||
Reaper_rstor_5_Volcan_Column = 1356
|
||||
Reaper_rstor_5_Fake = 1357
|
||||
Reaperman_Reaperman_Default = 215
|
||||
Reaperman_Reaperman_Sniper = 215
|
||||
Reaperman_Reaperman_Flyer = 215
|
||||
Reaperman_Reaperman_Bomb = 215
|
||||
Reaperman_Horn = 224
|
||||
Reaperman_Spear = 240
|
||||
Reaperman_Tracer = 275
|
||||
Reaperman_Grenade = 276
|
||||
Reaperman_Muzzl_Flash = 623
|
||||
Reaperman_Gunseat = 625
|
||||
Reaperman_Muzzl_Flas_2 = 627
|
||||
Reaperman_Tuba = 693
|
||||
Reaperman_Snipergun = 1047
|
||||
Reaperman_Bazooka = 1048
|
||||
Reaperman_Jetpack = 1049
|
||||
Reaperman_Torch = 1055
|
||||
Reaperman_Telescope = 1079
|
||||
Reaperman_Bomb = 1203
|
||||
Ripper_Ripper_Rippe_ri_1_6 = 73
|
||||
Ripper_Rippe_Spit_Small = 90
|
||||
Ripper_Rippe_Nest = 218
|
||||
Ripper_Mound = 219
|
||||
Ripper_Dir_1 = 220
|
||||
Ripper_Rippe_Nes_x = 226
|
||||
Ripper_Rippe_Spit_Big = 232
|
||||
Ripper_Gore_Head = 1104
|
||||
Ripper_Gore_Arm = 1105
|
||||
Rocks_Rock_1 = 78
|
||||
Rocks_Rock_2 = 79
|
||||
Rocks_Rock_3 = 91
|
||||
Rocks_Reaperma_Rock_1 = 680
|
||||
Rocks_Reaperma_Rock_2 = 681
|
||||
Rocks_Reaperma_Rock_3 = 687
|
||||
Rocks_Deser_Rock_1 = 1042
|
||||
Rocks_Deser_Rock_2 = 1043
|
||||
Rocks_Deser_Rock_3 = 1044
|
||||
Rocks_Stor_3_Ridge = 1096
|
||||
Rocks_Pebble = 1163
|
||||
Shadows_Round = 541
|
||||
Shadows_Elipse = 542
|
||||
Shadows_Elips_2 = 543
|
||||
Shadows_Blastmar_1 = 618
|
||||
Shadows_Blastmar_2 = 619
|
||||
Sno_Stuff_Sno_Tree = 830
|
||||
Sno_Stuff_Iceberg_1 = 1081
|
||||
Sno_Stuff_Iceberg_2 = 1085
|
||||
Sno_Stuff_Iceberg_3 = 1086
|
||||
Sno_Stuff_Iceberg_4 = 1087
|
||||
Sno_Stuff_Iceber_Ramp = 1088
|
||||
Sno_Stuff_Ic_Wall = 1089
|
||||
|
@ -4,3 +4,8 @@ class Entity:
|
||||
self.y = 0
|
||||
self.z = 0
|
||||
self.o = 0
|
||||
self.oid = 0
|
||||
self._model = 0
|
||||
|
||||
def model(self):
|
||||
return self._model
|
||||
|
5
giants/gameobject.py
Normal file
5
giants/gameobject.py
Normal file
@ -0,0 +1,5 @@
|
||||
from giants.entity import Entity
|
||||
|
||||
|
||||
class GameObject(Entity):
|
||||
pass
|
@ -1,8 +1,9 @@
|
||||
from .entity import Entity
|
||||
import random
|
||||
import struct
|
||||
from . import ChatColor, ChatType
|
||||
from . import ChatColor, ChatType, Models
|
||||
from dpnet.DFrame import DFrame
|
||||
from dpnet.gamepackets import MSG_CHANGE_TEAM, MSG_PLAYER_PING
|
||||
|
||||
|
||||
class PlayerPhases:
|
||||
@ -25,18 +26,18 @@ class Player(Entity):
|
||||
self.id = random.getrandbits(16)
|
||||
self.phase = PlayerPhases.NONE
|
||||
self.ping = 1
|
||||
self.oid = 0
|
||||
self.opts = {"debug": False}
|
||||
self.opts = {"debug": True}
|
||||
|
||||
async def change_team(self, newteam):
|
||||
def get_index(self):
|
||||
return self.session.server.get_player_index(self)
|
||||
|
||||
async def change_team(self, newteam, respawn=True):
|
||||
self.team = newteam
|
||||
await self.session.server.broadcast_event("on_player_change_team", self, self.team)
|
||||
|
||||
await self.session.server.broadcast_gamedata(b"\x10"+struct.pack("<B", self.team)+struct.pack("<L", self.id)+b"\x01\x00")
|
||||
#await self.session.server.broadcast_gamedata(b"\x10"+struct.pack("<B", self.team)+struct.pack("<L", self.id)+b"\x01\x00")
|
||||
await self.session.server.broadcast_gamedata(MSG_CHANGE_TEAM(self, newteam, respawn).to_packet())
|
||||
|
||||
async def send_ping(self, ping):
|
||||
await self.session.server.broadcast_gamedata(b"\x2f\x02\x00\x00" + struct.pack("<H", ping) + b"\x00")
|
||||
await self.session.server.broadcast_gamedata(MSG_PLAYER_PING(self, ping).to_packet())
|
||||
|
||||
async def send_message(self, message, type=ChatType.All, playerindex=0, color=ChatColor.Orange):
|
||||
options = type | color
|
||||
@ -51,3 +52,7 @@ class Player(Entity):
|
||||
dframe.NRcv = self.session.next_expected_seq
|
||||
dframe.SessID = self.session.SessID
|
||||
self.session.send(dframe)
|
||||
|
||||
def model(self):
|
||||
# TODO: Fix
|
||||
return Models.Characters_Mecc
|
||||
|
6
giants/projectile.py
Normal file
6
giants/projectile.py
Normal file
@ -0,0 +1,6 @@
|
||||
from giants.entity import Entity
|
||||
|
||||
|
||||
class Projectile(Entity):
|
||||
def __init__(self):
|
||||
super().__init__()
|
@ -1,11 +1,24 @@
|
||||
from giants import ChatColor
|
||||
import asyncio
|
||||
import struct
|
||||
from dpnet.packet import Packet
|
||||
from dpnet.gamepackets import *
|
||||
from random import randint
|
||||
|
||||
|
||||
class Commands:
|
||||
def __init__(self, server):
|
||||
self.server = server
|
||||
self.recorded = b''
|
||||
self.recording = False
|
||||
self.recordingplayer = None
|
||||
self.nextweapon = 1
|
||||
|
||||
async def on_player_gamedata(self, player, gamedatabytes):
|
||||
if self.recording:
|
||||
self.recorded = gamedatabytes
|
||||
self.recording = False
|
||||
await self.recordingplayer.send_message("Packet recorded: %s" % (self.recorded.hex(),), color=ChatColor.Cyan)
|
||||
|
||||
async def on_player_chat(self, player, type, team, message):
|
||||
await self.server.broadcast_message_except(player, "%s: %s" % (player.name, message), color=ChatColor.Yellow)
|
||||
@ -13,13 +26,16 @@ class Commands:
|
||||
command = message.split(" ")
|
||||
|
||||
if len(command) > 1 and command[0] == "team":
|
||||
newteam = command[1].replace("\x00", "")
|
||||
newteam = command[1]
|
||||
respawn = True
|
||||
if len(command) > 2:
|
||||
respawn = False if command[2] == "off" or command[2] == "no" or command[2] == "false" else True
|
||||
print("Changing team of %s to %s" % (player.name, newteam))
|
||||
await self.server.broadcast_message("%s switched to team %s using command" % (player.name, newteam))
|
||||
await player.change_team(int(newteam))
|
||||
await player.change_team(int(newteam), respawn=respawn)
|
||||
|
||||
if len(command) > 1 and command[0] == "ping":
|
||||
newping = command[1].replace("\x00", "")
|
||||
newping = command[1]
|
||||
print("Changing ping of %s to %s" % (player.name, newping))
|
||||
await self.server.broadcast_message("%s set his ping to %s" % (player.name, newping))
|
||||
await player.send_ping(int(newping))
|
||||
@ -56,7 +72,8 @@ class Commands:
|
||||
if command[0] == "die" and len(command) > 1:
|
||||
diemethod = int(command[1])
|
||||
await player.send_message("Death by id: %s" % diemethod)
|
||||
await player.session.send_gamedata(bytes.fromhex("0b1a0000000002070000a5b0d4c35d9714c450abef354a68fb410914000000020700000402000000")+struct.pack("<L",diemethod)+bytes.fromhex("0000"))
|
||||
await self.server.broadcast_gamedata(MSG_PLAYER_DIE(player, diemethod).to_packet())
|
||||
#await player.session.send_gamedata(bytes.fromhex("0b1a0000000002070000a5b0d4c35d9714c450abef354a68fb410914000000020700000402000000")+struct.pack("<L",diemethod)+bytes.fromhex("0000"))
|
||||
|
||||
if command[0] == "spawn" and len(command) > 1:
|
||||
await self.server.broadcast_message("Spawning " + command[1] + "")
|
||||
@ -78,6 +95,72 @@ class Commands:
|
||||
player.opts["debug"] = True
|
||||
await player.send_message("Debug enabled")
|
||||
|
||||
if command[0] == "record":
|
||||
self.recording = True
|
||||
self.recordingplayer = player
|
||||
await player.send_message("Recording next packet...", color=ChatColor.Cyan)
|
||||
|
||||
if command[0] == "replayshow":
|
||||
await player.send_message("Packet: %s" % (self.recorded.hex(),), color=ChatColor.Cyan)
|
||||
|
||||
if command[0] == "replay" or command[0] == "r" and len(command) == 1:
|
||||
await player.session.send_gamedata(self.recorded)
|
||||
await player.send_message("Sent packet %s to you" % (self.recorded.hex(),), color=ChatColor.Cyan)
|
||||
|
||||
if command[0] == "switch" and len(command) > 1:
|
||||
newweap = int(command[1])
|
||||
await player.send_message("Got you weapon %s" % newweap, color=ChatColor.Cyan)
|
||||
await self.server.broadcast_gamedata(MSG_SWITCH_WEAPON(player, newweap).to_packet())
|
||||
|
||||
if command[0] == "s":
|
||||
await player.send_message("Got you weapon %s" % (self.nextweapon,), color=ChatColor.Cyan)
|
||||
await self.server.broadcast_gamedata(MSG_SWITCH_WEAPON(player, self.nextweapon).to_packet())
|
||||
self.nextweapon += 1
|
||||
|
||||
if command[0] == "emptyweapons":
|
||||
for _ in range(4):
|
||||
await self.server.broadcast_gamedata(MSG_SWITCH_WEAPON(player, 0xff).to_packet())
|
||||
await player.send_message("Emptied your weapons", color=ChatColor.Cyan)
|
||||
|
||||
if command[0] == "sniper":
|
||||
p = Packet()
|
||||
p.putByte(0x20)
|
||||
p.putShort(self.server._nextid) # oid?
|
||||
self.server._nextid += 1
|
||||
p.putShort(0x0000)
|
||||
p.putShort(0x0440)
|
||||
p.putShort(0x0100)
|
||||
p.putFloat(0) # x
|
||||
p.putFloat(0) # y
|
||||
p.putFloat(0) # z
|
||||
p.putFloat(0) # o
|
||||
p.putFloat(0x621c68c1) # wtf?
|
||||
p.putShort(0x0000)
|
||||
p.putShort(0x7041) # oid?
|
||||
p.putShort(0x0000)
|
||||
p.putShort(0x0300)
|
||||
p.putLong(0x1e0000)
|
||||
p.putLong(0x0)
|
||||
p.putByte(0x00) # end
|
||||
await self.server.broadcast_gamedata(p.getvalue())
|
||||
|
||||
if len(command) > 1 and command[0] == "drop":
|
||||
weap = int(command[1])
|
||||
await player.send_message("Dropped weapon %s" % weap, color=ChatColor.Cyan)
|
||||
await self.server.broadcast_gamedata(MSG_DROP_WEAPON(player, self.server._nextid, weap, 255).to_packet())
|
||||
self.server._nextid += 1
|
||||
|
||||
if command[0] == "coords":
|
||||
await player.send_message("You are at (%s,%s,%s)" % (player.x, player.y, player.z), color=ChatColor.Cyan)
|
||||
|
||||
if command[0] == "tp":
|
||||
x = randint(-200,200)
|
||||
y = randint(-200,200)
|
||||
z = randint(-200,200)
|
||||
o = 0
|
||||
await player.send_message("Teleporting you to (%s,%s,%s)" % (x, y, z), color=ChatColor.Cyan)
|
||||
await self.server.broadcast_gamedata(MSG_PLAYER_TELEPORT(player, x, y, z, o).to_packet())
|
||||
|
||||
|
||||
def setup(server):
|
||||
plugin = Commands(server)
|
||||
|
59
plugins/instagib.py
Normal file
59
plugins/instagib.py
Normal file
@ -0,0 +1,59 @@
|
||||
from dpnet.packet import Packet
|
||||
from dpnet.gamepackets import *
|
||||
from random import randint
|
||||
|
||||
class Instagib:
|
||||
def __init__(self, server):
|
||||
self.server = server
|
||||
|
||||
async def on_player_spawn(self, player):
|
||||
await self.server.broadcast_message("%s has spawned" % player.name)
|
||||
|
||||
# random teleport
|
||||
await self.random_teleport(player)
|
||||
|
||||
# give stuff
|
||||
await self.give_stuff(player)
|
||||
|
||||
async def on_player_respawn(self, player):
|
||||
await self.server.broadcast_message("%s has respawned" % player.name)
|
||||
|
||||
# random teleport
|
||||
await self.random_teleport(player)
|
||||
|
||||
# give stuff
|
||||
await self.give_stuff(player)
|
||||
|
||||
async def on_player_shoot(self, player):
|
||||
await self.spawn_sniper(player)
|
||||
|
||||
async def on_player_hit(self, player, shooter, damage, weapon):
|
||||
# make player die
|
||||
await self.server.broadcast_gamedata(MSG_PLAYER_DIE(player, 1))
|
||||
|
||||
async def give_stuff(self, player):
|
||||
# remove current weapon
|
||||
await self.remove_current_weapon(player)
|
||||
|
||||
# add sniper
|
||||
await self.spawn_sniper(player)
|
||||
|
||||
async def spawn_sniper(self, player):
|
||||
await self.server.broadcast_gamedata(MSG_DROP_WEAPON(player, self.server._nextid, 6, 255).to_packet())
|
||||
self.server._nextid += 1
|
||||
|
||||
async def remove_current_weapon(self, player):
|
||||
await self.server.broadcast_gamedata(MSG_SWITCH_WEAPON(player, 0xff).to_packet())
|
||||
|
||||
async def random_teleport(self, player):
|
||||
# random teleport
|
||||
maxdist = 300
|
||||
x = randint(-(maxdist/2), maxdist/2)
|
||||
y = randint(-(maxdist/2), maxdist/2)
|
||||
z = randint(-(maxdist/2), maxdist/2)
|
||||
await self.server.broadcast_gamedata(MSG_PLAYER_TELEPORT(player, x, y, z).to_packet())
|
||||
|
||||
|
||||
def setup(server):
|
||||
plugin = Instagib(server)
|
||||
server.add_plugin(plugin)
|
18
server.py
18
server.py
@ -12,6 +12,7 @@ import traceback
|
||||
import asyncio
|
||||
from aioconsole import ainput
|
||||
import struct
|
||||
from curses import wrapper
|
||||
|
||||
logger = setup_logger(__name__)
|
||||
|
||||
@ -152,6 +153,19 @@ class Server:
|
||||
continue
|
||||
await pplayer.send_message(text, color=color, type=type)
|
||||
|
||||
async def new_object(self, model):
|
||||
oid = self._nextid
|
||||
p = Packet()
|
||||
p.putByte(0x05) # opcode
|
||||
p.putByte(0)
|
||||
p.putShort(self._nextid)
|
||||
p.putByte(0x00)
|
||||
p.putULong(model)
|
||||
p.putByte(0x00)
|
||||
self._nextid += 1
|
||||
await self.broadcast_gamedata(p.getvalue())
|
||||
return oid
|
||||
|
||||
async def spawn(self, player, model):
|
||||
plix = self.get_player_index(player)
|
||||
p = Packet()
|
||||
@ -264,13 +278,13 @@ class Server:
|
||||
return self.players[playerindex]
|
||||
|
||||
if __name__ == '__main__':
|
||||
server = Server(name="giantsd", maxplayers=20, register=False, teams=Teams.MvM) #, map=Map("Three Way Island - Canyons.gck"))
|
||||
server = Server(name="giantsd", maxplayers=20, register=False, teams=Teams.MvM, map=Map("Three Way Island - Canyons.gck")) #, map=Map("Three Way Island - Canyons.gck"))
|
||||
server.load_plugins()
|
||||
|
||||
loop = asyncio.get_event_loop()
|
||||
listen = loop.create_datagram_endpoint(lambda: Netserver(server), local_addr=(server.listen_ip, server.listen_port))
|
||||
transport, protocol = loop.run_until_complete(listen)
|
||||
#loop.create_task(server.ask_command())
|
||||
loop.create_task(server.ask_command())
|
||||
try:
|
||||
loop.run_forever()
|
||||
except KeyboardInterrupt:
|
||||
|
@ -6,7 +6,7 @@ def setup_logger(name):
|
||||
#_fh.setLevel("INFO")
|
||||
_ch = logging.StreamHandler()
|
||||
_ch.setLevel("DEBUG")
|
||||
_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||
_formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
|
||||
_ch.setFormatter(_formatter)
|
||||
#_fh.setFormatter(_formatter)
|
||||
logger = logging.getLogger(name)
|
||||
|
Loading…
Reference in New Issue
Block a user