summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormekolat <mekolat@users.noreply.github.com>2016-11-26 18:29:16 -0500
committerGitHub <noreply@github.com>2016-11-26 18:29:16 -0500
commitf604a13e791eecdef273d517f7f6f566383cde28 (patch)
treea800f235d032eb5434761cec0a47efaf775aa0a0
parent8c380d5b71de0c60866fdd95c6e8d1a54459123f (diff)
parent6d5919b4f782adc453106312c394cf1b7dd9e58f (diff)
downloadtmwa-16.11.27.tar.gz
tmwa-16.11.27.tar.bz2
tmwa-16.11.27.tar.xz
tmwa-16.11.27.zip
Merge pull request #226 from mekolat/settilesv16.11.27
Implement SMSG_MAP_SET_TILES_TYPE
-rw-r--r--src/map/clif.cpp18
-rw-r--r--src/map/clif.hpp1
-rw-r--r--src/map/script-fun.cpp33
-rwxr-xr-xtools/protocol.py20
4 files changed, 72 insertions, 0 deletions
diff --git a/src/map/clif.cpp b/src/map/clif.cpp
index 0bc6b8a..57c9dcb 100644
--- a/src/map/clif.cpp
+++ b/src/map/clif.cpp
@@ -3925,6 +3925,24 @@ void clif_remote_command(dumb_ptr<map_session_data> sd, XString cmd)
clif_send(buf, sd, SendWho::SELF, wrap<ClientVersion>(6));
}
+void clif_update_collision(dumb_ptr<map_session_data> sd, short x1, short y1,
+ short x2, short y2, MapName map_name, int mask)
+{
+ nullpo_retv(sd);
+
+ Packet_Fixed<0x0231> fixed_231;
+ fixed_231.x1 = x1;
+ fixed_231.y1 = y1;
+ fixed_231.x2 = x2;
+ fixed_231.y2 = y2;
+ fixed_231.mask = mask;
+ fixed_231.unused_layer = 0;
+ fixed_231.map = map_name;
+ Buffer buf = create_fpacket<0x0231, 34>(fixed_231);
+
+ clif_send(buf, sd, SendWho::SELF, wrap<ClientVersion>(7));
+}
+
void clif_change_music(dumb_ptr<map_session_data> sd, XString music)
{
nullpo_retv(sd);
diff --git a/src/map/clif.hpp b/src/map/clif.hpp
index 4783290..1d6365d 100644
--- a/src/map/clif.hpp
+++ b/src/map/clif.hpp
@@ -107,6 +107,7 @@ void clif_setnpcdirection_towards(dumb_ptr<map_session_data> sd, dumb_ptr<npc_da
void clif_npc_send_title(Session *s, BlockId npcid, XString msg);
void clif_server_message(dumb_ptr<map_session_data>, uint8_t, XString msg);
void clif_remote_command(dumb_ptr<map_session_data>, XString);
+void clif_update_collision(dumb_ptr<map_session_data>, short, short, short, short, MapName, int);
void clif_change_music(dumb_ptr<map_session_data> sd, XString music);
void clif_npc_action(dumb_ptr<map_session_data>, BlockId, short, int, short, short);
void clif_send_mask(dumb_ptr<map_session_data>, int);
diff --git a/src/map/script-fun.cpp b/src/map/script-fun.cpp
index 8ec0d4a..2036782 100644
--- a/src/map/script-fun.cpp
+++ b/src/map/script-fun.cpp
@@ -4187,6 +4187,38 @@ void builtin_remotecmd(ScriptState *st)
}
static
+void builtin_sendcollision(ScriptState *st)
+{
+ dumb_ptr<map_session_data> sd = script_rid2sd(st);
+ MapName map_name = stringish<MapName>(ZString(conv_str(st, &AARG(0))));
+ int mask = conv_num(st, &AARG(1));
+ short x1, y1, x2, y2;
+ x1 = x2 = conv_num(st, &AARG(2));
+ y1 = y2 = conv_num(st, &AARG(3));
+
+ if (HARG(5))
+ {
+ x2 = conv_num(st, &AARG(4));
+ y2 = conv_num(st, &AARG(5));
+ if (HARG(6))
+ {
+ CharName player = stringish<CharName>(ZString(conv_str(st, &AARG(6))));
+ sd = map_nick2sd(player);
+ }
+ }
+
+ else if (HARG(4))
+ {
+ CharName player = stringish<CharName>(ZString(conv_str(st, &AARG(4))));
+ sd = map_nick2sd(player);
+ }
+
+ if (sd == nullptr)
+ return;
+ clif_update_collision(sd, x1, y1, x2, y2, map_name, mask);
+}
+
+static
void builtin_music(ScriptState *st)
{
dumb_ptr<map_session_data> sd = script_rid2sd(st);
@@ -4818,6 +4850,7 @@ BuiltinFunction builtin_functions[] =
BUILTIN(title, "s"_s, '\0'),
BUILTIN(smsg, "e??"_s, '\0'),
BUILTIN(remotecmd, "s?"_s, '\0'),
+ BUILTIN(sendcollision, "Mixy???"_s, '\0'),
BUILTIN(music, "s"_s, '\0'),
BUILTIN(mapmask, "i?"_s, '\0'),
BUILTIN(getmask, ""_s, 'i'),
diff --git a/tools/protocol.py b/tools/protocol.py
index 5a9e05c..7a5542a 100755
--- a/tools/protocol.py
+++ b/tools/protocol.py
@@ -4796,6 +4796,26 @@ def build_context():
Execute a client command remotely
''',
)
+ map_user.s(0x0231, 'send area collision',
+ define='SMSG_MAP_SET_TILES_TYPE',
+ fixed=[
+ at(0, u16, 'packet id'),
+ at(2, u16, 'x1'),
+ at(4, u16, 'y1'),
+ at(6, u16, 'x2'),
+ at(8, u16, 'y2'),
+ at(10, u32, 'mask'),
+ at(14, u32, 'unused layer'),
+ at(18, map_name, 'map'),
+ ],
+ fixed_size=34,
+ pre=[NOTHING],
+ post=[PRETTY],
+ desc='''
+ Set updated collision for a square area
+ ''',
+ )
+
# TOC_LOGINCHAR
# login char