summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt3
-rw-r--r--doc/script_commands.txt19
-rw-r--r--src/map/clif.c22
-rw-r--r--src/map/clif.h1
-rw-r--r--src/map/script.c67
5 files changed, 111 insertions, 1 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 27b01379a..20a2bb91d 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -3,6 +3,9 @@ Date Added
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
+2010/06/09
+ * Added support for packet 0x7fe which changes the bgm temporarily for a single player [Rikter/Yommy]
+ * Added 2 script commands, playBGM and playBGMall, documented use in doc/script_commands.txt [Rikter/Yommy]
2010/06/01
* Rev. 14329 Corrected warnings (and errors on some compilers) from r14327. [L0ne_W0lf]
* Rev. 14327 Implemented the Manuk and Splendide item status effects, thanks to Epoque. [L0ne_W0lf]
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index d690471bc..fe6f1663d 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -6035,6 +6035,25 @@ You can add your own effects this way, naturally.
---------------------------------------
+*playBGM "<BGM filename>"
+*playBGMall "<BGM filename>",{,"<map name>"}{,<x0>,<y0>,<x1>,<y1>}
+
+These two commands will play a Background Music to either the invoking character
+only ('playBGM') or multiple characters ('playBGMall'). If the running
+code does not have an object ID (a 'floating' npc) or is not running from an NPC
+object at all (an item script) the sound will be centered on the character who's
+RID got attached to the script, if any. If it does, it will be centered on that
+object. (an NPC sprite)
+
+BGM filename is the filename in /BGM/ folder. It has to be in .mp3 extension.
+
+It's not required to specify the extension inside the script.
+If coordinates are omitted, BGM will be broadcasted on the entire map.
+
+You can add your own BGMs this way, naturally.
+
+---------------------------------------
+
*pvpon "<map name>";
*pvpoff "<map name>";
diff --git a/src/map/clif.c b/src/map/clif.c
index c63722a32..75797a821 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -7350,6 +7350,26 @@ int clif_wisall(struct map_session_data *sd,int type,int flag)
return 0;
}
+
+/*==========================================
+ * Play a BGM! [Rikter/Yommy]
+ *------------------------------------------*/
+void clif_playBGM(struct map_session_data* sd, struct block_list* bl, const char* name)
+{
+ int fd;
+
+ nullpo_retv(sd);
+ nullpo_retv(bl);
+
+ fd = sd->fd;
+ WFIFOHEAD(fd,packet_len(0x7fe));
+ WFIFOW(fd,0) = 0x7fe;
+ safestrncpy((char*)WFIFOP(fd,2), name, NAME_LENGTH);
+ WFIFOSET(fd,packet_len(0x7fe));
+
+ return;
+}
+
/*==========================================
* サウンドエフェクト
*------------------------------------------*/
@@ -13946,7 +13966,7 @@ static int packetdb_readdb(void)
6, 2, -1, 4, 4, 4, 4, 8, 8,268, 6, 8, 6, 54, 30, 54,
#endif
0, 0, 0, 0, 0, 8, 8, 32, -1, 5, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 14, 93, 86, 87, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 14, 93, 86, 87, 0, 0, 0, 0, 26, 0,
//#0x0800
-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
diff --git a/src/map/clif.h b/src/map/clif.h
index 61962bf99..090ed71a2 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -156,6 +156,7 @@ void clif_talkiebox(struct block_list* bl, const char* talkie);
void clif_wedding_effect(struct block_list *bl);
void clif_divorced(struct map_session_data* sd, const char* name);
//void clif_callpartner(struct map_session_data *sd);
+void clif_playBGM(struct map_session_data* sd, struct block_list* bl, const char* name);
void clif_soundeffect(struct map_session_data* sd, struct block_list* bl, const char* name, int type);
int clif_soundeffectall(struct block_list* bl, const char *name, int type, enum send_target coverage);
void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, int target_id, unsigned int tick);
diff --git a/src/map/script.c b/src/map/script.c
index f6b41331f..c3ad39a8e 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -10636,6 +10636,71 @@ BUILDIN_FUNC(misceffect)
return 0;
}
/*==========================================
+ * Play a BGM on a single client [Rikter/Yommy]
+ *------------------------------------------*/
+BUILDIN_FUNC(playBGM)
+{
+ TBL_PC* sd = script_rid2sd(st);
+ const char* name = script_getstr(st,2);
+
+ if(sd)
+ {
+ if(!st->rid)
+ clif_playBGM(sd,map_id2bl(st->oid),name);
+ else
+ clif_playBGM(sd,&sd->bl,name);
+ }
+
+ return 0;
+}
+
+int playBGM_sub(struct block_list* bl,va_list ap)
+{
+ char* name = va_arg(ap,char*);
+
+ clif_playBGM((TBL_PC *)bl, bl, name);
+
+ return 0;
+}
+
+/*==========================================
+ * Play a BGM on multiple client [Rikter/Yommy]
+ *------------------------------------------*/
+BUILDIN_FUNC(playBGMall)
+{
+ struct block_list* bl;
+ const char* name;
+
+ bl = (st->rid) ? &(script_rid2sd(st)->bl) : map_id2bl(st->oid);
+ if (!bl)
+ return 0;
+
+ name = script_getstr(st,2);
+
+ if(script_hasdata(st,7))
+ { // specified part of map
+ const char* map = script_getstr(st,3);
+ int x0 = script_getnum(st,4);
+ int y0 = script_getnum(st,5);
+ int x1 = script_getnum(st,6);
+ int y1 = script_getnum(st,7);
+ map_foreachinarea(playBGM_sub, map_mapname2mapid(map), x0, y0, x1, y1, BL_PC, name);
+ }
+ else
+ if(!script_hasdata(st,7))
+ { // entire map
+ const char* map = script_getstr(st,3);
+ map_foreachinmap(playBGM_sub, map_mapname2mapid(map), BL_PC, name);
+ }
+ else
+ {
+ ShowError("buildin_playBGMall: insufficient arguments for specific area broadcast.\n");
+ }
+
+ return 0;
+}
+
+/*==========================================
* サウンドエフェクト
*------------------------------------------*/
BUILDIN_FUNC(soundeffect)
@@ -14504,6 +14569,8 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(clearitem,""),
BUILDIN_DEF(classchange,"ii"),
BUILDIN_DEF(misceffect,"i"),
+ BUILDIN_DEF(playBGM,"s"),
+ BUILDIN_DEF(playBGMall,"s*"),
BUILDIN_DEF(soundeffect,"si"),
BUILDIN_DEF(soundeffectall,"si*"), // SoundEffectAll [Codemaster]
BUILDIN_DEF(strmobinfo,"ii"), // display mob data [Valaris]