* Merged changes from trunk [14688:14739/trunk].
git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/renewal@14740 54d463be-8e91-2dee-dedb-b68131a5f0ec
18
Makefile.in
@ -2,7 +2,7 @@
|
||||
|
||||
HAVE_MYSQL=@HAVE_MYSQL@
|
||||
ifeq ($(HAVE_MYSQL),yes)
|
||||
ALL_DEPENDS=common common_sql login login_sql char char_sql map map_sql tools converters plugins import save
|
||||
ALL_DEPENDS=common common_sql login login_sql char char_sql map map_sql tools converters import save
|
||||
SQL_DEPENDS=common_sql login_sql char_sql map_sql import save
|
||||
COMMON_SQL_DEPENDS=
|
||||
LOGIN_SQL_DEPENDS=common_sql
|
||||
@ -10,7 +10,7 @@ ifeq ($(HAVE_MYSQL),yes)
|
||||
MAP_SQL_DEPENDS=common_sql
|
||||
CONVERTERS_DEPENDS=common_sql
|
||||
else
|
||||
ALL_DEPENDS=common login char map tools plugins import save
|
||||
ALL_DEPENDS=common login char map tools import save
|
||||
SQL_DEPENDS=needs_mysql
|
||||
COMMON_SQL_DEPENDS=needs_mysql
|
||||
LOGIN_SQL_DEPENDS=needs_mysql
|
||||
@ -19,6 +19,14 @@ else
|
||||
CONVERTERS_DEPENDS=needs_mysql
|
||||
endif
|
||||
|
||||
WITH_PLUGINS=@WITH_PLUGINS@
|
||||
ifeq ($(WITH_PLUGINS),yes)
|
||||
ALL_DEPENDS+=plugins
|
||||
PLUGIN_DEPENDS=common
|
||||
else
|
||||
PLUGIN_DEPENDS=no_plugins
|
||||
endif
|
||||
|
||||
#####################################################################
|
||||
.PHONY: txt sql conf \
|
||||
common common_sql \
|
||||
@ -66,7 +74,7 @@ tools:
|
||||
converters: $(CONVERTERS_DEPENDS)
|
||||
@$(MAKE) -C src/txt-converter
|
||||
|
||||
plugins addons: common
|
||||
plugins addons: $(PLUGIN_DEPENDS)
|
||||
@$(MAKE) -C src/plugins
|
||||
|
||||
import:
|
||||
@ -129,6 +137,10 @@ needs_mysql:
|
||||
@echo "MySQL not found or disabled by the configure script"
|
||||
@exit 1
|
||||
|
||||
no_plugins:
|
||||
@echo "Plugins disabled by the configure script"
|
||||
@exit 1
|
||||
|
||||
#####################################################################
|
||||
# TODO
|
||||
|
||||
|
@ -1,5 +1,16 @@
|
||||
Date Added
|
||||
|
||||
2011/03/06
|
||||
* Rev. 14732 Added search store info related settings. [Ai4rei]
|
||||
2011/02/23
|
||||
* Rev. 14724 Made autotrade error message store type-neutral, as it is used for buying stores now as well. [Ai4rei]
|
||||
2011/02/19
|
||||
* Rev. 14713 Added map-server feature settings file 'battle/feature.conf'. [Ai4rei]
|
||||
- Added setting 'feature.buying_store' to enable/disable the buying store system.
|
||||
2011/02/15
|
||||
* Rev. 14707 Added map-server battle setting 'gm_check_minlevel'. [Ai4rei]
|
||||
2011/02/06
|
||||
* Rev. 14700 Added char-server setting 'char_del_delay'. [Ai4rei]
|
||||
2011/01/13
|
||||
* Rev. 14667 Removed ladmin settings (ladmin_athena.conf) and login-server settings for ladmin (login_athena.conf) (topic:262934). [Ai4rei]
|
||||
2010/12/30
|
||||
|
28
conf/battle/feature.conf
Normal file
@ -0,0 +1,28 @@
|
||||
// ______ __ __
|
||||
// /\ _ \/\ \__/\ \
|
||||
// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
|
||||
// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
|
||||
///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
|
||||
//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
|
||||
// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
|
||||
// _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
|
||||
//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
|
||||
// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
|
||||
//
|
||||
//--------------------------------------------------------------
|
||||
// eAthena Feature Configuration File
|
||||
//--------------------------------------------------------------
|
||||
// Note 1: Value is a config switch (on/off, yes/no or 1/0)
|
||||
// Note 2: Value is in percents (100 means 100%)
|
||||
// Note 3: Value is a bit field. If no description is given,
|
||||
// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun)
|
||||
//--------------------------------------------------------------
|
||||
|
||||
// Buying store (Note 1)
|
||||
// Requires: 2010-04-27aRagexeRE or later
|
||||
feature.buying_store: on
|
||||
|
||||
// Search stores (Note 1)
|
||||
// Requires: 2010-08-03aRagexeRE or later
|
||||
feature.search_stores: on
|
@ -116,3 +116,7 @@ title_lvl5: 50
|
||||
title_lvl6: 60
|
||||
title_lvl7: 80
|
||||
title_lvl8: 99
|
||||
|
||||
// Minimum GM level required for client command /check (display character status) to work.
|
||||
// Default: 60
|
||||
gm_check_minlevel: 60
|
||||
|
@ -121,3 +121,10 @@ auction_feeperhour: 12000
|
||||
|
||||
// Auction maximum sell price
|
||||
auction_maximumprice: 500000000
|
||||
|
||||
// Minimum delay between each store search query in seconds.
|
||||
searchstore_querydelay: 10
|
||||
|
||||
// Maximum amount of results a store search query may yield, before
|
||||
// it is canceled.
|
||||
searchstore_maxresults: 30
|
||||
|
@ -59,3 +59,7 @@ idle_no_share: no
|
||||
// Give additional experience bonus per party-member involved on even-share parties?
|
||||
// (eg: If set to 10, a even-share party of 5 people will receive +40% exp)
|
||||
party_even_share_bonus: 0
|
||||
|
||||
// Display party name regardless if player is in a guild.
|
||||
// Official servers do not display party name unless the user is in a guild. (Note 1)
|
||||
display_party_name: no
|
||||
|
@ -62,6 +62,9 @@ import: conf/battle/skill.conf
|
||||
//Status change related settings
|
||||
import: conf/battle/status.conf
|
||||
|
||||
//Feature control (on/off) settings
|
||||
import: conf/battle/feature.conf
|
||||
|
||||
// Anything else that didn't fit anywhere else.
|
||||
// Includes duel, day/night, mute/manner, log settings.
|
||||
import: conf/battle/misc.conf
|
||||
|
@ -166,6 +166,11 @@ chars_per_account: 0
|
||||
// e.g. char_del_level: 80 (players can't delete characters with 80+ BaseLevel)
|
||||
char_del_level: 0
|
||||
|
||||
// Amount of time in seconds by which the character deletion is delayed.
|
||||
// Default: 86400 (24 hours)
|
||||
// NOTE: Requires client 2010-08-03aragexeRE or newer.
|
||||
char_del_delay: 86400
|
||||
|
||||
// What folder the DB files are in (item_db.txt, etc.)
|
||||
db_path: db
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
// 2048 - (R) Log items placed/retrieved from storage.
|
||||
// 4096 - (G) Log items placed/retrieved from guild storage.
|
||||
// 8192 - (E) Log mail system transactions.
|
||||
// 16384 - (B) Log buying store transactions
|
||||
// Example: Log trades+vending+script items+created items: 2+4+64+1024 = 1094
|
||||
enable_logs: 1
|
||||
|
||||
|
@ -5,6 +5,7 @@
|
||||
//= eAthena Dev Team
|
||||
//= 1.0 [Komurka]
|
||||
//= 1.1 Added WoE:SE Map restrictions. [L0ne_W0lf]
|
||||
//= 1.2 Added Endless Tower Restrictions. (bugreport:4707) [L0ne_W0lf]
|
||||
//===== Current Version: =====================================
|
||||
|
||||
//Aldebaran Turbo Track
|
||||
@ -45,3 +46,11 @@ arug_cas05 mapflag restricted 4
|
||||
//Sealed Shrine ==================
|
||||
1@cata mapflag restricted 5
|
||||
2@cata mapflag restricted 5
|
||||
|
||||
//Endless Tower ==================
|
||||
1@tower mapflag restricted 6
|
||||
2@tower mapflag restricted 6
|
||||
3@tower mapflag restricted 6
|
||||
4@tower mapflag restricted 6
|
||||
5@tower mapflag restricted 6
|
||||
6@tower mapflag restricted 6
|
||||
|
@ -423,12 +423,7 @@
|
||||
502: Day Mode is activated
|
||||
503: Night Mode is activated
|
||||
|
||||
//Supernovice's Guardian Angel
|
||||
//actually.. new client msgtxt file contains these 3 lines... [Lupus]
|
||||
//----------------------------
|
||||
504: Guardian Angel, can you hear my voice? ^^;
|
||||
505: My name is %s, and I'm a Super Novice~
|
||||
506: Please help me~ T.T
|
||||
// 504~506 are not used (previously super novice's guardian angel prayer)
|
||||
|
||||
// Trade Spoof Messages
|
||||
507: This player has been banned for %d minute(s).
|
||||
@ -455,7 +450,7 @@
|
||||
//542: %.0s%.0sSomeone stole %s
|
||||
// 543~548 are not used (previously @away messages)
|
||||
// @Autotrade
|
||||
549: You should be vending to use @autotrade.
|
||||
549: You should have a shop open to use @autotrade.
|
||||
|
||||
//550 -> 650: Job Names
|
||||
550: Novice
|
||||
|
339
configure
vendored
@ -1,5 +1,5 @@
|
||||
#! /bin/sh
|
||||
# From configure.in Revision: 13486 .
|
||||
# From configure.in Revision: 14708 .
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.59.
|
||||
#
|
||||
@ -311,7 +311,7 @@ ac_includes_default="\
|
||||
# include <unistd.h>
|
||||
#endif"
|
||||
|
||||
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP MYSQL_CONFIG_HOME HAVE_MYSQL MYSQL_VERSION MYSQL_CFLAGS MYSQL_LIBS HAVE_PCRE PCRE_LIBS PCRE_CFLAGS DLLEXT LIBOBJS LTLIBOBJS'
|
||||
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP WITH_PLUGINS EGREP MYSQL_CONFIG_HOME HAVE_MYSQL MYSQL_VERSION MYSQL_CFLAGS MYSQL_LIBS HAVE_PCRE PCRE_LIBS PCRE_CFLAGS DLLEXT LIBOBJS LTLIBOBJS'
|
||||
ac_subst_files=''
|
||||
|
||||
# Initialize some variables set by options.
|
||||
@ -1333,7 +1333,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
||||
|
||||
ac_config_files="$ac_config_files Makefile src/common/Makefile"
|
||||
|
||||
ac_config_files="$ac_config_files src/char/Makefile src/login/Makefile"
|
||||
ac_config_files="$ac_config_files src/char/Makefile src/login/Makefile"
|
||||
|
||||
ac_config_files="$ac_config_files src/char_sql/Makefile src/txt-converter/Makefile"
|
||||
|
||||
@ -3257,6 +3257,240 @@ fi
|
||||
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||
|
||||
|
||||
echo "$as_me:$LINENO: checking whether $CC supports -fPIC" >&5
|
||||
echo $ECHO_N "checking whether $CC supports -fPIC... $ECHO_C" >&6
|
||||
OLD_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -fPIC"
|
||||
cat >conftest.$ac_ext <<_ACEOF
|
||||
int foo;
|
||||
_ACEOF
|
||||
rm -f conftest.$ac_objext
|
||||
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
|
||||
(eval $ac_compile) 2>conftest.er1
|
||||
ac_status=$?
|
||||
grep -v '^ *+' conftest.er1 >conftest.err
|
||||
rm -f conftest.er1
|
||||
cat conftest.err >&5
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); } &&
|
||||
{ ac_try='test -z "$ac_c_werror_flag"
|
||||
|| test ! -s conftest.err'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; } &&
|
||||
{ ac_try='test -s conftest.$ac_objext'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; }; then
|
||||
|
||||
echo "$as_me:$LINENO: result: yes" >&5
|
||||
echo "${ECHO_T}yes" >&6
|
||||
compiler_supports_pic="yes"
|
||||
|
||||
else
|
||||
echo "$as_me: failed program was:" >&5
|
||||
sed 's/^/| /' conftest.$ac_ext >&5
|
||||
|
||||
|
||||
echo "$as_me:$LINENO: result: no" >&5
|
||||
echo "${ECHO_T}no" >&6
|
||||
compiler_supports_pic="no"
|
||||
|
||||
|
||||
fi
|
||||
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||
CFLAGS="$OLD_CFLAGS"
|
||||
|
||||
|
||||
#
|
||||
# -shared needs position independent code; some platforms emit it
|
||||
# always, others need -fPIC
|
||||
#
|
||||
echo "$as_me:$LINENO: checking whether $CC needs -fPIC for shared objects" >&5
|
||||
echo $ECHO_N "checking whether $CC needs -fPIC for shared objects... $ECHO_C" >&6
|
||||
OLD_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -shared"
|
||||
WITH_PLUGINS="yes"
|
||||
cat >conftest.$ac_ext <<_ACEOF
|
||||
|
||||
int foo(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
_ACEOF
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
|
||||
(eval $ac_link) 2>conftest.er1
|
||||
ac_status=$?
|
||||
grep -v '^ *+' conftest.er1 >conftest.err
|
||||
rm -f conftest.er1
|
||||
cat conftest.err >&5
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); } &&
|
||||
{ ac_try='test -z "$ac_c_werror_flag"
|
||||
|| test ! -s conftest.err'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; } &&
|
||||
{ ac_try='test -s conftest$ac_exeext'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; }; then
|
||||
|
||||
echo "$as_me:$LINENO: result: no" >&5
|
||||
echo "${ECHO_T}no" >&6
|
||||
CFLAGS="$OLD_CFLAGS"
|
||||
|
||||
else
|
||||
echo "$as_me: failed program was:" >&5
|
||||
sed 's/^/| /' conftest.$ac_ext >&5
|
||||
|
||||
|
||||
if test "$compiler_supports_pic" = "yes" ; then
|
||||
# Verify if -shared really fails due to lack of -fPIC or something else
|
||||
CFLAGS="$CFLAGS -fPIC"
|
||||
cat >conftest.$ac_ext <<_ACEOF
|
||||
|
||||
int foo(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
_ACEOF
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
|
||||
(eval $ac_link) 2>conftest.er1
|
||||
ac_status=$?
|
||||
grep -v '^ *+' conftest.er1 >conftest.err
|
||||
rm -f conftest.er1
|
||||
cat conftest.err >&5
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); } &&
|
||||
{ ac_try='test -z "$ac_c_werror_flag"
|
||||
|| test ! -s conftest.err'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; } &&
|
||||
{ ac_try='test -s conftest$ac_exeext'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; }; then
|
||||
|
||||
echo "$as_me:$LINENO: result: yes" >&5
|
||||
echo "${ECHO_T}yes" >&6
|
||||
CFLAGS="$OLD_CFLAGS -fPIC"
|
||||
|
||||
else
|
||||
echo "$as_me: failed program was:" >&5
|
||||
sed 's/^/| /' conftest.$ac_ext >&5
|
||||
|
||||
|
||||
echo "$as_me:$LINENO: result: no, but fails for another reason" >&5
|
||||
echo "${ECHO_T}no, but fails for another reason" >&6
|
||||
{ { echo "$as_me:$LINENO: error: compiler is unable to compile shared objects for an unhandled reason, please report this with attached config.log... stopping" >&5
|
||||
echo "$as_me: error: compiler is unable to compile shared objects for an unhandled reason, please report this with attached config.log... stopping" >&2;}
|
||||
{ (exit 1); exit 1; }; }
|
||||
|
||||
|
||||
fi
|
||||
rm -f conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
else
|
||||
# Disable compilation of plugins (optional), so 'make all' does not fail
|
||||
echo "$as_me:$LINENO: result: yes, but unsupported" >&5
|
||||
echo "${ECHO_T}yes, but unsupported" >&6
|
||||
{ echo "$as_me:$LINENO: compiler is unable to generate position independent code, disabled plugins (optional)" >&5
|
||||
echo "$as_me: compiler is unable to generate position independent code, disabled plugins (optional)" >&6;}
|
||||
WITH_PLUGINS="no"
|
||||
fi
|
||||
|
||||
|
||||
fi
|
||||
rm -f conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
|
||||
|
||||
|
||||
#
|
||||
# DB_MANUAL_CAST_TO_UNION
|
||||
#
|
||||
echo "$as_me:$LINENO: checking whether $CC is able to typecast to union" >&5
|
||||
echo $ECHO_N "checking whether $CC is able to typecast to union... $ECHO_C" >&6
|
||||
cat >conftest.$ac_ext <<_ACEOF
|
||||
|
||||
typedef union Foonion
|
||||
{
|
||||
int i;
|
||||
unsigned int ui;
|
||||
const char* s;
|
||||
}
|
||||
Foonion;
|
||||
|
||||
int bar(Foonion onion)
|
||||
{
|
||||
return onion.i;
|
||||
}
|
||||
|
||||
int foo(void)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
return bar(((Foonion)(int)i));
|
||||
}
|
||||
|
||||
_ACEOF
|
||||
rm -f conftest.$ac_objext
|
||||
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
|
||||
(eval $ac_compile) 2>conftest.er1
|
||||
ac_status=$?
|
||||
grep -v '^ *+' conftest.er1 >conftest.err
|
||||
rm -f conftest.er1
|
||||
cat conftest.err >&5
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); } &&
|
||||
{ ac_try='test -z "$ac_c_werror_flag"
|
||||
|| test ! -s conftest.err'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; } &&
|
||||
{ ac_try='test -s conftest.$ac_objext'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; }; then
|
||||
|
||||
echo "$as_me:$LINENO: result: yes" >&5
|
||||
echo "${ECHO_T}yes" >&6
|
||||
|
||||
else
|
||||
echo "$as_me: failed program was:" >&5
|
||||
sed 's/^/| /' conftest.$ac_ext >&5
|
||||
|
||||
|
||||
echo "$as_me:$LINENO: result: no" >&5
|
||||
echo "${ECHO_T}no" >&6
|
||||
CFLAGS="$CFLAGS -DDB_MANUAL_CAST_TO_UNION"
|
||||
|
||||
|
||||
fi
|
||||
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||
|
||||
|
||||
###############################################################################
|
||||
# Check for libraries and header files.
|
||||
@ -3362,6 +3596,104 @@ fi
|
||||
|
||||
|
||||
|
||||
#
|
||||
# strnlen - string length with upper scan bound
|
||||
#
|
||||
echo "$as_me:$LINENO: checking for strnlen" >&5
|
||||
echo $ECHO_N "checking for strnlen... $ECHO_C" >&6
|
||||
if test "${ac_cv_func_strnlen+set}" = set; then
|
||||
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||
else
|
||||
cat >conftest.$ac_ext <<_ACEOF
|
||||
/* confdefs.h. */
|
||||
_ACEOF
|
||||
cat confdefs.h >>conftest.$ac_ext
|
||||
cat >>conftest.$ac_ext <<_ACEOF
|
||||
/* end confdefs.h. */
|
||||
/* Define strnlen to an innocuous variant, in case <limits.h> declares strnlen.
|
||||
For example, HP-UX 11i <limits.h> declares gettimeofday. */
|
||||
#define strnlen innocuous_strnlen
|
||||
|
||||
/* System header to define __stub macros and hopefully few prototypes,
|
||||
which can conflict with char strnlen (); below.
|
||||
Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
|
||||
<limits.h> exists even on freestanding compilers. */
|
||||
|
||||
#ifdef __STDC__
|
||||
# include <limits.h>
|
||||
#else
|
||||
# include <assert.h>
|
||||
#endif
|
||||
|
||||
#undef strnlen
|
||||
|
||||
/* Override any gcc2 internal prototype to avoid an error. */
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
/* We use char because int might match the return type of a gcc2
|
||||
builtin and then its argument prototype would still apply. */
|
||||
char strnlen ();
|
||||
/* The GNU C library defines this for functions which it implements
|
||||
to always fail with ENOSYS. Some functions are actually named
|
||||
something starting with __ and the normal name is an alias. */
|
||||
#if defined (__stub_strnlen) || defined (__stub___strnlen)
|
||||
choke me
|
||||
#else
|
||||
char (*f) () = strnlen;
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return f != strnlen;
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
|
||||
(eval $ac_link) 2>conftest.er1
|
||||
ac_status=$?
|
||||
grep -v '^ *+' conftest.er1 >conftest.err
|
||||
rm -f conftest.er1
|
||||
cat conftest.err >&5
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); } &&
|
||||
{ ac_try='test -z "$ac_c_werror_flag"
|
||||
|| test ! -s conftest.err'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; } &&
|
||||
{ ac_try='test -s conftest$ac_exeext'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; }; then
|
||||
ac_cv_func_strnlen=yes
|
||||
else
|
||||
echo "$as_me: failed program was:" >&5
|
||||
sed 's/^/| /' conftest.$ac_ext >&5
|
||||
|
||||
ac_cv_func_strnlen=no
|
||||
fi
|
||||
rm -f conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
fi
|
||||
echo "$as_me:$LINENO: result: $ac_cv_func_strnlen" >&5
|
||||
echo "${ECHO_T}$ac_cv_func_strnlen" >&6
|
||||
if test $ac_cv_func_strnlen = yes; then
|
||||
CFLAGS="$CFLAGS -DHAVE_STRNLEN"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
#
|
||||
# Memory manager
|
||||
@ -5725,6 +6057,7 @@ s,@ac_ct_CC@,$ac_ct_CC,;t t
|
||||
s,@EXEEXT@,$EXEEXT,;t t
|
||||
s,@OBJEXT@,$OBJEXT,;t t
|
||||
s,@CPP@,$CPP,;t t
|
||||
s,@WITH_PLUGINS@,$WITH_PLUGINS,;t t
|
||||
s,@EGREP@,$EGREP,;t t
|
||||
s,@MYSQL_CONFIG_HOME@,$MYSQL_CONFIG_HOME,;t t
|
||||
s,@HAVE_MYSQL@,$HAVE_MYSQL,;t t
|
||||
|
107
configure.in
@ -339,6 +339,108 @@ AC_COMPILE_IFELSE(
|
||||
)
|
||||
|
||||
|
||||
AC_MSG_CHECKING([whether $CC supports -fPIC])
|
||||
OLD_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -fPIC"
|
||||
AC_COMPILE_IFELSE(
|
||||
[int foo;],
|
||||
[
|
||||
AC_MSG_RESULT([yes])
|
||||
compiler_supports_pic="yes"
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT([no])
|
||||
compiler_supports_pic="no"
|
||||
]
|
||||
)
|
||||
CFLAGS="$OLD_CFLAGS"
|
||||
|
||||
|
||||
#
|
||||
# -shared needs position independent code; some platforms emit it
|
||||
# always, others need -fPIC
|
||||
#
|
||||
AC_MSG_CHECKING([whether $CC needs -fPIC for shared objects])
|
||||
OLD_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -shared"
|
||||
WITH_PLUGINS="yes"
|
||||
AC_LINK_IFELSE(
|
||||
[
|
||||
int foo(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT([no])
|
||||
CFLAGS="$OLD_CFLAGS"
|
||||
],
|
||||
[
|
||||
if test "$compiler_supports_pic" = "yes" ; then
|
||||
# Verify if -shared really fails due to lack of -fPIC or something else
|
||||
CFLAGS="$CFLAGS -fPIC"
|
||||
AC_LINK_IFELSE(
|
||||
[
|
||||
int foo(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT([yes])
|
||||
CFLAGS="$OLD_CFLAGS -fPIC"
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT([no, but fails for another reason])
|
||||
AC_MSG_ERROR([compiler is unable to compile shared objects for an unhandled reason, please report this with attached config.log... stopping])
|
||||
]
|
||||
)
|
||||
else
|
||||
# Disable compilation of plugins (optional), so 'make all' does not fail
|
||||
AC_MSG_RESULT([yes, but unsupported])
|
||||
AC_MSG_NOTICE([compiler is unable to generate position independent code, disabled plugins (optional)])
|
||||
WITH_PLUGINS="no"
|
||||
fi
|
||||
]
|
||||
)
|
||||
AC_SUBST([WITH_PLUGINS])
|
||||
|
||||
|
||||
#
|
||||
# DB_MANUAL_CAST_TO_UNION
|
||||
#
|
||||
AC_MSG_CHECKING([whether $CC is able to typecast to union])
|
||||
AC_COMPILE_IFELSE(
|
||||
[
|
||||
typedef union Foonion
|
||||
{
|
||||
int i;
|
||||
unsigned int ui;
|
||||
const char* s;
|
||||
}
|
||||
Foonion;
|
||||
|
||||
int bar(Foonion onion)
|
||||
{
|
||||
return onion.i;
|
||||
}
|
||||
|
||||
int foo(void)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
return bar(((Foonion)(int)i));
|
||||
}
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT([yes])
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT([no])
|
||||
CFLAGS="$CFLAGS -DDB_MANUAL_CAST_TO_UNION"
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
###############################################################################
|
||||
# Check for libraries and header files.
|
||||
@ -351,6 +453,11 @@ AC_COMPILE_IFELSE(
|
||||
AC_CHECK_FUNC([setrlimit],[CFLAGS="$CFLAGS -DHAVE_SETRLIMIT"])
|
||||
|
||||
|
||||
#
|
||||
# strnlen - string length with upper scan bound
|
||||
#
|
||||
AC_CHECK_FUNC([strnlen],[CFLAGS="$CFLAGS -DHAVE_STRNLEN"])
|
||||
|
||||
|
||||
#
|
||||
# Memory manager
|
||||
|
@ -9,6 +9,18 @@
|
||||
13005 Angelic Wing Dagger: NEED INFO.
|
||||
=======================
|
||||
|
||||
2011/03/06
|
||||
* Rev. 14732 Added Universal Catalog Silver, Gold and Bronze and their respective boxes. [Ai4rei]
|
||||
- Updated packet info related to search store info.
|
||||
2011/02/19
|
||||
* Rev. 14713 Database updates required by buying store system implementation. [Ai4rei]
|
||||
- Added database of items, that can be sold to a buying store (item_buyingstore.txt).
|
||||
- Added items Buy_Stall_Permit (6377) and Shabby_Purchase_Street_Stall_License (12548).
|
||||
- Updated packet database with buying store related packets.
|
||||
- Added skill 'Open Buying Store' (ALL_BUYING_STORE).
|
||||
2011/02/06
|
||||
* Rev. 14697 Added the missing restricted skills to zone 6 for Endless Tower. (bugreport:4707) [L0ne_W0lf]
|
||||
* Adjusted the rates for item using bAddEffOnSkill bonus.
|
||||
2011/01/23
|
||||
* Rev. 14679 Updated Aegis NPC ID constants from current npcidentity.lub (bugreport:4706). [Ai4rei]
|
||||
- Fixes some incorrect NPC ID constants (since r12780).
|
||||
|
1013
db/item_buyingstore.txt
Normal file
@ -684,7 +684,7 @@
|
||||
1382,Krieger_Twohand_Axe1,Glorious Two-Handed Axe,4,0,,0,220,,1,0,0x000444A2,7,2,34,4,80,1,7,{ bonus2 bAddRace,RC_DemiHuman,70; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(getrefine() > 5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-3)*(getrefine()-3); bonus2 bIgnoreDefRate,RC_DemiHuman,5; bonus3 bAutoSpell,"NPC_CRITICALWOUND",1,50; } if(getrefine() > 8) { bonus3 bAutoSpell,"NPC_CRITICALWOUND",1,100; bonus4 bAutoSpellOnSkill,"MC_MAMMONITE","NPC_CRITICALWOUND",2,200; bonus4 bAutoSpellOnSkill,"WS_CARTTERMINATION","NPC_CRITICALWOUND",2,200; } },{},{}
|
||||
1383,Holy_Celestial_Axe,Celestial Axe,4,0,,1500,250,,1,0,0x000444A2,7,2,34,4,60,1,7,{ bonus2 bAddRace,RC_Undead,10; bonus3 bAutoSpell,"AL_BLESSING",5,50; },{},{}
|
||||
1384,Veteran_Axe,Veteran Axe,4,0,,3000,250,,1,2,0x000444A2,7,2,34,3,80,1,7,{ if(getskilllv("BS_DAGGER")==3) { bonus bAtk,10; } if(getskilllv("BS_SWORD")==3) { bonus bAtk,10; } if(getskilllv("BS_TWOHANDSWORD")==3) { bonus bAtk,10; } if(getskilllv("BS_KNUCKLE")==3) { bonus bAtk,10; } if(getskilllv("BS_SPEAR")==3) { bonus bAtk,10; } if(getskilllv("BS_AXE")==3) { bonus bAtk,10; } if(getskilllv("BS_MACE")==3) { bonus bAtk,10; } bonus bVit,2; },{},{}
|
||||
1385,Bradium_Stonehammer,Bradium Stone Hammer,4,0,,2700,210,,1,0,0x000444A2,2,2,34,4,75,1,7,{ bonus3 bAddEffOnSkill,"BS_HAMMERFALL",Eff_Stun,50+(20*getrefine()); },{},{}
|
||||
1385,Bradium_Stonehammer,Bradium Stone Hammer,4,0,,2700,210,,1,0,0x000444A2,2,2,34,4,75,1,7,{ bonus3 bAddEffOnSkill,"BS_HAMMERFALL",Eff_Stun,500+(200*getrefine()); },{},{}
|
||||
1386,Doom_Slayer_I,Doom Slayer,4,20,,0,20,,1,0,0x000444A2,7,2,34,4,0,0,7,{ if(readparam(bStr)>=95){ bonus bBaseAtk,400; bonus2 bAddEff,Eff_Stun,3000; bonus bAspdRate,-25; bonus bUseSPrate,100; bonus bBreakArmorRate,500; } },{},{}
|
||||
1387,Giant_Axe,Giant Axe,4,0,,4000,330,,1,1,0x000444A2,2,2,34,3,50,1,7,{ bonus2 bSkillAtk,"WS_CARTTERMINATION",15; if(readparam(bStr)>=95) { bonus bHit,10; bonus bAspdRate,3; } },{},{}
|
||||
1388,Two_Handed_Axe_C,Two-Handed Axe,4,0,,0,220,,1,0,0x000444A2,7,2,34,3,1,0,7,{ bonus2 bAddSize,0,40; bonus2 bAddSize,1,40; bonus2 bAddSize,2,40; },{},{}
|
||||
@ -1024,7 +1024,7 @@
|
||||
1923,BF_Instrument1,Valorous Battlefield Guitar,4,0,,0,50,,1,0,0x00080000,7,1,2,3,80,1,13,{ bonus bDex,2; bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; },{},{}
|
||||
1924,BF_Instrument2,Brave Battlefield Guitar,4,0,,0,50,,1,0,0x00080000,7,1,2,3,80,1,13,{ bonus bDex,2; bonus2 bAddRace,RC_DemiHuman,95; bonus2 bSkillAtk,"CG_ARROWVULCAN",20; bonus bUnbreakableWeapon,0; },{},{}
|
||||
1925,Chello,Cello,4,20,,700,110,,1,3,0x00080000,2,1,002,3,70,1,13,{ bonus bAgi,2; bonus bDex,3; bonus2 bAddSkillBlow,"BA_MUSICALSTRIKE",2; bonus2 bAddSkillBlow,"CG_ARROWVULCAN",3; },{},{}
|
||||
1926,Harp_Of_Nepenthes,Harp of Nepenthes,4,20,,1000,120,,1,2,0x00080000,2,1,2,4,60,1,13,{ bonus bInt,2; bonus3 bAddEffOnSkill,"BA_MUSICALSTRIKE",Eff_Stun,100; if( getrefine() > 9 ) { bonus3 bAddEffOnSkill,"BA_MUSICALSTRIKE",Eff_Stun,200; } },{},{}
|
||||
1926,Harp_Of_Nepenthes,Harp of Nepenthes,4,20,,1000,120,,1,2,0x00080000,2,1,2,4,60,1,13,{ bonus bInt,2; if( getrefine() > 9 ) { bonus3 bAddEffOnSkill,"BA_MUSICALSTRIKE",Eff_Stun,2000; } else { bonus3 bAddEffOnSkill,"BA_MUSICALSTRIKE",Eff_Stun,1000; } },{},{}
|
||||
1927,Krieger_Instrument1,Glorious Guitar,4,0,,0,50,,1,0,0x00180000,7,1,2,4,80,1,13,{ bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(getrefine() > 5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine() > 8) bonus4 bAutoSpellOnSkill,"CG_ARROWVULCAN","CG_TAROTCARD",5,100; },{},{}
|
||||
1928,Berserk_Guitar_I,Spirited Guitar,4,0,,0,40,,1,0,0x00080000,2,1,2,4,0,1,13,{ bonus bAspdRate,100; bonus bHPrecovRate,-100; bonus2 bHPLossRate,50,5000; bonus bDex,-readparam(bDex); },{},{}
|
||||
1929,Guitar_C,Guitar,4,0,,0,177,,1,0,0x00080000,7,1,2,3,1,0,13,{ bonus2 bAddSize,0,40; bonus2 bAddSize,1,40; bonus2 bAddSize,2,40; },{},{}
|
||||
@ -1058,7 +1058,7 @@
|
||||
1976,Queen's_Whip_,Queen's Whip,4,20,,1100,150,,2,2,0x00080000,7,0,2,4,65,1,14,{ bonus2 bSkillAtk,"CG_ARROWVULCAN",10; bonus2 bSkillAtk,"DC_THROWARROW",10; },{},{}
|
||||
1977,BF_Whip1,Valorous Battle Lariat,4,0,,0,50,,2,0,0x00080000,7,0,2,3,80,1,14,{ bonus bDex,2; bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; },{},{}
|
||||
1978,BF_Whip2,Brave Battle Lariat,4,0,,0,50,,2,0,0x00080000,7,0,2,3,80,1,14,{ bonus bDex,2; bonus2 bAddRace,RC_DemiHuman,95; bonus2 bSkillAtk,"CG_ARROWVULCAN",20; bonus bUnbreakableWeapon,0; },{},{}
|
||||
1979,Stem_Of_Nepenthes,Stem of Nepenthes,4,20,,1000,120,,1,2,0x00080000,2,0,2,4,60,1,14,{ bonus bInt,2; bonus3 bAddEffOnSkill,"DC_THROWARROW",Eff_Freeze,100; if( getrefine() >= 9 ) { bonus3 bAddEffOnSkill,"DC_THROWARROW",Eff_Freeze,200; } },{},{}
|
||||
1979,Stem_Of_Nepenthes,Stem of Nepenthes,4,20,,1000,120,,1,2,0x00080000,2,0,2,4,60,1,14,{ bonus bInt,2; if( getrefine() >= 9 ) { bonus3 bAddEffOnSkill,"DC_THROWARROW",Eff_Freeze,2000; } else { bonus3 bAddEffOnSkill,"DC_THROWARROW",Eff_Freeze,1000; } },{},{}
|
||||
1980,Whip_Of_Balance,Whip of Balance,4,20,,700,110,,1,3,0x00080000,2,0,2,3,70,1,14,{ bonus bAgi,2; bonus bDex,3; bonus2 bAddSkillBlow,"DC_THROWARROW",2; bonus2 bAddSkillBlow,"CG_ARROWVULCAN",3; },{},{}
|
||||
1981,Krieger_Whip1,Glorious Lariat,4,0,,0,50,,2,0,0x00180000,7,0,2,4,80,1,14,{ bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(getrefine() > 5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine() > 8) bonus4 bAutoSpellOnSkill,"CG_ARROWVULCAN","CG_TAROTCARD",5,100; },{},{}
|
||||
1982,Phenomena_Whip,Phenomena Whip,4,0,,0,160,,2,0,0x00080000,7,0,2,4,1,0,14,{ bonus2 bSkillAtk,"DC_THROWARROW",25; },{},{}
|
||||
@ -2763,7 +2763,7 @@
|
||||
5555,Leaf_Cat_Hat,Leaf Cat Hat,5,20,,100,,3,,0,0xFFFFFFFF,7,2,256,,0,1,539,{ bonus bAgi,1; bonus3 bAutoSpellWhenHit,"AL_HEAL",3,10; },{},{}
|
||||
5556,Seal_Hat,Seal Hat,5,20,,500,,3,,0,0xFFFFFFFF,7,2,769,,55,1,540,{ bonus bInt,1; bonus3 bAutoSpell,"WZ_FROSTNOVA",1,30; },{},{}
|
||||
//5557,Wild_Rose_Hat,Wild Rose Hat,5,20,,500,,3,,1,0xFFFFFFFE,7,2,256,,20,1,541,{ bonus bAgi,3; },{},{}
|
||||
//5558,Luxury_Hat,Luxury Hat,5,20,,100,,3,,1,0xFFFFFFFF,7,2,256,,30,1,542,{ bonus3 bAddMonsterDropItem,511,RC_Plant,500; },{},{}
|
||||
//5558,Luxury_Hat,Luxury Hat,5,20,,100,,3,,1,0xFFFFFFFF,7,2,256,,30,1,542,{ bonus3 bAddMonsterDropItem,510,RC_Plant,500; },{},{}
|
||||
5559,Piece_Of_White_Cloth,Piece Of White Cloth,5,20,,100,,1,,0,0xFFFFFFFF,7,2,256,,0,1,543,{},{},{}
|
||||
5560,Bullock_Helm_,Bullock Helm,5,20,,300,,3,,0,0xFFFFFFFF,7,2,256,,75,1,322,{ bonus bMaxHP,100; bonus bNoKnockback,0; bonus2 bSubEle,Ele_Neutral,-20; bonus2 bSubEle,Ele_Fire,-20; bonus2 bSubEle,Ele_Water,-20; bonus2 bSubEle,Ele_Wind,-20; bonus2 bSubEle,Ele_Earth,-20; bonus2 bSubEle,Ele_Dark,-20; bonus2 bSubEle,Ele_Holy,-20; bonus2 bSubEle,Ele_Ghost,-20; },{},{}
|
||||
5561,Magic_Rabbit_Hat,Magic Rabbit Hat,5,20,,800,,1,,0,0xFFFFFFFF,7,2,256,,0,1,497,{ bonus bInt,1; bonus bMaxSP,50; bonus4 bAutoSpellWhenHit,"MG_FIREBOLT",3,10,3; bonus4 bAutoSpellWhenHit,"MG_COLDBOLT",3,10,3; bonus4 bAutoSpellWhenHit,"MG_LIGHTNINGBOLT",3,10,3; bonus3 bAutoSpellWhenHit,"AL_HEAL",1,10; },{},{}
|
||||
@ -3293,7 +3293,7 @@
|
||||
//6362,Yellow_Wish_Point,Yellow Wish Point,3,100,,5,,,,,,,,,,,,,{},{},{}
|
||||
//6363,Lime_Green_Point,Lime Green Point,3,100,,5,,,,,,,,,,,,,{},{},{}
|
||||
//6376,KVM_Badge
|
||||
//6377,Buy_Stall_Permit,Purchase Street Stall License,3,200,,10,,,,,,,,,,,,,{},{},{}
|
||||
6377,Buy_Stall_Permit,Purchase Street Stall License,3,200,,10,,,,,,,,,,,,,{},{},{}
|
||||
//6378
|
||||
//6379
|
||||
//6380
|
||||
@ -4823,13 +4823,16 @@
|
||||
//12471,LV5_Adrenaline_Scroll,
|
||||
//12472,Convex_Mirror,
|
||||
//12475,Cure_Free,
|
||||
//12548,Shabby_Purchase_Street_Stall_License,
|
||||
12548,Shabby_Purchase_Street_Stall_License,Shabby Purchase Street Stall License,2,500,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ buyingstore 2; },{},{}
|
||||
//12553,Brysingamen_Piece_Box,
|
||||
//12554,Asprika_Piece_Box,
|
||||
//12555,Brynhild_Piece_Box,
|
||||
//12556,Sleipnir_Piece_Box,
|
||||
//12557,Mjolnir_Piece_Box,
|
||||
//12558,Megingiorde_Piece_Box,
|
||||
12580,Universal_Catalog_Silver,Universal Catalog Silver,2,200,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ searchstores 10,0; },{},{}
|
||||
12581,Universal_Catalog_Gold,Universal Catalog Gold,2,0,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ searchstores 10,1; },{},{}
|
||||
12591,Universal_Catalog_Bronze,Universal Catalog Bronze,2,0,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ searchstores 10,1; },{},{}
|
||||
12701,Old_Blue_Box_F,Old Blue Box,2,,,200,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
|
||||
12702,Old_Bleu_Box,Old Navy Box,2,0,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem groupranditem(IG_BleuBox),1; getitem groupranditem(IG_BleuBox),1; },{},{}
|
||||
12703,Holy_Egg_2,Holy Egg,11,0,,50,,,,,0xFFFFFFFF,7,2,,,,,,{},{},{}
|
||||
@ -5025,8 +5028,8 @@
|
||||
//13043,Fortune_Sword_I
|
||||
//13044,House_Auger_I
|
||||
//13045,Kamaitachi_I
|
||||
13046,Krieg,Krierg,4,20,,500,110,,1,3,0x00021040,2,2,2,2,50,1,1,{ bonus3 bAddEffOnSkill,"RG_BACKSTAP",Eff_Bleeding,100; bonus2 bSkillAtk,"RG_BACKSTAP",15; },{},{}
|
||||
13047,Weihna,Weihna,4,20,,500,135,,1,2,0x00021040,2,2,2,3,50,1,1,{ bonus3 bAddEffOnSkill,"RG_RAID",Eff_Poison,100; autobonus "{ bonus2 bAddRace,RC_NonBoss,10; bonus2 bAddRace,RC_Boss,10; }",5,5000,BF_WEAPON|BF_SHORT,"{ specialeffect2 EF_POTION_BERSERK; }"; },{},{}
|
||||
13046,Krieg,Krierg,4,20,,500,110,,1,3,0x00021040,2,2,2,2,50,1,1,{ bonus3 bAddEffOnSkill,"RG_BACKSTAP",Eff_Bleeding,1000; bonus2 bSkillAtk,"RG_BACKSTAP",15; },{},{}
|
||||
13047,Weihna,Weihna,4,20,,500,135,,1,2,0x00021040,2,2,2,3,50,1,1,{ bonus3 bAddEffOnSkill,"RG_RAID",Eff_Poison,1000; autobonus "{ bonus2 bAddRace,RC_NonBoss,10; bonus2 bAddRace,RC_Boss,10; }",5,5000,BF_WEAPON|BF_SHORT,"{ specialeffect2 EF_POTION_BERSERK; }"; },{},{}
|
||||
//13048,Damascus_C
|
||||
13050,P_Dagger1,Eden Dagger I,4,0,,0,124,,1,0,0xFE9F7EEF,7,2,2,2,26,0,1,{},{},{}
|
||||
13051,P_Dagger2,Eden Dagger II,4,0,,0,158,,1,0,0xFE9F7EEF,7,2,2,2,40,0,1,{},{},{}
|
||||
@ -5077,8 +5080,8 @@
|
||||
//13175,Lever_Action_Rifle_C
|
||||
13176,Krieger_Rifle1,Glorious Rifle,4,0,,0,90,,9,0,0x01000000,7,2,34,4,80,1,18,{ bonus2 bAddRace,RC_DemiHuman,75; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus2 bSkillAtk,"GS_TRIPLEACTION",30; bonus bUnbreakableWeapon,0; if(getrefine() > 5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine() > 8) { bonus2 bCastrate,"GS_TRACKING",25; bonus2 bSkillAtk,"GS_TRACKING",getrefine() * 3; } },{},{}
|
||||
13177,Krieger_Gatling1,Glorious Gatling Gun,4,0,,0,90,,9,0,0x01000000,7,2,34,4,80,1,19,{ bonus2 bAddRace,RC_DemiHuman,35; bonus2 bIgnoreDefRate,RC_DemiHuman,25; bonus2 bSkillAtk,"GS_TRIPLEACTION",30; bonus bUnbreakableWeapon,0; if(getrefine() > 5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine() > 8) {bonus2 bAddRace,RC_Boss,getrefine(); bonus2 bAddRace,RC_NonBoss,getrefine(); } },{},{}
|
||||
13178,Krieger_Shotgun1,Glorious Shotgun,4,0,,0,110,,9,0,0x01000000,7,2,34,4,80,1,20,{ bonus2 bAddRace,RC_DemiHuman,55; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bSplashRange,1; bonus2 bSkillAtk,"GS_TRIPLEACTION",30; bonus bUnbreakableWeapon,0; if(getrefine() > 5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine() > 8) { bonus2 bSkillAtk,"GS_SPREADATTACK",getrefine() * 2; bonus3 bAddEffOnSkill,"GS_SPREADATTACK",Eff_Stun,200; } },{},{}
|
||||
13179,Krieger_Launcher1,Glorious Grenade Launcher,4,0,,0,330,,9,0,0x01000000,7,2,34,4,80,1,21,{ bonus2 bAddRace,RC_DemiHuman,35; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus2 bSkillAtk,"GS_TRIPLEACTION",30; bonus bUnbreakableWeapon,0; if(getrefine() > 5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine() > 8) { bonus2 bSkillAtk,"GS_GROUNDDRIFT",getrefine() * 2; bonus3 bAddEffOnSkill,"GS_SPREADATTACK",Eff_Stun,200; autobonus "{ bonus bAspdRate,20; }",200,20000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; } },{},{}
|
||||
13178,Krieger_Shotgun1,Glorious Shotgun,4,0,,0,110,,9,0,0x01000000,7,2,34,4,80,1,20,{ bonus2 bAddRace,RC_DemiHuman,55; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bSplashRange,1; bonus2 bSkillAtk,"GS_TRIPLEACTION",30; bonus bUnbreakableWeapon,0; if(getrefine() > 5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine() > 8) { bonus2 bSkillAtk,"GS_SPREADATTACK",getrefine() * 2; bonus3 bAddEffOnSkill,"GS_SPREADATTACK",Eff_Stun,2000; } },{},{}
|
||||
13179,Krieger_Launcher1,Glorious Grenade Launcher,4,0,,0,330,,9,0,0x01000000,7,2,34,4,80,1,21,{ bonus2 bAddRace,RC_DemiHuman,35; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus2 bSkillAtk,"GS_TRIPLEACTION",30; bonus bUnbreakableWeapon,0; if(getrefine() > 5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine() > 8) { bonus2 bSkillAtk,"GS_GROUNDDRIFT",getrefine() * 2; bonus3 bAddEffOnSkill,"GS_SPREADATTACK",Eff_Stun,2000; autobonus "{ bonus bAspdRate,20; }",200,20000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; } },{},{}
|
||||
// Bullets
|
||||
13200,Bullet,Bullet,10,1,,2,10,,,,0x01000000,7,2,32768,,1,,3,{},{},{}
|
||||
13201,Silver_Bullet,Silver Bullet,10,15,,2,15,,,,0x01000000,7,2,32768,,1,,3,{ bonus bAtkEle,Ele_Holy; },{},{}
|
||||
@ -6183,6 +6186,12 @@
|
||||
//16588,Thoughtful_Hat_Box
|
||||
//16589,Thoughtful_Hat_Box
|
||||
//16590,Thoughtful_Hat_Box
|
||||
16677,Universal_Catalog_Gold_Box10,Universal Catalog Gold 10 Box,2,0,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 12581,10; },{},{}
|
||||
16678,Universal_Catalog_Gold_Box50,Universal Catalog Gold 50 Box,2,0,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 12581,50; },{},{}
|
||||
16679,Universal_Catalog_Gold_Box10,Universal Catalog Gold 10 Box,2,0,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 12581,10; },{},{}
|
||||
16680,Universal_Catalog_Gold_Box50,Universal Catalog Gold 50 Box,2,0,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 12581,50; },{},{}
|
||||
16776,Universal_Catalog_Gold_Box10,Universal Catalog Gold 10 Box,2,0,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 12581,10; },{},{}
|
||||
16777,Universal_Catalog_Gold_Box50,Universal Catalog Gold 50 Box,2,0,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ getitem 12581,50; },{},{}
|
||||
//18000,Cannon_Ball
|
||||
//18001,Holy_Cannon_Ball
|
||||
//18002,Dark_Cannon_Ball
|
||||
|
@ -1487,8 +1487,8 @@ packet_ver: 25
|
||||
0x080F,20
|
||||
|
||||
//2010-03-03aRagexeRE
|
||||
//0x0810,3
|
||||
//0x0811,-1
|
||||
0x0810,3
|
||||
0x0811,-1,reqopenbuyingstore,2:4:8:9:89
|
||||
//0x0812,86
|
||||
//0x0813,6
|
||||
//0x0814,6
|
||||
@ -1498,11 +1498,11 @@ packet_ver: 25
|
||||
//0x0819,4
|
||||
|
||||
//2010-03-09aRagexeRE
|
||||
//0x0813,-1
|
||||
0x0813,-1
|
||||
//0x0814,2
|
||||
//0x0815,6
|
||||
//0x0816,6
|
||||
//0x0818,-1
|
||||
0x0816,6
|
||||
0x0818,-1
|
||||
//0x0819,10
|
||||
//0x081A,4
|
||||
//0x081B,4
|
||||
@ -1527,31 +1527,30 @@ packet_ver: 25
|
||||
//0x081B,8
|
||||
|
||||
//2010-04-20aRagexeRE
|
||||
//0x0812,8
|
||||
//0x0814,86
|
||||
//0x0815,2
|
||||
//0x0817,6
|
||||
//0x0819,-1
|
||||
//0x081a,4
|
||||
//0x081b,10
|
||||
//0x081c,10
|
||||
//0x0824,6
|
||||
0x0812,8
|
||||
0x0814,86
|
||||
0x0815,2,reqclosebuyingstore,0
|
||||
0x0817,6,reqclickbuyingstore,2
|
||||
0x0819,-1,reqtradebuyingstore,2:4:8:12
|
||||
0x081a,4
|
||||
0x081b,10
|
||||
0x081c,10
|
||||
0x0824,6
|
||||
|
||||
//2010-06-01aRagexeRE
|
||||
//0x0825,-1
|
||||
//0x0826,4
|
||||
//0x0835,-1
|
||||
//0x0836,-1
|
||||
//0x0837,3
|
||||
0x0835,-1,searchstoreinfo,2:4:5:9:13:14:15
|
||||
0x0836,-1
|
||||
0x0837,3
|
||||
//0x0838,3
|
||||
|
||||
//2010-06-08aRagexeRE
|
||||
//0x0838,2
|
||||
//0x0839,66
|
||||
//0x083A,4 // Search Stalls Feature
|
||||
//0x083B,2
|
||||
//0x083C,12
|
||||
//0x083D,6
|
||||
0x0838,2,searchstoreinfonextpage,0
|
||||
0x083A,4 // Search Stalls Feature
|
||||
0x083B,2,closesearchstoreinfo,0
|
||||
0x083C,12,searchstoreinfolistitemclick,2:6:10
|
||||
0x083D,6
|
||||
|
||||
//2010-06-15aRagexeRE
|
||||
//0x083E,26
|
||||
@ -1566,7 +1565,7 @@ packet_ver: 25
|
||||
//0x07F3,6
|
||||
|
||||
//2010-07-01aRagexeRE
|
||||
//0x083A,5 // Search Stalls Feature
|
||||
0x083A,5 // Search Stalls Feature
|
||||
|
||||
//2010-07-13aRagexeRE
|
||||
//0x0827,6
|
||||
@ -1582,6 +1581,7 @@ packet_ver: 25
|
||||
//0x841,4
|
||||
|
||||
//2010-08-03aRagexeRE
|
||||
0x0839,66
|
||||
0x0842,6,recall2,2
|
||||
0x0843,6,remove2,2
|
||||
|
||||
|
@ -938,6 +938,9 @@
|
||||
// Episode 13.3
|
||||
//2534,0,0,0,0,0,0,9,0,no,0,0,0,none,0 RETURN_TO_ELDICASTES,
|
||||
|
||||
// Buying Store
|
||||
2535,0,0,4,0,0x1,0,1,0,no,0,0x1,0,none,0, ALL_BUYING_STORE,Open Buying Store
|
||||
|
||||
8001,9,6,4,0,0x1,0,5,1,no,0,0,0,magic,0, HLIF_HEAL,Healing Touch
|
||||
8002,0,6,4,0,0x3,-1,5,1,no,0,0,0,none,0, HLIF_AVOID,Avoid
|
||||
8003,0,0,0,0,0,1,5,0,no,0,0,0,none,0, HLIF_BRAIN,Brain Surgery
|
||||
|
@ -39,12 +39,14 @@
|
||||
27,8 //AL_WARP
|
||||
87,8 //WZ_ICEWALL
|
||||
150,8 //TF_BACKSLIDING
|
||||
264,8 //MO_BODYRELOCATION
|
||||
361,8 //HP_ASSUMPTIO
|
||||
362,8 //HP_BASILICA
|
||||
395,8 //CG_MOONLIT
|
||||
396,8 //CG_MARIONETTE
|
||||
491,8 //CR_CULTIVATION
|
||||
411,8 //TK_RUN
|
||||
426,8 //High Jump
|
||||
426,8 //TK_HIGHJUMP
|
||||
427,8 //SG_FEEL
|
||||
428,8 //SG_SUN_WARM
|
||||
429,8 //SG_MOON_WARM
|
||||
@ -59,6 +61,7 @@
|
||||
438,8 //SG_SUN_BLESS
|
||||
439,8 //SG_MOON_BLESS
|
||||
440,8 //SG_STAR_BLESS
|
||||
530,8 //NJ_KIRIKAGE
|
||||
691,8 //CASH_ASSUMPITO
|
||||
|
||||
//mixed
|
||||
@ -69,34 +72,41 @@
|
||||
79,16 //PR_MAGNUS
|
||||
|
||||
//Zone 1 - Aldebaran Turbo Track
|
||||
219,32 //Snatch
|
||||
26,32 //Teleport
|
||||
27,32 //Warp portal
|
||||
51,32 //Hiding
|
||||
135,32 //Cloaking
|
||||
389,32 //Stealth
|
||||
35,32 //Cure
|
||||
87,32 //Ice Wall
|
||||
359,32 //Berserk (Frenzy)
|
||||
362,32 //Basilica
|
||||
395,32 //Sheltering Bliss
|
||||
357,32 //Spear Dynamo (Concentration)
|
||||
264,32 //Snap (Body Relocation)
|
||||
219,32 //RG_INTIMIDATE
|
||||
26,32 //AL_TELEPORT
|
||||
27,32 //AL_WARP
|
||||
51,32 //TF_HIDING
|
||||
135,32 //AS_CLOAKING
|
||||
389,32 //ST_CHASEWALK
|
||||
35,32 //AL_CURE
|
||||
87,32 //WZ_ICEWALL
|
||||
359,32 //LK_BERSERK
|
||||
362,32 //HP_BASILICA
|
||||
395,32 //CG_MOONLIT
|
||||
357,32 //LK_CONCENTRATION
|
||||
264,32 //MO_BODYRELOCATION
|
||||
|
||||
//Zone 2 - Jail
|
||||
421,64 //TK_JUMPKICK#Flying Side Kick#
|
||||
426,64 //TK_HIGHJUMP#Taekwon Jump#
|
||||
421,64 //TK_JUMPKICK
|
||||
426,64 //TK_HIGHJUMP
|
||||
|
||||
//Zone 3 - Izlude Battle Arena
|
||||
219,128 //Snatch
|
||||
26,128 //Teleport
|
||||
219,128 //RG_INTIMIDATE
|
||||
26,128 //AL_TELEPORT
|
||||
|
||||
//Zone 4 - WoE:SE
|
||||
426,256 //High Jump
|
||||
426,256 //TK_HIGHJUMP
|
||||
|
||||
//Zone 5 - Sealed Shrine
|
||||
12,512 //MG_SAFETYWALL
|
||||
26,512 //AL_TELEPORT
|
||||
219,512 //Snatch
|
||||
219,512 //RG_INTIMIDATE
|
||||
361,512 //HP_ASSUMPTIO
|
||||
691,512 //CASH_ASSUMPTIO
|
||||
|
||||
//Zone 6 -Endless Tower
|
||||
26,1024 //AL_TELEPORT
|
||||
87,1024 //WZ_ICEWALL
|
||||
219,1024 //RG_INTIMIDATE
|
||||
405,1024 //PF_SPIDERWEB
|
||||
674,1024 //NPC_EXPULSION
|
||||
|
@ -454,6 +454,8 @@
|
||||
1018,0,0,30,0,0,0,99,0,0,none,0,12114,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTFIRE
|
||||
1019,0,0,30,0,0,0,99,0,0,none,0,12117,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ELEMENTWIND
|
||||
|
||||
2535,0,0,1,0,0,0,99,0,0,none,0,6377,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store
|
||||
|
||||
10010,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GD_BATTLEORDER##
|
||||
10011,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GD_REGENERATION##
|
||||
10012,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //GD_RESTORE##
|
||||
|
@ -86,6 +86,7 @@
|
||||
5,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
|
||||
5,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
|
||||
5,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R#
|
||||
5,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store#
|
||||
//Thief
|
||||
6,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
|
||||
6,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
|
||||
@ -240,6 +241,7 @@
|
||||
10,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
|
||||
10,459,1,111,5,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#Full Adrenaline Rush#
|
||||
10,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R#
|
||||
10,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store#
|
||||
//Hunter
|
||||
11,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
|
||||
11,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
|
||||
@ -511,6 +513,7 @@
|
||||
18,497,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT2#Twilight Alchemy 2#
|
||||
18,498,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT3#Twilight Alchemy 3#
|
||||
18,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R#
|
||||
18,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store#
|
||||
//Bard
|
||||
19,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
|
||||
19,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
|
||||
@ -668,6 +671,7 @@
|
||||
23,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify#
|
||||
23,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
|
||||
23,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R#
|
||||
23,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store#
|
||||
//Gunslinger
|
||||
24,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
|
||||
24,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
|
||||
@ -810,6 +814,7 @@
|
||||
4006,155,1,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#Crazy Uproar#
|
||||
4006,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
|
||||
4006,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R#
|
||||
4006,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store#
|
||||
//ThiefHigh
|
||||
4007,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
|
||||
4007,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
|
||||
@ -989,6 +994,7 @@
|
||||
4011,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
|
||||
4011,459,1,111,5,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#Full Adrenaline Rush#
|
||||
4011,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R#
|
||||
4011,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store#
|
||||
//Sniper
|
||||
4012,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
|
||||
4012,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
|
||||
@ -1303,6 +1309,7 @@
|
||||
4019,497,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT2#Twilight Alchemy 2#
|
||||
4019,498,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT3#Twilight Alchemy 3#
|
||||
4019,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R#
|
||||
4019,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store#
|
||||
//Clown
|
||||
4020,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
|
||||
4020,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
|
||||
@ -1508,6 +1515,7 @@
|
||||
4028,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
|
||||
4028,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
|
||||
4028,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R#
|
||||
4028,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store#
|
||||
//Baby Thief
|
||||
4029,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
|
||||
4029,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
|
||||
@ -1666,6 +1674,7 @@
|
||||
4033,1013,1,0,0,0,0,0,0,0,0,0,0 //BS_GREED#Greed#
|
||||
4033,459,1,111,5,0,0,0,0,0,0,0,0 //BS_ADRENALINE2#Full Adrenaline Rush#
|
||||
4033,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R#
|
||||
4033,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store#
|
||||
//Baby Hunter
|
||||
4034,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
|
||||
4034,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
|
||||
@ -1945,6 +1954,7 @@
|
||||
4041,497,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT2#Twilight Alchemy 2#
|
||||
4041,498,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT3#Twilight Alchemy 3#
|
||||
4041,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R#
|
||||
4041,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store#
|
||||
//Baby Bard
|
||||
4042,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
|
||||
4042,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
|
||||
@ -2099,6 +2109,7 @@
|
||||
4045,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby#
|
||||
4045,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent#
|
||||
4045,681,1,0,0,0,0,0,0,0,0,0,0 //ALL_INCCARRY#Enlarge Weight Limit R#
|
||||
4045,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store#
|
||||
//Taekwon
|
||||
4046,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill#
|
||||
4046,142,1,0,0,0,0,0,0,0,0,0,0 //NV_FIRSTAID#First Aid#
|
||||
|
@ -4,7 +4,7 @@
|
||||
//= A reference manual for the eAthena scripting language.
|
||||
//= Commands are sorted depending on their functionality.
|
||||
//===== Version ===========================================
|
||||
//= 3.35.20110106
|
||||
//= 3.37.20110306
|
||||
//=========================================================
|
||||
//= 1.0 - First release, filled will as much info as I could
|
||||
//= remember or figure out, most likely there are errors,
|
||||
@ -155,6 +155,10 @@
|
||||
//= Spellcheck. [Ai4rei]
|
||||
//= 3.35.20110106
|
||||
//= Removed bug warning from 'deletearray'. [Ai4rei]
|
||||
//= 3.36.20110219
|
||||
//= Added 'buyingstore' command. [Ai4rei]
|
||||
//= 3.37.20110306
|
||||
//= Added 'searchstores' command. [Ai4rei]
|
||||
//=========================================================
|
||||
|
||||
This document is a reference manual for all the scripting commands and functions
|
||||
@ -4423,6 +4427,39 @@ Example(s):
|
||||
//The invoked character will no longer automatically equip a falchion.
|
||||
autoequip 1104,0;
|
||||
|
||||
---------------------------------------
|
||||
|
||||
*buyingstore <slots>;
|
||||
|
||||
Invokes buying store preparation window like the skill 'Open Buying Store',
|
||||
without the item requirement. Amount of slots is limited by the server to
|
||||
a maximum of 5 slots by default.
|
||||
|
||||
Example:
|
||||
|
||||
// Gives the player oppurtunity to buy 4 different kinds of items.
|
||||
buyingstore 4;
|
||||
|
||||
---------------------------------------
|
||||
|
||||
*searchstores <uses>,<effect>;
|
||||
|
||||
Invokes the store search window, which allows to search for both vending
|
||||
and buying stores. Parameter uses indicates, how many searches can be
|
||||
started, before the window has to be reopened. Effect value affects,
|
||||
what happens, when a result item is double-clicked and can be one of the
|
||||
following:
|
||||
|
||||
0 = Shows the store's position on the mini-map and highlights the
|
||||
shop sign with yellow color, when the store is on same map
|
||||
as the invoking player.
|
||||
1 = Directly opens the shop, regardless of distance.
|
||||
|
||||
Example:
|
||||
|
||||
// Item Universal_Catalog_Gold (10 uses, effect: open shop)
|
||||
searchstores 10,1;
|
||||
|
||||
---------------------------------------
|
||||
//
|
||||
4,1.- End of item-related commands
|
||||
@ -6098,7 +6135,7 @@ illustration without displaying a new one, an empty file name and position 255
|
||||
must be used.
|
||||
|
||||
// Displays the Comodo Kafra illustration in lower right corner.
|
||||
cutin "kafra_7",2;
|
||||
cutin "kafra_07",2;
|
||||
|
||||
// Typical way to end a script, which displayed an illustration during a
|
||||
// dialog with a player.
|
||||
|
@ -1,5 +1,17 @@
|
||||
Date Added
|
||||
======
|
||||
2011/02/06
|
||||
* Rev. 14697 Script bug fixing. :] Here's some. I know it's been awhile. [L0ne_W0lf]
|
||||
- Changed some duplicates so they use a floating NPC as their original. (bugreport:1395)
|
||||
- Fixed the NPC looking for missing label in the Cursed Spirit quest. (bugreport:4654)
|
||||
- Applied Uno's fix for the cooldown condition in Endless Tower. (bugreport:4677)
|
||||
- Removed level requirement for the Viens Stone gathering quest. (bugreport:4678)
|
||||
- Added the missing restricted skills to zone 6 for Endless Tower. (bugreport:4707)
|
||||
It's worth noting how much I hate the system for restricting skills per zone.
|
||||
- Fixed Cat Hand warp service warping players to all warp options. (bugreport:4709)
|
||||
- Fixed floor 75 warp in endless tower disabling the wrong warp. (bugreport:4711)
|
||||
- Added a condition for Chungwolmang to only delete items if a certain ID is specified. (bugreport:4719)
|
||||
- Corrected a mobcount specifying the wrong NPC in the Moscovia Ship quest. (bugreport:4736)
|
||||
2011/01/16
|
||||
* Rev. 14676 Various fixes for scripts that are disabled by default. [Ai4rei]
|
||||
- Fixed name collision in Baphomet Jr. taming item quest (custom) with 'Little Boy' in cities/lutie.txt
|
||||
@ -20,28 +32,10 @@ Date Added
|
||||
Airship Ticket Quest, How the Airship Works, Ice Necklace Quest,
|
||||
Siblings Quest, Thor Volcano Base Quest, Muff's Loan, Broken Diamond,
|
||||
and the Z-Gang Quest
|
||||
2010/11/14
|
||||
* Rev. 14462 Updating spawns as a precursor for Eden group quests. [L0ne_W0lf]
|
||||
* Updated spawns for Juno fields to Renewal.
|
||||
* Updated spawns for Umbala fields to Renewal.
|
||||
* Updated spawns for Comodo fields to Renewal
|
||||
* Updated spawns for Mjolnir fields to Renewal.
|
||||
* Updated spawns for Payon fields to Renewal.
|
||||
* Updated spawns for Morroc fields to Renewal.
|
||||
* Commented out repeatable EXP quests.
|
||||
2010/11/04
|
||||
* Rev. 14448 Just a couple Bug fixes. :P [L0ne_W0lf]
|
||||
- Added a missing close in quests_13_2.txt. (bugreport:4520)
|
||||
- Corrected 'IProntera' typo in quests_prontera.txt (bugreport:4522)
|
||||
2010/10/23
|
||||
* Rev. 14435 Updated spawns for Geffen fields to Renewal. [L0ne_W0lf]
|
||||
2010/10/20
|
||||
* Rev. 14433 Updated spawns for Prontera fields to Renewal. [L0ne_W0lf]
|
||||
2010/10/10
|
||||
* Rev. 14422 Wot's dis? Missed a warp in morroc field! THIS WILL NOT DO. [L0ne_W0lf]
|
||||
- ...corrected the versions in the file headers as well. :P
|
||||
* Rev. 14421 Renewal Update to warp portals, and deleted disabled_warps.txt. [L0ne_W0lf]
|
||||
- Only disabled warps, some coordinates might have slipped past me.
|
||||
2010/09/18
|
||||
* Rev 14409 Updates, and bugfixes, the usual stuff. [L0ne_W0lf]
|
||||
* Updated Sage quest skill quest with the file curtosy of 5511.
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= Kisuka
|
||||
//===== Current Version: =====================================
|
||||
//= 1.1
|
||||
//= 1.2
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -11,6 +11,7 @@
|
||||
//===== Additional Comments: =================================
|
||||
//= 1.0 First version. [Kisuka]
|
||||
//= 1.1 Many Many Fixes. [Kisuka]
|
||||
//= 1.2 Some changes. [Kisuka]
|
||||
//============================================================
|
||||
|
||||
// ================== Lauds ======================
|
||||
@ -37,16 +38,11 @@ prontera,182,214,4 script Lauds#Memorial 58,{
|
||||
mes "My what?";
|
||||
next;
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "How are you supposed to go on your trip";
|
||||
mes "without your towel!?";
|
||||
mes "How are you supposed to go on your trip without your towel!?";
|
||||
next;
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "If you think this is just another";
|
||||
mes "holiday,";
|
||||
mes "I'm not going to waste my breath.";
|
||||
mes "But if you like to pay a tribute to";
|
||||
mes "great soldiers,";
|
||||
mes "I will help you ready yourself";
|
||||
mes "If you think this is just another holiday, I'm not going to waste my breath.";
|
||||
mes "But if you like to pay a tribute to great soldiers, I will help you ready yourself.";
|
||||
next;
|
||||
if (select("I guess so...:Are you crazy or something?") == 2) {
|
||||
mes "[Mad Sago Lauds]";
|
||||
@ -62,11 +58,8 @@ prontera,182,214,4 script Lauds#Memorial 58,{
|
||||
mes "Then listen to me carefully.";
|
||||
next;
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "Now before you can pay tribute to";
|
||||
mes "the fallen soldiers";
|
||||
mes "you must be properly equipped";
|
||||
mes "Without your towel you will be";
|
||||
mes "lost!";
|
||||
mes "Now before you can pay tribute to the fallen soldiers you must be properly equipped.";
|
||||
mes "Without your towel you will be lost!";
|
||||
mes "If you bring me the materials, I can make you a towel.";
|
||||
next;
|
||||
mes "[Mad Sago Lauds]";
|
||||
@ -79,25 +72,19 @@ prontera,182,214,4 script Lauds#Memorial 58,{
|
||||
else if(Memorial08 == 1) {
|
||||
if (countitem(1059) < 30 || countitem(914) < 20) {
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "What are these? They aren't";
|
||||
mes "enough?!";
|
||||
mes "*Sigh* Do I really have to tell you";
|
||||
mes "again?!";
|
||||
mes "What are these? They aren't enough?!";
|
||||
mes "*Sigh* Do I really have to tell you again?!";
|
||||
mes "Bring me ^FF000030 Fabric and 20 Fluffs^000000.";
|
||||
close;
|
||||
}else{
|
||||
mes "***Mad Sago Lauds appears to be";
|
||||
mes "muttering to himself***";
|
||||
mes "***Mad Sago Lauds appears to be muttering to himself***";
|
||||
next;
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "So, did you bring the towel";
|
||||
mes "materials?";
|
||||
mes "So, did you bring the towel materials?";
|
||||
next;
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "Excellent; you've brought them";
|
||||
mes "all.";
|
||||
mes "Then I shall make you a Towel of";
|
||||
mes "Memory as I promised.";
|
||||
mes "Excellent; you've brought them all.";
|
||||
mes "Then I shall make you a Towel of Memory as I promised.";
|
||||
mes "Give me a moment.";
|
||||
next;
|
||||
mes "[Mad Sago Lauds]";
|
||||
@ -113,40 +100,30 @@ prontera,182,214,4 script Lauds#Memorial 58,{
|
||||
|
||||
else if(Memorial08 == 2) {
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "Ah, you have fluffy new towel now";
|
||||
mes "I even put your name on it";
|
||||
mes "Ah, you have fluffy new towel now I even put your name on it";
|
||||
next;
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "Say, how do you like to go";
|
||||
mes "on a journey to pay a tribute to";
|
||||
mes "Memorial Day?";
|
||||
mes "Say, how do you like to go on a journey to pay a tribute to Memorial Day?";
|
||||
next;
|
||||
if (select("Sure.:No, I'm Busy.") == 2) {
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "Don't come crying to me";
|
||||
mes "if someone decides to";
|
||||
mes "build a highway through";
|
||||
mes "your home!";
|
||||
mes "Don't come crying to me if someone decides to build a highway through your home!";
|
||||
close;
|
||||
}
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "Good. By the way, do you even know";
|
||||
mes "what the towel is for?";
|
||||
mes "Good. By the way, do you even know what the towel is for?";
|
||||
next;
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "It seems you're just carrying it";
|
||||
mes "without understanding its meaning.";
|
||||
mes "What a shame! You should go speak";
|
||||
mes "to ^FF0000Grast in Prontera^000000.";
|
||||
mes "It seems you're just carrying it without understanding its meaning.";
|
||||
mes "What a shame! You should go speak to ^FF0000Grast in Prontera^000000.";
|
||||
set Memorial08,3;
|
||||
close;
|
||||
}
|
||||
|
||||
else if(Memorial08 == 3) {
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "What are you still doing here? I";
|
||||
mes "told you to go speak to Grast in";
|
||||
mes "Prontera!";
|
||||
mes "What are you still doing here?";
|
||||
mes "I told you to go speak to Grast in Prontera!";
|
||||
close;
|
||||
}
|
||||
|
||||
@ -163,20 +140,16 @@ prontera,182,214,4 script Lauds#Memorial 58,{
|
||||
mes "HAHAHAHAHAHA!!!! cough cough";
|
||||
next;
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "Please give them to me. Thank you";
|
||||
mes "for your hard work, by the way.";
|
||||
mes "Please give them to me. Thank you for your hard work, by the way.";
|
||||
mes "Say, have you learned anything from the journey?";
|
||||
mes "Now is to go visit the plaque at 12";
|
||||
mes "o'clock direction in Prontera.";
|
||||
mes "Now is to go visit the plaque at 12 o'clock direction in Prontera.";
|
||||
next;
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "What do you mean you were just";
|
||||
mes "there?";
|
||||
mes "What do you mean you were just there?";
|
||||
next;
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "What? Why are you giving me your";
|
||||
mes "garbage!";
|
||||
mes "Those items are not useful to me at all";
|
||||
mes "What? Why are you giving me your garbage!";
|
||||
mes "Those items are not useful to me at all.";
|
||||
mes "You should be going to the plaque!";
|
||||
set Memorial08,8;
|
||||
close;
|
||||
@ -185,8 +158,7 @@ prontera,182,214,4 script Lauds#Memorial 58,{
|
||||
else if(Memorial08 == 8) {
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "Stop trying to give me your garbage!";
|
||||
mes "Go to the plaque at 12 o'clock";
|
||||
mes "direction in Prontera for your journey!";
|
||||
mes "Go to the plaque at 12 o'clock direction in Prontera for your journey!";
|
||||
close;
|
||||
}
|
||||
|
||||
@ -201,17 +173,12 @@ prontera,182,214,4 script Lauds#Memorial 58,{
|
||||
else if(.@RandomMsg == 2) {
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "Life... is like a grapefruit.";
|
||||
mes "It's orange and squishy, and has a";
|
||||
mes "few pips in it,";
|
||||
mes "and some folks have half a one for";
|
||||
mes "breakfast.";
|
||||
mes "It's orange and squishy, and has a few pips in it, and some folks have half a one for breakfast.";
|
||||
close;
|
||||
}
|
||||
else if(.@RandomMsg == 3) {
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "There was a point to this story,";
|
||||
mes "but it has temporarily escaped the";
|
||||
mes "chronicler's mind.";
|
||||
mes "There was a point to this story, but it has temporarily escaped the chronicler's mind.";
|
||||
close;
|
||||
}
|
||||
else if(.@RandomMsg == 4) {
|
||||
@ -221,9 +188,7 @@ prontera,182,214,4 script Lauds#Memorial 58,{
|
||||
}
|
||||
else if(.@RandomMsg == 5) {
|
||||
mes "[Mad Sago Lauds]";
|
||||
mes "It is a mistake to think you can";
|
||||
mes "solve any major problems just with";
|
||||
mes "potatoes.";
|
||||
mes "It is a mistake to think you can solve any major problems just with potatoes.";
|
||||
close;
|
||||
}
|
||||
}
|
||||
@ -254,14 +219,11 @@ prontera,153,286,4 script Memorial Plaque#Memorial 857,{
|
||||
}
|
||||
|
||||
L_CleanPlaque:
|
||||
mes "- You see a message from the cleaned plaque.";
|
||||
mes "- You see a message from the cleaned plaque.-";
|
||||
next;
|
||||
mes "-Although no sculptured marble";
|
||||
mes "should rise to their memory,-";
|
||||
mes "-nor engraved stone bear record of";
|
||||
mes "their deeds,-";
|
||||
mes "-yet will their remembrance be as";
|
||||
mes "lasting as the land they honored.-";
|
||||
mes "-Although no sculptured marble should rise to their memory,-";
|
||||
mes "-nor engraved stone bear record of their deeds,-";
|
||||
mes "-yet will their remembrance be as lasting as the land they honored.-";
|
||||
mes "-Daniel Webster-";
|
||||
if(Memorial08 == 9) {
|
||||
getexp 93750,43750;
|
||||
@ -269,10 +231,8 @@ prontera,153,286,4 script Memorial Plaque#Memorial 857,{
|
||||
next;
|
||||
mes "-There's another message.-";
|
||||
next;
|
||||
mes "-I may not have gone where I";
|
||||
mes "intended to go,-";
|
||||
mes "-but I think I have ended up where";
|
||||
mes "I needed to be.-";
|
||||
mes "-I may not have gone where I intended to go,-";
|
||||
mes "-but I think I have ended up where I needed to be.-";
|
||||
mes "- Douglas Adams.-";
|
||||
if(Memorial08 == 9) {
|
||||
getexp 93750,43750;
|
||||
@ -280,12 +240,9 @@ prontera,153,286,4 script Memorial Plaque#Memorial 857,{
|
||||
next;
|
||||
mes "-This is the last message.-";
|
||||
next;
|
||||
mes "-True heroism is remarkably sober,";
|
||||
mes "very undramatic.-";
|
||||
mes "-It is not the urge to surpass all";
|
||||
mes "others at whatever cost,-";
|
||||
mes "- but the urge to serve others at";
|
||||
mes "whatever cost. -";
|
||||
mes "-True heroism is remarkably sober, very undramatic.-";
|
||||
mes "-It is not the urge to surpass all others at whatever cost,-";
|
||||
mes "- but the urge to serve others at whatever cost. -";
|
||||
mes "- Arthur Ashe -";
|
||||
if(Memorial08 == 9) {
|
||||
getexp 93750,43750;
|
||||
@ -300,33 +257,24 @@ prontera,153,286,4 script Memorial Plaque#Memorial 857,{
|
||||
prontera,150,270,4 script Grast#Memorial 900,{
|
||||
if(Memorial08 < 3) {
|
||||
mes "[Grast]";
|
||||
mes "Memorial Day is a sad and yet";
|
||||
mes "glorious day.";
|
||||
mes "I wonder how many people remember";
|
||||
mes "them...";
|
||||
mes "Memorial Day is a sad and yet glorious day.";
|
||||
mes "I wonder how many people remember them...";
|
||||
close;
|
||||
}
|
||||
|
||||
else if(Memorial08 == 3) {
|
||||
mes "[Grast]";
|
||||
mes "Oh, isn't that a Towel of Memory?";
|
||||
mes "I'm so glad to meet someone who";
|
||||
mes "understands the meaning of Memorial Day.";
|
||||
mes "I'm so glad to meet someone who understands the meaning of Memorial Day.";
|
||||
next;
|
||||
mes "[Grast]";
|
||||
mes "It is very important to know what";
|
||||
mes "we're celebrating today, don't you think?";
|
||||
mes "It is very important to know what we're celebrating today, don't you think?";
|
||||
next;
|
||||
mes "[Grast]";
|
||||
mes "If you like to go on a journey to";
|
||||
mes "pay a tribute to Memorial Day,";
|
||||
mes "you should bring me some materials";
|
||||
mes "I ask.";
|
||||
mes "If you like to go on a journey to pay a tribute to Memorial Day, you should bring me some materials I ask.";
|
||||
next;
|
||||
mes "[Grast]";
|
||||
mes "Please bring me ^FF0000one of each Red";
|
||||
mes "Potion, Green Potion, Awakening";
|
||||
mes "Potion, and Butterfly Wing^000000.";
|
||||
mes "Please bring me ^FF0000one of each Red Potion, Green Potion, Awakening Potion, and Butterfly Wing^000000.";
|
||||
mes "I'll be waiting for your return.";
|
||||
set Memorial08,4;
|
||||
close;
|
||||
@ -335,20 +283,14 @@ prontera,150,270,4 script Grast#Memorial 900,{
|
||||
else if(Memorial08 == 4) {
|
||||
if (countitem(501) < 1 || countitem(506) < 1 || countitem(656) < 1 || countitem(602) < 1) {
|
||||
mes "[Grast]";
|
||||
mes "Oops, you haven't brought all";
|
||||
mes "materials.";
|
||||
mes "Oops, you haven't brought all materials.";
|
||||
mes "Please make sure you need to bring me";
|
||||
mes " ^FF0000one of each Red Potion, Green";
|
||||
mes "Potion, Awakening Potion, and";
|
||||
mes "Butteryfly Wing^000000.";
|
||||
mes "^FF0000one of each Red Potion, Green Potion, Awakening Potion, and Butteryfly Wing^000000.";
|
||||
next;
|
||||
mes "[Grast]";
|
||||
mes "You'll have to bring me more";
|
||||
mes "materials afterwards.";
|
||||
mes "If you feel too burdened to gather";
|
||||
mes "them all,";
|
||||
mes "I can provide you all the";
|
||||
mes "materials.";
|
||||
mes "You'll have to bring me more materials afterwards.";
|
||||
mes "If you feel too burdened to gather them all,";
|
||||
mes "I can provide you all the materials.";
|
||||
next;
|
||||
if (select("I'll gather the rest.:Give me the materials.") == 2) {
|
||||
goto L_GiveUp;
|
||||
@ -362,9 +304,7 @@ prontera,150,270,4 script Grast#Memorial 900,{
|
||||
mes "Hmm, you will need some more things still...";
|
||||
next;
|
||||
mes "[Grast]";
|
||||
mes "Please bring me ^FF0000one of each Trap,";
|
||||
mes "Yggdrasil Leaf, Blue Gemstone,";
|
||||
mes "Crystal Mirror, Meat, and Carrot.^000000";
|
||||
mes "Please bring me ^FF0000one of each Trap, Yggdrasil Leaf, Blue Gemstone, Crystal Mirror, Meat, and Carrot.^000000";
|
||||
mes "I'll be waiting for your return.";
|
||||
set Memorial08,5;
|
||||
close;
|
||||
@ -376,15 +316,11 @@ prontera,150,270,4 script Grast#Memorial 900,{
|
||||
mes "[Grast]";
|
||||
mes "Oops, you haven't brought all materials.";
|
||||
mes "Please make sure you'll have to bring me";
|
||||
mes " ^FF0000one of each Trap, Yggdrasil Leaf,";
|
||||
mes "Blue Gemstone, Crystal Mirror,";
|
||||
mes "Meat, and Carrot^000000.";
|
||||
mes "^FF0000one of each Trap, Yggdrasil Leaf, Blue Gemstone, Crystal Mirror, Meat, and Carrot^000000.";
|
||||
next;
|
||||
mes "[Grast]";
|
||||
mes "You'll have to bring me more";
|
||||
mes "materials afterwards.";
|
||||
mes "If you feel too burdened to gather them all,";
|
||||
mes "I can provide you all the materials.";
|
||||
mes "You'll have to bring me more materials afterwards.";
|
||||
mes "If you feel too burdened to gather them all, I can provide you all the materials.";
|
||||
next;
|
||||
if (select("I'll gather the rest.:Give me the materials.") == 2) {
|
||||
goto L_GiveUp;
|
||||
@ -396,9 +332,7 @@ prontera,150,270,4 script Grast#Memorial 900,{
|
||||
mes "Hmm, I think you need just a little bit more.";
|
||||
next;
|
||||
mes "[Grast]";
|
||||
mes "Please bring me ^FF0000one of each Pet";
|
||||
mes "Incubator, Firecracker, Poring";
|
||||
mes "Doll, and Bouquet^000000.";
|
||||
mes "Please bring me ^FF0000one of each Pet Incubator, Firecracker, Poring Doll, and Bouquet^000000.";
|
||||
set Memorial08,6;
|
||||
close;
|
||||
}
|
||||
@ -409,17 +343,14 @@ prontera,150,270,4 script Grast#Memorial 900,{
|
||||
mes "[Grast]";
|
||||
mes "Oops, you haven't brought all materials.";
|
||||
mes "Please make sure you need to bring me";
|
||||
mes " ^FF0000one of each Pet Incubator,";
|
||||
mes "Firecracker, Poring Doll and Bouquet";
|
||||
mes "^FF0000one of each Pet Incubator, Firecracker, Poring Doll and Bouquet";
|
||||
next;
|
||||
mes "[Grast]";
|
||||
mes "They are the last batch of materials.";
|
||||
mes "If you feel too burdened to gather them all,";
|
||||
mes "I can provide you all the materials.";
|
||||
mes "If you feel too burdened to gather them all, I can provide you all the materials.";
|
||||
next;
|
||||
mes "[Grast]";
|
||||
mes "If I provide you all materials, however,";
|
||||
mes "I won't have to thank you for your service.";
|
||||
mes "If I provide you all materials, however, I won't have to thank you for your service.";
|
||||
mes "It's your call, " + strcharinfo(0) + ".";
|
||||
next;
|
||||
if (select("I'll gather the rest.:Give me the materials.") == 2) {
|
||||
@ -429,19 +360,15 @@ prontera,150,270,4 script Grast#Memorial 900,{
|
||||
}else{
|
||||
mes "[Grast]";
|
||||
mes "Have you brought the materials I asked?";
|
||||
mes "Ah, thank you for your hard work;";
|
||||
mes "you've brought all of them.";
|
||||
mes "Ah, thank you for your hard work you've brought all of them.";
|
||||
next;
|
||||
mes "[Grast]";
|
||||
mes "I hope you'll learn a valuable";
|
||||
mes "lesson while gathering these materials.";
|
||||
mes "I hope you'll learn a valuable lesson while gathering these materials.";
|
||||
mes "I like to give you a small gift for your service.";
|
||||
next;
|
||||
mes "[Grast]";
|
||||
mes "You see, I have two different gifts";
|
||||
mes "in my each hand.";
|
||||
mes "A best thing would be giving you";
|
||||
mes "both of them, but...";
|
||||
mes "You see, I have two different gifts in my each hand.";
|
||||
mes "A best thing would be giving you both of them, but...";
|
||||
mes "How do you like to test your luck, " + strcharinfo(0) + "?";
|
||||
next;
|
||||
mes "[Grast]";
|
||||
@ -451,8 +378,7 @@ prontera,150,270,4 script Grast#Memorial 900,{
|
||||
mes "[Grast]";
|
||||
mes "You've selected my right hand.";
|
||||
mes "Here's the gift for you.";
|
||||
mes "Now, please bring all these";
|
||||
mes "materials to Lauds.";
|
||||
mes "Now, please bring all these materials to Lauds.";
|
||||
set Memorial08, 7;
|
||||
getitem 617,1;
|
||||
close;
|
||||
@ -460,8 +386,7 @@ prontera,150,270,4 script Grast#Memorial 900,{
|
||||
mes "[Grast]";
|
||||
mes "You've selected my left hand.";
|
||||
mes "Here's the gift for you.";
|
||||
mes "Now, please bring all these";
|
||||
mes "materials to Lauds.";
|
||||
mes "Now, please bring all these materials to Lauds.";
|
||||
set Memorial08, 7;
|
||||
getitem 12109,1;
|
||||
close;
|
||||
@ -471,43 +396,32 @@ prontera,150,270,4 script Grast#Memorial 900,{
|
||||
else if(Memorial08 == 7) {
|
||||
mes "[Grast]";
|
||||
mes "Have you met Lauds?";
|
||||
mes "I hope you'll remember your freedom";
|
||||
mes "and happiness";
|
||||
mes "are built on thousands of lives";
|
||||
mes "sacrificed in war.";
|
||||
mes "I hope you'll remember your freedom and happiness are built on thousands of lives sacrificed in war.";
|
||||
close;
|
||||
}
|
||||
|
||||
else if(Memorial08 >= 8) {
|
||||
mes "[Grast]";
|
||||
mes "A towel is about the most massively";
|
||||
mes "useful thing an adventurer can have.";
|
||||
mes "A towel is about the most massively useful thing an adventurer can have.";
|
||||
close;
|
||||
}
|
||||
|
||||
L_GiveUp:
|
||||
mes "[Grast]";
|
||||
mes "Oh, I see. I guess you're quite";
|
||||
mes "busy nowadays, huh?";
|
||||
mes "No problem; I'll give you all the";
|
||||
mes "supplies...";
|
||||
mes "Oh, I see. I guess you're quite busy nowadays, huh?";
|
||||
mes "No problem; I'll give you all the supplies...";
|
||||
next;
|
||||
mes "[Grast]";
|
||||
mes "There you go.";
|
||||
mes "I crushed all the items together";
|
||||
mes "into a more compact form for you";
|
||||
mes "You can thank me later for that";
|
||||
mes "extra service.";
|
||||
mes "I crushed all the items together into a more compact form for you.";
|
||||
mes "You can thank me later for that extra service.";
|
||||
mes "Please bring them to Lauds.";
|
||||
set Memorial08,7;
|
||||
getitem 7126,1;
|
||||
next;
|
||||
mes "[Grast]";
|
||||
mes "By the way, he had an unfortunate";
|
||||
mes "accident, and has kind of lost his";
|
||||
mes "mind.";
|
||||
mes "Please don't be alarmed even if he";
|
||||
mes "starts babbling.";
|
||||
mes "By the way, he had an unfortunate accident, and has kind of lost his mind.";
|
||||
mes "Please don't be alarmed even if he starts babbling.";
|
||||
close;
|
||||
|
||||
L_Continue:
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= Kisuka
|
||||
//===== Current Version: =====================================
|
||||
//= 1.4
|
||||
//= 1.5
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -29,6 +29,7 @@
|
||||
//= Corrected EXP rewards, and some typos.
|
||||
//= 1.3 Corrected random in item function. [L0ne_W0lf]
|
||||
//= 1.4 Replaced effect numerics with constants. [Samuray22]
|
||||
//= 1.5 Revamped the script. [Kisuka]
|
||||
//============================================================
|
||||
|
||||
prt_fild05,170,286,4 script Anxious Leprechaun#8pday 954,{
|
||||
@ -37,159 +38,105 @@ prt_fild05,170,286,4 script Anxious Leprechaun#8pday 954,{
|
||||
mes "Hmm...";
|
||||
mes "Tis a fine day it be.";
|
||||
mes "If you have a moment to spare.";
|
||||
mes "Come here to me now,";
|
||||
mes "come here and I'll tell ya something.";
|
||||
mes "Come here to me now, come here and I'll tell ya something.";
|
||||
next;
|
||||
select("Go ahead.");
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "These past years I've";
|
||||
mes "come to see the world";
|
||||
mes "and each time the snakes";
|
||||
mes "have stolen me treasure.";
|
||||
mes "These past years I've come to see the world and each time the snakes have stolen me treasure.";
|
||||
next;
|
||||
select("Oh?");
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "Ye fine folks of this land";
|
||||
mes "have been so gracious";
|
||||
mes "to recover me treasure again and again.";
|
||||
mes "Ye fine folks of this land have been so gracious to recover me treasure again and again.";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "I've learned me lesson";
|
||||
mes "and will never forget how those";
|
||||
mes "vile snakes have wronged me.";
|
||||
mes "I've learned me lesson and will never forget how those vile snakes have wronged me.";
|
||||
next;
|
||||
select("What did you do?");
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "I made a safe place to hide me";
|
||||
mes "treasure.";
|
||||
mes "Hidden in a secret place the treasure";
|
||||
mes "would be safe until I returned";
|
||||
mes "to the world the following year.";
|
||||
mes "I made a safe place to hide me treasure.";
|
||||
mes "Hidden in a secret place the treasure would be safe until I returned to the world the following year.";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "This year, I have made me journey";
|
||||
mes "to see the outside world once again.";
|
||||
mes "I traveled to me cache of gold";
|
||||
mes "I found it to be safe and";
|
||||
mes "undisturbed.";
|
||||
mes "This year, I have made me journey to see the outside world once again.";
|
||||
mes "I traveled to me cache of gold I found it to be safe and undisturbed.";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "I thought to meself,";
|
||||
mes "I am very clever to hide the";
|
||||
mes "treasure from the snakes.";
|
||||
mes "I thought to meself, I am very clever to hide the treasure from the snakes.";
|
||||
mes "Oh, but I was a fool still.";
|
||||
next;
|
||||
select("What happened?");
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "My hiding place was too clever.";
|
||||
mes "I pulled and I heaved and pushed,";
|
||||
mes "but the hiding place would not";
|
||||
mes "budge.";
|
||||
mes "So once again, I am without";
|
||||
mes "treasure this year.";
|
||||
mes "I pulled and I heaved and pushed, but the hiding place would not budge.";
|
||||
mes "So once again, I am without treasure this year.";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "I have not even begun brewing";
|
||||
mes "me famous green ale on account of";
|
||||
mes "this mess.";
|
||||
mes "I will ask ye, will ya help get me";
|
||||
mes "treasure back?";
|
||||
mes "I have not even begun brewing me famous green ale on account of this mess.";
|
||||
mes "I will ask ye, will ya help get me treasure back?";
|
||||
next;
|
||||
if (select("Sure, I can help you.:I'm too busy.") == 2) {
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "Aye, I understand.";
|
||||
mes "Thank you for listening to me";
|
||||
mes "tale.";
|
||||
mes "Thank you for listening to me tale.";
|
||||
close;
|
||||
}
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "To find my treasure it be true.";
|
||||
mes "To my treasure I give my secret to";
|
||||
mes "you.";
|
||||
mes "To my treasure I give my secret to you.";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "So, listen well and make no";
|
||||
mes "omissions.";
|
||||
mes "Make the journey to the city of";
|
||||
mes "magicians.";
|
||||
mes "Over the bridge and across the";
|
||||
mes "water";
|
||||
mes "Climb the mountain until north ye";
|
||||
mes "can travel no farther.";
|
||||
mes "So, listen well and make no omissions.";
|
||||
mes "Make the journey to the city of magicians.";
|
||||
mes "Over the bridge and across the water";
|
||||
mes "Climb the mountain until north ye can travel no farther.";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "Passed the stone steps set into the";
|
||||
mes "air.";
|
||||
mes "Hidden in the mountain side,";
|
||||
mes "me treasure is there.";
|
||||
mes "Passed the stone steps set into the air.";
|
||||
mes "Hidden in the mountain side, me treasure is there.";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "Ye must find a way to break it";
|
||||
mes "open.";
|
||||
mes "Ye will need a mighty explosion";
|
||||
mes "to free the cache to be sure.";
|
||||
mes "Ye must find a way to break it open.";
|
||||
mes "Ye will need a mighty explosion to free the cache to be sure.";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "Ye might try some Firecrackers.";
|
||||
mes "Course, Ye would need a great";
|
||||
mes "number of them,";
|
||||
mes "Ye would need at least ^FF0000200";
|
||||
mes "Firecreackers^000000";
|
||||
mes "Course, Ye would need a great number of them, Ye would need at least ^FF0000200 Firecreackers^000000";
|
||||
set StPatrick2008,1;
|
||||
close;
|
||||
}
|
||||
else if (StPatrick2008 == 1) {
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "Tis a fine day it be.";
|
||||
mes "Have you found me treasure yet,";
|
||||
mes "have you?";
|
||||
mes "Me hiding spot is a might hard to";
|
||||
mes "crack.";
|
||||
mes "Have you found me treasure yet, have you?";
|
||||
mes "Me hiding spot is a might hard to crack.";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "Ye might try some Firecrackers.";
|
||||
mes "Course, Ye would need a great";
|
||||
mes "number of them,";
|
||||
mes "Ye would need at least ^FF0000200";
|
||||
mes "Firecreackers^000000";
|
||||
mes "Course, Ye would need a great number of them, Ye would need at least ^FF0000200 Firecreackers^000000";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "I be understanding if you can't get";
|
||||
mes "to it";
|
||||
mes "to be sure to be sure.";
|
||||
mes "I be understanding if you can't get to it to be sure to be sure.";
|
||||
close;
|
||||
}
|
||||
else if (StPatrick2008 == 2) {
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "Oh, welcome back!";
|
||||
mes "Thank you for returning me";
|
||||
mes "treasure!";
|
||||
mes "Thank you for returning me treasure!";
|
||||
mes "Me gratitude knows no bounds!";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "I am so happy,";
|
||||
mes "I'll be starting up me brew right";
|
||||
mes "away";
|
||||
mes "I'll be starting up me brew right away";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "It seems that the snakes have";
|
||||
mes "returned this year";
|
||||
mes "and are here to steal my treasure";
|
||||
mes "again.";
|
||||
mes "It seems that the snakes have returned this year and are here to steal my treasure again.";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "The snakes carry the coins";
|
||||
mes "of my kinsmen and must be";
|
||||
mes "punished.";
|
||||
mes "But ye have had a long journey, for";
|
||||
mes "which I am";
|
||||
mes "very grateful.";
|
||||
mes "The snakes carry the coins of my kinsmen and must be punished.";
|
||||
mes "But ye have had a long journey, for which I am very grateful.";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "When ye have had a moment to rest";
|
||||
mes "ye legs,";
|
||||
mes "come talk to me again and we may";
|
||||
mes "speak again";
|
||||
mes "When ye have had a moment to rest ye legs, come talk to me again and we may speak again";
|
||||
close2;
|
||||
set StPatrick2008,3;
|
||||
getexp 200000,70000;
|
||||
@ -202,39 +149,23 @@ prt_fild05,170,286,4 script Anxious Leprechaun#8pday 954,{
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "Thank you for coming by again.";
|
||||
mes "The snakes carry the coins of my";
|
||||
mes "kindsmen";
|
||||
mes "and must be punished.";
|
||||
mes "The snakes carry the coins of my kindsmen and must be punished.";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "I would be so generous to give you";
|
||||
mes "some of my famous brew";
|
||||
mes "if you would bring me the";
|
||||
mes "ill-gotten gains carried";
|
||||
mes "by those vile snakes";
|
||||
mes "I would be so generous to give you some of my famous brew if you would bring me the ill-gotten gains carried by those vile snakes";
|
||||
next;
|
||||
mes "And if you find one of the";
|
||||
mes "treasures of my kin";
|
||||
mes "please bring me those coins";
|
||||
mes "so that the snakes don't get them.";
|
||||
mes "And if you find one of the treasures of my kin please bring me those coins so that the snakes don't get them.";
|
||||
set StPatrick2008,4;
|
||||
close;
|
||||
}
|
||||
else if (StPatrick2008 == 4) {
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "The snakes carry too many of me";
|
||||
mes "kinsmen's coin";
|
||||
mes "I be passing out pints of me brew";
|
||||
mes "as reward for their return.";
|
||||
mes "The snakes carry too many of me kinsmen's coin I be passing out pints of me brew as reward for their return.";
|
||||
next;
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "I'll reward ye with one jug of ale";
|
||||
mes "for ^0000FF1 Golden Coins^000000, ^0000FF5 Silver Coins^000000,";
|
||||
mes "or ^0000FF10 Bronze Coins^000000.";
|
||||
mes "It be a fair bounty for the";
|
||||
mes "ill-gotten coins.";
|
||||
mes "So, what kind of coin have ye";
|
||||
mes "brought?";
|
||||
mes "I'll reward ye with one jug of ale for ^0000FF1 Golden Coins^000000, ^0000FF5 Silver Coins^000000, or ^0000FF10 Bronze Coins^000000.";
|
||||
mes "It be a fair bounty for the ill-gotten coins.";
|
||||
mes "So, what kind of coin have ye brought?";
|
||||
next;
|
||||
switch(select("Bronze Coins:Silver Coins:Gold Coins:Quit.")) {
|
||||
case 1:
|
||||
@ -263,9 +194,7 @@ prt_fild05,170,286,4 script Anxious Leprechaun#8pday 954,{
|
||||
close;
|
||||
case 4:
|
||||
mes "[O'Riley the Leprechaun]";
|
||||
mes "I'll reward ye with one jug of ale";
|
||||
mes "for ^0000FF1 Golden Coins^000000, ^0000FF5 Silver Coins^000000,";
|
||||
mes "or ^0000FF10 Bronze Coins^000000.";
|
||||
mes "I'll reward ye with one jug of ale for ^0000FF1 Golden Coins^000000, ^0000FF5 Silver Coins^000000, or ^0000FF10 Bronze Coins^000000.";
|
||||
close;
|
||||
}
|
||||
}
|
||||
@ -276,37 +205,30 @@ mjolnir_01,272,363,4 script Rocks#08StPattysDay -1,1,1,{
|
||||
|
||||
OnTouch:
|
||||
if (StPatrick2008 < 1) {
|
||||
mes "- You've found a pile of rocks";
|
||||
mes "covered with soil. -";
|
||||
mes "- You've found a pile of rocks covered with soil. -";
|
||||
close;
|
||||
}
|
||||
if (StPatrick2008 == 1) {
|
||||
mes "- You've found a pile of rocks";
|
||||
mes "covered with soil. -";
|
||||
mes "- You've found a pile of rocks covered with soil. -";
|
||||
next;
|
||||
if (countitem(12018) < 200) {
|
||||
mes "The rocks won't budge.";
|
||||
mes "Maybe O'Riley knows a way to move";
|
||||
mes "the rocks.";
|
||||
mes "Maybe O'Riley knows a way to move the rocks.";
|
||||
close;
|
||||
}
|
||||
else {
|
||||
if (select("Use Firecrackers.:Ignore") == 2) {
|
||||
close;
|
||||
}
|
||||
mes "You buried 200 Firecrackers";
|
||||
mes "under the pile of rocks.";
|
||||
mes "You buried 200 Firecrackers under the pile of rocks.";
|
||||
mes "You light the fuse.";
|
||||
next;
|
||||
mes "*BOOM!*";
|
||||
specialeffect2 EF_LORD;
|
||||
next;
|
||||
mes "After A cloud of dust and smoke has";
|
||||
mes "dissipated,";
|
||||
mes "You've found a box between the";
|
||||
mes "rocks and soil.";
|
||||
mes "This box must contain O'Riley's";
|
||||
mes "valuables.";
|
||||
mes "After A cloud of dust and smoke has dissipated,";
|
||||
mes "You've found a box between the rocks and soil.";
|
||||
mes "This box must contain O'Riley's valuables.";
|
||||
mes "Let's bring the box to O'Riley.";
|
||||
close2;
|
||||
set StPatrick2008,2;
|
||||
|
@ -1,10 +1,26 @@
|
||||
//===== eAthena Script =======================================
|
||||
//= Guild dungeon event, Arunafeltz.
|
||||
//===== By: ==================================================
|
||||
//= L0ne_W0lf
|
||||
//===== Current Version: =====================================
|
||||
//= 1.1
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
//= Guild dungeon event, Arunafeltz. Retrieve Morestone's
|
||||
//= pickaxe from Kublin.
|
||||
//===== Additional Comments: =================================
|
||||
//= 1.0 First version
|
||||
//= 1.1 Changed spawn timer to 1 hour. [L0ne_w0lf]
|
||||
//============================================================
|
||||
|
||||
arug_dun01,1,1,1 script Monster Controler#aru_gd 81,{
|
||||
OnInit:
|
||||
donpcevent "Monster Controler1#aru::OnKill";
|
||||
initnpctimer;
|
||||
end;
|
||||
|
||||
OnTimer10000:
|
||||
OnTimer3600000:
|
||||
donpcevent "Monster Controler1#aru::OnEnable";
|
||||
mapannounce "arug_dun01", "Kublin: Aargh!",bc_map,"0x99CC00";
|
||||
mapannounce "arug_dun01", "Morestone: Stop righ there! You thief!",bc_map,"0x99CC00";
|
||||
|
@ -1,10 +1,26 @@
|
||||
//===== eAthena Script =======================================
|
||||
//= Guild dungeon event, Schwaltzvalt.
|
||||
//===== By: ==================================================
|
||||
//= L0ne_W0lf
|
||||
//===== Current Version: =====================================
|
||||
//= 1.1
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
//= Guild dungeon event, Schwaltzvalt. Retrieve Morestone's
|
||||
//= pickaxe from Kublin.
|
||||
//===== Additional Comments: =================================
|
||||
//= 1.0 First version
|
||||
//= 1.1 Changed spawn timer to 1 hour. [L0ne_w0lf]
|
||||
//============================================================
|
||||
|
||||
schg_dun01,1,1,1 script Monster Controler#sch_gd 81,{
|
||||
OnInit:
|
||||
donpcevent "Monster Controler1#sch::OnKill";
|
||||
initnpctimer;
|
||||
end;
|
||||
|
||||
OnTimer10000:
|
||||
OnTimer3600000:
|
||||
donpcevent "Monster Controler1#sch::OnEnable";
|
||||
mapannounce "schg_dun01", "Kublin: Aargh!",bc_map,"0x99CC00";
|
||||
mapannounce "schg_dun01", "Morestone: Stop righ there! You thief!",bc_map,"0x99CC00";
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= Kisuka
|
||||
//===== Current Version: =====================================
|
||||
//= 1.0
|
||||
//= 1.1
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -14,6 +14,7 @@
|
||||
//= You must enable the event monsters in mob_db2.
|
||||
//===== Additional Comments: =================================
|
||||
//= 1.0 First version. [Kisuka]
|
||||
//= 1.1 Some small changes. [Kisuka]
|
||||
//============================================================
|
||||
|
||||
payon,162,176,4 script Halloween Magician#iRO08 704,{
|
||||
@ -21,15 +22,12 @@ payon,162,176,4 script Halloween Magician#iRO08 704,{
|
||||
if(Hallow08 < 1) {
|
||||
mes "[Halloween Magician]";
|
||||
mes "Kkkkkkkkk!";
|
||||
mes "I have a special event this";
|
||||
mes "Halloween that tests your luck and";
|
||||
mes "agility.";
|
||||
mes "I have a special event this Halloween that tests your luck and agility.";
|
||||
mes "Are you interested?";
|
||||
next;
|
||||
mes "[Halloween Magician]";
|
||||
mes "Come on! Don't be a wuss!";
|
||||
mes "If you collect enough tickets";
|
||||
mes "you can get good prizes!";
|
||||
mes "If you collect enough tickets you can get good prizes!";
|
||||
mes "So what do you say?";
|
||||
next;
|
||||
goto MainMenu;
|
||||
@ -60,56 +58,40 @@ payon,162,176,4 script Halloween Magician#iRO08 704,{
|
||||
set Hallow08Kill,0;
|
||||
mes "[Halloween Magician]";
|
||||
mes "As I promised";
|
||||
mes "You can get Halloween tickets";
|
||||
mes "for cool items.";
|
||||
mes "You can get Halloween tickets for cool items.";
|
||||
close;
|
||||
}
|
||||
|
||||
if(Hallow08 > 0) {
|
||||
mes "[Halloween Magician]";
|
||||
mes "Well, do you want to hear the rules";
|
||||
mes "again or,";
|
||||
mes "just get back to it...";
|
||||
mes "Well, do you want to hear the rules again or, just get back to it...";
|
||||
next;
|
||||
goto MainMenu2;
|
||||
}
|
||||
|
||||
Rules:
|
||||
mes "[Halloween Magician]";
|
||||
mes "This village is like a virtual";
|
||||
mes "Payon. There are zombies and ghouls";
|
||||
mes "roaming around";
|
||||
mes "and three southern exits, but only";
|
||||
mes "one works.";
|
||||
mes "This village is like a virtual Payon.";
|
||||
mes "There are zombies and ghouls roaming around and three southern exits, but only one works.";
|
||||
mes "That's up to you to find out.";
|
||||
next;
|
||||
mes "[Halloween Magician]";
|
||||
mes "You can't use any skills";
|
||||
mes "to kill the ghouls or zombies.";
|
||||
mes "You can't use any skills to kill the ghouls or zombies.";
|
||||
mes "And one more thing...";
|
||||
mes "you shouldn't forget...";
|
||||
next;
|
||||
mes "[Halloween Magician]";
|
||||
mes "All participants";
|
||||
mes "should be wearing nothing.";
|
||||
mes "Put all belongings in your storage";
|
||||
mes "and come back here when your weight";
|
||||
mes "is '0'.";
|
||||
mes "All participants should be wearing nothing.";
|
||||
mes "Put all belongings in your storage and come back here when your weight is '0'.";
|
||||
next;
|
||||
mes "[Halloween Magician]";
|
||||
mes "Oh and one more thing!";
|
||||
mes "You can't be riding a PecoPeco or";
|
||||
mes "have a Cart.";
|
||||
mes "If you are, then I will remove them";
|
||||
mes "before you enter.";
|
||||
mes "You can't be riding a PecoPeco or have a Cart.";
|
||||
mes "If you are, then I will remove them before you enter.";
|
||||
mes "Got it?";
|
||||
next;
|
||||
mes "[Halloween Magician]";
|
||||
mes "Remember, there are three exits but";
|
||||
mes "only one works randomly,";
|
||||
mes "the zombies and ghouls roaming";
|
||||
mes "around there can't be killed";
|
||||
mes "and you can't be wearing anything.";
|
||||
mes "Remember, there are three exits but only one works randomly, the zombies and ghouls roaming around there can't be killed and you can't be wearing anything.";
|
||||
next;
|
||||
if (Hallow08 > 0) {
|
||||
mes "[Halloween Magician]";
|
||||
@ -128,26 +110,21 @@ payon,162,176,4 script Halloween Magician#iRO08 704,{
|
||||
if (Weight > 0) {
|
||||
mes "[Halloween Magician]";
|
||||
mes "Gosh!";
|
||||
mes "There's always a black sheep";
|
||||
mes "anywhere.";
|
||||
mes "There's always a black sheep anywhere.";
|
||||
next;
|
||||
mes "[Halloween Magician]";
|
||||
mes "You think I wouldn't notice that";
|
||||
mes "your weight is above '0'?";
|
||||
mes "You think I wouldn't notice that your weight is above '0'?";
|
||||
mes "You're overweight...";
|
||||
close;
|
||||
}else{
|
||||
mes "[Halloween Magician]";
|
||||
mes "You seem good to go,";
|
||||
mes "and your weight is just right.";
|
||||
mes "You seem good to go, and your weight is just right.";
|
||||
next;
|
||||
mes "[Halloween Magician]";
|
||||
mes "I was quite swamped with my work,";
|
||||
mes "so I'm exhausted.";
|
||||
mes "I was quite swamped with my work, so I'm exhausted.";
|
||||
next;
|
||||
mes "[Halloween Magician]";
|
||||
mes "I sometimes forget to send you";
|
||||
mes "there...";
|
||||
mes "I sometimes forget to send you there...";
|
||||
next;
|
||||
mes "[Halloween Magician]";
|
||||
mes "I hope you come back well.";
|
||||
@ -166,13 +143,11 @@ payon,162,176,4 script Halloween Magician#iRO08 704,{
|
||||
|
||||
TicketExchange:
|
||||
mes "[Halloween Magician]";
|
||||
mes "You want to exchange tickets for";
|
||||
mes "prizes?";
|
||||
mes "You want to exchange tickets for prizes?";
|
||||
mes "Good job! Kkkkkk!";
|
||||
next;
|
||||
mes "[Halloween Magician]";
|
||||
mes "Lemme tell you what items you can";
|
||||
mes "exchange for.";
|
||||
mes "Lemme tell you what items you can exchange for.";
|
||||
next;
|
||||
mes "[Halloween Magician]";
|
||||
mes "5 tickets for Pumpkin Pie.";
|
||||
@ -182,8 +157,7 @@ payon,162,176,4 script Halloween Magician#iRO08 704,{
|
||||
mes "200 tickets for Old Card Album.";
|
||||
next;
|
||||
mes "[Halloween Magician]";
|
||||
mes "What would you like to exchange";
|
||||
mes "for?";
|
||||
mes "What would you like to exchange for?";
|
||||
next;
|
||||
switch(select("Pumpkin Pie:Pumpkin-Head:Old Blue Box:Old Purple Box:Old Card Album")) {
|
||||
case 1:
|
||||
@ -248,8 +222,7 @@ payon,162,176,4 script Halloween Magician#iRO08 704,{
|
||||
mes "[Halloween Magician]";
|
||||
mes "You don't have enough tickets!";
|
||||
mes "Can't you even count?";
|
||||
mes "Please come here with the right";
|
||||
mes "number of tickets.";
|
||||
mes "Please come here with the right number of tickets.";
|
||||
close;
|
||||
|
||||
Enough:
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= Kisuka
|
||||
//===== Current Version: =====================================
|
||||
//= 1.2
|
||||
//= 1.3
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -20,6 +20,7 @@
|
||||
//===== Additional Comments: =================================
|
||||
//= 1.0 First version. [Kisuka]
|
||||
//= 1.1-1.2 Fixed exploits with unlimited rings and non deleting choco [Lupus]
|
||||
//= 1.3 Some Changes. [Kisuka]
|
||||
//============================================================
|
||||
|
||||
// Marco Bassinio (Chocolate/Chocolate Box maker)
|
||||
@ -37,17 +38,12 @@ prontera,164,174,4 script Trader#Val09 58,{
|
||||
case 1:
|
||||
mes "[Marco Bassinio]";
|
||||
mes "Ahaha, my dear.";
|
||||
mes "This chocolate is";
|
||||
mes "nothing like others.";
|
||||
mes "Every piece bears the";
|
||||
mes "devotion of the person";
|
||||
mes "who made it!";
|
||||
mes "This chocolate is nothing like others.";
|
||||
mes "Every piece bears the devotion of the person who made it!";
|
||||
next;
|
||||
mes "[Marco Bassinio]";
|
||||
mes "So, that's why I can't sell";
|
||||
mes "more than 5 of them at a time.";
|
||||
mes "If you really really want more,";
|
||||
mes "then talk to me again.";
|
||||
mes "So, that's why I can't sell more than 5 of them at a time.";
|
||||
mes "If you really really want more, then talk to me again.";
|
||||
mes "How many do you want anyway?";
|
||||
next;
|
||||
while(.@input <= 0 || .@input > 5) {
|
||||
@ -55,29 +51,22 @@ prontera,164,174,4 script Trader#Val09 58,{
|
||||
if (.@input < 1) {
|
||||
mes "[Marco Bassinio]";
|
||||
mes "Oh, it's such a shame!";
|
||||
mes "I'm sure you'll miss";
|
||||
mes "this opportunity and";
|
||||
mes "regret you didn't buy it.";
|
||||
mes "I'm sure you'll miss this opportunity and regret you didn't buy it.";
|
||||
next;
|
||||
mes "[Marco Bassinio]";
|
||||
mes "Remember, you can never";
|
||||
mes "find this anywhere else!";
|
||||
mes "Come back anytime,";
|
||||
mes "when you change your mind.";
|
||||
mes "Remember, you can never find this anywhere else!";
|
||||
mes "Come back anytime, when you change your mind.";
|
||||
close;
|
||||
}
|
||||
if (.@input > 5) {
|
||||
mes "[Marco Bassinio]";
|
||||
mes "Ugh.. Didn't I tell you?";
|
||||
mes "5 is the maximum!";
|
||||
mes "I can't sell more than";
|
||||
mes "that to the same person.";
|
||||
mes "I can't sell more than that to the same person.";
|
||||
next;
|
||||
mes "[Marco Bassinio]";
|
||||
mes "And you know it's not";
|
||||
mes "like an everyday meal.";
|
||||
mes "Eating too much is not";
|
||||
mes "really good for you.";
|
||||
mes "And you know it's not like an everyday meal.";
|
||||
mes "Eating too much is not really good for you.";
|
||||
next;
|
||||
}
|
||||
}
|
||||
@ -90,60 +79,40 @@ prontera,164,174,4 script Trader#Val09 58,{
|
||||
set .@price, .@input * 5000;
|
||||
if (Zeny < .@price) {
|
||||
mes "[Marco Bassinio]";
|
||||
mes "Looks like you don't have";
|
||||
mes "enough zeny with ya.";
|
||||
mes "Maybe you should borrow";
|
||||
mes "some zeny from a friend.";
|
||||
mes "Cuz, I'm not gonna";
|
||||
mes "be here everyday.";
|
||||
mes "Looks like you don't have enough zeny with ya.";
|
||||
mes "Maybe you should borrow some zeny from a friend.";
|
||||
mes "Cuz, I'm not gonna be here everyday.";
|
||||
close;
|
||||
}else{
|
||||
mes "[Marco Bassinio]";
|
||||
mes "Good for you!";
|
||||
mes "It's also perfect as a gift!";
|
||||
mes "You know you can't get this";
|
||||
mes "kind of chocolate normally.";
|
||||
mes "You know you can't get this kind of chocolate normally.";
|
||||
next;
|
||||
mes "[Marco Bassinio]";
|
||||
mes "If you want more,";
|
||||
mes "you should come back.";
|
||||
mes "Might be a good idea to";
|
||||
mes "buy some more while";
|
||||
mes "you have a chance...!";
|
||||
mes "If you want more, you should come back.";
|
||||
mes "Might be a good idea to buy some more while you have a chance...!";
|
||||
set Zeny,Zeny - .@price;
|
||||
getitem 558,.@input;
|
||||
close;
|
||||
}
|
||||
case 2:
|
||||
mes "[Marco Bassinio]";
|
||||
mes "If you want to gift-wrap";
|
||||
mes "the chocolate, of course,";
|
||||
mes "you need chocolate,";
|
||||
mes "plus, wrapping paper,";
|
||||
mes "wrapping strap and a box.";
|
||||
mes "If you want to gift-wrap the chocolate, of course, you need chocolate, plus, wrapping paper, wrapping strap and a box.";
|
||||
next;
|
||||
mes "[Marco Bassinio]";
|
||||
mes "You also need to pay";
|
||||
mes "500 zeny to carve your";
|
||||
mes "name on the box.";
|
||||
mes "You also need to pay 500 zeny to carve your name on the box.";
|
||||
mes "Are you all prepared...?";
|
||||
next;
|
||||
if(countitem(7175) < 1 || countitem(7174) < 1 || countitem(7948) < 1 || Zeny < 500) {
|
||||
mes "[Marco Bassinio]";
|
||||
mes "Hmm.. Looks like you don't";
|
||||
mes "have enough materials to";
|
||||
mes "decorate the gift box..";
|
||||
mes "You can't just put your gift";
|
||||
mes "into some plain looking box..";
|
||||
mes "Hmm.. Looks like you don't have enough materials to decorate the gift box..";
|
||||
mes "You can't just put your gift into some plain looking box..";
|
||||
mes "Don't you think?";
|
||||
next;
|
||||
mes "[Marco Bassinio]";
|
||||
mes "You need to bring some";
|
||||
mes "wrapping paper,";
|
||||
mes "wrapping strap, and a box.";
|
||||
mes "Oh, also bring 500 zeny,";
|
||||
mes "and don't forget to bring your";
|
||||
mes "true loving heart with you!!";
|
||||
mes "You need to bring some wrapping paper, wrapping strap, and a box.";
|
||||
mes "Oh, also bring 500 zeny, and don't forget to bring your true loving heart with you!!";
|
||||
close;
|
||||
}
|
||||
if(countitem(558) < 1) {
|
||||
@ -153,10 +122,7 @@ prontera,164,174,4 script Trader#Val09 58,{
|
||||
mes "You know I'm not an alchemist or anything.";
|
||||
next;
|
||||
mes "[Marco Bassinio]";
|
||||
mes "You're not saying that you";
|
||||
mes "want an empty chocolate box";
|
||||
mes "without any chocolate in it,";
|
||||
mes "am I right?";
|
||||
mes "You're not saying that you want an empty chocolate box without any chocolate in it, am I right?";
|
||||
close;
|
||||
}
|
||||
if (!checkweight(12744,1)) {
|
||||
@ -167,11 +133,9 @@ prontera,164,174,4 script Trader#Val09 58,{
|
||||
}
|
||||
mes "[Marco Bassinio]";
|
||||
mes "Here, look!";
|
||||
mes "It's your chocolate box";
|
||||
mes "with your name on it.";
|
||||
mes "It's your chocolate box with your name on it.";
|
||||
mes "Isn't it fabulous?";
|
||||
mes "See, your name looks";
|
||||
mes "great on the box!";
|
||||
mes "See, your name looks great on the box!";
|
||||
next;
|
||||
delitem 558,1;
|
||||
delitem 7175,1;
|
||||
@ -186,15 +150,11 @@ prontera,164,174,4 script Trader#Val09 58,{
|
||||
case 3:
|
||||
mes "[Marco Bassinio]";
|
||||
mes "Oh, it's such a shame!";
|
||||
mes "I'm sure you'll miss";
|
||||
mes "this opportunity and";
|
||||
mes "regret you didn't buy it.";
|
||||
mes "I'm sure you'll miss this opportunity and regret you didn't buy it.";
|
||||
next;
|
||||
mes "[Marco Bassinio]";
|
||||
mes "Remember, you can never";
|
||||
mes "find this anywhere else!";
|
||||
mes "Come back anytime,";
|
||||
mes "when you change your mind.";
|
||||
mes "Remember, you can never find this anywhere else!";
|
||||
mes "Come back anytime, when you change your mind.";
|
||||
close;
|
||||
}
|
||||
}
|
||||
@ -203,9 +163,7 @@ prontera,164,174,4 script Trader#Val09 58,{
|
||||
prontera,147,171,5 script Packs Trader#Val09 58,{
|
||||
mes "[Packs Trader]";
|
||||
mes "Hello.";
|
||||
mes "I am a Packs Trader,";
|
||||
mes "I sell paper boxes and";
|
||||
mes "supplies for packing presents.";
|
||||
mes "I am a Packs Trader, I sell paper boxes and supplies for packing presents.";
|
||||
next;
|
||||
while(1) {
|
||||
mes "[Packs Trader]";
|
||||
@ -214,18 +172,15 @@ prontera,147,171,5 script Packs Trader#Val09 58,{
|
||||
switch(select("Packing Paper:Packing Ribbon:Box:Cancel.")) {
|
||||
case 1:
|
||||
mes "[Packs Trader]";
|
||||
mes "It's 200 zeny for";
|
||||
mes "1 Packing Paper.";
|
||||
mes "It's 200 zeny for 1 Packing Paper.";
|
||||
mes "How many do you want?";
|
||||
mes "You can't buy more";
|
||||
mes "than 10 items at once.";
|
||||
mes "You can't buy more than 10 items at once.";
|
||||
next;
|
||||
input .@input;
|
||||
if (.@input <= 0) {
|
||||
mes "[Packs Trader]";
|
||||
mes "Nothing to buy.";
|
||||
mes "Come back when";
|
||||
mes "you need something.";
|
||||
mes "Come back when you need something.";
|
||||
close;
|
||||
}
|
||||
if (.@input > 10) {
|
||||
@ -250,9 +205,7 @@ prontera,147,171,5 script Packs Trader#Val09 58,{
|
||||
}else{
|
||||
mes "[Packs Trader]";
|
||||
mes "Here they are.";
|
||||
mes "Hope it makes your";
|
||||
mes "Valentine's Day";
|
||||
mes "more pleasing!";
|
||||
mes "Hope it makes your Valentine's Day more pleasing!";
|
||||
set Zeny,Zeny-.@price;
|
||||
getitem 7175,.@input;
|
||||
next;
|
||||
@ -260,18 +213,15 @@ prontera,147,171,5 script Packs Trader#Val09 58,{
|
||||
}
|
||||
case 2:
|
||||
mes "[Packs Trader]";
|
||||
mes "It's 200 zeny for";
|
||||
mes "1 Packing Ribbon.";
|
||||
mes "It's 200 zeny for 1 Packing Ribbon.";
|
||||
mes "How many do you want?";
|
||||
mes "You can't buy more";
|
||||
mes "than 10 items at once.";
|
||||
mes "You can't buy more than 10 items at once.";
|
||||
next;
|
||||
input .@input;
|
||||
if (.@input <= 0) {
|
||||
mes "[Packs Trader]";
|
||||
mes "Nothing to buy.";
|
||||
mes "Come back when";
|
||||
mes "you need something.";
|
||||
mes "Come back when you need something.";
|
||||
close;
|
||||
}
|
||||
if (.@input > 10) {
|
||||
@ -296,9 +246,7 @@ prontera,147,171,5 script Packs Trader#Val09 58,{
|
||||
}else{
|
||||
mes "[Packs Trader]";
|
||||
mes "Here they are.";
|
||||
mes "Hope it makes your";
|
||||
mes "Valentine's Day";
|
||||
mes "more pleasing!";
|
||||
mes "Hope it makes your Valentine's Day more pleasing!";
|
||||
set Zeny,Zeny-.@price;
|
||||
getitem 7174,.@input;
|
||||
next;
|
||||
@ -306,18 +254,15 @@ prontera,147,171,5 script Packs Trader#Val09 58,{
|
||||
}
|
||||
case 3:
|
||||
mes "[Packs Trader]";
|
||||
mes "It's 600 zeny for";
|
||||
mes "1 Box.";
|
||||
mes "It's 600 zeny for 1 Box.";
|
||||
mes "How many do you want?";
|
||||
mes "You can't buy more";
|
||||
mes "than 10 items at once.";
|
||||
mes "You can't buy more than 10 items at once.";
|
||||
next;
|
||||
input .@input;
|
||||
if (.@input <= 0) {
|
||||
mes "[Packs Trader]";
|
||||
mes "Nothing to buy.";
|
||||
mes "Come back when";
|
||||
mes "you need something.";
|
||||
mes "Come back when you need something.";
|
||||
close;
|
||||
}
|
||||
if (.@input > 10) {
|
||||
@ -342,9 +287,7 @@ prontera,147,171,5 script Packs Trader#Val09 58,{
|
||||
}else{
|
||||
mes "[Packs Trader]";
|
||||
mes "Here they are.";
|
||||
mes "Hope it makes your";
|
||||
mes "Valentine's Day";
|
||||
mes "more pleasing!";
|
||||
mes "Hope it makes your Valentine's Day more pleasing!";
|
||||
set Zeny,Zeny-.@price;
|
||||
getitem 7948,.@input;
|
||||
next;
|
||||
@ -353,8 +296,7 @@ prontera,147,171,5 script Packs Trader#Val09 58,{
|
||||
case 4:
|
||||
mes "[Packs Trader]";
|
||||
mes "Goodbye!";
|
||||
mes "And enjoy your";
|
||||
mes "Valentine's Day.";
|
||||
mes "And enjoy your Valentine's Day.";
|
||||
close;
|
||||
}
|
||||
}
|
||||
@ -364,102 +306,66 @@ prontera,147,171,5 script Packs Trader#Val09 58,{
|
||||
prontera,154,185,5 script Event Ring Maker#Val09 721,{
|
||||
if (BaseLevel < 75) {
|
||||
mes "[Event Ring Maker]";
|
||||
mes "Hello, I only make the";
|
||||
mes "Valentine rings to those";
|
||||
mes "experienced adventurers";
|
||||
mes "Level 75 or above.";
|
||||
mes "Hello, I only make the Valentine rings to those experienced adventurer Level 75 or above.";
|
||||
next;
|
||||
mes "[Event Ring Maker]";
|
||||
mes "You're not fully";
|
||||
mes "experienced yet.";
|
||||
mes "Come back when you're";
|
||||
mes "experienced enough to";
|
||||
mes "handle the quests.";
|
||||
mes "You're not fully experienced yet.";
|
||||
mes "Come back when you're experienced enough to handle the quests.";
|
||||
close;
|
||||
}
|
||||
|
||||
if (iROval09ring >= 1) {
|
||||
mes "[Event Ring Maker]";
|
||||
mes "The box with the ring,";
|
||||
mes "carved with your name,";
|
||||
mes "is for the one you love.";
|
||||
mes "The box with the ring, carved with your name, is for the one you love.";
|
||||
next;
|
||||
mes "[Event Ring Maker]";
|
||||
mes "As for the rings that you";
|
||||
mes "receive from others, they";
|
||||
mes "should all be registered";
|
||||
mes "with the Vote Manager.";
|
||||
mes "She is standing near";
|
||||
mes "the Prontera Fountain.";
|
||||
mes "As for the rings that you receive from others, they should all be registered with the Vote Manager.";
|
||||
mes "She is standing near the Prontera Fountain.";
|
||||
next;
|
||||
mes "[Event Ring Maker]";
|
||||
mes "Only the most popular";
|
||||
mes "male and female are";
|
||||
mes "subjected to getting rewards.";
|
||||
mes "Be aware, and always";
|
||||
mes "try to stay popular!";
|
||||
mes "Only the most popular male and female are subjected to getting rewards.";
|
||||
mes "Be aware, and always try to stay popular!";
|
||||
close;
|
||||
}
|
||||
|
||||
mes "[Event Ring Maker]";
|
||||
mes "Hi, there, how are ya?";
|
||||
mes "Come to me if you're";
|
||||
mes "interested in the event,";
|
||||
mes "'Who's Valentine's Hottest?'";
|
||||
mes "Come to me if you're interested in the event, 'Who's Valentine's Hottest?'";
|
||||
next;
|
||||
mes "[Event Ring Maker]";
|
||||
mes "I make the most precious";
|
||||
mes "rings that you can give";
|
||||
mes "to your sweethearts.";
|
||||
mes "Those rings are very special";
|
||||
mes "because I carve";
|
||||
mes "your names on them!";
|
||||
mes "I make the most precious rings that you can give to your sweethearts.";
|
||||
mes "Those rings are very special because I carve your names on them!";
|
||||
next;
|
||||
mes "[Event Ring Maker]";
|
||||
mes "Isn't it exciting?";
|
||||
mes "Isn't it such a brilliant idea?";
|
||||
mes "Give these special rings";
|
||||
mes "to your sweethearts!";
|
||||
mes "Give these special rings to your sweethearts!";
|
||||
next;
|
||||
mes "[Event Ring Maker]";
|
||||
mes "You should hurry 'cuz";
|
||||
mes "this event will only";
|
||||
mes "last for two weeks.";
|
||||
mes "Give that special someone";
|
||||
mes "a gift of a Valentine's ring.";
|
||||
mes "You should hurry 'cuz this event will only last for two weeks.";
|
||||
mes "Give that special someone a gift of a Valentine's ring.";
|
||||
next;
|
||||
mes "[Event Ring Maker]";
|
||||
mes "Remember, you can only";
|
||||
mes "generate the ring once.";
|
||||
mes "You also need Wrapping Paper,";
|
||||
mes "Wrapping Strap and a Box";
|
||||
mes "to make the ring.";
|
||||
mes "Remember, you can only generate the ring once.";
|
||||
mes "You also need Wrapping Paper, Wrapping Strap and a Box to make the ring.";
|
||||
next;
|
||||
mes "[Event Ring Maker]";
|
||||
mes "So you better be sure";
|
||||
mes "of who you give this to.";
|
||||
mes "By the way,";
|
||||
mes "It costs 1,000 zeny.";
|
||||
mes "So you better be sure of who you give this to.";
|
||||
mes "By the way, It costs 1,000 zeny.";
|
||||
mes "Would you like to make one?";
|
||||
next;
|
||||
if(select("Hmm.. I gotta give it a second thought...:Sure.") == 1) {
|
||||
mes "[Event Ring Maker]";
|
||||
mes "Alrighty!";
|
||||
mes "You can't put a rush";
|
||||
mes "on such a thing like this.";
|
||||
mes "Think about what";
|
||||
mes "you truly want.";
|
||||
mes "You can't put a rush on such a thing like this.";
|
||||
mes "Think about what you truly want.";
|
||||
mes "Just follow your heart!";
|
||||
close;
|
||||
}
|
||||
if(countitem(7175) < 1 || countitem(7174) < 1 || countitem(7948) < 1 || Zeny < 1000) {
|
||||
mes "[Event Ring Maker]";
|
||||
mes "Well, you don't have";
|
||||
mes "enough materials";
|
||||
mes "to make a gift box.";
|
||||
mes "Check what you have,";
|
||||
mes "and come back later";
|
||||
mes "with all the materials.";
|
||||
mes "Well, you don't have enough materials to make a gift box.";
|
||||
mes "Check what you have, and come back later with all the materials.";
|
||||
close;
|
||||
}
|
||||
mes "[Event Ring Maker]";
|
||||
@ -477,51 +383,33 @@ prontera,154,185,5 script Event Ring Maker#Val09 721,{
|
||||
getnameditem 12743,strcharinfo(0);
|
||||
}
|
||||
mes "[Event Ring Maker]";
|
||||
mes "Here, the most precious";
|
||||
mes "ring in the world!";
|
||||
mes "Don't forget, you can never";
|
||||
mes "make this ring again.";
|
||||
mes "Here, the most precious ring in the world!";
|
||||
mes "Don't forget, you can never make this ring again.";
|
||||
next;
|
||||
mes "[Event Ring Maker]";
|
||||
mes "You must pick out the one";
|
||||
mes "that you really really love,";
|
||||
mes "and give this ring";
|
||||
mes "to that person.";
|
||||
mes "You must pick out the one that you really really love, and give this ring to that person.";
|
||||
next;
|
||||
mes "[Event Ring Maker]";
|
||||
mes "Of course, you've got to";
|
||||
mes "get rings from others,";
|
||||
mes "that's the way you can";
|
||||
mes "participate in the voting, right?";
|
||||
mes "Challenge yourself to become";
|
||||
mes "Valentine's Hottest!";
|
||||
mes "Of course, you've got to get rings from others, that's the way you can participate in the voting, right?";
|
||||
mes "Challenge yourself to become Valentine's Hottest!";
|
||||
close;
|
||||
}
|
||||
|
||||
// Valentine Vote Manager (Registers votes)
|
||||
prontera,157,185,4 script Valentine Vote Manager#v 113,{
|
||||
mes "[Valentine Vote Manager]";
|
||||
mes "Hello, I'm the Valentine's";
|
||||
mes "Vote Manager.";
|
||||
mes "I'm in charge of collecting";
|
||||
mes "rings for this event!";
|
||||
mes "Hello, I'm the Valentine's Vote Manager.";
|
||||
mes "I'm in charge of collecting rings for this event!";
|
||||
next;
|
||||
mes "[Valentine Vote Manager]";
|
||||
mes "I register the rings";
|
||||
mes "you get from others";
|
||||
mes "and I calculate the";
|
||||
mes "total number of rings.";
|
||||
mes "I register the rings you get from others and I calculate the total number of rings.";
|
||||
next;
|
||||
mes "[Valentine Vote Manager]";
|
||||
mes "You know what I do besides";
|
||||
mes "just counting those rings?";
|
||||
mes "I can tell you the adventurer's";
|
||||
mes "name who's got the";
|
||||
mes "most number of votes.";
|
||||
mes "You know what I do besides just counting those rings?";
|
||||
mes "I can tell you the adventurer's name who's got the most number of votes.";
|
||||
next;
|
||||
mes "[Valentine Vote Manager]";
|
||||
mes "Plus, you can also find out how";
|
||||
mes "many votes he/she got.";
|
||||
mes "Plus, you can also find out how many votes he/she got.";
|
||||
next;
|
||||
while (1) {
|
||||
mes "[Valentine Vote Manager]";
|
||||
@ -530,15 +418,10 @@ prontera,157,185,4 script Valentine Vote Manager#v 113,{
|
||||
switch(select("Please register my rings.:Please count my votes.:Nothing, for now.")) {
|
||||
case 1:
|
||||
mes "[Valentine Vote Manager]";
|
||||
mes "Please tell me how many";
|
||||
mes "rings you want to register.";
|
||||
mes "Please tell me how many rings you want to register.";
|
||||
next;
|
||||
mes "[Valentine Vote Manager]";
|
||||
mes "When you write the";
|
||||
mes "number of the rings,";
|
||||
mes "the number shouldn't be";
|
||||
mes "larger than the number of";
|
||||
mes "rings you actually have.";
|
||||
mes "When you write the number of the rings, the number shouldn't be larger than the number of rings you actually have.";
|
||||
mes "'0', cancels everything.";
|
||||
next;
|
||||
input .@input;
|
||||
@ -569,8 +452,7 @@ prontera,157,185,4 script Valentine Vote Manager#v 113,{
|
||||
}
|
||||
|
||||
mes "[Valentine Vote Manager]";
|
||||
mes "I'll take those silver rings,";
|
||||
mes "and count the votes for you.";
|
||||
mes "I'll take those silver rings, and count the votes for you.";
|
||||
mes "Thank you for participating.";
|
||||
delitem 7947,.@input;
|
||||
set Val09Rings,Val09Rings+.@input;
|
||||
@ -598,8 +480,7 @@ prontera,157,185,4 script Valentine Vote Manager#v 113,{
|
||||
}
|
||||
|
||||
mes "[Valentine Vote Manager]";
|
||||
mes "I'll take those gold rings,";
|
||||
mes "and count the votes for you.";
|
||||
mes "I'll take those gold rings, and count the votes for you.";
|
||||
mes "Thank you for participating.";
|
||||
delitem 7946,.@input;
|
||||
set Val09Rings,Val09Rings+.@input;
|
||||
@ -613,8 +494,7 @@ prontera,157,185,4 script Valentine Vote Manager#v 113,{
|
||||
case 2:
|
||||
mes "[Valentine Vote Manager]";
|
||||
mes "Let's see...";
|
||||
mes "You have registered..";
|
||||
mes ".."+Val09Rings+" rings so far.";
|
||||
mes "You have registered...."+Val09Rings+" rings so far.";
|
||||
mes "and...";
|
||||
next;
|
||||
mes "[Valentine Vote Manager]";
|
||||
@ -629,8 +509,7 @@ prontera,157,185,4 script Valentine Vote Manager#v 113,{
|
||||
mes "[Valentine Vote Manager]";
|
||||
mes "Hey, you can be popular too!";
|
||||
mes "Anyone can... really!";
|
||||
mes "Though you have to try a lot";
|
||||
mes "harder, but still~ Hahaha!";
|
||||
mes "Though you have to try a lot harder, but still~ Hahaha!";
|
||||
close;
|
||||
}
|
||||
}
|
||||
@ -640,16 +519,12 @@ prontera,157,185,4 script Valentine Vote Manager#v 113,{
|
||||
prt_castle,42,35,3 script Dessert Manager#Val09 47,{
|
||||
if (Sex) {
|
||||
mes "[Charles Orleans]";
|
||||
mes "Monsieur~! What brings";
|
||||
mes "you to my beautiful atelier?";
|
||||
mes "Monsieur~! What brings you to my beautiful atelier?";
|
||||
mes "What is it that you want?";
|
||||
mes "Well, my sparkling eyes";
|
||||
mes "get dried and lose their shine";
|
||||
mes "if not for the pretty little lady.";
|
||||
mes "Well, my sparkling eyes get dried and lose their shine if not for the pretty little lady.";
|
||||
next;
|
||||
mes "[Charles Orleans]";
|
||||
mes "Please leave me alone unless";
|
||||
mes "you have business with me.";
|
||||
mes "Please leave me alone unless you have business with me.";
|
||||
mes "Haaaa~ I'm a busy person.";
|
||||
mes "Don't bother me....";
|
||||
mes "Annoying, annoying, annoying~~!";
|
||||
@ -658,11 +533,8 @@ prt_castle,42,35,3 script Dessert Manager#Val09 47,{
|
||||
|
||||
mes "[Charles Orleans]";
|
||||
mes "Oh, Mademoiselle!";
|
||||
mes "This little trifling space";
|
||||
mes "felt like heaven the";
|
||||
mes "minute you walked in!";
|
||||
mes "Can I help you with";
|
||||
mes "anything, if it's alright?";
|
||||
mes "This little trifling space felt like heaven the minute you walked in!";
|
||||
mes "Can I help you with anything, if it's alright?";
|
||||
next;
|
||||
if(select("Please, make me some chocolate.:Don't bother. I'm just passing by.") == 2) {
|
||||
mes "[Charles Orleans]";
|
||||
@ -680,51 +552,36 @@ prt_castle,42,35,3 script Dessert Manager#Val09 47,{
|
||||
if(countitem(558) < 3) {
|
||||
mes "[Charles Orleans]";
|
||||
mes "Ahhh, Mademoiselle.";
|
||||
mes "I'm not an alchemist,";
|
||||
mes "or a magician.";
|
||||
mes "I don't just make chocolate";
|
||||
mes "out of anything.";
|
||||
mes "I'm not an alchemist, or a magician.";
|
||||
mes "I don't just make chocolate out of anything.";
|
||||
next;
|
||||
mes "[Charles Orleans]";
|
||||
mes "I always think of making";
|
||||
mes "chocolate as artistic work.";
|
||||
mes "I always think of making chocolate as artistic work.";
|
||||
mes "You see, I'm no ordinary cook...";
|
||||
mes "I make chocolate with feelings..";
|
||||
mes "messages of loving hearts..";
|
||||
next;
|
||||
mes "[Charles Orleans]";
|
||||
mes "I make masterpieces.";
|
||||
mes "No one can imitate";
|
||||
mes "the looks and the taste.";
|
||||
mes "Yes, it's nothing like";
|
||||
mes "ordinary chocolate!";
|
||||
mes "No one can imitate the looks and the taste.";
|
||||
mes "Yes, it's nothing like ordinary chocolate!";
|
||||
next;
|
||||
mes "[Charles Orleans]";
|
||||
mes "I'm afraid I can't make it";
|
||||
mes "and prove it to you now.";
|
||||
mes "I'm afraid I can't make it and prove it to you now.";
|
||||
mes "This is really a shame!";
|
||||
next;
|
||||
mes "[Charles Orleans]";
|
||||
mes "I really want to thank";
|
||||
mes "you for visiting me";
|
||||
mes "and if you only bring";
|
||||
mes "^3152ff3 Chocolates^000000,";
|
||||
mes "I'll make you chocolate";
|
||||
mes "like you've never seen...";
|
||||
mes "I really want to thank you for visiting me and if you only bring ^3152ff3 Chocolates^000000, I'll make you chocolate like you've never seen...";
|
||||
next;
|
||||
mes "[Charles Orleans]";
|
||||
mes "never tasted before...";
|
||||
mes "Mademoiselle, with your spirit,";
|
||||
mes "I'm sure you can bring";
|
||||
mes "3 pieces of chocolate.";
|
||||
mes "Mademoiselle, with your spirit, I'm sure you can bring 3 pieces of chocolate.";
|
||||
mes "I have no doubt at all.";
|
||||
next;
|
||||
mes "[Charles Orleans]";
|
||||
mes "So... what do you think?";
|
||||
mes "Can you bring ^3152ff3 Chocolates^000000?";
|
||||
mes "I could get them myself,";
|
||||
mes "but I'm tied up with so much";
|
||||
mes "work as you see right now.";
|
||||
mes "I could get them myself, but I'm tied up with so much work as you see right now.";
|
||||
next;
|
||||
mes "[Charles Orleans]";
|
||||
mes "Adios, Mademoiselle.....";
|
||||
@ -739,28 +596,20 @@ prt_castle,42,35,3 script Dessert Manager#Val09 47,{
|
||||
}
|
||||
mes "[Charles Orleans]";
|
||||
mes "Oh, Mademoiselle!";
|
||||
mes "I'll make the best chocolate";
|
||||
mes "with the pieces you've brought.";
|
||||
mes "I'm going to put the light of";
|
||||
mes "your eyes into this chocolate";
|
||||
mes "that no one can resist.";
|
||||
mes "I'll make the best chocolate with the pieces you've brought.";
|
||||
mes "I'm going to put the light of your eyes into this chocolate that no one can resist.";
|
||||
next;
|
||||
mes "[Charles Orleans]";
|
||||
mes "It'll be stronger than a";
|
||||
mes "sweet sweet love potion.....";
|
||||
mes "It'll be stronger than a sweet sweet love potion.....";
|
||||
next;
|
||||
mes "[Charles Orleans]";
|
||||
mes "Un, Deux, Trois, Quatre.....";
|
||||
mes "Just like the ugly duckling that";
|
||||
mes "turned to a beautiful swan-";
|
||||
mes "Ordinary chocolate pieces are";
|
||||
mes "becoming a piece of art!";
|
||||
mes "Just like the ugly duckling that turned to a beautiful swan-";
|
||||
mes "Ordinary chocolate pieces are becoming a piece of art!";
|
||||
next;
|
||||
mes "[Charles Orleans]";
|
||||
mes "They're changing!";
|
||||
mes "They're getting warm,";
|
||||
mes "softly changing the shape,";
|
||||
mes "getting stronger again!";
|
||||
mes "They're getting warm, softly changing the shape, getting stronger again!";
|
||||
mes "Oh, is it a master piece or";
|
||||
mes "what...!!";
|
||||
next;
|
||||
@ -774,10 +623,7 @@ prt_castle,42,35,3 script Dessert Manager#Val09 47,{
|
||||
next;
|
||||
mes "[Charles Orleans]";
|
||||
mes "Alright. Mademoiselle,";
|
||||
mes "I hope this is just";
|
||||
mes "what you wanted,";
|
||||
mes "for it bears your";
|
||||
mes "beautiful heart inside.";
|
||||
mes "I hope this is just what you wanted, for it bears your beautiful heart inside.";
|
||||
close;
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= L0ne_W0lf
|
||||
//===== Current Version: =====================================
|
||||
//= 1.5
|
||||
//= 1.6
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -21,6 +21,8 @@
|
||||
//= You may need to update your questid2display.
|
||||
//= Changed White lady spawn to MVP White Lady. (bugreport:4601)
|
||||
//= 1.5 Corrected some grammar and typos.
|
||||
//= 1.6 Corrected the tower re-entry blocked condition. (bugreport:4677) [L0ne_W0lf]
|
||||
//= Corrected floor 75 warp disabling the wrong NPC. (bugreport:4711)
|
||||
//============================================================
|
||||
|
||||
alberta,214,77,6 script Captain Janssen 709,{
|
||||
@ -352,7 +354,7 @@ e_tower,81,105,0 script Tower Protection Stone 406,{
|
||||
}
|
||||
close;
|
||||
}
|
||||
else if ((.@etower_timer >= 0) && (.@etower_timer2 == 2)) {
|
||||
else if ((.@etower_timer >= 0) && (.@etower_timer < 2) && (.@etower_timer2 == 2)) {
|
||||
mes "Due to the tower's aftereffects, you cannot enter the dungeon right now, " + .@dun_h + "hours " + .@dun_m + "minutes " + .@dun_s + "seconds left to enter the next dungeon.";
|
||||
next;
|
||||
mes "It is dangerous here. Let me move you to Alberta.";
|
||||
@ -2807,11 +2809,11 @@ OnTimer120000:
|
||||
|
||||
3@tower,355,51,0 script 75FGate102tower-2 45,2,2,{
|
||||
OnInstanceInit:
|
||||
disablenpc instance_npcname("75FGate102tower", instance_id());
|
||||
disablenpc instance_npcname("75FGate102tower-2", instance_id());
|
||||
end;
|
||||
|
||||
OnEnable:
|
||||
enablenpc instance_npcname("75FGate102tower", instance_id());
|
||||
enablenpc instance_npcname("75FGate102tower-2", instance_id());
|
||||
end;
|
||||
|
||||
OnTouch_:
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= KOOK SWU, Kisuka
|
||||
//===== Current Version: =====================================
|
||||
//= 1.3
|
||||
//= 1.5
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -12,10 +12,11 @@
|
||||
//= 1.1 Optimized, changed overlapping coords in Alberta [Lupus]
|
||||
//= 1.2 According to the patch, IceCream seller has been removed from Morocc [Lupus]
|
||||
//= 1.3 No more label menu and updated to match AEGIS script. [Kisuka]
|
||||
//= 1.4 Duplicates now spawn from floating NPCs. [L0ne_W0lf]
|
||||
//= 1.5 Fixed small checkweight issue. [Kisuka]
|
||||
//============================================================
|
||||
|
||||
// Alberta
|
||||
alberta,120,45,2 script Ice Cream Maker::IceCreamer 85,{
|
||||
- script Ice Cream Maker::IceCreamer -1,{
|
||||
mes "[Ice Cream Maker]";
|
||||
mes "Fresh Ice Cream made with snow from Lutie!";
|
||||
mes "Enjoy it now, it won't be on sale for long!";
|
||||
@ -62,7 +63,7 @@ alberta,120,45,2 script Ice Cream Maker::IceCreamer 85,{
|
||||
mes "Price is ^3355FF100 Zeny^000000 per ice cream.";
|
||||
close;
|
||||
}
|
||||
if(checkweight(536,.@amount) == 0) {
|
||||
if(checkweight(536,.@input) == 0) {
|
||||
mes "[Ice Cream Maker]";
|
||||
mes "Dear customer,you look like you're carrying a lot.";
|
||||
mes "Ice Cream is fine,";
|
||||
@ -75,6 +76,9 @@ alberta,120,45,2 script Ice Cream Maker::IceCreamer 85,{
|
||||
close;
|
||||
}
|
||||
|
||||
// Alberta
|
||||
alberta,120,45,2 duplicate(IceCreamer) Ice Cream Maker#1 85
|
||||
|
||||
// Morroc Field
|
||||
moc_fild16,88,304,4 duplicate(IceCreamer) Ice Cream Maker#2 85
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= eAthena dev team
|
||||
//===== Current Version: =====================================
|
||||
//= 1.9
|
||||
//= 2.0
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -26,9 +26,10 @@
|
||||
//= 1.8 Added missing Gae Bolg and Dragon Slayer. [Kisuka]
|
||||
//= 1.9 Moved Episode 12 items to separate NPC.
|
||||
//= Some cleanup & optimization. [Gepard]
|
||||
//= 2.0 Duplicates now spawn from floating NPCs. [L0ne_W0lf]
|
||||
//============================================================
|
||||
|
||||
payon,140,151,5 script Seiyablem#pay 84,{
|
||||
- script Seiyablem#dummy::SocketEnchant -1,{
|
||||
if (checkweight(1201,1) == 0)
|
||||
{
|
||||
mes "- Wait a minute !! -";
|
||||
@ -333,11 +334,12 @@ function script Func_Socket {
|
||||
}
|
||||
}
|
||||
|
||||
lhz_in02,281,35,5 duplicate(Seiyablem#pay) Seiyablem#lhz 84
|
||||
prt_in,33,70,5 duplicate(Seiyablem#pay) Seiyablem#prt 84
|
||||
morocc,51,41,4 duplicate(Seiyablem#pay) Seiyablem#moc 84
|
||||
payon,140,151,5 duplicate(SocketEnchant) Seiyablem#pay 84
|
||||
lhz_in02,281,35,5 duplicate(SocketEnchant) Seiyablem#lhz 84
|
||||
prt_in,33,70,5 duplicate(SocketEnchant) Seiyablem#prt 84
|
||||
morocc,51,41,4 duplicate(SocketEnchant) Seiyablem#moc 84
|
||||
|
||||
prt_in,31,57,1 script Young Man#prt 97,{
|
||||
- script Young Man#dummy::SocketMan -1,{
|
||||
mes "[Young Man]";
|
||||
mes "I'm considering becoming a Slotting Engineer.";
|
||||
mes "It's a new field where you can add Slots to equipment, and it'd be cool if I can work in such a lucrative career.";
|
||||
@ -354,6 +356,7 @@ prt_in,31,57,1 script Young Man#prt 97,{
|
||||
close;
|
||||
}
|
||||
|
||||
payon,143,143,7 duplicate(Young Man#prt) Young Man#pay 97
|
||||
morocc,60,42,3 duplicate(Young Man#prt) Young Man#moc 97
|
||||
lhz_in02,269,33,5 duplicate(Young Man#prt) Young Man#lhz 97
|
||||
prt_in,31,57,1 duplicate(SocketMan) Young Man#prt 97
|
||||
payon,143,143,7 duplicate(SocketMan) Young Man#pay 97
|
||||
morocc,60,42,3 duplicate(SocketMan) Young Man#moc 97
|
||||
lhz_in02,269,33,5 duplicate(SocketMan) Young Man#lhz 97
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= Gepard
|
||||
//===== Current Version: =====================================
|
||||
//= 1.0
|
||||
//= 1.1
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -11,9 +11,10 @@
|
||||
//= Adds slots to selected weapons and armor.
|
||||
//===== Additional Comments: =================================
|
||||
//= 1.0 First version.
|
||||
//= 1.1 Duplicates now spawn from floating NPCs. [L0ne_W0lf]
|
||||
//============================================================
|
||||
|
||||
payon,236,199,3 script Leablem 86,{
|
||||
- script Leablem#dummy::SocketEnchant2 -1,{
|
||||
if (checkweight(1201,1) == 0)
|
||||
{
|
||||
mes "- Wait a seconds !! -";
|
||||
@ -377,9 +378,10 @@ payon,236,199,3 script Leablem 86,{
|
||||
}
|
||||
}
|
||||
|
||||
lighthalzen,96,137,3 duplicate(Leablem) Leablem#lhz 86
|
||||
prontera,244,169,5 duplicate(Leablem) Leablem#prt 86
|
||||
moc_ruins,154,86,3 duplicate(Leablem) Leablem#moc 86
|
||||
payon,236,199,3 duplicate(SocketEnchant2) Leablem#pay 86,{
|
||||
lighthalzen,96,137,3 duplicate(SocketEnchant2) Leablem#lhz 86
|
||||
prontera,244,169,5 duplicate(SocketEnchant2) Leablem#prt 86
|
||||
moc_ruins,154,86,3 duplicate(SocketEnchant2) Leablem#moc 86
|
||||
|
||||
function script Func_Socket2 {
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= L0ne_W0lf
|
||||
//===== Current Version: =====================================
|
||||
//= 1.2
|
||||
//= 1.3
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -13,6 +13,7 @@
|
||||
//= 1.0 First version, place holders only. [L0ne_W0lf]
|
||||
//= 1.1 Moved Morroc Auction NPCs to Morroc Ruins. [L0ne_W0lf]
|
||||
//= 1.2 Warp fixed. Dialog in Ruins/Lighthalzen changed. [Kisuka]
|
||||
//= 1.3 Duplicates now spawn from floating NPCs. [L0ne_W0lf]
|
||||
//============================================================
|
||||
|
||||
// Auction House warpers
|
||||
@ -72,14 +73,15 @@ function script F_AuctionWarper {
|
||||
|
||||
// Sign posts
|
||||
//============================================================
|
||||
moc_ruins,76,176,6 script Information Post#moc::AuctionSign 837,{
|
||||
- script Information Post#dum::AuctionSign -1,{
|
||||
mes "[Information]";
|
||||
mes "Auction Warp Guide";
|
||||
close;
|
||||
}
|
||||
|
||||
prontera,216,120,4 duplicate(AuctionSign) Information Post#prt 837,{
|
||||
yuno,131,116,0 duplicate(AuctionSign) Information Post#yuno 837,{
|
||||
moc_ruins,76,176,6 duplicate(AuctionSign) Information Post#moc 837
|
||||
prontera,216,120,4 duplicate(AuctionSign) Information Post#prt 837
|
||||
yuno,131,116,0 duplicate(AuctionSign) Information Post#yuno 837
|
||||
lighthalzen,207,169,6 duplicate(AuctionSign) Information Post#lhz 837
|
||||
|
||||
// Warps
|
||||
@ -91,7 +93,7 @@ auction_02,43,17,0 warp auction_enterance_lhz 1,1,lighthalzen,209,169
|
||||
|
||||
// Auction House NPCs
|
||||
//============================================================
|
||||
auction_01,182,68,6 script Auction Broker#moc1::AuctionBroker 98,{
|
||||
- script Auction Broker#dum::AuctionBroker -1,{
|
||||
mes "[Auction Broker]";
|
||||
mes "Welcome to the Auction Hall.";
|
||||
mes "Would you like to view the goods?";
|
||||
@ -114,6 +116,7 @@ auction_01,182,68,6 script Auction Broker#moc1::AuctionBroker 98,{
|
||||
close;
|
||||
}
|
||||
|
||||
auction_01,182,68,6 duplicate(AuctionBroker) Auction Broker#moc1 98
|
||||
auction_01,182,75,0 duplicate(AuctionBroker) Auction Broker#moc2 99
|
||||
auction_01,177,75,2 duplicate(AuctionBroker) Auction Broker#moc3 98
|
||||
auction_01,177,68,4 duplicate(AuctionBroker) Auction Broker#moc4 99
|
||||
|
@ -21,6 +21,7 @@
|
||||
//= Added missing emotions and cutins
|
||||
//= 1.1- Updated prizes according to 11.1 NPC [Paradox924X]
|
||||
//= 1.2 Corrected NPC names to fall within proper restrictions. [L0ne_W0lf]
|
||||
//= 1.3 Added missing item. [Kisuka]
|
||||
//============================================================
|
||||
|
||||
comodo,219,160,3 script Kachua 91,{
|
||||
@ -169,6 +170,7 @@ comodo,219,160,3 script Kachua 91,{
|
||||
else if (.@gamble2 == 81) set .@item,1560; // Sage's Diary[2]
|
||||
else if (.@gamble2 == 82) set .@item,1618; // Survivor's Rod[1]
|
||||
else if (.@gamble2 == 83) set .@item,1620; // Survivor's Rod[1]
|
||||
else if (.@gamble2 > 83 && .@gamble2 < 86) set .@item,1971; // Electric Wire
|
||||
}
|
||||
else if ((.@gamble1 > 0) && (.@gamble1 < 201)) set .@item,1201; // Knife[3]
|
||||
else if ((.@gamble1 > 200) && (.@gamble1 < 301)) set .@item,1101; // Sword[3]
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= L0ne_W0lf
|
||||
//===== Current Version: =====================================
|
||||
//= 1.5
|
||||
//= 1.6
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -17,14 +17,12 @@
|
||||
//= 1.3a Corrected a typo error. (bugreport:798) [Samuray22]
|
||||
//= 1.4 Added a Mapflag to prevent mail operations in other maps [Zephyrus]
|
||||
//= 1.5 Moved Morroc Mail boxes to Morroc Ruins. [L0ne_W0lf]
|
||||
//= 1.6 Duplicates now spawn from floating NPCs. [L0ne_W0lf]
|
||||
//============================================================
|
||||
|
||||
// Allow Mail Inbox reading from
|
||||
// Floating mailbox npc that all NPCs duplicate from.
|
||||
//============================================================
|
||||
|
||||
// Prontera
|
||||
//============================================================
|
||||
prontera,146,86,0 script Mailbox#prt::MailBox 888,{
|
||||
- script Mailbox#dummy::MailBox -1,{
|
||||
mes "[Mailbox]";
|
||||
mes "If you'd like to use";
|
||||
mes "the Mailbox Service,";
|
||||
@ -57,6 +55,9 @@ prontera,146,86,0 script Mailbox#prt::MailBox 888,{
|
||||
close;
|
||||
}
|
||||
|
||||
// Prontera
|
||||
//============================================================
|
||||
prontera,146,86,0 duplicate(MailBox) Mailbox#prt 888
|
||||
prontera,275,213,0 duplicate(MailBox) Mailbox#2prt 888
|
||||
prontera,34,212,0 duplicate(MailBox) Mailbox#3prt 888
|
||||
|
||||
|
@ -1,9 +1,10 @@
|
||||
//===== eAthena Script =======================================
|
||||
//===== eAthena Script =======================================
|
||||
//= Mercenary related NPCs
|
||||
//===== By: ==================================================
|
||||
//= L0ne_W0lf
|
||||
//===== Current Version: =====================================
|
||||
//= 1.2
|
||||
//= 1.3
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -14,6 +15,7 @@
|
||||
//= 1.0 First version. [L0ne_W0lf]
|
||||
//= 1.1 Optimization. [Zephyrus]
|
||||
//= 1.2 Removed redundent input. [L0ne_W0lf]
|
||||
//= 1.3 Duplicates now spawned from floating NPCs. [L0ne_W0lf]
|
||||
//============================================================
|
||||
|
||||
prontera,41,337,5 script Mercenary Manager#Spear 105,{
|
||||
@ -653,7 +655,7 @@ pay_arche,99,167,4 script Mercenary Manager#Bow 732,{
|
||||
|
||||
// Mercenary Merchant NPCs
|
||||
//============================================================
|
||||
prontera,30,337,4 script Mercenary Merchant#Spear::MercMerchant 700,{
|
||||
- script Mercenary Merchant#dummy::MercMerchant -1,{
|
||||
mes "[Mercenary Goods Merchant]";
|
||||
mes "Hello, I sell goods";
|
||||
mes "that Mercenaries can";
|
||||
@ -698,8 +700,10 @@ prontera,30,337,4 script Mercenary Merchant#Spear::MercMerchant 700,{
|
||||
next;
|
||||
callfunc "F_PurchaseMercItem",12243,2100;
|
||||
}
|
||||
close;
|
||||
}
|
||||
|
||||
prontera,30,337,4 duplicate(MercMerchant) Mercenary Merchant#Spear 700
|
||||
izlude,56,139,4 duplicate(MercMerchant) Mercenary Merchant#Sword 892
|
||||
pay_arche,102,167,5 duplicate(MercMerchant) Mercenary Merchant#Bow 879
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= kobra_k88; L0ne_W0lf
|
||||
//===== Current Version: =====================================
|
||||
//= 1.4
|
||||
//= 1.5
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -26,15 +26,12 @@
|
||||
//= exception of the "Free for all" mode.
|
||||
//= Added PVP event NPCs.
|
||||
//= 1.4 Corrected NPC names to fall within proper restrictions. [L0ne_W0lf]
|
||||
//= 1.5 Duplicates now spawn from floating NPCs. [L0ne_W0lf]
|
||||
//============================================================
|
||||
|
||||
// Morroc
|
||||
// Floating NPC
|
||||
//============================================================
|
||||
morocc_in,144,138,4 script PVPNarrator#moc 84,{
|
||||
callfunc "F_PVPNarrator","morocc_in",141,139;
|
||||
}
|
||||
|
||||
morocc_in,144,142,4 script Gate Keeper#moc::PVPGateKeeper 83,{
|
||||
- script Gate Keeper#dummy::PVPGateKeeper -1,{
|
||||
mes "[Gate Keeper]";
|
||||
mes "Glad to be of service.";
|
||||
mes "I will open the PVP fight";
|
||||
@ -114,6 +111,15 @@ morocc_in,144,142,4 script Gate Keeper#moc::PVPGateKeeper 83,{
|
||||
}
|
||||
}
|
||||
|
||||
// Morroc
|
||||
//============================================================
|
||||
morocc_in,144,138,4 script PVPNarrator#moc 84,{
|
||||
callfunc "F_PVPNarrator","morocc_in",141,139;
|
||||
}
|
||||
|
||||
morocc_in,144,142,4 duplicate(PVPGateKeeper) Gate Keeper#moc 83,{
|
||||
|
||||
|
||||
// Alberta
|
||||
//============================================================
|
||||
alberta_in,22,146,4 script PVP Narrator#alb 84,{
|
||||
@ -465,7 +471,7 @@ OnInit:
|
||||
|
||||
// Spectator Entrance
|
||||
//============================================================
|
||||
pvp_room,62,85,4 script Spectator's Entrance#1::PVPSpectator 105,{
|
||||
- script Spectator's Entrance#dum::PVPSpectator -1,{
|
||||
if (countitem(7029) == 0) {
|
||||
mes "[PVP Compete Square Register Staff]";
|
||||
mes "This is the entrance for viewers.";
|
||||
@ -492,6 +498,8 @@ OnInit:
|
||||
end;
|
||||
}
|
||||
|
||||
pvp_room,62,85,4 duplicate(PVPSpectator) Spectator's Entrance#1 105
|
||||
|
||||
pvp_room,70,85,4 duplicate(PVPSpectator) Spectator's Entrance#2 105
|
||||
|
||||
pvp_room,78,85,4 duplicate(PVPSpectator) Spectator's Entrance#3 105
|
||||
@ -500,7 +508,7 @@ pvp_room,86,85,4 duplicate(PVPSpectator) Spectator's Entrance#4 105
|
||||
|
||||
// Spectator Warps
|
||||
//============================================================
|
||||
pvp_2vs2,5,4,0 script Combat Square Staff#1::PVPSpecWarp 45,1,1,{
|
||||
- script Combat Square Staff#dum::PVPSpecWarp -1,{
|
||||
OnTouch:
|
||||
mes "[Combat Square Staff]";
|
||||
mes "May I help you?";
|
||||
@ -512,6 +520,8 @@ OnTouch:
|
||||
end;
|
||||
}
|
||||
|
||||
pvp_2vs2,5,4,0 duplicate(PVPSpecWarp) Combat Square Staff#1 45,1,1,{
|
||||
|
||||
pvp_2vs2,5,74,0 duplicate(PVPSpecWarp) Combat Square Staff#2 45,1,1
|
||||
|
||||
pvp_2vs2,74,74,0 duplicate(PVPSpecWarp) Combat Square Staff#3 45,1,1
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= DiviniaRO members, cleaned by reddozen
|
||||
//===== Current Version: =====================================
|
||||
//= 1.3a
|
||||
//= 1.4
|
||||
//===== Compatible With: =====================================
|
||||
//= SVN eA
|
||||
//===== Description: =========================================
|
||||
@ -21,6 +21,7 @@
|
||||
//= Fixed some of the names to iRO.
|
||||
//= 1.3 Fixed some color code bugs in Ghenirhemin. Thanks to yyCC. [L0ne_W0lf]
|
||||
//= 1.3a Fixed wrong item names (due to copy/paste) [Lupus]
|
||||
//= 1.4 Chungwolmang now checks if the last item set should be deleted. (bugreport:4719) [L0ne_W0lf]
|
||||
//============================================================
|
||||
|
||||
//===================== Censor Bar =====================================================
|
||||
@ -781,7 +782,8 @@ S_MakeMask:
|
||||
delitem getarg(1),getarg(2);
|
||||
delitem getarg(3),getarg(4);
|
||||
delitem getarg(5),getarg(6);
|
||||
delitem getarg(7),getarg(8);
|
||||
if (getarg(0) == 5169)
|
||||
delitem getarg(7),getarg(8);
|
||||
getitem getarg(0),1;
|
||||
set moza_tal,0;
|
||||
mes "[Chungwolmang]";
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= L0ne_W0lf
|
||||
//===== Current Version: =====================================
|
||||
//= 1.6
|
||||
//= 1.7
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -33,6 +33,7 @@
|
||||
//= 1.4 Changed killmonsterall -> killmonster. (bugreport:4131)
|
||||
//= 1.5 Removed a 'close;' which should have been 'close2'. (bugreport:4276)
|
||||
//= 1.6 Fixed check in cat hand agent.
|
||||
//= 1.7 Moved the close in Cat Hand Service Warps. (bugreport:4079) [L0ne_W0lf]
|
||||
//============================================================
|
||||
|
||||
// Onward to the New World
|
||||
@ -8956,8 +8957,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 2:
|
||||
break;
|
||||
}
|
||||
@ -8972,8 +8973,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 2:
|
||||
if (Zeny >= 5500) {
|
||||
set zeny,zeny-5500;
|
||||
@ -8982,8 +8983,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 3:
|
||||
break;
|
||||
}
|
||||
@ -8998,8 +8999,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 2:
|
||||
if (Zeny >= 5025) {
|
||||
set zeny,zeny-5025;
|
||||
@ -9008,8 +9009,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 3:
|
||||
if (Zeny >= 5025) {
|
||||
set zeny,zeny-5025;
|
||||
@ -9018,8 +9019,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 4:
|
||||
break;
|
||||
}
|
||||
@ -9034,8 +9035,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 2:
|
||||
if (Zeny >= 5025) {
|
||||
set zeny,zeny-5025;
|
||||
@ -9044,8 +9045,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 3:
|
||||
if (Zeny >= 5025) {
|
||||
set zeny,zeny-5025;
|
||||
@ -9054,8 +9055,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 4:
|
||||
if (Zeny >= 5025) {
|
||||
set zeny,zeny-5025;
|
||||
@ -9064,8 +9065,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 5:
|
||||
break;
|
||||
}
|
||||
@ -9080,8 +9081,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 2:
|
||||
if (Zeny >= 4765) {
|
||||
set zeny,zeny-4765;
|
||||
@ -9090,8 +9091,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 3:
|
||||
if (Zeny >= 4765) {
|
||||
set zeny,zeny-4765;
|
||||
@ -9100,8 +9101,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 4:
|
||||
if (Zeny >= 4765) {
|
||||
set zeny,zeny-4765;
|
||||
@ -9110,8 +9111,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 5:
|
||||
if (Zeny >= 4765) {
|
||||
set zeny,zeny-4765;
|
||||
@ -9120,8 +9121,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 6:
|
||||
break;
|
||||
}
|
||||
@ -9136,8 +9137,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 2:
|
||||
if (Zeny >= 4765) {
|
||||
set zeny,zeny-4765;
|
||||
@ -9146,8 +9147,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 3:
|
||||
if (Zeny >= 4765) {
|
||||
set zeny,zeny-4765;
|
||||
@ -9156,8 +9157,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 4:
|
||||
if (Zeny >= 4765) {
|
||||
set zeny,zeny-4765;
|
||||
@ -9166,8 +9167,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 5:
|
||||
if (Zeny >= 4765) {
|
||||
set zeny,zeny-4765;
|
||||
@ -9176,8 +9177,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 6:
|
||||
if (Zeny >= 4765) {
|
||||
set zeny,zeny-4765;
|
||||
@ -9186,8 +9187,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 7:
|
||||
break;
|
||||
}
|
||||
@ -9202,8 +9203,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 2:
|
||||
if (Zeny >= 4590) {
|
||||
set zeny,zeny-4590;
|
||||
@ -9212,8 +9213,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 3:
|
||||
if (Zeny >= 4590) {
|
||||
set zeny,zeny-4590;
|
||||
@ -9222,8 +9223,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 4:
|
||||
if (Zeny >= 4590) {
|
||||
set zeny,zeny-4590;
|
||||
@ -9232,8 +9233,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 5:
|
||||
if (Zeny >= 4590) {
|
||||
set zeny,zeny-4590;
|
||||
@ -9242,8 +9243,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 6:
|
||||
if (Zeny >= 4590) {
|
||||
set zeny,zeny-4590;
|
||||
@ -9252,8 +9253,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 7:
|
||||
if (Zeny >= 4590) {
|
||||
set zeny,zeny-4590;
|
||||
@ -9262,8 +9263,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 8:
|
||||
break;
|
||||
}
|
||||
@ -9338,8 +9339,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 2:
|
||||
if (Zeny >= 4590) {
|
||||
set zeny,zeny-4590;
|
||||
@ -9348,8 +9349,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 3:
|
||||
if (Zeny >= 4590) {
|
||||
set zeny,zeny-4590;
|
||||
@ -9358,8 +9359,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 4:
|
||||
if (Zeny >= 4590) {
|
||||
set zeny,zeny-4590;
|
||||
@ -9368,8 +9369,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 5:
|
||||
if (Zeny >= 4590) {
|
||||
set zeny,zeny-4590;
|
||||
@ -9378,8 +9379,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 6:
|
||||
if (Zeny >= 4590) {
|
||||
set zeny,zeny-4590;
|
||||
@ -9388,8 +9389,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 7:
|
||||
if (Zeny >= 4590) {
|
||||
set zeny,zeny-4590;
|
||||
@ -9398,8 +9399,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 8:
|
||||
break;
|
||||
}
|
||||
@ -9414,8 +9415,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 2:
|
||||
if (Zeny >= 4170) {
|
||||
set zeny,zeny-4170;
|
||||
@ -9424,8 +9425,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 3:
|
||||
if (Zeny >= 4170) {
|
||||
set zeny,zeny-4170;
|
||||
@ -9434,8 +9435,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 4:
|
||||
if (Zeny >= 4170) {
|
||||
set zeny,zeny-4170;
|
||||
@ -9444,8 +9445,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 5:
|
||||
if (Zeny >= 4170) {
|
||||
set zeny,zeny-4170;
|
||||
@ -9454,8 +9455,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 6:
|
||||
if (Zeny >= 4170) {
|
||||
set zeny,zeny-4170;
|
||||
@ -9464,8 +9465,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 7:
|
||||
if (Zeny >= 4170) {
|
||||
set zeny,zeny-4170;
|
||||
@ -9474,8 +9475,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 8:
|
||||
if (Zeny >= 4170) {
|
||||
set zeny,zeny-4170;
|
||||
@ -9484,8 +9485,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 9:
|
||||
break;
|
||||
}
|
||||
@ -9500,8 +9501,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 2:
|
||||
if (Zeny >= 4025) {
|
||||
set zeny,zeny-4025;
|
||||
@ -9510,8 +9511,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 3:
|
||||
if (Zeny >= 4025) {
|
||||
set zeny,zeny-4025;
|
||||
@ -9520,8 +9521,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 4:
|
||||
if (Zeny >= 4025) {
|
||||
set zeny,zeny-4025;
|
||||
@ -9530,8 +9531,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 5:
|
||||
if (Zeny >= 4025) {
|
||||
set zeny,zeny-4025;
|
||||
@ -9540,8 +9541,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 6:
|
||||
if (Zeny >= 4025) {
|
||||
set zeny,zeny-4025;
|
||||
@ -9550,8 +9551,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 7:
|
||||
if (Zeny >= 4025) {
|
||||
set zeny,zeny-4025;
|
||||
@ -9560,8 +9561,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 8:
|
||||
if (Zeny >= 4025) {
|
||||
set zeny,zeny-4025;
|
||||
@ -9570,8 +9571,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 9:
|
||||
if (Zeny >= 4025) {
|
||||
set zeny,zeny-4025;
|
||||
@ -9580,8 +9581,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 10:
|
||||
break;
|
||||
}
|
||||
@ -9596,8 +9597,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 2:
|
||||
if (Zeny >= 3970) {
|
||||
set zeny,zeny-3970;
|
||||
@ -9606,8 +9607,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 3:
|
||||
if (Zeny >= 3970) {
|
||||
set zeny,zeny-3970;
|
||||
@ -9616,8 +9617,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 4:
|
||||
if (Zeny >= 3970) {
|
||||
set zeny,zeny-3970;
|
||||
@ -9626,8 +9627,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 5:
|
||||
if (Zeny >= 3970) {
|
||||
set zeny,zeny-3970;
|
||||
@ -9636,8 +9637,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 6:
|
||||
if (Zeny >= 3970) {
|
||||
set zeny,zeny-3970;
|
||||
@ -9646,8 +9647,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 7:
|
||||
if (Zeny >= 3970) {
|
||||
set zeny,zeny-3970;
|
||||
@ -9656,8 +9657,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 8:
|
||||
if (Zeny >= 3970) {
|
||||
set zeny,zeny-3970;
|
||||
@ -9666,8 +9667,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 9:
|
||||
if (Zeny >= 3970) {
|
||||
set zeny,zeny-3970;
|
||||
@ -9676,8 +9677,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 10:
|
||||
if (Zeny >= 3970) {
|
||||
set zeny,zeny-3970;
|
||||
@ -9686,8 +9687,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 11:
|
||||
break;
|
||||
}
|
||||
@ -9708,8 +9709,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 2:
|
||||
if (Zeny >= 5500) {
|
||||
set zeny,zeny-5500;
|
||||
@ -9718,8 +9719,8 @@ mid_camp,62,125,4 script Cat Hand Agent 421,{
|
||||
else {
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Don't play with money.";
|
||||
close;
|
||||
}
|
||||
close;
|
||||
case 3:
|
||||
mes "[Cat Hand Agent]";
|
||||
mes "Thank you for using our service.";
|
||||
|
@ -4,7 +4,7 @@
|
||||
//= Persian, Vicious_Pucca, aoa00, Evera, MasterOfMupppets,
|
||||
//= Lupus, Lord Gywall
|
||||
//===== Current Version: =====================================
|
||||
//= 4.6
|
||||
//= 4.7
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -76,6 +76,7 @@
|
||||
//= 4.5 Official Gangster Alert script. [Gepard]
|
||||
//= 4.6 Added quest log entries for:
|
||||
//= - Cursed Spirit Quest
|
||||
//= 4.7 Fixed missing label. (bugreport:4654) [L0ne_W0lf]
|
||||
//============================================================
|
||||
|
||||
// Gangster Alert [Aegis Conversion]
|
||||
@ -5235,89 +5236,93 @@ lhz_in01,114,181,3 script Representative 71,{
|
||||
mes "to the Rekenber Corporation.";
|
||||
mes "How may I be of service today?";
|
||||
next;
|
||||
if(lhz_curse == 7) menu "Building Information",L_Building,"Corporation History",L_History;
|
||||
else menu "Building Information",L_Building;
|
||||
if(lhz_curse == 7)
|
||||
select("Building Information","Corporation History");
|
||||
else
|
||||
select("Building Information");
|
||||
|
||||
while(1) {
|
||||
mes "[Representative]";
|
||||
mes "Please tell me";
|
||||
mes "which floor you'd like";
|
||||
mes "to know more about.";
|
||||
next;
|
||||
switch( select( "1F","2F","B1","Cancel" ) )
|
||||
{
|
||||
case 1:
|
||||
mes "[Representative]";
|
||||
mes "The ^3131FFRekenber Library^000000 can";
|
||||
mes "be found at the end of the";
|
||||
mes "left hallway. Our library is";
|
||||
mes "a great resource of innovative";
|
||||
mes "ideas and information for our";
|
||||
mes "system development employees.";
|
||||
next;
|
||||
mes "[Representative]";
|
||||
mes "The ^3131FFBall Room^000000, where";
|
||||
mes "various official events are";
|
||||
mes "usually held, can be accessed";
|
||||
mes "through the right hallway.";
|
||||
next;
|
||||
break;
|
||||
if (@menu == 1) {
|
||||
while(1) {
|
||||
mes "[Representative]";
|
||||
mes "Please tell me";
|
||||
mes "which floor you'd like";
|
||||
mes "to know more about.";
|
||||
next;
|
||||
switch( select( "1F","2F","B1","Cancel" ) )
|
||||
{
|
||||
case 1:
|
||||
mes "[Representative]";
|
||||
mes "The ^3131FFRekenber Library^000000 can";
|
||||
mes "be found at the end of the";
|
||||
mes "left hallway. Our library is";
|
||||
mes "a great resource of innovative";
|
||||
mes "ideas and information for our";
|
||||
mes "system development employees.";
|
||||
next;
|
||||
mes "[Representative]";
|
||||
mes "The ^3131FFBall Room^000000, where";
|
||||
mes "various official events are";
|
||||
mes "usually held, can be accessed";
|
||||
mes "through the right hallway.";
|
||||
next;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
mes "[Representative]";
|
||||
mes "Please use the stairs";
|
||||
mes "located on both sides of";
|
||||
mes "the Help Desk to go to the";
|
||||
mes "Second Floor. The Second";
|
||||
mes "Floor is mostly used for";
|
||||
mes "administrative purposes.";
|
||||
next;
|
||||
mes "[Representative]";
|
||||
mes "There, you can find";
|
||||
mes "the ^3131FFConference Room^000000,";
|
||||
mes "^3131FFSecretary Office^000000, the";
|
||||
mes "^3131FFAuditorium^000000 and the";
|
||||
mes "^3131FFChairman's Office^000000.";
|
||||
next;
|
||||
break;
|
||||
case 2:
|
||||
mes "[Representative]";
|
||||
mes "Please use the stairs";
|
||||
mes "located on both sides of";
|
||||
mes "the Help Desk to go to the";
|
||||
mes "Second Floor. The Second";
|
||||
mes "Floor is mostly used for";
|
||||
mes "administrative purposes.";
|
||||
next;
|
||||
mes "[Representative]";
|
||||
mes "There, you can find";
|
||||
mes "the ^3131FFConference Room^000000,";
|
||||
mes "^3131FFSecretary Office^000000, the";
|
||||
mes "^3131FFAuditorium^000000 and the";
|
||||
mes "^3131FFChairman's Office^000000.";
|
||||
next;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
mes "[Representative]";
|
||||
mes "The first underground floor";
|
||||
mes "is used by the ^3131FFRegenshirm^000000,";
|
||||
mes "our laboratory affiliate. For";
|
||||
mes "security reasons, this floor";
|
||||
mes "is not accessible to visitors";
|
||||
next;
|
||||
break;
|
||||
case 3:
|
||||
mes "[Representative]";
|
||||
mes "The first underground floor";
|
||||
mes "is used by the ^3131FFRegenshirm^000000,";
|
||||
mes "our laboratory affiliate. For";
|
||||
mes "security reasons, this floor";
|
||||
mes "is not accessible to visitors";
|
||||
next;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
mes "[Representative]";
|
||||
mes "We are always doing our";
|
||||
mes "best to provide the best";
|
||||
mes "services to our customers.";
|
||||
mes "Remember that Rekenber";
|
||||
mes "is the name you can trust.";
|
||||
mes "Thank you and have a nice day.";
|
||||
close;
|
||||
case 4:
|
||||
mes "[Representative]";
|
||||
mes "We are always doing our";
|
||||
mes "best to provide the best";
|
||||
mes "services to our customers.";
|
||||
mes "Remember that Rekenber";
|
||||
mes "is the name you can trust.";
|
||||
mes "Thank you and have a nice day.";
|
||||
close;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
L_History:
|
||||
mes "[Representative]";
|
||||
mes "If you're interested in";
|
||||
mes "learning the history of";
|
||||
mes "our corporation, please";
|
||||
mes "speak to the representative";
|
||||
mes "inside our Library. Thank you.";
|
||||
next;
|
||||
mes "[Representative]";
|
||||
mes "Please head down";
|
||||
mes "the hallway to the left in";
|
||||
mes "order to find our Library.";
|
||||
mes "Thank you and have a nice day.";
|
||||
changequest 2087,2088;
|
||||
set lhz_curse,8;
|
||||
else {
|
||||
mes "[Representative]";
|
||||
mes "If you're interested in";
|
||||
mes "learning the history of";
|
||||
mes "our corporation, please";
|
||||
mes "speak to the representative";
|
||||
mes "inside our Library. Thank you.";
|
||||
next;
|
||||
mes "[Representative]";
|
||||
mes "Please head down";
|
||||
mes "the hallway to the left in";
|
||||
mes "order to find our Library.";
|
||||
mes "Thank you and have a nice day.";
|
||||
changequest 2087,2088;
|
||||
set lhz_curse,8;
|
||||
}
|
||||
close;
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= Kisuka
|
||||
//===== Current Version: =====================================
|
||||
//= 1.8
|
||||
//= 1.9
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -20,6 +20,7 @@
|
||||
//= 1.6 Added 'tides' to Ibanoff & Fixed time check for Marozka. [Kisuka]
|
||||
//= 1.7 Fixes on donpcevents and fixed some left over aegis stuff. [Kisuka]
|
||||
//= 1.8 Fixed some condition checks. [Gepard]
|
||||
//= 1.9 Corrected NPC counting mobs for the wrong NPC. (bugreport:4736) [L0ne_W0lf]
|
||||
//============================================================
|
||||
|
||||
//============================================================================
|
||||
@ -5117,7 +5118,7 @@ OnDisable:
|
||||
end;
|
||||
|
||||
OnMyMobDead:
|
||||
if (mobcount("mosk_ship","Baehideun1#ship::OnMyMobDead") < 1) {
|
||||
if (mobcount("mosk_ship","Baehideun4#ship::OnMyMobDead") < 1) {
|
||||
set $@mos1_edq,0;
|
||||
mes "[Mr. Ibanoff]";
|
||||
mes "Now that all the monsters are gone,";
|
||||
|
@ -3,7 +3,7 @@
|
||||
//===== By: ==================================================
|
||||
//= L0ne_W0lf
|
||||
//===== Current Version: =====================================
|
||||
//= 1.9
|
||||
//= 2.0
|
||||
//===== Compatible With: =====================================
|
||||
//= eAthena SVN
|
||||
//===== Description: =========================================
|
||||
@ -43,6 +43,7 @@
|
||||
//= 1.9 Added quest log entries for:
|
||||
//= - Siblings Quest
|
||||
//= - Thor Volcano Base Quest
|
||||
//= 2.0 Removed lvel requirement. (bugreport:4678) [L0ne_W0lf]
|
||||
//============================================================
|
||||
|
||||
// Stone Quest
|
||||
@ -56,7 +57,7 @@ ve_fild05,257,130,4 script Wincing Old Man#ve 945,{
|
||||
mes "- you put some items into Kafra Storage. -";
|
||||
close;
|
||||
}
|
||||
if ((veins_stone == 0) && (BaseLevel > 59)) {
|
||||
if (veins_stone == 0) {
|
||||
mes "[Zabaroo]";
|
||||
mes "My back is killing me";
|
||||
mes "after stooping over to";
|
||||
@ -300,11 +301,6 @@ ve_fild05,257,130,4 script Wincing Old Man#ve 945,{
|
||||
mes "care of myself at my age...";
|
||||
close;
|
||||
}
|
||||
mes "[Zabaroo]";
|
||||
mes "I'm sorry dear.";
|
||||
mes "You're not strong enough for this kind of work.";
|
||||
mes "Put on some muscle and talk to me again.";
|
||||
close;
|
||||
}
|
||||
|
||||
ve_in,169,310,6 script Strange Old Man#ve 121,{
|
||||
|
@ -237,9 +237,9 @@ in_rogue,355,179,0 script Haijara Greg#rogueguild 46,{
|
||||
mes "[Haijara Greg]";
|
||||
mes "Hmm... Well, I suppose";
|
||||
if (Upper == 1)
|
||||
mes "I can trust a fellow Rogue";
|
||||
else
|
||||
mes "I can trust a fellow Stalker";
|
||||
else
|
||||
mes "I can trust a fellow Rogue";
|
||||
mes "with my predictament. Honor";
|
||||
mes "among thieves and all that.";
|
||||
mes "Alright. Have you ever heard";
|
||||
|
387
readme.html
@ -1,349 +1,40 @@
|
||||
<html><head><link rel="stylesheet" type="text/css" href="./readme/readme.css"><title>eAthena - Introduction</title></head>
|
||||
|
||||
<body>
|
||||
<div id="dleftbg">
|
||||
</div>
|
||||
<div id="drightbg">
|
||||
</div>
|
||||
<div id="canvas" align="center">
|
||||
<table cellspacing="0" cellpadding="0" border="0" id="ea" align="center">
|
||||
<tr>
|
||||
<td id="leftborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="leftborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./readme/images/leftborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="middle" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0" valign="top">
|
||||
<tr>
|
||||
<td id="logo" valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td rowspan="4">
|
||||
<img src="./readme/images/chara.gif" width="366" height="274">
|
||||
</td>
|
||||
<td rowspan="4" width="129">
|
||||
</td>
|
||||
<td colspan="2" width="305" height="51" align="right">
|
||||
<img src="./readme/images/banner.gif" width="305" height="51">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="title" colspan="2" align="right">
|
||||
Introduction
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="81" colspan="2">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="navi" align="right">
|
||||
Introduction<br>
|
||||
<a href="./readme/changelog.html">Changelog</a><br>
|
||||
<a href="./readme/features.html">Features</a><br>
|
||||
<a href="./readme/npcfeatures.html">NPC Features</a>
|
||||
|
||||
</td>
|
||||
<td class="navi" align="right">
|
||||
<a href="./readme/setup.html">Setup</a><br>
|
||||
<a href="./readme/gmcommands.html">GM Commands</a><br>
|
||||
<a href="./readme/faq.html">FAQ</a><br>
|
||||
<a href="./readme/resources.html">Resources</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="btmborder">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="2">
|
||||
<tr>
|
||||
<td id="leftbtmborder"">
|
||||
</td>
|
||||
<td id="midbtmborder"">
|
||||
<img src="./readme/images/btmborder.gif" width="44" height="2">
|
||||
</td>
|
||||
<td id="rightbtmborder">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="content">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td id="lefttext" valign="top">
|
||||
<h1>eAthena SVN series</h1>
|
||||
eAthena is an open-source Ragnarok Online server emulator. It's written in C, but we are working on a C++ version. Although it is cross-platform, we only officially support Win32 and Linux.
|
||||
<br>
|
||||
<br>eAthena is licensed under the GPL, so please give us credit if you use our code.
|
||||
<br>Our SVN (<a href="http://tortoisesvn.tigris.org/download.html">You may download TortoiseSVN here to access our SVN</a>) is located at <a href="http://66.118.142.23:8080/svn/ea/">http://66.118.142.23:8080/svn/ea/</a>. SVN stands for Subversion, which is similar to the commonly used CVS.
|
||||
<br>
|
||||
<br>P.S. If you had a hard time loading this readme, please use <a href="http://www.getfirefox.com">Firefox</a>.
|
||||
|
||||
</td>
|
||||
<td id="midtext">
|
||||
</td>
|
||||
<td id="righttext" valign="top">
|
||||
<h1>The eAthena Team</h1>
|
||||
Here are our current developers. We have had many past developers, and if you come across this, please let us know ^_^.<br>
|
||||
|
||||
<b>Developers</b>
|
||||
<table class="right">
|
||||
<tr>
|
||||
<td>
|
||||
Wallex
|
||||
</td>
|
||||
<td>
|
||||
Lupus
|
||||
</td>
|
||||
<td>
|
||||
DracoRPG
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
MasterOfMuppets
|
||||
</td>
|
||||
|
||||
<td>
|
||||
Fredzilla
|
||||
</td>
|
||||
<td>
|
||||
Kayla
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Kevin
|
||||
</td>
|
||||
<td>
|
||||
Shinomori
|
||||
</td>
|
||||
<td>
|
||||
Clownphobia(Cuteboi)
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
LuzZza
|
||||
</td>
|
||||
<td>
|
||||
Evera
|
||||
</td>
|
||||
<td>
|
||||
Nexon
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Celest
|
||||
</td>
|
||||
<td>
|
||||
Wizputer
|
||||
</td>
|
||||
<td>
|
||||
Valaris
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Lance
|
||||
</td>
|
||||
<td>
|
||||
Komurka
|
||||
</td>
|
||||
<td>
|
||||
<html>
|
||||
<head>
|
||||
<title>eAthena | Intro</title>
|
||||
<link rel="stylesheet" type="text/css" href="./readme/style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="template">
|
||||
<div id="header">
|
||||
<div class="logo">eAthena<br /><span class="subtitle">- RAGNAROK Online Server Emulator</span></div>
|
||||
<div class="title">Intro</div>
|
||||
</div>
|
||||
<div id="navcontainer">
|
||||
<ul id="navlist">
|
||||
<li><a href="./readme.html">Intro</a></li>
|
||||
<li><a href="./readme/setup.html">Setup</a></li>
|
||||
<li><a href="./readme/faq.html">FAQ</a></li>
|
||||
<li><a href="./readme/scripting.html">Scripting</a></li>
|
||||
<li><a href="./readme/commands.html">GM Commands</a></li>
|
||||
<li><a href="./readme/resources.html">Resources</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="body-container">
|
||||
<ul>
|
||||
<li><span class="body-title">What is eAthena?</span><br>
|
||||
eAthena is a collaborative software development project revolving around the creation of a robust massively multiplayer online role playing game (MMORPG) server package. Written in C, the program is very versatile and provides NPCs, warps and modifications. The project is jointly managed by a group of volunteers located around the world as well as a tremendous community providing QA and support. eAthena is a continuation of the original jAthena project.</li>
|
||||
</ul>
|
||||
|
||||
<ul>
|
||||
<li><span class="body-title">Who are the eAthena developers?</span><br>
|
||||
You can find a list of the currently active eAthena developers at:<br>
|
||||
<a href="http://code.google.com/p/eathena-project/people/list" target="_new">http://code.google.com/p/eathena-project/people/list</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
<b>Mods/Admins</b>
|
||||
<table class="right">
|
||||
<tr>
|
||||
<td>
|
||||
Massdriller
|
||||
</td>
|
||||
<td>
|
||||
Deviant
|
||||
</td>
|
||||
<td>
|
||||
Delta
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Manipulator
|
||||
</td>
|
||||
<td>
|
||||
SantaPoring
|
||||
</td>
|
||||
<td>
|
||||
Davidchak
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Valaris
|
||||
</td><td></td><td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
<b>Ex-Developers and Honorable Mentions</b>
|
||||
<table class="right">
|
||||
<tr>
|
||||
<td>
|
||||
RoVeRT
|
||||
</td>
|
||||
<td>
|
||||
AppleGirl
|
||||
</td>
|
||||
<td>
|
||||
Akaru/Hikaru
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Darkchild
|
||||
</td>
|
||||
<td>
|
||||
Kalaspuff
|
||||
</td>
|
||||
<td>
|
||||
Ajarn
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Fritz
|
||||
</td>
|
||||
<td>
|
||||
Aria
|
||||
</td>
|
||||
<td>
|
||||
Mass Zero
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Nana
|
||||
</td>
|
||||
<td>
|
||||
Shinigami
|
||||
</td>
|
||||
<td>
|
||||
Moonsoul
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Kobra_k88
|
||||
</td>
|
||||
<td>
|
||||
Codemaster
|
||||
</td>
|
||||
<td>
|
||||
Davidsiaw
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
MC_Cameri
|
||||
</td>
|
||||
<td>
|
||||
Spira
|
||||
</td>
|
||||
<td>
|
||||
Lord
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Yor
|
||||
</td>
|
||||
<td>
|
||||
Sara-chan
|
||||
</td>
|
||||
<td>
|
||||
Mikage
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Ajs15822
|
||||
</td>
|
||||
<td>
|
||||
Cyberghost
|
||||
</td>
|
||||
<td>
|
||||
Azndragon
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Nasedo
|
||||
</td>
|
||||
<td>
|
||||
Sirius
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br />
|
||||
<br />
|
||||
</strong>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
© Content Copyright 2005 eAthena Development Team/Evera<br>
|
||||
© Design Copyright 2005 Evera
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</table>
|
||||
<td id="rightborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="rightborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./readme/images/rightborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<div id="footer">"Read Me" Created & Designed by <a href="http://www.kisuka.com" target="_new">Kisuka</a></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,136 +0,0 @@
|
||||
<html><head><title>eAthena - Changelog</title><head>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="./readme.css">
|
||||
|
||||
<body>
|
||||
<div id="dleftbg">
|
||||
</div>
|
||||
<div id="drightbg">
|
||||
</div>
|
||||
<div id="canvas" align="center">
|
||||
<table cellspacing="0" cellpadding="0" border="0" id="ea" align="center">
|
||||
<tr>
|
||||
<td id="leftborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="leftborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./images/leftborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="middle" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0" valign="top">
|
||||
<tr>
|
||||
<td id="logo" valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td rowspan="4">
|
||||
<img src="./images/chara.gif" width="366" height="274">
|
||||
</td>
|
||||
<td rowspan="4" width="129">
|
||||
</td>
|
||||
<td colspan="2" width="305" height="51" align="right">
|
||||
<img src="./images/banner.gif" width="305" height="51">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="title" colspan="2" align="right">
|
||||
Changelog
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="81" colspan="2">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="navi" align="right">
|
||||
<a href="../readme.html">Introduction</a><br>
|
||||
Changelog<br>
|
||||
<a href="./features.html">Features</a><br>
|
||||
<a href="./npcfeatures.html">NPC Features</a>
|
||||
|
||||
</td>
|
||||
<td class="navi" align="right">
|
||||
<a href="./setup.html">Setup</a><br>
|
||||
<a href="./gmcommands.html">GM Commands</a><br>
|
||||
<a href="./faq.html">FAQ</a><br>
|
||||
<a href="./resources.html">Resources</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="btmborder">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="2">
|
||||
<tr>
|
||||
<td id="leftbtmborder"">
|
||||
</td>
|
||||
<td id="midbtmborder"">
|
||||
<img src="./images/btmborder.gif" width="44" height="2">
|
||||
</td>
|
||||
<td id="rightbtmborder">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="content">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td id="lefttext" valign="top">
|
||||
<h1>Changelog</h1>
|
||||
This is our current changelog. Please note this isn't our <i>complete</i> changelog.
|
||||
<br>
|
||||
|
||||
|
||||
</td>
|
||||
<td id="midtext">
|
||||
</td>
|
||||
<td id="righttext" valign="top">
|
||||
<iframe src="../Changelog-Trunk.txt" name="Changelog" title="eAthena SVN Changelog" marginwidth="10" marginheight="10" frameborder="0" height="500" width="100%"></iframe>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
© Content Copyright 2005 eAthena Development Team/Evera<br>
|
||||
© Design Copyright 2005 Evera
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="rightborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="rightborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./images/rightborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
32
readme/commands.html
Normal file
@ -0,0 +1,32 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>eAthena | GM Commands</title>
|
||||
<link rel="stylesheet" type="text/css" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="template">
|
||||
<div id="header">
|
||||
<div class="logo">eAthena<br /><span class="subtitle">- RAGNAROK Online Server Emulator</span></div>
|
||||
<div class="title">GM Commands</div>
|
||||
</div>
|
||||
<div id="navcontainer">
|
||||
<ul id="navlist">
|
||||
<li><a href="../readme.html">Intro</a></li>
|
||||
<li><a href="setup.html">Setup</a></li>
|
||||
<li><a href="faq.html">FAQ</a></li>
|
||||
<li><a href="scripting.html">Scripting</a></li>
|
||||
<li><a href="commands.html">GM Commands</a></li>
|
||||
<li><a href="resources.html">Resources</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="body-container">
|
||||
The following are the GM Commands which can be used in-game on an eAthena server.<br /><br />
|
||||
<iframe width="100%" height="35%" src="../conf/help.txt"></iframe><br /><br />
|
||||
<iframe width="100%" height="35%" src="../conf/help2.txt"></iframe>
|
||||
</div>
|
||||
|
||||
<div id="footer">"Read Me" Created & Designed by <a href="http://www.kisuka.com" target="_new">Kisuka</a></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
33
readme/faq-content.html
Normal file
@ -0,0 +1,33 @@
|
||||
<html>
|
||||
<body>
|
||||
<ul>
|
||||
<li><strong>Where can I set the exp rates?</strong><br />
|
||||
- Go to /conf/battle/exp.conf<br />
|
||||
- Find base_exp_rate and job_exp_rate. Change the value there to raise or lower the rates.<br />
|
||||
- 100 = 1x, 1000 = 10x rates, etc<br />
|
||||
<br />
|
||||
</li>
|
||||
<li><strong>Where can I set the item drop rates?</strong><br />
|
||||
- Go to /conf/battle/drops.conf<br />
|
||||
- You can set the drop rates by changing the values:<br />
|
||||
item_rate_common: 100 <-- 100 = 1x drop rate, 1000 = 10x drop rate, etc<br />
|
||||
item_rate_common_boss: 100 <--- drop rate for bosses<br />
|
||||
item_drop_common_min: 1 <--- minimal drop rate<br />
|
||||
item_drop_common_max: 10000 <--- maximum drop rate.<br />
|
||||
(You can set the rates of different items in the same file)<br />
|
||||
<br />
|
||||
</li>
|
||||
<li><strong>I found a bug, where to I report it?</strong><br />
|
||||
If you find a bug in eAthena, report it here: <a href="http://www.eathena.ws/board/index.php?autocom=bugtracker" target="_blank">Bug Tracker</a><br />
|
||||
<br />
|
||||
</li>
|
||||
<li><strong>I'm a well-experienced programmer, can I join the eAthena dev team?</strong><br />
|
||||
Contact <a href="http://www.eathena.ws/board/index.php?showuser=121372" target="_blank">Paradox924X</a><br />
|
||||
<br />
|
||||
</li>
|
||||
<li><strong>My character won't move, and no windows open when I login to the game, what's wrong?</strong><br />
|
||||
Your packet_db_ver is most likely set wrong, change it in /db/packet_db.txt to match your client's packet ver.
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
182
readme/faq.html
@ -1,151 +1,31 @@
|
||||
<html><head><title>eAthena - FAQ</title><head>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="./readme.css">
|
||||
|
||||
<body>
|
||||
<div id="dleftbg">
|
||||
</div>
|
||||
<div id="drightbg">
|
||||
</div>
|
||||
<div id="canvas" align="center">
|
||||
<table cellspacing="0" cellpadding="0" border="0" id="ea" align="center">
|
||||
<tr>
|
||||
<td id="leftborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="leftborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./images/leftborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="middle" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0" valign="top">
|
||||
<tr>
|
||||
<td id="logo" valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td rowspan="4">
|
||||
<img src="./images/chara.gif" width="366" height="274">
|
||||
</td>
|
||||
<td rowspan="4" width="129">
|
||||
</td>
|
||||
<td colspan="2" width="305" height="51" align="right">
|
||||
<img src="./images/banner.gif" width="305" height="51">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="title" colspan="2" align="right">
|
||||
FAQ
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="81" colspan="2">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="navi" align="right">
|
||||
<a href="../readme.html">Introduction</a><br>
|
||||
<a href="./changelog.html">Changelog</a><br>
|
||||
Features<br>
|
||||
<a href="./npcfeatures.html">NPC Features</a>
|
||||
|
||||
</td>
|
||||
<td class="navi" align="right">
|
||||
<a href="./setup.html">Setup</a><br>
|
||||
<a href="./gmcommands.html">GM Commands</a><br>
|
||||
<a href="./faq.html">FAQ</a><br>
|
||||
<a href="./resources.html">Resources</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="btmborder">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="2">
|
||||
<tr>
|
||||
<td id="leftbtmborder"">
|
||||
</td>
|
||||
<td id="midbtmborder"">
|
||||
<img src="./images/btmborder.gif" width="44" height="2">
|
||||
</td>
|
||||
<td id="rightbtmborder">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="content">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td id="lefttext" valign="top">
|
||||
<h1>FAQ</h1>
|
||||
<b>Q: I get the error message "This application has failed to start because cygwin1.dll was not found. Re-installing the application may fix this problem."</b><br>
|
||||
A: You're missing the cygwin dlls. Please get the latest dll at: http://www.cygwin.com/snapshot. If you're unsure, asking around in our IRC chatroom will get you around too, but always remember - use common sense and search before asking.<br><br>
|
||||
<b>Q: My map-server won't load! It appears to be loading things before it dissapeared suddenly! HELP!</b><br>
|
||||
A: Use command line to load map-server. It should tell you the error. If you're missing a map, update your kRO Sakray or comment the map from map_athena.conf. If you have an errornous NPC, fix it or comment it off. Anything other than that, feel free to ask around<br><br>
|
||||
<b>Q: My map-server failed to load 'adata.grf'! Where do I find this adata.grf? My map-server won't load without it!</b><br>
|
||||
A: The error that caused the map-server to not load is not the adata.grf. adata.grf is NOT a requirement for the map-server to load. The error is probably related to something else.<br><br>
|
||||
</td>
|
||||
<td id="midtext">
|
||||
</td>
|
||||
<td id="righttext" valign="top">
|
||||
<b>Q: All 3 of the servers are loaded, but I am still having problems accessing it! What do I do?</b><br>
|
||||
A: First, check the IPs in map_athena.conf and char_athena.conf. If those are correct, check the ports to make sure they match. If that's correct too, you probably cannot handle the server load. Lower the monster spawning rate using mob_count in battle_athena.conf and it should be fine.<br><br>
|
||||
<b>Q: How do I start Guild Wars/War of Emperium??? HELP!!!</b><br>
|
||||
A: Read the GM Command page for full list of commands that GMs can use, including the command for this.<br><br>
|
||||
<b>Q: My Ragnarok Online crashed while playing with eAthena! What do I do now?</b><br>
|
||||
A: Well, if your Ragnarok crashes, it's most probably not anything to do with eAthena. Something is wrong with your Ragnarok installation. Try reinstalling or updating.<br><br>
|
||||
<b>Q: Is eAthena compatible with mySQL? Can I use mySQL as the DB instead of using text files?</b><br>
|
||||
A: Yes, eAthena is compatible with mySQL. A tutorial on how to setup this is coming soon.<br><br>
|
||||
<b>Q: Is eAthena compatible with msSQL? Can I use msSQL as the DB instead of using text files?</b><br>
|
||||
A: No, eAthena is not compatible with msSQL. You cannot use msSQL with eAthena.<br><br>
|
||||
<b>Q: I found a bug! Where do I report it?</b><br>
|
||||
A: Drop the developers a line at the IRC chatroom. Or just post it in the bug report forum. We check them out too. :)<br><br>
|
||||
<b>Q: I know alot of C and I'm able to help improve eAthena and add new features. How can I join your development team?</b><br>
|
||||
A: Try talking to one of the current developers in the eAthena channel.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
© Content Copyright 2005 eAthena Development Team/Evera<br>
|
||||
© Design Copyright 2005 Evera
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="rightborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="rightborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./images/rightborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>eAthena | FAQ</title>
|
||||
<link rel="stylesheet" type="text/css" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="template">
|
||||
<div id="header">
|
||||
<div class="logo">eAthena<br /><span class="subtitle">- RAGNAROK Online Server Emulator</span></div>
|
||||
<div class="title">FAQ</div>
|
||||
</div>
|
||||
<div id="navcontainer">
|
||||
<ul id="navlist">
|
||||
<li><a href="../readme.html">Intro</a></li>
|
||||
<li><a href="setup.html">Setup</a></li>
|
||||
<li><a href="faq.html">FAQ</a></li>
|
||||
<li><a href="scripting.html">Scripting</a></li>
|
||||
<li><a href="commands.html">GM Commands</a></li>
|
||||
<li><a href="resources.html">Resources</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="body-container">
|
||||
The following are frequently asked questions regarding eAthena.<br /><br />
|
||||
<iframe width="100%" height="75%" src="faq-content.html"></iframe><br />
|
||||
</div>
|
||||
|
||||
<div id="footer">"Read Me" Created & Designed by <a href="http://www.kisuka.com" target="_new">Kisuka</a></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,159 +0,0 @@
|
||||
<html><head><title>eAthena - Features</title><head>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="./readme.css">
|
||||
|
||||
<body>
|
||||
<div id="dleftbg">
|
||||
</div>
|
||||
<div id="drightbg">
|
||||
</div>
|
||||
<div id="canvas" align="center">
|
||||
<table cellspacing="0" cellpadding="0" border="0" id="ea" align="center">
|
||||
<tr>
|
||||
<td id="leftborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="leftborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./images/leftborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="middle" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0" valign="top">
|
||||
<tr>
|
||||
<td id="logo" valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td rowspan="4">
|
||||
<img src="./images/chara.gif" width="366" height="274">
|
||||
</td>
|
||||
<td rowspan="4" width="129">
|
||||
</td>
|
||||
<td colspan="2" width="305" height="51" align="right">
|
||||
<img src="./images/banner.gif" width="305" height="51">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="title" colspan="2" align="right">
|
||||
Features
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="81" colspan="2">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="navi" align="right">
|
||||
<a href="../readme.html">Introduction</a><br>
|
||||
<a href="./changelog.html">Changelog</a><br>
|
||||
Features<br>
|
||||
<a href="./npcfeatures.html">NPC Features</a>
|
||||
|
||||
</td>
|
||||
<td class="navi" align="right">
|
||||
<a href="./setup.html">Setup</a><br>
|
||||
<a href="./gmcommands.html">GM Commands</a><br>
|
||||
<a href="./faq.html">FAQ</a><br>
|
||||
<a href="./resources.html">Resources</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="btmborder">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="2">
|
||||
<tr>
|
||||
<td id="leftbtmborder"">
|
||||
</td>
|
||||
<td id="midbtmborder"">
|
||||
<img src="./images/btmborder.gif" width="44" height="2">
|
||||
</td>
|
||||
<td id="rightbtmborder">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="content">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td id="lefttext" valign="top">
|
||||
<h1>Features</h1>
|
||||
eAthena tries to keep up with kRO (Korean Ragnarok Online, an official server) in terms of features. Many of the features we have
|
||||
are re-coded versions of official onces. We also have many eAthena exclusive features, such as various NPC commands. We also
|
||||
have all of the RO server emu goodies, like open-source modification and custom sprites/items. We are currently on <i>feature-lock</i>,
|
||||
so we will focus mainly on stability for the time being, not new features.
|
||||
|
||||
|
||||
</td>
|
||||
<td id="midtext">
|
||||
</td>
|
||||
<td id="righttext" valign="top">
|
||||
<ul>
|
||||
<li>PVP (Player Vs. Player)</li>
|
||||
<li>Adoption System</li>
|
||||
<li>Dynamic monster spawning system</li>
|
||||
<li>GVG (Guild Vs. Guild)</li>
|
||||
<li>qPets (Cute Pets)</li>
|
||||
<li>Monster Skills</li>
|
||||
<li>2-2 Jobs (Alternate 2nd Jobs)</li>
|
||||
<li>Super Novice (Alternate 1st Job)</li>
|
||||
<li>WoE (War of Emperium)</li>
|
||||
<li>Weddings</li>
|
||||
<li>Pet equipped mobs</li>
|
||||
<li>Management of day/night</li>
|
||||
<li>Mob Disguises</li>
|
||||
<li>Weather and other special effects</li>
|
||||
<li>"Rebirth/Transcendent" Classes</li>
|
||||
<li>Room for custom sprites/items</li>
|
||||
<li>Open source, allowing for your own personal modifications</li>
|
||||
<li>Two different storage systems, TXT and SQL</li>
|
||||
<li>Stability</li>
|
||||
<li>Many other various features</li>
|
||||
</ul>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
© Content Copyright 2005 eAthena Development Team/Evera<br>
|
||||
© Design Copyright 2005 Evera
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="rightborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="rightborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./images/rightborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
@ -1,139 +0,0 @@
|
||||
<html><head><title>eAthena - GM Commands</title><head>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="./readme.css">
|
||||
|
||||
<body>
|
||||
<div id="dleftbg">
|
||||
</div>
|
||||
<div id="drightbg">
|
||||
</div>
|
||||
<div id="canvas" align="center">
|
||||
<table cellspacing="0" cellpadding="0" border="0" id="ea" align="center">
|
||||
<tr>
|
||||
<td id="leftborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="leftborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./images/leftborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="middle" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0" valign="top">
|
||||
<tr>
|
||||
<td id="logo" valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td rowspan="4">
|
||||
<img src="./images/chara.gif" width="366" height="274">
|
||||
</td>
|
||||
<td rowspan="4" width="129">
|
||||
</td>
|
||||
<td colspan="2" width="305" height="51" align="right">
|
||||
<img src="./images/banner.gif" width="305" height="51">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="title" colspan="2" align="right">
|
||||
GM Commands
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="81" colspan="2">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="navi" align="right">
|
||||
<a href="../readme.html">Introduction</a><br>
|
||||
<a href="./changelog.html">Changelog</a><br>
|
||||
<a href="./features.html">Features</a><br>
|
||||
<a href="./npcfeatures.html">NPC Features</a>
|
||||
|
||||
</td>
|
||||
<td class="navi" align="right">
|
||||
<a href="./setup.html">Setup</a><br>
|
||||
GM Commands<br>
|
||||
<a href="./faq.html">FAQ</a><br>
|
||||
<a href="./resources.html">Resources</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="btmborder">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="2">
|
||||
<tr>
|
||||
<td id="leftbtmborder"">
|
||||
</td>
|
||||
<td id="midbtmborder"">
|
||||
<img src="./images/btmborder.gif" width="44" height="2">
|
||||
</td>
|
||||
<td id="rightbtmborder">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="content">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td id="lefttext" valign="top">
|
||||
<h1>GM Commands</h1>
|
||||
A GM, or Game Master, on eAthena has access to certain codes to administer the server. A GM is appointed by the server owner, and can not
|
||||
be gained normally through the game. These commands start with the @ symbol, a well-recognized sign of an Athena server. Many of our current
|
||||
commands are broken and don't work properly.
|
||||
</td>
|
||||
<td id="midtext">
|
||||
</td>
|
||||
<td id="righttext" valign="top">
|
||||
<iframe src="../conf/help.txt" name="Help" title="eAthena Gm Commands" marginwidth="10" marginheight="10" frameborder="0" height="500" width="100%"></iframe>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
© Content Copyright 2005 eAthena Development Team/Evera<br>
|
||||
© Design Copyright 2005 Evera
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="rightborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="rightborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./images/rightborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
Before Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 755 B |
Before Width: | Height: | Size: 567 B |
Before Width: | Height: | Size: 208 KiB |
BIN
readme/images/clown.png
Normal file
After Width: | Height: | Size: 577 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 729 B |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 912 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 730 B |
Before Width: | Height: | Size: 617 B |
@ -1,262 +0,0 @@
|
||||
<html><head><title>eAthena - NPC Features</title><head>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="./readme.css">
|
||||
|
||||
<body>
|
||||
<div id="dleftbg">
|
||||
</div>
|
||||
<div id="drightbg">
|
||||
</div>
|
||||
<div id="canvas" align="center">
|
||||
<table cellspacing="0" cellpadding="0" border="0" id="ea" align="center">
|
||||
<tr>
|
||||
<td id="leftborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="leftborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./images/leftborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="middle" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0" valign="top">
|
||||
<tr>
|
||||
<td id="logo" valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td rowspan="4">
|
||||
<img src="./images/chara.gif" width="366" height="274">
|
||||
</td>
|
||||
<td rowspan="4" width="129">
|
||||
</td>
|
||||
<td colspan="2" width="305" height="51" align="right">
|
||||
<img src="./images/banner.gif" width="305" height="51">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="title" colspan="2" align="right">
|
||||
NPC Features
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="81" colspan="2">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="navi" align="right">
|
||||
<a href="../readme.html">Introduction</a><br>
|
||||
<a href="./changelog.html">Changelog</a><br>
|
||||
<a href="./features.html">Features</a><br>
|
||||
NPC Features
|
||||
|
||||
</td>
|
||||
<td class="navi" align="right">
|
||||
<a href="./setup.html">Setup</a><br>
|
||||
<a href="./gmcommands.html">GM Commands</a><br>
|
||||
<a href="./faq.html">FAQ</a><br>
|
||||
<a href="./resources.html">Resources</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="btmborder">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="2">
|
||||
<tr>
|
||||
<td id="leftbtmborder"">
|
||||
</td>
|
||||
<td id="midbtmborder"">
|
||||
<img src="./images/btmborder.gif" width="44" height="2">
|
||||
</td>
|
||||
<td id="rightbtmborder">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="content">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td id="lefttext" valign="top">
|
||||
<h1>NPC Features</h1>
|
||||
One of the best aspects of eAthena is the NPC system. As a base, we have most of the official kRO NPC scripts, and if they are in
|
||||
iRO, we have their correct translations. You can put any of your custom NPCs on top of these, using our extremely easy-to-learn
|
||||
scripting language. We also have a wide variety of custom NPCs available in /npc/custom/ and for download in the forums to
|
||||
maximize your players' experiences.
|
||||
|
||||
|
||||
</td>
|
||||
<td id="midtext">
|
||||
</td>
|
||||
<td id="righttext" valign="top">
|
||||
<ul>
|
||||
<li><strong>Town Npcs</strong> (11/17)</li>
|
||||
<ul><li> Alberta - 100%</li></ul>
|
||||
<ul><li> Al de Baran - 100%</li></ul>
|
||||
<ul><li> Amatsu - 100%</li></ul>
|
||||
<ul><li> Ayothaya - 75%</li></ul>
|
||||
<ul><li> Comodo - 100%</li></ul>
|
||||
<ul><li> Einbech - 90%</li></ul>
|
||||
<ul><li> Einbroch - 75%</li></ul>
|
||||
<ul><li> Geffen - 100%</li></ul>
|
||||
<ul><li> Gonryun - 60%</li></ul>
|
||||
<ul><li> Izlude - 100%</li></ul>
|
||||
<ul><li> Louyang - 75%</li></ul>
|
||||
<ul><li> Lutie - 100%</li></ul>
|
||||
<ul><li> Morocc - 100%</li></ul>
|
||||
<ul><li> Niflheim - 100%</li></ul>
|
||||
<ul><li> Payon(New Maps) - 99%</li></ul>
|
||||
<ul><li> Prontera - 100%</li></ul>
|
||||
<ul><li> Umbala - 100%</li></ul>
|
||||
|
||||
<li><strong>Job Quests</strong> (16/33)</li>
|
||||
<ul><li> Novice Class (2/2)</li></ul>
|
||||
<ul><ul><li> Novice - 100%</li></ul></ul>
|
||||
<ul><ul><li> Super Novice - 100%</li></ul></ul>
|
||||
<ul><li> 1-1 Class (6/6)</li></ul>
|
||||
<ul><ul><li> Swordman - 100%</li></ul></ul>
|
||||
<ul><ul><li> Mage - 100%</li></ul></ul>
|
||||
|
||||
|
||||
<ul><ul><li> Archer - 100%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Acolyte - 100%</li></ul></ul>
|
||||
<ul><ul><li> Merchant - 100%</li></ul></ul>
|
||||
<ul><ul><li> Thief - 100%</li></ul></ul>
|
||||
<ul><li> 2-1 Class (6/6)</li></ul>
|
||||
<ul><ul><li> Knight - 100%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Priest - 100%</li></ul></ul>
|
||||
<ul><ul><li> Wizard - 100%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Blacksmith - 100%</li></ul></ul>
|
||||
<ul><ul><li> Hunter - 100%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Assassin - 100%</li></ul></ul>
|
||||
|
||||
<ul><li> 2-2 Class (2/7)</li></ul>
|
||||
<ul><ul><li> Crusader - 0%</li></ul></ul>
|
||||
<ul><ul><li> Monk - 0% (Soon)</li></ul></ul>
|
||||
<ul><ul><li> Sage - 0% (Soon)</li></ul></ul>
|
||||
<ul><ul><li> Rogue - 100%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Alchemist - 100%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Bard - 0%</li></ul></ul>
|
||||
<ul><ul><li> Dancer - 100%</li></ul></ul>
|
||||
|
||||
<ul><li> 2-1-1 Class (0/6)</li></ul>
|
||||
<ul><li> 2-2-1 Class (0/6)</li></ul>
|
||||
<li><strong>Kafras</strong> - 100%</li>
|
||||
|
||||
<li><strong>Guides</strong> - 100%</li>
|
||||
|
||||
<li> <strong>War Of Emperium</strong> (4/5)</li>
|
||||
<ul><li> Prontera - 100%</li></ul>
|
||||
<ul><li> Geffen - 100%</li></ul>
|
||||
|
||||
<ul><li> Payon - 100%</li></ul>
|
||||
<ul><li> Al De Baran - 100%</li></ul>
|
||||
|
||||
<ul><li> Novice - 0%</li></ul>
|
||||
<li><strong>Quests</strong> (24/25)</li>
|
||||
|
||||
<ul><li> Skill Quests (7/7)</li></ul>
|
||||
|
||||
<ul><ul><li> Novice - 100%</li></ul></ul>
|
||||
<ul><ul><li> Swordman - 100%</li></ul></ul>
|
||||
<ul><ul><li> Mage - 100%</li></ul></ul>
|
||||
<ul><ul><li> Archer - 100%</li></ul></ul>
|
||||
<ul><ul><li> Acolyte - 100%</li></ul></ul>
|
||||
<ul><ul><li> Merchant - 100%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Thief - 100%</li></ul></ul>
|
||||
|
||||
<ul><li>Town Quests (9/10)</li></ul>
|
||||
<ul><ul><li> Prontera - 100%</li></ul></ul>
|
||||
<ul><ul><li> Morocc - 100%</li></ul></ul>
|
||||
<ul><ul><li> Geffen - 100%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Izlude - 100%</li></ul></ul>
|
||||
<ul><ul><li> Alberta - 100%</li></ul></ul>
|
||||
<ul><ul><li> Al De Baran - 100%</li></ul></ul>
|
||||
<ul><ul><li> Yuno - 100%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Lutie - 100%</li></ul></ul>
|
||||
<ul><ul><li> Comodo - 100%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Payon - 20%</li></ul></ul>
|
||||
<ul><li>Other Quests (9/9)</li></ul>
|
||||
<ul><ul><li> Dye - 100%</li></ul></ul>
|
||||
<ul><ul><li> MrSmile - 100%</li></ul></ul>
|
||||
<ul><ul><li> Juice Making - 100%</li></ul></ul>
|
||||
<ul><ul><li> Doomed Swords - 100%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Bongun Taming - 100%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Munak Taming - 100%</li></ul></ul>
|
||||
<ul><ul><li> Tamking - 100%</li></ul></ul>
|
||||
<ul><ul><li> Bongun Sword - 100%</li></ul></ul>
|
||||
<ul><ul><li> The lvl 4 Weapon Quest - 100%</li></ul></ul>
|
||||
<ul><li>Other (7/10)</li></ul>
|
||||
<ul><ul><li> Card Remover - 100%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> PvP (old) - 100%</li></ul></ul>
|
||||
<ul><ul><li> Time Arena - 100%</li></ul></ul>
|
||||
<ul><ul><li> Bank - 100%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Wedding - 80%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Valkyrie - 10%</li></ul></ul>
|
||||
|
||||
<ul><ul><li> Gefenia - 10%</li></ul></ul>
|
||||
<ul><ul><li> Heal Npc - 100%</li></ul></ul>
|
||||
<ul><ul><li> Warp Npc - 100%</li></ul></ul>
|
||||
<ul><ul><li> Jobchange - 100%</li></ul></ul>
|
||||
</ul>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
© Content Copyright 2005 eAthena Development Team/Evera<br>
|
||||
© Design Copyright 2005 Evera
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="rightborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="rightborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./images/rightborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
@ -1,227 +0,0 @@
|
||||
/* Go away, Troll */
|
||||
|
||||
A,
|
||||
A:link,
|
||||
A:visited,
|
||||
A:active,
|
||||
A:hover {
|
||||
|
||||
color: #000;
|
||||
|
||||
text-decoration: underline;
|
||||
|
||||
background-color : inherit;
|
||||
|
||||
}
|
||||
|
||||
|
||||
html {
|
||||
|
||||
margin: 0px;
|
||||
|
||||
padding: 0px;
|
||||
|
||||
}
|
||||
|
||||
body {
|
||||
|
||||
background: url(./images/bg.gif);
|
||||
|
||||
margin: 0px 0px 0px 0px;
|
||||
|
||||
padding: 0px 0px 0px 0px;
|
||||
|
||||
font: 14px Arial, arial;
|
||||
|
||||
color: #000;
|
||||
|
||||
}
|
||||
|
||||
h1 {
|
||||
|
||||
width : 100%;
|
||||
|
||||
height : 40px;
|
||||
|
||||
text-align : bottom;
|
||||
|
||||
font : 30px Arial Black, arial black, helvetica, sans-serif;
|
||||
|
||||
}
|
||||
|
||||
.w800 {
|
||||
|
||||
width: 800px;
|
||||
|
||||
}
|
||||
|
||||
#dleftbg,
|
||||
#drightbg {
|
||||
|
||||
position: absolute;
|
||||
|
||||
width: 50%;
|
||||
|
||||
overflow: hidden;
|
||||
|
||||
height: 69px;
|
||||
|
||||
z-index: 0;
|
||||
|
||||
}
|
||||
|
||||
#dleftbg {
|
||||
|
||||
top: 66px;
|
||||
|
||||
left: 0px;
|
||||
|
||||
background: url(./images/leftbg.gif);
|
||||
|
||||
}
|
||||
|
||||
#drightbg {
|
||||
|
||||
top: 105px;
|
||||
|
||||
right: 0px;
|
||||
|
||||
background: url(./images/rightbg.gif);
|
||||
|
||||
}
|
||||
|
||||
#canvas {
|
||||
|
||||
position: absolute;
|
||||
|
||||
z-index: 1;
|
||||
|
||||
width: 100%;
|
||||
|
||||
height: 100%;
|
||||
|
||||
}
|
||||
|
||||
#ea {
|
||||
|
||||
height: 100%;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#leftborderspacer,
|
||||
#leftbgspacer {
|
||||
|
||||
height: 66px;
|
||||
|
||||
}
|
||||
|
||||
#rightborderspacer {
|
||||
|
||||
height: 106px;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#leftborder,
|
||||
#rightborder {
|
||||
|
||||
background: #000;
|
||||
|
||||
width: 1px;
|
||||
|
||||
}
|
||||
|
||||
.vspacer {
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
#middle {
|
||||
|
||||
background: url(./images/textbg.gif);
|
||||
|
||||
width: 800px;
|
||||
|
||||
height: 100%;
|
||||
|
||||
}
|
||||
|
||||
#logo {
|
||||
|
||||
background: url(./images/logo.gif) no-repeat top left;
|
||||
|
||||
height: 100%;
|
||||
|
||||
}
|
||||
|
||||
#title {
|
||||
|
||||
font : 30px Arial Black, arial black, helvetica, sans-serif;
|
||||
|
||||
height: 54px;
|
||||
|
||||
}
|
||||
|
||||
.navi {
|
||||
|
||||
font : 14px Arial Black, arial black, helvetica, sans-serif;
|
||||
|
||||
height: 88px;
|
||||
|
||||
}
|
||||
|
||||
#btmborder {
|
||||
|
||||
background: url(./images/btmborderbg.gif);
|
||||
|
||||
height: 2px;
|
||||
|
||||
}
|
||||
|
||||
.left,
|
||||
#lefttext,
|
||||
#leftbtmborder {
|
||||
|
||||
width: 327px;
|
||||
|
||||
}
|
||||
|
||||
#midtext,
|
||||
#midbtmborder {
|
||||
|
||||
width: 44px;
|
||||
|
||||
}
|
||||
|
||||
.right,
|
||||
#righttext,
|
||||
#rightbtmborder {
|
||||
|
||||
width: 429px;
|
||||
|
||||
}
|
||||
|
||||
#content {
|
||||
|
||||
height: 100px;
|
||||
|
||||
}
|
||||
|
||||
#lefttext,
|
||||
#righttext {
|
||||
|
||||
background: url(./images/textbg.gif);
|
||||
|
||||
height: 100%;
|
||||
|
||||
}
|
||||
|
||||
#midtext {
|
||||
|
||||
background: url(./images/logobtm.gif);
|
||||
|
||||
height: 100%;
|
||||
|
||||
}
|
@ -1,150 +1,67 @@
|
||||
<html><head><title>eAthena - Resources</title><head>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="./readme.css">
|
||||
|
||||
<body>
|
||||
<div id="dleftbg">
|
||||
</div>
|
||||
<div id="drightbg">
|
||||
</div>
|
||||
<div id="canvas" align="center">
|
||||
<table cellspacing="0" cellpadding="0" border="0" id="ea" align="center">
|
||||
<tr>
|
||||
<td id="leftborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="leftborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./images/leftborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="middle" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0" valign="top">
|
||||
<tr>
|
||||
<td id="logo" valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td rowspan="4">
|
||||
<img src="./images/chara.gif" width="366" height="274">
|
||||
</td>
|
||||
<td rowspan="4" width="129">
|
||||
</td>
|
||||
<td colspan="2" width="305" height="51" align="right">
|
||||
<img src="./images/banner.gif" width="305" height="51">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="title" colspan="2" align="right">
|
||||
Resources
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="81" colspan="2">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="navi" align="right">
|
||||
<a href="../readme.html">Introduction</a><br>
|
||||
<a href="./changelog.html">Changelog</a><br>
|
||||
<a href="./features.html">Features</a><br>
|
||||
<a href="./npcfeatures.html">NPC Features</a>
|
||||
|
||||
</td>
|
||||
<td class="navi" align="right">
|
||||
<a href="./setup.html">Setup</a><br>
|
||||
<a href="./gmcommands.html">GM Commands</a><br>
|
||||
<a href="./faq.html">FAQ</a><br>
|
||||
Resources
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="btmborder">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="2">
|
||||
<tr>
|
||||
<td id="leftbtmborder"">
|
||||
</td>
|
||||
<td id="midbtmborder"">
|
||||
<img src="./images/btmborder.gif" width="44" height="2">
|
||||
</td>
|
||||
<td id="rightbtmborder">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="content">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td id="lefttext" valign="top">
|
||||
<h1>Official Sources</h1>
|
||||
<b><a href="http://www.eathena.ws">http://www.eathena.ws</a></b>
|
||||
Our Official Webpage.<br>
|
||||
<b><a href="http://forum.asb-sakray.net">http://forum.asb-sakray.net</a></b>
|
||||
Aegis Support Board.<br>
|
||||
Please take note, you are adviced to search in the forums
|
||||
first before requesting for help to be made toward you.<br>
|
||||
<br>
|
||||
<b>IRC Channel:</b><br>
|
||||
|
||||
<b><a href="irc://irc.deltaanime.net">irc.deltaanime.net</a></b>
|
||||
#athena (Please make sure to check both forums before coming into
|
||||
the channel to ask questions, or else we will not only ignore you,
|
||||
but laugh at you too.)
|
||||
</td>
|
||||
<td id="midtext">
|
||||
</td>
|
||||
<td id="righttext" valign="top">
|
||||
<h1>Other Sources</h1>
|
||||
<b><a href="http://kalen.s79.xrea.com/npc/">http://kalen.s79.xrea.com/npc/</a></b>
|
||||
NPC Factory (Lists NPC/number)<br>
|
||||
<br>
|
||||
If you want your site to be featured here, please tell a dev ^_^.
|
||||
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
© Content Copyright 2005 eAthena Development Team/Evera<br>
|
||||
© Design Copyright 2005 Evera
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="rightborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="rightborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./images/rightborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>eAthena | Resources</title>
|
||||
<link rel="stylesheet" type="text/css" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="template">
|
||||
<div id="header">
|
||||
<div class="logo">eAthena<br /><span class="subtitle">- RAGNAROK Online Server Emulator</span></div>
|
||||
<div class="title">Resources</div>
|
||||
</div>
|
||||
<div id="navcontainer">
|
||||
<ul id="navlist">
|
||||
<li><a href="../readme.html">Intro</a></li>
|
||||
<li><a href="setup.html">Setup</a></li>
|
||||
<li><a href="faq.html">FAQ</a></li>
|
||||
<li><a href="scripting.html">Scripting</a></li>
|
||||
<li><a href="commands.html">GM Commands</a></li>
|
||||
<li><a href="resources.html">Resources</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="body-container">
|
||||
The following are some links to various resources which can be helpful when using eAthena.<br />
|
||||
<ul>
|
||||
<li><a href="http://www.eathena.ws/" target="_new">http://www.eathena.ws/</a><br>
|
||||
The official eAthena project website.
|
||||
</li><br>
|
||||
|
||||
<li><a href="http://eathena-project.googlecode.com/svn/" target="_new">
|
||||
http://eathena-project.googlecode.com/svn/</a><br>
|
||||
The official SVN of the eAthena project.</li><br>
|
||||
|
||||
<li><a href="irc://irc.deltaanime.net/#athena" target="_new">irc://irc.deltaanime.net/#athena</a><br>
|
||||
The official eAthena IRC Channel.</li><br>
|
||||
|
||||
<li><a href="http://forum.asb-sakray.net/" target="_new">http://forum.asb-sakray.net/</a><br>
|
||||
The official AEGIS Support Board.</li><br>
|
||||
|
||||
<li><a href="http://www.ragnarokonline.com/" target="_new">
|
||||
http://www.ragnarokonline.com/</a><br>
|
||||
The official Ragnarok Online website.
|
||||
</li><br>
|
||||
|
||||
<li><a href="http://nn.nachtwolke.com/dev/npclist/" target="_new">
|
||||
http://nn.nachtwolke.com/dev/npclist/</a><br>
|
||||
List of Ragnarok Online NPC sprite names and IDs.
|
||||
</li><br>
|
||||
|
||||
<li><a href="../doc/script_commands.txt" target="_new">Script Commands</a><br>
|
||||
Documentation of the script commands available in eAthena.
|
||||
</li><br>
|
||||
|
||||
<li><a href="../doc/effect_list.txt" target="_new">Effect List</a><br>
|
||||
Documentation of the visual effects available in eAthena.
|
||||
</li><br>
|
||||
|
||||
<li><a href="../doc/item_bonus.txt" target="_new">Item Bonuses</a><br>
|
||||
Documentation of the item bonuses available in eAthena.
|
||||
</li><br>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="footer">"Read Me" Created & Designed by <a href="http://www.kisuka.com" target="_new">Kisuka</a></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
69
readme/scripting.html
Normal file
@ -0,0 +1,69 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>eAthena | Scripting</title>
|
||||
<link rel="stylesheet" type="text/css" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="template">
|
||||
<div id="header">
|
||||
<div class="logo">eAthena<br /><span class="subtitle">- RAGNAROK Online Server Emulator</span></div>
|
||||
<div class="title">Scripting</div>
|
||||
</div>
|
||||
<div id="navcontainer">
|
||||
<ul id="navlist">
|
||||
<li><a href="../readme.html">Intro</a></li>
|
||||
<li><a href="setup.html">Setup</a></li>
|
||||
<li><a href="faq.html">FAQ</a></li>
|
||||
<li><a href="scripting.html">Scripting</a></li>
|
||||
<li><a href="commands.html">GM Commands</a></li>
|
||||
<li><a href="resources.html">Resources</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="body-container">
|
||||
<p>
|
||||
How to create an NPC using eAthena's scripting:<br /><br />
|
||||
<font color="#0000FF">map_name</font>,<font color="#009900">x_cord</font>,<font color="#0CF305">y_cord</font>,<font color="#FF0000">npc_facing_direction</font> <strong>-TAB-</strong> script <strong>-TAB-</strong> <font color="#FF6600">NPC Name</font>#<font color="#FFCC00">HiddenName</font> <strong>-TAB-</strong> <font color="#CC3399">Sprite ID</font>,{<br />
|
||||
mes "[NPC Name]";<br>
|
||||
mes "Hello World";<br>
|
||||
close;<br>
|
||||
}
|
||||
</p>
|
||||
<p>
|
||||
<strong>Common Script Commands:</strong>
|
||||
<ul>
|
||||
<li><strong>mes</strong><br>
|
||||
usage: mes "<message>";<br>
|
||||
info: displays a line of text in an NPC's dialog window.</li>
|
||||
<li><strong>close</strong><br>
|
||||
usage: close;<br>
|
||||
info: displays a "Close" button in an NPC's dialog window.
|
||||
</li>
|
||||
<li><strong>next</strong><br>
|
||||
usage: next;<br>
|
||||
info: displays a "Next" button in an NPC's dialog window.</li>
|
||||
<li><strong>getitem</strong><br>
|
||||
usage: getitem <item id>,<amount>;<br>
|
||||
info: gives the player an item.
|
||||
</li>
|
||||
<li><strong>delitem</strong><br>
|
||||
usage: delitem <item id>,<amount>;<br>
|
||||
info: deletes an item from the player.
|
||||
</li>
|
||||
</ul>
|
||||
<p><strong>Script Command Documentation:</strong><br>
|
||||
|
||||
All the script commands in eAthena can be found <a href="../doc/script_commands.txt" target="_new">here</a>.</p>
|
||||
<p><strong>How to enable your NPC:</strong><br>
|
||||
1. Save it as a text file in your /npc/custom/ folder.<br>
|
||||
2. Open /npc/scripts_custom.conf<br>
|
||||
3. Add the following line:<br>
|
||||
<em>npc: npc/custom/name_of_your_text_file.txt</em><br>
|
||||
4. Save and close.</p>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div id="footer">"Read Me" Created & Designed by <a href="http://www.kisuka.com" target="_new">Kisuka</a></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,144 +1,62 @@
|
||||
<html><head><title>eAthena - Setup</title><head>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="./readme.css">
|
||||
|
||||
<body>
|
||||
<div id="dleftbg">
|
||||
</div>
|
||||
<div id="drightbg">
|
||||
</div>
|
||||
<div id="canvas" align="center">
|
||||
<table cellspacing="0" cellpadding="0" border="0" id="ea" align="center">
|
||||
<tr>
|
||||
<td id="leftborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="leftborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./images/leftborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="middle" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0" valign="top">
|
||||
<tr>
|
||||
<td id="logo" valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td rowspan="4">
|
||||
<img src="./images/chara.gif" width="366" height="274">
|
||||
</td>
|
||||
<td rowspan="4" width="129">
|
||||
</td>
|
||||
<td colspan="2" width="305" height="51" align="right">
|
||||
<img src="./images/banner.gif" width="305" height="51">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="title" colspan="2" align="right">
|
||||
Setup
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="81" colspan="2">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="navi" align="right">
|
||||
<a href="../readme.html">Introduction</a><br>
|
||||
<a href="./changelog.html">Changelog</a><br>
|
||||
<a href="./features.html">Features</a><br>
|
||||
<a href="./npcfeatures.html">NPC Features</a>
|
||||
|
||||
</td>
|
||||
<td class="navi" align="right">
|
||||
Setup<br>
|
||||
<a href="./gmcommands.html">GM Commands</a><br>
|
||||
<a href="./faq.html">FAQ</a><br>
|
||||
<a href="./resources.html">Resources</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="btmborder">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="2">
|
||||
<tr>
|
||||
<td id="leftbtmborder"">
|
||||
</td>
|
||||
<td id="midbtmborder"">
|
||||
<img src="./images/btmborder.gif" width="44" height="2">
|
||||
</td>
|
||||
<td id="rightbtmborder">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="content">
|
||||
<table class="w800" cellspacing="0" cellpadding="0" border="0" height="100%">
|
||||
<tr>
|
||||
<td id="lefttext" valign="top">
|
||||
<h1>Fresh Install</h1>
|
||||
It's extremely easy to set up eAthena, just follow these simple steps.
|
||||
<ol>
|
||||
<li>Edit motd.txt, grf-files.txt and the .conf files in your /conf/ folder as you see fit</li>
|
||||
<li>If you want to add a user, edit save/account.txt in the main eAthena directory before starting the server.</li>
|
||||
<li>Run runserver.bat or runserver-sql.bat (depending on which storage system you're using, or you could run login-server.exe, char-server.exe, and map-server.exe manually)</li>
|
||||
<li>Give people your IP address (can be found at <a href="http://www.whatismyip.com">http://www.whatismyip.com</a>) to people to add in their sclientinfo.xml</li>
|
||||
<li>You're done!</li>
|
||||
</td>
|
||||
<td id="midtext">
|
||||
</td>
|
||||
<td id="righttext" valign="top">
|
||||
<h1>Upgrading</h1>
|
||||
When you're changing versions of eAthena, it is important to keep your saved files in tact. Locate the files (/save/ in TXT, your SQL databse in SQL) and make a back up.
|
||||
You also might want to back up any changes you did to eAthena, such as custom sprites/items, open-source changes.
|
||||
After backing it up, change motd.txt, grf-files.txt, and the .conf files in the /conf/ folder to your old settings. It is
|
||||
important that you use a fresh eAthena, as it changes in structure and many files will have different formats over time.
|
||||
Put your backed up files back in, and run eAthena like you normally would.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
© Content Copyright 2005 eAthena Development Team/Evera<br>
|
||||
© Design Copyright 2005 Evera
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td id="rightborder" valign="top">
|
||||
<table cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td id="rightborderspacer">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<img src="./images/rightborder.gif">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>eAthena | Setup</title>
|
||||
<link rel="stylesheet" type="text/css" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="template">
|
||||
<div id="header">
|
||||
<div class="logo">eAthena<br /><span class="subtitle">- RAGNAROK Online Server Emulator</span></div>
|
||||
<div class="title">Setup</div>
|
||||
</div>
|
||||
<div id="navcontainer">
|
||||
<ul id="navlist">
|
||||
<li><a href="../readme.html">Intro</a></li>
|
||||
<li><a href="setup.html">Setup</a></li>
|
||||
<li><a href="faq.html">FAQ</a></li>
|
||||
<li><a href="scripting.html">Scripting</a></li>
|
||||
<li><a href="commands.html">GM Commands</a></li>
|
||||
<li><a href="resources.html">Resources</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="body-container">
|
||||
<strong>Character Server:<br></strong>
|
||||
<ol>
|
||||
<li>Open /conf/char_athena.conf</li>
|
||||
<li>Change userid and passwd (s1/p1) to what you want your server's communication details to be.</li>
|
||||
<li>Change Server_Name to what you want to call your server.</li>
|
||||
<li>Remove the <strong>//</strong> before login_ip.
|
||||
<li>Remove the <strong>//</strong> before char_ip and change 127.0.0.1 to your <a href="http://www.whatismyip.com" target="_new">WAN IP</a>.
|
||||
</ol>
|
||||
|
||||
<strong>Map Server:<br></strong>
|
||||
<ol>
|
||||
<li>Open /conf/map_athena.conf</li>
|
||||
<li>Change userid and passwd to the same thing you set in char_athena.</li>
|
||||
<li>Remove the <strong>//</strong> before char_ip.</li>
|
||||
<li>Remove the <strong>//</strong> before map_ip and change 127.0.0.1 to your <a href="http://www.whatismyip.com" target="_new">WAN IP</a>.
|
||||
</ol>
|
||||
|
||||
<strong>Subnet:<br></strong>
|
||||
<ol>
|
||||
<li>Open /conf/subnet_athena.conf</li>
|
||||
<li>Change 255.0.0.0 to your <strong>"Subnet Mask"</strong>, change the two 127.0.0.1 to your <strong>LAN IP</strong>.
|
||||
</ol>
|
||||
|
||||
<strong>MySQL Settings:<br></strong>
|
||||
<ol>
|
||||
<li>Open /conf/inter_athena.conf</li>
|
||||
<li>Find the "Global SQL Settings" and change them to your SQL server's settings.</li>
|
||||
</ol>
|
||||
|
||||
<strong>Message of the Day:<br></strong>
|
||||
<ol>
|
||||
<li>Open /conf/motd.txt and edit it to change the in-game MOTD.</li>
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
<div id="footer">"Read Me" Created & Designed by <a href="http://www.kisuka.com" target="_new">Kisuka</a></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
80
readme/style.css
Normal file
@ -0,0 +1,80 @@
|
||||
/* Created by Kisuka */
|
||||
/* www.kisuka.com */
|
||||
html, body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
background-image:url(images/bg.gif);
|
||||
}
|
||||
body {
|
||||
width: 900px;
|
||||
height: 100%;
|
||||
border-left:thin solid #000;
|
||||
border-right:thin solid #000;
|
||||
margin-left:auto;
|
||||
margin-right:auto;
|
||||
background:#FFF url(images/clown.png) no-repeat fixed right bottom;
|
||||
}
|
||||
#template { position:relative; min-height:100%; }
|
||||
* html #template { height: 100%; }
|
||||
#header {
|
||||
height: 60px;
|
||||
border-bottom:thin solid #000;
|
||||
}
|
||||
.logo {
|
||||
float:left;
|
||||
padding-left:25px;
|
||||
font-size:x-large;
|
||||
}
|
||||
.title {
|
||||
float:right;
|
||||
padding-right:25px;
|
||||
font-size:xx-large;
|
||||
padding-top:10px;
|
||||
}
|
||||
.body-title {
|
||||
font-size:x-large;
|
||||
}
|
||||
.subtitle {
|
||||
font-size:14px;
|
||||
padding-left:10px;
|
||||
font-style:italic;
|
||||
}
|
||||
.body-container {
|
||||
padding-left:30px;
|
||||
padding-right:30px;
|
||||
}
|
||||
#navcontainer ul {
|
||||
padding-left: 0;
|
||||
margin-left: 0;
|
||||
margin-top:0;
|
||||
background-color: #000;
|
||||
color: White;
|
||||
float: left;
|
||||
width: 100%;
|
||||
font-family: arial, helvetica, sans-serif;
|
||||
}
|
||||
#navcontainer ul li { display: inline; }
|
||||
#navcontainer ul li a {
|
||||
padding: 0.2em 1em;
|
||||
background-color: #000;
|
||||
color: White;
|
||||
text-decoration: none;
|
||||
float: left;
|
||||
border-right: 1px solid #fff;
|
||||
}
|
||||
#navcontainer ul li a:hover {
|
||||
background-color: #666;
|
||||
color: #fff;
|
||||
}
|
||||
#footer {
|
||||
background-color: #000;
|
||||
width: 100%;
|
||||
color: White;
|
||||
position:absolute;
|
||||
bottom:0;
|
||||
text-align:center;
|
||||
border-top: 1px solid #fff;
|
||||
}
|
||||
#footer a {
|
||||
color: White;
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
#PickLog types (M)onsters Drop, (P)layers Drop/Take, Mobs Drop (L)oot Drop/Take,
|
||||
# Players (T)rade Give/Take, Players (V)ending Sell/Take, (S)hop Sell/Take, (N)PC Give/Take,
|
||||
# (C)onsumable Items, (A)dministrators Create/Delete, Sto(R)age, (G)uild Storage,
|
||||
# (E)mail attachment
|
||||
# (E)mail attachment,(B)uying Store
|
||||
|
||||
#Database: log
|
||||
#Table: picklog
|
||||
@ -9,7 +9,7 @@ CREATE TABLE `picklog` (
|
||||
`id` int(11) NOT NULL auto_increment,
|
||||
`time` datetime NOT NULL default '0000-00-00 00:00:00',
|
||||
`char_id` int(11) NOT NULL default '0',
|
||||
`type` enum('M','P','L','T','V','S','N','C','A','R','G','E') NOT NULL default 'P',
|
||||
`type` enum('M','P','L','T','V','S','N','C','A','R','G','E','B') NOT NULL default 'P',
|
||||
`nameid` int(11) NOT NULL default '0',
|
||||
`amount` int(11) NOT NULL default '1',
|
||||
`refine` tinyint(3) unsigned NOT NULL default '0',
|
||||
@ -22,7 +22,7 @@ CREATE TABLE `picklog` (
|
||||
INDEX (`type`)
|
||||
) ENGINE=MyISAM AUTO_INCREMENT=1 ;
|
||||
|
||||
#ZenyLog types (M)onsters,(T)rade,(V)ending Sell/Buy,(S)hop Sell/Buy,(N)PC Change amount,(A)dministrators,(E)Mail
|
||||
#ZenyLog types (M)onsters,(T)rade,(V)ending Sell/Buy,(S)hop Sell/Buy,(N)PC Change amount,(A)dministrators,(E)Mail,(B)uying Store
|
||||
#Database: log
|
||||
#Table: zenylog
|
||||
CREATE TABLE `zenylog` (
|
||||
@ -30,7 +30,7 @@ CREATE TABLE `zenylog` (
|
||||
`time` datetime NOT NULL default '0000-00-00 00:00:00',
|
||||
`char_id` int(11) NOT NULL default '0',
|
||||
`src_id` int(11) NOT NULL default '0',
|
||||
`type` enum('M','T','V','S','N','A','E') NOT NULL default 'S',
|
||||
`type` enum('M','T','V','S','N','A','E','B') NOT NULL default 'S',
|
||||
`amount` int(11) NOT NULL default '0',
|
||||
`map` varchar(11) NOT NULL default '',
|
||||
PRIMARY KEY (`id`),
|
||||
|
@ -101,6 +101,7 @@ CREATE TABLE IF NOT EXISTS `char` (
|
||||
`child` int(11) unsigned NOT NULL default '0',
|
||||
`fame` int(11) unsigned NOT NULL default '0',
|
||||
`rename` SMALLINT(3) unsigned NOT NULL default '0',
|
||||
`delete_date` INT(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`char_id`),
|
||||
KEY `account_id` (`account_id`),
|
||||
KEY `party_id` (`party_id`),
|
||||
|
1
sql-files/upgrade_svn14700.sql
Normal file
@ -0,0 +1 @@
|
||||
ALTER TABLE `char` ADD `delete_date` INT(11) UNSIGNED NOT NULL DEFAULT '0';
|
4
sql-files/upgrade_svn14713_log.sql
Normal file
@ -0,0 +1,4 @@
|
||||
-- Adds 'B' to `type` in `picklog` and `zenylog`
|
||||
|
||||
ALTER TABLE `picklog` MODIFY `type` ENUM('M','P','L','T','V','S','N','C','A','R','G','E','B') NOT NULL DEFAULT 'P';
|
||||
ALTER TABLE `zenylog` MODIFY `type` ENUM('M','T','V','S','N','A','E','B') NOT NULL DEFAULT 'S';
|
321
src/char/char.c
@ -85,6 +85,7 @@ char char_name_letters[1024] = ""; // list of letters/symbols allowed (or not) i
|
||||
|
||||
int char_per_account = 0; //Maximum charas per account (default unlimited) [Sirius]
|
||||
int char_del_level = 0; //From which level u can delete character [Lupus]
|
||||
int char_del_delay = 86400;
|
||||
|
||||
int log_char = 1; // loggin char or not [devil]
|
||||
int log_inter = 1; // loggin inter or not [devil]
|
||||
@ -106,6 +107,7 @@ struct char_session_data {
|
||||
int gmlevel;
|
||||
uint32 version;
|
||||
uint8 clienttype;
|
||||
char birthdate[10+1]; // YYYY-MM-DD
|
||||
};
|
||||
|
||||
int char_id_count = START_CHAR_NUM;
|
||||
@ -368,6 +370,48 @@ int char_log(char *fmt, ...)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/// Find all characters for given session and update the session character cache.
|
||||
int char_find_characters(struct char_session_data* sd)
|
||||
{
|
||||
int i, found_num = 0;
|
||||
|
||||
for( i = 0; i < char_num; i++ )
|
||||
{// find character entries and save them
|
||||
if( char_dat[i].status.account_id == sd->account_id )
|
||||
{
|
||||
sd->found_char[found_num++] = i;
|
||||
|
||||
if( found_num >= MAX_CHARS )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for( i = found_num; i < MAX_CHARS; i++ )
|
||||
{// fill remaining blanks
|
||||
sd->found_char[i] = -1;
|
||||
}
|
||||
|
||||
return found_num;
|
||||
}
|
||||
|
||||
|
||||
/// Search character data from given session.
|
||||
struct mmo_charstatus* search_session_character(struct char_session_data* sd, int char_id)
|
||||
{
|
||||
int i;
|
||||
|
||||
ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] != -1 && char_dat[sd->found_char[i]].status.char_id == char_id );
|
||||
if( i == MAX_CHARS )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
return &char_dat[sd->found_char[i]].status;
|
||||
}
|
||||
|
||||
|
||||
//Search character data from the aid/cid givem
|
||||
struct mmo_charstatus* search_character(int aid, int cid)
|
||||
{
|
||||
@ -483,7 +527,7 @@ int mmo_char_tostr(char *str, struct mmo_charstatus *p, struct global_reg *reg,
|
||||
"\t%d,%d,%d\t%d,%d,%d,%d" //Up to hom id
|
||||
"\t%d,%d,%d\t%d,%d,%d,%d,%d" //Up to head bottom
|
||||
"\t%d,%d,%d\t%d,%d,%d" //last point + save point
|
||||
",%d,%d,%d,%d,%d\t", //Family info
|
||||
",%d,%d,%d,%d,%d,%lu\t", //Family info + delete date
|
||||
p->char_id, p->account_id, p->slot, p->name, //
|
||||
p->class_, p->base_level, p->job_level,
|
||||
p->base_exp, p->job_exp, p->zeny,
|
||||
@ -496,7 +540,8 @@ int mmo_char_tostr(char *str, struct mmo_charstatus *p, struct global_reg *reg,
|
||||
p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom,
|
||||
p->last_point.map, p->last_point.x, p->last_point.y, //
|
||||
p->save_point.map, p->save_point.x, p->save_point.y,
|
||||
p->partner_id,p->father,p->mother,p->child,p->fame);
|
||||
p->partner_id,p->father,p->mother,p->child,p->fame, //
|
||||
(unsigned long)p->delete_date); // FIXME: platform-dependent size
|
||||
for(i = 0; i < MAX_MEMOPOINTS; i++)
|
||||
if (p->memo_point[i].map) {
|
||||
str_p += sprintf(str_p, "%d,%d,%d ", p->memo_point[i].map, p->memo_point[i].x, p->memo_point[i].y);
|
||||
@ -549,10 +594,30 @@ int mmo_char_fromstr(char *str, struct mmo_charstatus *p, struct global_reg *reg
|
||||
int tmp_int[256];
|
||||
unsigned int tmp_uint[2]; //To read exp....
|
||||
int next, len, i, j;
|
||||
unsigned long tmp_ulong[1];
|
||||
|
||||
// initilialise character
|
||||
memset(p, '\0', sizeof(struct mmo_charstatus));
|
||||
|
||||
// Char structure of version 146xx (delete date)
|
||||
if (sscanf(str, "%d\t%d,%d\t%127[^\t]\t%d,%d,%d\t%u,%u,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
|
||||
"\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
|
||||
"\t%d,%d,%d\t%d,%d,%d,%d,%d,%d,%d,%d,%lu%n",
|
||||
&tmp_int[0], &tmp_int[1], &tmp_int[2], tmp_str[0],
|
||||
&tmp_int[3], &tmp_int[4], &tmp_int[5],
|
||||
&tmp_uint[0], &tmp_uint[1], &tmp_int[8],
|
||||
&tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
|
||||
&tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
|
||||
&tmp_int[19], &tmp_int[20],
|
||||
&tmp_int[21], &tmp_int[22], &tmp_int[23], //
|
||||
&tmp_int[24], &tmp_int[25], &tmp_int[26], &tmp_int[44],
|
||||
&tmp_int[27], &tmp_int[28], &tmp_int[29],
|
||||
&tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
|
||||
&tmp_int[45], &tmp_int[35], &tmp_int[36],
|
||||
&tmp_int[46], &tmp_int[37], &tmp_int[38], &tmp_int[39],
|
||||
&tmp_int[40], &tmp_int[41], &tmp_int[42], &tmp_int[43], &tmp_ulong[0], &next) != 49)
|
||||
{
|
||||
tmp_ulong[0] = 0; // delete date
|
||||
// Char structure of version 1500 (homun + mapindex maps)
|
||||
if (sscanf(str, "%d\t%d,%d\t%127[^\t]\t%d,%d,%d\t%u,%u,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
|
||||
"\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
|
||||
@ -677,6 +742,7 @@ int mmo_char_fromstr(char *str, struct mmo_charstatus *p, struct global_reg *reg
|
||||
tmp_int[45] = mapindex_name2id(tmp_str[1]);
|
||||
tmp_int[46] = mapindex_name2id(tmp_str[2]);
|
||||
} // Char structure of version 1500 (homun + mapindex maps)
|
||||
} // Char structure of version 146xx (delete date)
|
||||
|
||||
safestrncpy(p->name, tmp_str[0], NAME_LENGTH); //Overflow protection [Skotlex]
|
||||
p->char_id = tmp_int[0];
|
||||
@ -726,6 +792,7 @@ int mmo_char_fromstr(char *str, struct mmo_charstatus *p, struct global_reg *reg
|
||||
p->hom_id = tmp_int[44];
|
||||
p->last_point.map = tmp_int[45];
|
||||
p->save_point.map = tmp_int[46];
|
||||
p->delete_date = tmp_ulong[0];
|
||||
|
||||
#ifndef TXT_SQL_CONVERT
|
||||
// Some checks
|
||||
@ -1705,7 +1772,7 @@ int count_users(void)
|
||||
// Writes char data to the buffer in the format used by the client.
|
||||
// Used in packets 0x6b (chars info) and 0x6d (new char info)
|
||||
// Returns the size
|
||||
#define MAX_CHAR_BUF 110 //Max size (for WFIFOHEAD calls)
|
||||
#define MAX_CHAR_BUF 132 //Max size (for WFIFOHEAD calls)
|
||||
int mmo_char_tobuf(uint8* buffer, struct mmo_charstatus* p)
|
||||
{
|
||||
unsigned short offset = 0;
|
||||
@ -1764,6 +1831,10 @@ int mmo_char_tobuf(uint8* buffer, struct mmo_charstatus* p)
|
||||
#if (PACKETVER >= 20100720 && PACKETVER <= 20100727) || PACKETVER >= 20100803
|
||||
mapindex_getmapname_ext(mapindex_id2name(p->last_point.map), (char*)WBUFP(buf,108));
|
||||
offset += MAP_NAME_LENGTH_EXT;
|
||||
#endif
|
||||
#if PACKETVER >= 20100803
|
||||
WBUFL(buf,124) = TOL(p->delete_date);
|
||||
offset += 4;
|
||||
#endif
|
||||
return 106+offset;
|
||||
}
|
||||
@ -1778,16 +1849,7 @@ int mmo_char_send006b(int fd, struct char_session_data* sd)
|
||||
offset += 3;
|
||||
#endif
|
||||
|
||||
found_num = 0;
|
||||
for(i = 0; i < char_num; i++) {
|
||||
if (char_dat[i].status.account_id == sd->account_id) {
|
||||
sd->found_char[found_num] = i;
|
||||
if( ++found_num == MAX_CHARS )
|
||||
break;
|
||||
}
|
||||
}
|
||||
for(i = found_num; i < MAX_CHARS; i++)
|
||||
sd->found_char[i] = -1;
|
||||
found_num = char_find_characters(sd);
|
||||
|
||||
j = 24 + offset; // offset
|
||||
WFIFOHEAD(fd,j + found_num*MAX_CHAR_BUF);
|
||||
@ -2064,7 +2126,7 @@ int parse_fromlogin(int fd)
|
||||
break;
|
||||
|
||||
case 0x2717: // account data
|
||||
if (RFIFOREST(fd) < 51)
|
||||
if (RFIFOREST(fd) < 62)
|
||||
return 0;
|
||||
|
||||
// find the authenticated session with this account id
|
||||
@ -2074,6 +2136,7 @@ int parse_fromlogin(int fd)
|
||||
memcpy(sd->email, RFIFOP(fd,6), 40);
|
||||
sd->expiration_time = (time_t)RFIFOL(fd,46);
|
||||
sd->gmlevel = RFIFOB(fd,50);
|
||||
safestrncpy(sd->birthdate, RFIFOP(fd,51), sizeof(sd->birthdate));
|
||||
|
||||
// continued from char_auth_ok...
|
||||
if( max_connect_user && count_users() >= max_connect_user && sd->gmlevel < gm_allow_level )
|
||||
@ -2089,7 +2152,7 @@ int parse_fromlogin(int fd)
|
||||
mmo_char_send006b(i, sd);
|
||||
}
|
||||
}
|
||||
RFIFOSKIP(fd,51);
|
||||
RFIFOSKIP(fd,62);
|
||||
break;
|
||||
|
||||
// login-server alive packet
|
||||
@ -3155,6 +3218,211 @@ int lan_subnetcheck(uint32 ip)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// @param result
|
||||
/// 0 (0x718): An unknown error has occurred.
|
||||
/// 1: none/success
|
||||
/// 3 (0x719): A database error occurred.
|
||||
/// 4 (0x71a): To delete a character you must withdraw from the guild.
|
||||
/// 5 (0x71b): To delete a character you must withdraw from the party.
|
||||
/// Any (0x718): An unknown error has occurred.
|
||||
void char_delete2_ack(int fd, int char_id, uint32 result, time_t delete_date)
|
||||
{// HC: <0828>.W <char id>.L <Msg:0-5>.L <deleteDate>.L
|
||||
WFIFOHEAD(fd,14);
|
||||
WFIFOW(fd,0) = 0x828;
|
||||
WFIFOL(fd,2) = char_id;
|
||||
WFIFOL(fd,6) = result;
|
||||
WFIFOL(fd,10) = TOL(delete_date);
|
||||
WFIFOSET(fd,14);
|
||||
}
|
||||
|
||||
|
||||
/// @param result
|
||||
/// 0 (0x718): An unknown error has occurred.
|
||||
/// 1: none/success
|
||||
/// 2 (0x71c): Due to system settings can not be deleted.
|
||||
/// 3 (0x719): A database error occurred.
|
||||
/// 4 (0x71d): Deleting not yet possible time.
|
||||
/// 5 (0x71e): Date of birth do not match.
|
||||
/// Any (0x718): An unknown error has occurred.
|
||||
void char_delete2_accept_ack(int fd, int char_id, uint32 result)
|
||||
{// HC: <082a>.W <char id>.L <Msg:0-5>.L
|
||||
WFIFOHEAD(fd,10);
|
||||
WFIFOW(fd,0) = 0x82a;
|
||||
WFIFOL(fd,2) = char_id;
|
||||
WFIFOL(fd,6) = result;
|
||||
WFIFOSET(fd,10);
|
||||
}
|
||||
|
||||
|
||||
/// @param result
|
||||
/// 1 (0x718): none/success, (if char id not in deletion process): An unknown error has occurred.
|
||||
/// 2 (0x719): A database error occurred.
|
||||
/// Any (0x718): An unknown error has occurred.
|
||||
void char_delete2_cancel_ack(int fd, int char_id, uint32 result)
|
||||
{// HC: <082c>.W <char id>.L <Msg:1-2>.L
|
||||
WFIFOHEAD(fd,10);
|
||||
WFIFOW(fd,0) = 0x82c;
|
||||
WFIFOL(fd,2) = char_id;
|
||||
WFIFOL(fd,6) = result;
|
||||
WFIFOSET(fd,10);
|
||||
}
|
||||
|
||||
|
||||
static void char_delete2_req(int fd, struct char_session_data* sd)
|
||||
{// CH: <0827>.W <char id>.L
|
||||
int char_id;
|
||||
struct mmo_charstatus* cs;
|
||||
|
||||
char_id = RFIFOL(fd,2);
|
||||
|
||||
if( ( cs = search_session_character(sd, char_id) ) == NULL )
|
||||
{// character not found
|
||||
char_delete2_ack(fd, char_id, 3, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if( cs->delete_date )
|
||||
{// character already queued for deletion
|
||||
char_delete2_ack(fd, char_id, 0, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
// Aegis imposes these checks probably to avoid dead member
|
||||
// entries in guilds/parties, otherwise they are not required.
|
||||
// TODO: Figure out how these are enforced during waiting.
|
||||
if( cs->guild_id )
|
||||
{// character in guild
|
||||
char_delete2_ack(fd, char_id, 4, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if( cs->party_id )
|
||||
{// character in party
|
||||
char_delete2_ack(fd, char_id, 5, 0);
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
// success
|
||||
cs->delete_date = time(NULL)+char_del_delay;
|
||||
|
||||
char_delete2_ack(fd, char_id, 1, cs->delete_date);
|
||||
}
|
||||
|
||||
|
||||
static void char_delete2_accept(int fd, struct char_session_data* sd)
|
||||
{// CH: <0829>.W <char id>.L <birth date:YYMMDD>.6B
|
||||
char birthdate[8+1];
|
||||
int char_id, i;
|
||||
struct mmo_charstatus* cs;
|
||||
|
||||
char_id = RFIFOL(fd,2);
|
||||
|
||||
ShowInfo(CL_RED"Request Char Deletion: "CL_GREEN"%d (%d)"CL_RESET"\n", sd->account_id, char_id);
|
||||
|
||||
// construct "YY-MM-DD"
|
||||
birthdate[0] = RFIFOB(fd,6);
|
||||
birthdate[1] = RFIFOB(fd,7);
|
||||
birthdate[2] = '-';
|
||||
birthdate[3] = RFIFOB(fd,8);
|
||||
birthdate[4] = RFIFOB(fd,9);
|
||||
birthdate[5] = '-';
|
||||
birthdate[6] = RFIFOB(fd,10);
|
||||
birthdate[7] = RFIFOB(fd,11);
|
||||
birthdate[8] = 0;
|
||||
|
||||
ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] != -1 && char_dat[sd->found_char[i]].status.char_id == char_id );
|
||||
if( i == MAX_CHARS )
|
||||
{// character not found
|
||||
char_delete2_accept_ack(fd, char_id, 3);
|
||||
return;
|
||||
}
|
||||
cs = &char_dat[sd->found_char[i]].status;
|
||||
|
||||
if( !cs->delete_date || cs->delete_date>time(NULL) )
|
||||
{// not queued or delay not yet passed
|
||||
char_delete2_accept_ack(fd, char_id, 4);
|
||||
return;
|
||||
}
|
||||
|
||||
if( strcmp(sd->birthdate+2, birthdate) ) // +2 to cut off the century
|
||||
{// birth date is wrong
|
||||
char_delete2_accept_ack(fd, char_id, 5);
|
||||
return;
|
||||
}
|
||||
|
||||
if( ( char_del_level > 0 && cs->base_level >= (unsigned int)char_del_level ) || ( char_del_level < 0 && cs->base_level <= (unsigned int)(-char_del_level) ) )
|
||||
{// character level config restriction
|
||||
char_delete2_accept_ack(fd, char_id, 2);
|
||||
return;
|
||||
}
|
||||
|
||||
// success
|
||||
char_delete(cs);
|
||||
|
||||
// drop character entry
|
||||
if( --char_num > 0 && sd->found_char[i] != char_num )
|
||||
{
|
||||
int s, c;
|
||||
|
||||
// move the last entry to the place of the deleted character
|
||||
memcpy(&char_dat[sd->found_char[i]], &char_dat[char_num], sizeof(struct mmo_charstatus));
|
||||
|
||||
// scan currently online accounts, if the moved character
|
||||
// entry requires an update of the cached character list
|
||||
for( s = 0; s < fd_max; s++ )
|
||||
{
|
||||
struct char_session_data* osd;
|
||||
|
||||
if( session[s] && ( osd = (struct char_session_data*)session[s]->session_data ) != NULL && osd->account_id == char_dat[char_num].status.account_id )
|
||||
{
|
||||
for( c = 0; c < MAX_CHARS; c++ )
|
||||
{
|
||||
if( osd->found_char[c] == char_num )
|
||||
{
|
||||
osd->found_char[c] = sd->found_char[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// wipe the last entry
|
||||
memset(&char_dat[char_num], 0, sizeof(struct mmo_charstatus));
|
||||
}
|
||||
|
||||
// refresh character list cache
|
||||
char_find_characters(sd);
|
||||
|
||||
char_delete2_accept_ack(fd, char_id, 1);
|
||||
}
|
||||
|
||||
|
||||
static void char_delete2_cancel(int fd, struct char_session_data* sd)
|
||||
{// CH: <082b>.W <char id>.L
|
||||
int char_id;
|
||||
struct mmo_charstatus* cs;
|
||||
|
||||
char_id = RFIFOL(fd,2);
|
||||
|
||||
if( ( cs = search_session_character(sd, char_id) ) == NULL )
|
||||
{// character not found
|
||||
char_delete2_cancel_ack(fd, char_id, 2);
|
||||
return;
|
||||
}
|
||||
|
||||
// there is no need to check, whether or not the character was
|
||||
// queued for deletion, as the client prints an error message by
|
||||
// itself, if it was not the case (@see char_delete2_cancel_ack)
|
||||
cs->delete_date = 0;
|
||||
|
||||
char_delete2_cancel_ack(fd, char_id, 1);
|
||||
}
|
||||
|
||||
|
||||
int parse_char(int fd)
|
||||
{
|
||||
int i, ch;
|
||||
@ -3600,6 +3868,27 @@ int parse_char(int fd)
|
||||
RFIFOSKIP(fd,32);
|
||||
break;
|
||||
|
||||
// deletion timer request
|
||||
case 0x827:
|
||||
FIFOSD_CHECK(6);
|
||||
char_delete2_req(fd, sd);
|
||||
RFIFOSKIP(fd,6);
|
||||
break;
|
||||
|
||||
// deletion accept request
|
||||
case 0x829:
|
||||
FIFOSD_CHECK(12);
|
||||
char_delete2_accept(fd, sd);
|
||||
RFIFOSKIP(fd,12);
|
||||
break;
|
||||
|
||||
// deletion cancel request
|
||||
case 0x82b:
|
||||
FIFOSD_CHECK(6);
|
||||
char_delete2_cancel(fd, sd);
|
||||
RFIFOSKIP(fd,6);
|
||||
break;
|
||||
|
||||
// login as map-server
|
||||
case 0x2af8:
|
||||
if (RFIFOREST(fd) < 60)
|
||||
@ -4056,6 +4345,8 @@ int char_config_read(const char *cfgName)
|
||||
char_per_account = atoi(w2);
|
||||
} else if (strcmpi(w1, "char_del_level") == 0) { //disable/enable char deletion by its level condition [Lupus]
|
||||
char_del_level = atoi(w2);
|
||||
} else if (strcmpi(w1, "char_del_delay") == 0) {
|
||||
char_del_delay = atoi(w2);
|
||||
// online files options
|
||||
} else if (strcmpi(w1, "online_txt_filename") == 0) {
|
||||
safestrncpy(online_txt_filename, w2, sizeof(online_txt_filename));
|
||||
|
@ -109,6 +109,7 @@ char char_name_letters[1024] = ""; // list of letters/symbols allowed (or not) i
|
||||
|
||||
int char_per_account = 0; //Maximum charas per account (default unlimited) [Sirius]
|
||||
int char_del_level = 0; //From which level u can delete character [Lupus]
|
||||
int char_del_delay = 86400;
|
||||
|
||||
int log_char = 1; // loggin char or not [devil]
|
||||
int log_inter = 1; // loggin inter or not [devil]
|
||||
@ -131,6 +132,7 @@ struct char_session_data {
|
||||
uint32 version;
|
||||
uint8 clienttype;
|
||||
char new_name[NAME_LENGTH];
|
||||
char birthdate[10+1]; // YYYY-MM-DD
|
||||
};
|
||||
|
||||
int max_connect_user = 0;
|
||||
@ -471,7 +473,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p)
|
||||
(p->party_id != cp->party_id) || (p->guild_id != cp->guild_id) ||
|
||||
(p->pet_id != cp->pet_id) || (p->weapon != cp->weapon) || (p->hom_id != cp->hom_id) ||
|
||||
(p->shield != cp->shield) || (p->head_top != cp->head_top) ||
|
||||
(p->head_mid != cp->head_mid) || (p->head_bottom != cp->head_bottom)
|
||||
(p->head_mid != cp->head_mid) || (p->head_bottom != cp->head_bottom) || (p->delete_date != cp->delete_date)
|
||||
)
|
||||
{ //Save status
|
||||
if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `base_level`='%d', `job_level`='%d',"
|
||||
@ -480,7 +482,8 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p)
|
||||
"`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d',"
|
||||
"`option`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d',`homun_id`='%d',"
|
||||
"`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d',"
|
||||
"`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d', `rename`='%d'"
|
||||
"`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d', `rename`='%d',"
|
||||
"`delete_date`='%lu'"
|
||||
" WHERE `account_id`='%d' AND `char_id` = '%d'",
|
||||
char_db, p->base_level, p->job_level,
|
||||
p->base_exp, p->job_exp, p->zeny,
|
||||
@ -490,6 +493,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p)
|
||||
p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom,
|
||||
mapindex_id2name(p->last_point.map), p->last_point.x, p->last_point.y,
|
||||
mapindex_id2name(p->save_point.map), p->save_point.x, p->save_point.y, p->rename,
|
||||
(unsigned long)p->delete_date, // FIXME: platform-dependent size
|
||||
p->account_id, p->char_id) )
|
||||
{
|
||||
Sql_ShowDebug(sql_handle);
|
||||
@ -839,7 +843,7 @@ int mmo_chars_fromsql(struct char_session_data* sd, uint8* buf)
|
||||
"`char_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`,"
|
||||
"`str`,`agi`,`vit`,`int`,`dex`,`luk`,`max_hp`,`hp`,`max_sp`,`sp`,"
|
||||
"`status_point`,`skill_point`,`option`,`karma`,`manner`,`hair`,`hair_color`,"
|
||||
"`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`rename`"
|
||||
"`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`rename`,`delete_date`"
|
||||
" FROM `%s` WHERE `account_id`='%d' AND `char_num` < '%d'", char_db, sd->account_id, MAX_CHARS)
|
||||
|| SQL_ERROR == SqlStmt_Execute(stmt)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 0, SQLDT_INT, &p.char_id, 0, NULL, NULL)
|
||||
@ -876,6 +880,7 @@ int mmo_chars_fromsql(struct char_session_data* sd, uint8* buf)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 31, SQLDT_SHORT, &p.head_bottom, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 32, SQLDT_STRING, &last_map, sizeof(last_map), NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 33, SQLDT_SHORT, &p.rename, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 34, SQLDT_UINT32, &p.delete_date, 0, NULL, NULL)
|
||||
)
|
||||
{
|
||||
SqlStmt_ShowDebug(stmt);
|
||||
@ -934,7 +939,7 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_everything
|
||||
"`str`,`agi`,`vit`,`int`,`dex`,`luk`,`max_hp`,`hp`,`max_sp`,`sp`,"
|
||||
"`status_point`,`skill_point`,`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`homun_id`,`hair`,"
|
||||
"`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`last_x`,`last_y`,"
|
||||
"`save_map`,`save_x`,`save_y`,`partner_id`,`father`,`mother`,`child`,`fame`,`rename`"
|
||||
"`save_map`,`save_x`,`save_y`,`partner_id`,`father`,`mother`,`child`,`fame`,`rename`,`delete_date`"
|
||||
" FROM `%s` WHERE `char_id`=? LIMIT 1", char_db)
|
||||
|| SQL_ERROR == SqlStmt_BindParam(stmt, 0, SQLDT_INT, &char_id, 0)
|
||||
|| SQL_ERROR == SqlStmt_Execute(stmt)
|
||||
@ -987,6 +992,7 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_everything
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 46, SQLDT_INT, &p->child, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 47, SQLDT_INT, &p->fame, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 48, SQLDT_SHORT, &p->rename, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 49, SQLDT_UINT32, &p->delete_date, 0, NULL, NULL)
|
||||
)
|
||||
{
|
||||
SqlStmt_ShowDebug(stmt);
|
||||
@ -1407,6 +1413,7 @@ int delete_char_sql(int char_id)
|
||||
Sql_FreeResult(sql_handle);
|
||||
|
||||
//check for config char del condition [Lupus]
|
||||
// TODO: Move this out to packet processing (0x68/0x1fb).
|
||||
if( ( char_del_level > 0 && base_level >= char_del_level )
|
||||
|| ( char_del_level < 0 && base_level <= -char_del_level )
|
||||
) {
|
||||
@ -1542,7 +1549,7 @@ int count_users(void)
|
||||
// Writes char data to the buffer in the format used by the client.
|
||||
// Used in packets 0x6b (chars info) and 0x6d (new char info)
|
||||
// Returns the size
|
||||
#define MAX_CHAR_BUF 110 //Max size (for WFIFOHEAD calls)
|
||||
#define MAX_CHAR_BUF 132 //Max size (for WFIFOHEAD calls)
|
||||
int mmo_char_tobuf(uint8* buffer, struct mmo_charstatus* p)
|
||||
{
|
||||
unsigned short offset = 0;
|
||||
@ -1601,6 +1608,10 @@ int mmo_char_tobuf(uint8* buffer, struct mmo_charstatus* p)
|
||||
#if (PACKETVER >= 20100720 && PACKETVER <= 20100727) || PACKETVER >= 20100803
|
||||
mapindex_getmapname_ext(mapindex_id2name(p->last_point.map), (char*)WBUFP(buf,108));
|
||||
offset += MAP_NAME_LENGTH_EXT;
|
||||
#endif
|
||||
#if PACKETVER >= 20100803
|
||||
WBUFL(buf,124) = TOL(p->delete_date);
|
||||
offset += 4;
|
||||
#endif
|
||||
return 106+offset;
|
||||
}
|
||||
@ -1849,7 +1860,7 @@ int parse_fromlogin(int fd)
|
||||
break;
|
||||
|
||||
case 0x2717: // account data
|
||||
if (RFIFOREST(fd) < 51)
|
||||
if (RFIFOREST(fd) < 62)
|
||||
return 0;
|
||||
|
||||
// find the authenticated session with this account id
|
||||
@ -1859,6 +1870,7 @@ int parse_fromlogin(int fd)
|
||||
memcpy(sd->email, RFIFOP(fd,6), 40);
|
||||
sd->expiration_time = (time_t)RFIFOL(fd,46);
|
||||
sd->gmlevel = RFIFOB(fd,50);
|
||||
safestrncpy(sd->birthdate, RFIFOP(fd,51), sizeof(sd->birthdate));
|
||||
|
||||
// continued from char_auth_ok...
|
||||
if( max_connect_user && count_users() >= max_connect_user && sd->gmlevel < gm_allow_level )
|
||||
@ -1874,7 +1886,7 @@ int parse_fromlogin(int fd)
|
||||
mmo_char_send006b(i, sd);
|
||||
}
|
||||
}
|
||||
RFIFOSKIP(fd,51);
|
||||
RFIFOSKIP(fd,62);
|
||||
break;
|
||||
|
||||
// login-server alive packet
|
||||
@ -2961,6 +2973,223 @@ int lan_subnetcheck(uint32 ip)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// @param result
|
||||
/// 0 (0x718): An unknown error has occurred.
|
||||
/// 1: none/success
|
||||
/// 3 (0x719): A database error occurred.
|
||||
/// 4 (0x71a): To delete a character you must withdraw from the guild.
|
||||
/// 5 (0x71b): To delete a character you must withdraw from the party.
|
||||
/// Any (0x718): An unknown error has occurred.
|
||||
void char_delete2_ack(int fd, int char_id, uint32 result, time_t delete_date)
|
||||
{// HC: <0828>.W <char id>.L <Msg:0-5>.L <deleteDate>.L
|
||||
WFIFOHEAD(fd,14);
|
||||
WFIFOW(fd,0) = 0x828;
|
||||
WFIFOL(fd,2) = char_id;
|
||||
WFIFOL(fd,6) = result;
|
||||
WFIFOL(fd,10) = TOL(delete_date);
|
||||
WFIFOSET(fd,14);
|
||||
}
|
||||
|
||||
|
||||
/// @param result
|
||||
/// 0 (0x718): An unknown error has occurred.
|
||||
/// 1: none/success
|
||||
/// 2 (0x71c): Due to system settings can not be deleted.
|
||||
/// 3 (0x719): A database error occurred.
|
||||
/// 4 (0x71d): Deleting not yet possible time.
|
||||
/// 5 (0x71e): Date of birth do not match.
|
||||
/// Any (0x718): An unknown error has occurred.
|
||||
void char_delete2_accept_ack(int fd, int char_id, uint32 result)
|
||||
{// HC: <082a>.W <char id>.L <Msg:0-5>.L
|
||||
WFIFOHEAD(fd,10);
|
||||
WFIFOW(fd,0) = 0x82a;
|
||||
WFIFOL(fd,2) = char_id;
|
||||
WFIFOL(fd,6) = result;
|
||||
WFIFOSET(fd,10);
|
||||
}
|
||||
|
||||
|
||||
/// @param result
|
||||
/// 1 (0x718): none/success, (if char id not in deletion process): An unknown error has occurred.
|
||||
/// 2 (0x719): A database error occurred.
|
||||
/// Any (0x718): An unknown error has occurred.
|
||||
void char_delete2_cancel_ack(int fd, int char_id, uint32 result)
|
||||
{// HC: <082c>.W <char id>.L <Msg:1-2>.L
|
||||
WFIFOHEAD(fd,10);
|
||||
WFIFOW(fd,0) = 0x82c;
|
||||
WFIFOL(fd,2) = char_id;
|
||||
WFIFOL(fd,6) = result;
|
||||
WFIFOSET(fd,10);
|
||||
}
|
||||
|
||||
|
||||
static void char_delete2_req(int fd, struct char_session_data* sd)
|
||||
{// CH: <0827>.W <char id>.L
|
||||
int char_id, i, guild_id, party_id;
|
||||
char* data;
|
||||
time_t delete_date;
|
||||
|
||||
char_id = RFIFOL(fd,2);
|
||||
|
||||
ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] == char_id );
|
||||
if( i == MAX_CHARS )
|
||||
{// character not found
|
||||
char_delete2_ack(fd, char_id, 3, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if( SQL_SUCCESS != Sql_Query(sql_handle, "SELECT `guild_id`,`party_id`,`delete_date` FROM `%s` WHERE `char_id`='%d'", char_db, char_id) || SQL_SUCCESS != Sql_NextRow(sql_handle) )
|
||||
{
|
||||
Sql_ShowDebug(sql_handle);
|
||||
char_delete2_ack(fd, char_id, 3, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
Sql_GetData(sql_handle, 0, &data, NULL); guild_id = atoi(data);
|
||||
Sql_GetData(sql_handle, 1, &data, NULL); party_id = atoi(data);
|
||||
Sql_GetData(sql_handle, 2, &data, NULL); delete_date = strtoul(data, NULL, 10);
|
||||
|
||||
if( delete_date )
|
||||
{// character already queued for deletion
|
||||
char_delete2_ack(fd, char_id, 0, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
// Aegis imposes these checks probably to avoid dead member
|
||||
// entries in guilds/parties, otherwise they are not required.
|
||||
// TODO: Figure out how these are enforced during waiting.
|
||||
if( guild_id )
|
||||
{// character in guild
|
||||
char_delete2_ack(fd, char_id, 4, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if( party_id )
|
||||
{// character in party
|
||||
char_delete2_ack(fd, char_id, 5, 0);
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
// success
|
||||
delete_date = time(NULL)+char_del_delay;
|
||||
|
||||
if( SQL_SUCCESS != Sql_Query(sql_handle, "UPDATE `%s` SET `delete_date`='%lu' WHERE `char_id`='%d'", char_db, (unsigned long)delete_date, char_id) )
|
||||
{
|
||||
Sql_ShowDebug(sql_handle);
|
||||
char_delete2_ack(fd, char_id, 3, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
char_delete2_ack(fd, char_id, 1, delete_date);
|
||||
}
|
||||
|
||||
|
||||
static void char_delete2_accept(int fd, struct char_session_data* sd)
|
||||
{// CH: <0829>.W <char id>.L <birth date:YYMMDD>.6B
|
||||
char birthdate[8+1];
|
||||
int char_id, i, k;
|
||||
unsigned int base_level;
|
||||
char* data;
|
||||
time_t delete_date;
|
||||
|
||||
char_id = RFIFOL(fd,2);
|
||||
|
||||
ShowInfo(CL_RED"Request Char Deletion: "CL_GREEN"%d (%d)"CL_RESET"\n", sd->account_id, char_id);
|
||||
|
||||
// construct "YY-MM-DD"
|
||||
birthdate[0] = RFIFOB(fd,6);
|
||||
birthdate[1] = RFIFOB(fd,7);
|
||||
birthdate[2] = '-';
|
||||
birthdate[3] = RFIFOB(fd,8);
|
||||
birthdate[4] = RFIFOB(fd,9);
|
||||
birthdate[5] = '-';
|
||||
birthdate[6] = RFIFOB(fd,10);
|
||||
birthdate[7] = RFIFOB(fd,11);
|
||||
birthdate[8] = 0;
|
||||
|
||||
ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] == char_id );
|
||||
if( i == MAX_CHARS )
|
||||
{// character not found
|
||||
char_delete2_accept_ack(fd, char_id, 3);
|
||||
return;
|
||||
}
|
||||
|
||||
if( SQL_SUCCESS != Sql_Query(sql_handle, "SELECT `base_level`,`delete_date` FROM `%s` WHERE `char_id`='%d'", char_db, char_id) || SQL_SUCCESS != Sql_NextRow(sql_handle) )
|
||||
{// data error
|
||||
Sql_ShowDebug(sql_handle);
|
||||
char_delete2_accept_ack(fd, char_id, 3);
|
||||
return;
|
||||
}
|
||||
|
||||
Sql_GetData(sql_handle, 0, &data, NULL); base_level = (unsigned int)strtoul(data, NULL, 10);
|
||||
Sql_GetData(sql_handle, 1, &data, NULL); delete_date = strtoul(data, NULL, 10);
|
||||
|
||||
if( !delete_date || delete_date>time(NULL) )
|
||||
{// not queued or delay not yet passed
|
||||
char_delete2_accept_ack(fd, char_id, 4);
|
||||
return;
|
||||
}
|
||||
|
||||
if( strcmp(sd->birthdate+2, birthdate) ) // +2 to cut off the century
|
||||
{// birth date is wrong
|
||||
char_delete2_accept_ack(fd, char_id, 5);
|
||||
return;
|
||||
}
|
||||
|
||||
if( ( char_del_level > 0 && base_level >= (unsigned int)char_del_level ) || ( char_del_level < 0 && base_level <= (unsigned int)(-char_del_level) ) )
|
||||
{// character level config restriction
|
||||
char_delete2_accept_ack(fd, char_id, 2);
|
||||
return;
|
||||
}
|
||||
|
||||
// success
|
||||
if( delete_char_sql(char_id) < 0 )
|
||||
{
|
||||
char_delete2_accept_ack(fd, char_id, 3);
|
||||
return;
|
||||
}
|
||||
|
||||
// refresh character list cache
|
||||
for(k = i; k < MAX_CHARS-1; k++)
|
||||
{
|
||||
sd->found_char[k] = sd->found_char[k+1];
|
||||
}
|
||||
sd->found_char[MAX_CHARS-1] = -1;
|
||||
|
||||
char_delete2_accept_ack(fd, char_id, 1);
|
||||
}
|
||||
|
||||
|
||||
static void char_delete2_cancel(int fd, struct char_session_data* sd)
|
||||
{// CH: <082b>.W <char id>.L
|
||||
int char_id, i;
|
||||
|
||||
char_id = RFIFOL(fd,2);
|
||||
|
||||
ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] == char_id );
|
||||
if( i == MAX_CHARS )
|
||||
{// character not found
|
||||
char_delete2_cancel_ack(fd, char_id, 2);
|
||||
return;
|
||||
}
|
||||
|
||||
// there is no need to check, whether or not the character was
|
||||
// queued for deletion, as the client prints an error message by
|
||||
// itself, if it was not the case (@see char_delete2_cancel_ack)
|
||||
if( SQL_SUCCESS != Sql_Query(sql_handle, "UPDATE `%s` SET `delete_date`='0' WHERE `char_id`='%d'", char_db, char_id) )
|
||||
{
|
||||
Sql_ShowDebug(sql_handle);
|
||||
char_delete2_cancel_ack(fd, char_id, 2);
|
||||
return;
|
||||
}
|
||||
|
||||
char_delete2_cancel_ack(fd, char_id, 1);
|
||||
}
|
||||
|
||||
|
||||
int parse_char(int fd)
|
||||
{
|
||||
int i, ch;
|
||||
@ -3393,6 +3622,27 @@ int parse_char(int fd)
|
||||
RFIFOSKIP(fd,32);
|
||||
break;
|
||||
|
||||
// deletion timer request
|
||||
case 0x827:
|
||||
FIFOSD_CHECK(6);
|
||||
char_delete2_req(fd, sd);
|
||||
RFIFOSKIP(fd,6);
|
||||
break;
|
||||
|
||||
// deletion accept request
|
||||
case 0x829:
|
||||
FIFOSD_CHECK(12);
|
||||
char_delete2_accept(fd, sd);
|
||||
RFIFOSKIP(fd,12);
|
||||
break;
|
||||
|
||||
// deletion cancel request
|
||||
case 0x82b:
|
||||
FIFOSD_CHECK(6);
|
||||
char_delete2_cancel(fd, sd);
|
||||
RFIFOSKIP(fd,6);
|
||||
break;
|
||||
|
||||
// login as map-server
|
||||
case 0x2af8:
|
||||
if (RFIFOREST(fd) < 60)
|
||||
@ -3910,6 +4160,8 @@ int char_config_read(const char* cfgName)
|
||||
char_per_account = atoi(w2);
|
||||
} else if (strcmpi(w1, "char_del_level") == 0) { //disable/enable char deletion by its level condition [Lupus]
|
||||
char_del_level = atoi(w2);
|
||||
} else if (strcmpi(w1, "char_del_delay") == 0) {
|
||||
char_del_delay = atoi(w2);
|
||||
} else if(strcmpi(w1,"db_path")==0) {
|
||||
safestrncpy(db_path, w2, sizeof(db_path));
|
||||
} else if (strcmpi(w1, "console") == 0) {
|
||||
|
@ -38,6 +38,7 @@
|
||||
// 20100629 - 2010-06-29aRagexeRE+ - 0x2d0, 0xaa, 0x2d1, 0x2d2
|
||||
// 20100721 - 2010-07-21aRagexeRE+ - 0x6b, 0x6d
|
||||
// 20100727 - 2010-07-27aRagexeRE+ - 0x6b, 0x6d
|
||||
// 20100803 - 2010-08-03aRagexeRE+ - 0x6b, 0x6d, 0x827, 0x828, 0x829, 0x82a, 0x82b, 0x82c, 0x842, 0x843
|
||||
|
||||
#ifndef PACKETVER
|
||||
#define PACKETVER 20081126
|
||||
@ -53,8 +54,6 @@
|
||||
#define PACKETVER 20071106
|
||||
#endif
|
||||
|
||||
#define FIFOSIZE_SERVERLINK 256*1024
|
||||
|
||||
//Remove/Comment this line to disable sc_data saving. [Skotlex]
|
||||
#define ENABLE_SC_SAVING
|
||||
//Remove/Comment this line to disable server-side hot-key saving support [Skotlex]
|
||||
@ -85,7 +84,7 @@
|
||||
#define MAX_ZENY 1000000000
|
||||
#define MAX_FAME 1000000000
|
||||
#define MAX_CART 100
|
||||
#define MAX_SKILL 1020
|
||||
#define MAX_SKILL 2536
|
||||
#define GLOBAL_REG_NUM 256
|
||||
#define ACCOUNT_REG_NUM 64
|
||||
#define ACCOUNT_REG2_NUM 16
|
||||
@ -95,7 +94,7 @@
|
||||
#define MIN_WALK_SPEED 0
|
||||
#define MAX_WALK_SPEED 1000
|
||||
#define MAX_STORAGE 600
|
||||
#define MAX_GUILD_STORAGE 1000
|
||||
#define MAX_GUILD_STORAGE 600
|
||||
#define MAX_PARTY 12
|
||||
#define MAX_GUILD 16+10*6 // increased max guild members +6 per 1 extension levels [Lupus]
|
||||
#define MAX_GUILDPOSITION 20 // increased max guild positions to accomodate for all members [Valaris] (removed) [PoW]
|
||||
@ -350,6 +349,8 @@ struct mmo_charstatus {
|
||||
#endif
|
||||
bool show_equip;
|
||||
short rename;
|
||||
|
||||
time_t delete_date;
|
||||
};
|
||||
|
||||
typedef enum mail_status {
|
||||
|
@ -543,18 +543,16 @@ static int create_session(int fd, RecvFunc func_recv, SendFunc func_send, ParseF
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int delete_session(int fd)
|
||||
static void delete_session(int fd)
|
||||
{
|
||||
if (fd <= 0 || fd >= FD_SETSIZE)
|
||||
return -1;
|
||||
if (session[fd]) {
|
||||
if( session_isValid(fd) )
|
||||
{
|
||||
aFree(session[fd]->rdata);
|
||||
aFree(session[fd]->wdata);
|
||||
aFree(session[fd]->session_data);
|
||||
aFree(session[fd]);
|
||||
session[fd] = NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int realloc_fifo(int fd, unsigned int rfifo_size, unsigned int wfifo_size)
|
||||
@ -584,7 +582,7 @@ int realloc_writefifo(int fd, size_t addition)
|
||||
if( session[fd]->wdata_size + addition > session[fd]->max_wdata )
|
||||
{ // grow rule; grow in multiples of WFIFO_SIZE
|
||||
newsize = WFIFO_SIZE;
|
||||
while( session[fd]->wdata_size + addition > newsize ) newsize += newsize;
|
||||
while( session[fd]->wdata_size + addition > newsize ) newsize += WFIFO_SIZE;
|
||||
}
|
||||
else
|
||||
if( session[fd]->max_wdata >= (size_t)2*(session[fd]->flag.server?FIFOSIZE_SERVERLINK:WFIFO_SIZE)
|
||||
@ -667,9 +665,9 @@ int WFIFOSET(int fd, size_t len)
|
||||
|
||||
// always keep a WFIFO_SIZE reserve in the buffer
|
||||
// For inter-server connections, let the reserve be 1/4th of the link size.
|
||||
newreserve = s->wdata_size + ( s->flag.server ? FIFOSIZE_SERVERLINK / 4 : WFIFO_SIZE);
|
||||
newreserve = s->flag.server ? FIFOSIZE_SERVERLINK / 4 : WFIFO_SIZE;
|
||||
|
||||
// readjust the buffer to the newly chosen size
|
||||
// readjust the buffer to include the chosen reserve
|
||||
realloc_writefifo(fd, newreserve);
|
||||
|
||||
#ifdef SEND_SHORTLIST
|
||||
@ -1333,10 +1331,12 @@ void send_shortlist_add_fd(int fd)
|
||||
int i;
|
||||
int bit;
|
||||
|
||||
if( fd < 0 || fd >= FD_SETSIZE )
|
||||
if( !session_isValid(fd) )
|
||||
return;// out of range
|
||||
|
||||
i = fd/32;
|
||||
bit = fd%32;
|
||||
|
||||
if( (send_shortlist_set[i]>>bit)&1 )
|
||||
return;// already in the list
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
#define WIN32_LEAN_AND_MEAN // otherwise winsock2.h includes full windows.h
|
||||
#include <winsock2.h>
|
||||
typedef long in_addr_t;
|
||||
#else
|
||||
@ -19,6 +20,7 @@
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#define FIFOSIZE_SERVERLINK 256*1024
|
||||
|
||||
// socket I/O macros
|
||||
#define RFIFOHEAD(fd)
|
||||
|
@ -8,7 +8,6 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
@ -241,7 +240,7 @@ char* _strtok_r(char *s1, const char *s2, char **lasts)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !(defined(WIN32) && defined(_MSC_VER) && _MSC_VER >= 1400) && !defined(CYGWIN)
|
||||
#if !(defined(WIN32) && defined(_MSC_VER) && _MSC_VER >= 1400) && !defined(HAVE_STRNLEN)
|
||||
/* Find the length of STRING, but scan at most MAXLEN characters.
|
||||
If no '\0' terminator is found in that many characters, return MAXLEN. */
|
||||
size_t strnlen (const char* string, size_t maxlen)
|
||||
|
@ -9,6 +9,10 @@
|
||||
#endif
|
||||
#include <stdarg.h>
|
||||
|
||||
#define __USE_GNU // required to enable strnlen on some platforms
|
||||
#include <string.h>
|
||||
#undef __USE_GNU
|
||||
|
||||
char* jstrescape (char* pt);
|
||||
char* jstrescapecpy (char* pt, const char* spt);
|
||||
int jmemescapecpy (char* pt, const char* spt, int size);
|
||||
@ -24,7 +28,7 @@ const char *stristr(const char *haystack, const char *needle);
|
||||
char* _strtok_r(char* s1, const char* s2, char** lasts);
|
||||
#endif
|
||||
|
||||
#if !(defined(WIN32) && defined(_MSC_VER) && _MSC_VER >= 1400) && !defined(CYGWIN)
|
||||
#if !(defined(WIN32) && defined(_MSC_VER) && _MSC_VER >= 1400) && !defined(HAVE_STRNLEN)
|
||||
size_t strnlen (const char* string, size_t maxlen);
|
||||
#endif
|
||||
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include "../common/mmo.h"
|
||||
#include "../common/malloc.h"
|
||||
#include "../common/showmsg.h"
|
||||
#include "socket.h"
|
||||
#include "utils.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@ -25,39 +26,64 @@
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
// generate a hex dump of the first 'length' bytes of 'buffer'
|
||||
void dump(FILE* fp, const unsigned char* buffer, int length)
|
||||
|
||||
/// Dumps given buffer into file pointed to by a handle.
|
||||
void WriteDump(FILE* fp, const void* buffer, size_t length)
|
||||
{
|
||||
int i, j;
|
||||
size_t i;
|
||||
char hex[48+1], ascii[16+1];
|
||||
|
||||
fprintf(fp, " Hex ASCII\n");
|
||||
fprintf(fp, " ----------------------------------------------- ----------------");
|
||||
fprintf(fp, "--- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F 0123456789ABCDEF\n");
|
||||
ascii[16] = 0;
|
||||
|
||||
for (i = 0; i < length; i += 16)
|
||||
for( i = 0; i < length; i++ )
|
||||
{
|
||||
fprintf(fp, "\n%p ", &buffer[i]);
|
||||
for (j = i; j < i + 16; ++j)
|
||||
{
|
||||
if (j < length)
|
||||
fprintf(fp, "%02hX ", buffer[j]);
|
||||
else
|
||||
fprintf(fp, " ");
|
||||
}
|
||||
char c = RBUFB(buffer,i);
|
||||
|
||||
fprintf(fp, " | ");
|
||||
ascii[i%16] = ISCNTRL(c) ? '.' : c;
|
||||
sprintf(hex+(i%16)*3, "%02X ", RBUFB(buffer,i));
|
||||
|
||||
for (j = i; j < i + 16; ++j)
|
||||
if( (i%16) == 15 )
|
||||
{
|
||||
if (j < length) {
|
||||
if (buffer[j] > 31 && buffer[j] < 127)
|
||||
fprintf(fp, "%c", buffer[j]);
|
||||
else
|
||||
fprintf(fp, ".");
|
||||
} else
|
||||
fprintf(fp, " ");
|
||||
fprintf(fp, "%03X %s %s\n", i/16, hex, ascii);
|
||||
}
|
||||
}
|
||||
fprintf(fp, "\n");
|
||||
|
||||
if( (i%16) != 0 )
|
||||
{
|
||||
ascii[i%16] = 0;
|
||||
fprintf(fp, "%03X %-48s %-16s\n", i/16, hex, ascii);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// Dumps given buffer on the console.
|
||||
void ShowDump(const void* buffer, size_t length)
|
||||
{
|
||||
size_t i;
|
||||
char hex[48+1], ascii[16+1];
|
||||
|
||||
ShowDebug("--- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F 0123456789ABCDEF\n");
|
||||
ascii[16] = 0;
|
||||
|
||||
for( i = 0; i < length; i++ )
|
||||
{
|
||||
char c = RBUFB(buffer,i);
|
||||
|
||||
ascii[i%16] = ISCNTRL(c) ? '.' : c;
|
||||
sprintf(hex+(i%16)*3, "%02X ", RBUFB(buffer,i));
|
||||
|
||||
if( (i%16) == 15 )
|
||||
{
|
||||
ShowDebug("%03X %s %s\n", i/16, hex, ascii);
|
||||
}
|
||||
}
|
||||
|
||||
if( (i%16) != 0 )
|
||||
{
|
||||
ascii[i%16] = 0;
|
||||
ShowDebug("%03X %-48s %-16s\n", i/16, hex, ascii);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -183,6 +209,8 @@ void findfile(const char *p, const char *pat, void (func)(const char*))
|
||||
findfile(tmppath, pat, func);
|
||||
}
|
||||
}//end while
|
||||
|
||||
closedir(dir);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -11,7 +11,8 @@
|
||||
#include <stdio.h> // FILE*
|
||||
|
||||
// generate a hex dump of the first 'length' bytes of 'buffer'
|
||||
void dump(FILE* fp, const unsigned char* buffer, int length);
|
||||
void WriteDump(FILE* fp, const void* buffer, size_t length);
|
||||
void ShowDump(const void* buffer, size_t length);
|
||||
|
||||
void findfile(const char *p, const char *pat, void (func)(const char*));
|
||||
bool exists(const char* filename);
|
||||
|
@ -12,7 +12,7 @@
|
||||
#include <string.h>
|
||||
|
||||
/// global defines
|
||||
#define ACCOUNT_SQL_DB_VERSION 20080417
|
||||
#define ACCOUNT_SQL_DB_VERSION 20110114
|
||||
|
||||
/// internal structure
|
||||
typedef struct AccountDB_SQL
|
||||
|
@ -517,6 +517,7 @@ int parse_fromchar(int fd)
|
||||
time_t expiration_time = 0;
|
||||
char email[40] = "";
|
||||
int gmlevel = 0;
|
||||
char birthdate[10+1] = "";
|
||||
|
||||
int account_id = RFIFOL(fd,2);
|
||||
RFIFOSKIP(fd,6);
|
||||
@ -528,15 +529,17 @@ int parse_fromchar(int fd)
|
||||
safestrncpy(email, acc.email, sizeof(email));
|
||||
expiration_time = acc.expiration_time;
|
||||
gmlevel = acc.level;
|
||||
safestrncpy(birthdate, acc.birthdate, sizeof(birthdate));
|
||||
}
|
||||
|
||||
WFIFOHEAD(fd,51);
|
||||
WFIFOHEAD(fd,62);
|
||||
WFIFOW(fd,0) = 0x2717;
|
||||
WFIFOL(fd,2) = account_id;
|
||||
safestrncpy((char*)WFIFOP(fd,6), email, 40);
|
||||
WFIFOL(fd,46) = (uint32)expiration_time;
|
||||
WFIFOB(fd,50) = gmlevel;
|
||||
WFIFOSET(fd,51);
|
||||
safestrncpy((char*)WFIFOP(fd,51), birthdate, 10+1);
|
||||
WFIFOSET(fd,62);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -17,7 +17,8 @@ MAP_OBJ = map.o chrif.o clif.o pc.o status.o npc.o \
|
||||
npc_chat.o chat.o path.o itemdb.o mob.o script.o \
|
||||
storage.o skill.o atcommand.o battle.o battleground.o \
|
||||
intif.o trade.o party.o vending.o guild.o pet.o \
|
||||
log.o mail.o date.o unit.o homunculus.o mercenary.o quest.o instance.o
|
||||
log.o mail.o date.o unit.o homunculus.o mercenary.o quest.o instance.o \
|
||||
buyingstore.o searchstore.o
|
||||
MAP_TXT_OBJ = $(MAP_OBJ:%=obj_txt/%) \
|
||||
obj_txt/mapreg_txt.o
|
||||
MAP_SQL_OBJ = $(MAP_OBJ:%=obj_sql/%) \
|
||||
@ -26,7 +27,8 @@ MAP_H = map.h chrif.h clif.h pc.h status.h npc.h \
|
||||
chat.h itemdb.h mob.h script.h path.h \
|
||||
storage.h skill.h atcommand.h battle.h battleground.h \
|
||||
intif.h trade.h party.h vending.h guild.h pet.h \
|
||||
log.h mail.h date.h unit.h homunculus.h mercenary.h quest.h instance.h mapreg.h
|
||||
log.h mail.h date.h unit.h homunculus.h mercenary.h quest.h instance.h mapreg.h \
|
||||
buyingstore.h searchstore.h
|
||||
|
||||
HAVE_MYSQL=@HAVE_MYSQL@
|
||||
ifeq ($(HAVE_MYSQL),yes)
|
||||
|
@ -1150,7 +1150,7 @@ ACMD_FUNC(storage)
|
||||
{
|
||||
nullpo_retr(-1, sd);
|
||||
|
||||
if (sd->npc_id || sd->vender_id || sd->state.trading || sd->state.storage_flag)
|
||||
if (sd->npc_id || sd->vender_id || sd->state.buyingstore || sd->state.trading || sd->state.storage_flag)
|
||||
return -1;
|
||||
|
||||
if (storage_storageopen(sd) == 1)
|
||||
@ -1177,7 +1177,7 @@ ACMD_FUNC(guildstorage)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (sd->npc_id || sd->vender_id || sd->state.trading)
|
||||
if (sd->npc_id || sd->vender_id || sd->state.buyingstore || sd->state.trading)
|
||||
return -1;
|
||||
|
||||
if (sd->state.storage_flag == 1) {
|
||||
@ -1673,8 +1673,8 @@ ACMD_FUNC(item2)
|
||||
}
|
||||
if (item_data->type == IT_PETARMOR)
|
||||
refine = 0;
|
||||
if (refine > 10)
|
||||
refine = 10;
|
||||
if (refine > MAX_REFINE)
|
||||
refine = MAX_REFINE;
|
||||
} else {
|
||||
identify = 1;
|
||||
refine = attr = 0;
|
||||
@ -1956,7 +1956,7 @@ ACMD_FUNC(pvpoff)
|
||||
map[sd->bl.m].flag.pvp = 0;
|
||||
|
||||
if (!battle_config.pk_mode)
|
||||
clif_send0199(sd->bl.m, 0);
|
||||
clif_map_property_mapall(sd->bl.m, MAPPROPERTY_NOTHING);
|
||||
map_foreachinmap(atcommand_pvpoff_sub,sd->bl.m, BL_PC);
|
||||
map_foreachinmap(atcommand_stopattack,sd->bl.m, BL_CHAR, 0);
|
||||
clif_displaymessage(fd, msg_txt(31)); // PvP: Off.
|
||||
@ -1993,7 +1993,7 @@ ACMD_FUNC(pvpon)
|
||||
|
||||
if (!battle_config.pk_mode)
|
||||
{// display pvp circle and rank
|
||||
clif_send0199(sd->bl.m, 1);
|
||||
clif_map_property_mapall(sd->bl.m, MAPPROPERTY_FREEPVPZONE);
|
||||
map_foreachinmap(atcommand_pvpon_sub,sd->bl.m, BL_PC);
|
||||
}
|
||||
|
||||
@ -2015,7 +2015,7 @@ ACMD_FUNC(gvgoff)
|
||||
}
|
||||
|
||||
map[sd->bl.m].flag.gvg = 0;
|
||||
clif_send0199(sd->bl.m, 0);
|
||||
clif_map_property_mapall(sd->bl.m, MAPPROPERTY_NOTHING);
|
||||
map_foreachinmap(atcommand_stopattack,sd->bl.m, BL_CHAR, 0);
|
||||
clif_displaymessage(fd, msg_txt(33)); // GvG: Off.
|
||||
|
||||
@ -2035,7 +2035,7 @@ ACMD_FUNC(gvgon)
|
||||
}
|
||||
|
||||
map[sd->bl.m].flag.gvg = 1;
|
||||
clif_send0199(sd->bl.m, 3);
|
||||
clif_map_property_mapall(sd->bl.m, MAPPROPERTY_AGITZONE);
|
||||
clif_displaymessage(fd, msg_txt(34)); // GvG: On.
|
||||
|
||||
return 0;
|
||||
@ -3009,7 +3009,7 @@ ACMD_FUNC(param)
|
||||
status[4] = &sd->status.dex;
|
||||
status[5] = &sd->status.luk;
|
||||
|
||||
if(value < 0 && *status[i] < -value)
|
||||
if(value < 0 && *status[i] <= -value)
|
||||
{
|
||||
new_value = 1;
|
||||
}
|
||||
@ -5945,8 +5945,8 @@ ACMD_FUNC(autotrade)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if( !sd->vender_id ) { //check if player is vending
|
||||
clif_displaymessage(fd, msg_txt(549)); // You should be vending to use @Autotrade.
|
||||
if( !sd->vender_id && !sd->state.buyingstore ) { //check if player is vending or buying
|
||||
clif_displaymessage(fd, msg_txt(549)); // "You should have a shop open to use @autotrade."
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -4006,6 +4006,12 @@ static const struct _battle_data {
|
||||
{ "autospell_check_range", &battle_config.autospell_check_range, 0, 0, 1, },
|
||||
{ "client_reshuffle_dice", &battle_config.client_reshuffle_dice, 0, 0, 1, },
|
||||
{ "client_sort_storage", &battle_config.client_sort_storage, 0, 0, 1, },
|
||||
{ "gm_check_minlevel", &battle_config.gm_check_minlevel, 60, 0, 100, },
|
||||
{ "feature.buying_store", &battle_config.feature_buying_store, 1, 0, 1, },
|
||||
{ "feature.search_stores", &battle_config.feature_search_stores, 1, 0, 1, },
|
||||
{ "searchstore_querydelay", &battle_config.searchstore_querydelay, 10, 0, INT_MAX, },
|
||||
{ "searchstore_maxresults", &battle_config.searchstore_maxresults, 30, 1, INT_MAX, },
|
||||
{ "display_party_name", &battle_config.display_party_name, 0, 0, 1, },
|
||||
// BattleGround Settings
|
||||
{ "bg_update_interval", &battle_config.bg_update_interval, 1000, 100, INT_MAX, },
|
||||
{ "bg_short_attack_damage_rate", &battle_config.bg_short_damage_rate, 80, 0, INT_MAX, },
|
||||
|
@ -480,6 +480,12 @@ extern struct Battle_Config
|
||||
int autospell_check_range; //Enable range check for autospell bonus. [L0ne_W0lf]
|
||||
int client_reshuffle_dice; // Reshuffle /dice
|
||||
int client_sort_storage;
|
||||
int gm_check_minlevel; // min GM level for /check
|
||||
int feature_buying_store;
|
||||
int feature_search_stores;
|
||||
int searchstore_querydelay;
|
||||
int searchstore_maxresults;
|
||||
int display_party_name;
|
||||
|
||||
// [BattleGround Settings]
|
||||
int bg_update_interval;
|
||||
|
470
src/map/buyingstore.c
Normal file
@ -0,0 +1,470 @@
|
||||
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
|
||||
// For more information, see LICENCE in the main folder
|
||||
|
||||
#include "../common/cbasetypes.h"
|
||||
#include "../common/db.h" // ARR_FIND
|
||||
#include "../common/showmsg.h" // ShowWarning
|
||||
#include "../common/socket.h" // RBUF*
|
||||
#include "../common/strlib.h" // safestrncpy
|
||||
#include "atcommand.h" // msg_txt
|
||||
#include "battle.h" // battle_config.*
|
||||
#include "buyingstore.h" // struct s_buyingstore
|
||||
#include "clif.h" // clif_buyingstore_*
|
||||
#include "log.h" // log_pick_pc, log_zeny
|
||||
#include "pc.h" // struct map_session_data
|
||||
|
||||
|
||||
/// constants (client-side restrictions)
|
||||
#define BUYINGSTORE_MAX_PRICE 99990000
|
||||
#define BUYINGSTORE_MAX_AMOUNT 9999
|
||||
|
||||
|
||||
/// failure constants for clif functions
|
||||
enum e_buyingstore_failure
|
||||
{
|
||||
BUYINGSTORE_CREATE = 1, // "Failed to open buying store."
|
||||
BUYINGSTORE_CREATE_OVERWEIGHT = 2, // "Total amount of then possessed items exceeds the weight limit by %d. Please re-enter."
|
||||
BUYINGSTORE_TRADE_BUYER_ZENY = 3, // "All items within the buy limit were purchased."
|
||||
BUYINGSTORE_TRADE_BUYER_NO_ITEMS = 4, // "All items were purchased."
|
||||
BUYINGSTORE_TRADE_SELLER_FAILED = 5, // "The deal has failed."
|
||||
BUYINGSTORE_TRADE_SELLER_COUNT = 6, // "The trade failed, because the entered amount of item %s is higher, than the buyer is willing to buy."
|
||||
BUYINGSTORE_TRADE_SELLER_ZENY = 7, // "The trade failed, because the buyer is lacking required balance."
|
||||
BUYINGSTORE_CREATE_NO_INFO = 8, // "No sale (purchase) information available."
|
||||
};
|
||||
|
||||
|
||||
static unsigned int buyingstore_nextid = 0;
|
||||
static const short buyingstore_blankslots[MAX_SLOTS] = { 0 }; // used when checking whether or not an item's card slots are blank
|
||||
|
||||
|
||||
/// Returns unique buying store id
|
||||
static unsigned int buyingstore_getuid(void)
|
||||
{
|
||||
return buyingstore_nextid++;
|
||||
}
|
||||
|
||||
|
||||
bool buyingstore_setup(struct map_session_data* sd, unsigned char slots)
|
||||
{
|
||||
if( !battle_config.feature_buying_store || sd->vender_id || sd->state.buyingstore || sd->state.trading || slots == 0 )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if( sd->sc.data[SC_NOCHAT] && (sd->sc.data[SC_NOCHAT]->val1&MANNER_NOROOM) )
|
||||
{// custom: mute limitation
|
||||
return false;
|
||||
}
|
||||
|
||||
if( map[sd->bl.m].flag.novending || map_getcell(sd->bl.m, sd->bl.x, sd->bl.y, CELL_CHKNOVENDING) )
|
||||
{// custom: no vending maps/cells
|
||||
clif_displaymessage(sd->fd, msg_txt(276)); // "You can't open a shop on this map"
|
||||
return false;
|
||||
}
|
||||
|
||||
if( slots > MAX_BUYINGSTORE_SLOTS )
|
||||
{
|
||||
ShowWarning("buyingstore_setup: Requested %d slots, but server supports only %d slots.\n", (int)slots, MAX_BUYINGSTORE_SLOTS);
|
||||
slots = MAX_BUYINGSTORE_SLOTS;
|
||||
}
|
||||
|
||||
sd->buyingstore.slots = slots;
|
||||
clif_buyingstore_open(sd);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void buyingstore_create(struct map_session_data* sd, int zenylimit, unsigned char result, const char* storename, const uint8* itemlist, unsigned int count)
|
||||
{
|
||||
unsigned int i, weight, listidx;
|
||||
struct item_data* id;
|
||||
|
||||
if( !result || count == 0 )
|
||||
{// canceled, or no items
|
||||
return;
|
||||
}
|
||||
|
||||
if( !battle_config.feature_buying_store || pc_istrading(sd) || sd->buyingstore.slots == 0 || count > sd->buyingstore.slots || zenylimit <= 0 || zenylimit > sd->status.zeny || !storename[0] )
|
||||
{// disabled or invalid input
|
||||
sd->buyingstore.slots = 0;
|
||||
clif_buyingstore_open_failed(sd, BUYINGSTORE_CREATE, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if( !pc_can_give_items(pc_isGM(sd)) )
|
||||
{// custom: GM is not allowed to buy (give zeny)
|
||||
sd->buyingstore.slots = 0;
|
||||
clif_displaymessage(sd->fd, msg_txt(246));
|
||||
clif_buyingstore_open_failed(sd, BUYINGSTORE_CREATE, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if( sd->sc.data[SC_NOCHAT] && (sd->sc.data[SC_NOCHAT]->val1&MANNER_NOROOM) )
|
||||
{// custom: mute limitation
|
||||
return;
|
||||
}
|
||||
|
||||
if( map[sd->bl.m].flag.novending || map_getcell(sd->bl.m, sd->bl.x, sd->bl.y, CELL_CHKNOVENDING) )
|
||||
{// custom: no vending maps/cells
|
||||
clif_displaymessage(sd->fd, msg_txt(276)); // "You can't open a shop on this map"
|
||||
return;
|
||||
}
|
||||
|
||||
weight = sd->weight;
|
||||
|
||||
// check item list
|
||||
for( i = 0; i < count; i++ )
|
||||
{// itemlist: <name id>.W <amount>.W <price>.L
|
||||
unsigned short nameid, amount;
|
||||
int price, idx;
|
||||
|
||||
nameid = RBUFW(itemlist,i*8+0);
|
||||
amount = RBUFW(itemlist,i*8+2);
|
||||
price = RBUFL(itemlist,i*8+4);
|
||||
|
||||
if( ( id = itemdb_exists(nameid) ) == NULL || amount == 0 )
|
||||
{// invalid input
|
||||
break;
|
||||
}
|
||||
|
||||
if( price <= 0 || price > BUYINGSTORE_MAX_PRICE )
|
||||
{// invalid price: unlike vending, items cannot be bought at 0 Zeny
|
||||
break;
|
||||
}
|
||||
|
||||
if( !id->flag.buyingstore || !itemdb_cantrade_sub(id, pc_isGM(sd), pc_isGM(sd)) || ( idx = pc_search_inventory(sd, nameid) ) == -1 )
|
||||
{// restrictions: allowed, no character-bound items and at least one must be owned
|
||||
break;
|
||||
}
|
||||
|
||||
if( sd->status.inventory[idx].amount+amount > BUYINGSTORE_MAX_AMOUNT )
|
||||
{// too many items of same kind
|
||||
break;
|
||||
}
|
||||
|
||||
if( i )
|
||||
{// duplicate check. as the client does this too, only malicious intent should be caught here
|
||||
ARR_FIND( 0, i, listidx, sd->buyingstore.items[i].nameid == nameid );
|
||||
if( listidx != i )
|
||||
{// duplicate
|
||||
ShowWarning("buyingstore_create: Found duplicate item on buying list (nameid=%hu, amount=%hu, account_id=%d, char_id=%d).\n", nameid, amount, sd->status.account_id, sd->status.char_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
weight+= id->weight*amount;
|
||||
sd->buyingstore.items[i].nameid = nameid;
|
||||
sd->buyingstore.items[i].amount = amount;
|
||||
sd->buyingstore.items[i].price = price;
|
||||
}
|
||||
|
||||
if( i != count )
|
||||
{// invalid item/amount/price
|
||||
sd->buyingstore.slots = 0;
|
||||
clif_buyingstore_open_failed(sd, BUYINGSTORE_CREATE, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if( (sd->max_weight*90)/100 < weight )
|
||||
{// not able to carry all wanted items without getting overweight (90%)
|
||||
sd->buyingstore.slots = 0;
|
||||
clif_buyingstore_open_failed(sd, BUYINGSTORE_CREATE_OVERWEIGHT, weight);
|
||||
return;
|
||||
}
|
||||
|
||||
// success
|
||||
sd->state.buyingstore = true;
|
||||
sd->buyer_id = buyingstore_getuid();
|
||||
sd->buyingstore.zenylimit = zenylimit;
|
||||
sd->buyingstore.slots = i; // store actual amount of items
|
||||
safestrncpy(sd->message, storename, sizeof(sd->message));
|
||||
clif_buyingstore_myitemlist(sd);
|
||||
clif_buyingstore_entry(sd);
|
||||
}
|
||||
|
||||
|
||||
void buyingstore_close(struct map_session_data* sd)
|
||||
{
|
||||
if( sd->state.buyingstore )
|
||||
{
|
||||
// invalidate data
|
||||
sd->state.buyingstore = false;
|
||||
memset(&sd->buyingstore, 0, sizeof(sd->buyingstore));
|
||||
|
||||
// notify other players
|
||||
clif_buyingstore_disappear_entry(sd);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void buyingstore_open(struct map_session_data* sd, int account_id)
|
||||
{
|
||||
struct map_session_data* pl_sd;
|
||||
|
||||
if( !battle_config.feature_buying_store || pc_istrading(sd) )
|
||||
{// not allowed to sell
|
||||
return;
|
||||
}
|
||||
|
||||
if( !pc_can_give_items(pc_isGM(sd)) )
|
||||
{// custom: GM is not allowed to sell
|
||||
clif_displaymessage(sd->fd, msg_txt(246));
|
||||
return;
|
||||
}
|
||||
|
||||
if( ( pl_sd = map_id2sd(account_id) ) == NULL || !pl_sd->state.buyingstore )
|
||||
{// not online or not buying
|
||||
return;
|
||||
}
|
||||
|
||||
if( !searchstore_queryremote(sd, account_id) && ( sd->bl.m != pl_sd->bl.m || !check_distance_bl(&sd->bl, &pl_sd->bl, AREA_SIZE) ) )
|
||||
{// out of view range
|
||||
return;
|
||||
}
|
||||
|
||||
// success
|
||||
clif_buyingstore_itemlist(sd, pl_sd);
|
||||
}
|
||||
|
||||
|
||||
void buyingstore_trade(struct map_session_data* sd, int account_id, unsigned int buyer_id, const uint8* itemlist, unsigned int count)
|
||||
{
|
||||
int zeny = 0;
|
||||
unsigned int i, weight, listidx, k;
|
||||
struct map_session_data* pl_sd;
|
||||
|
||||
if( count == 0 )
|
||||
{// nothing to do
|
||||
return;
|
||||
}
|
||||
|
||||
if( !battle_config.feature_buying_store || pc_istrading(sd) )
|
||||
{// not allowed to sell
|
||||
clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if( !pc_can_give_items(pc_isGM(sd)) )
|
||||
{// custom: GM is not allowed to sell
|
||||
clif_displaymessage(sd->fd, msg_txt(246));
|
||||
clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if( ( pl_sd = map_id2sd(account_id) ) == NULL || !pl_sd->state.buyingstore || pl_sd->buyer_id != buyer_id )
|
||||
{// not online, not buying or not same store
|
||||
clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if( !searchstore_queryremote(sd, account_id) && ( sd->bl.m != pl_sd->bl.m || !check_distance_bl(&sd->bl, &pl_sd->bl, AREA_SIZE) ) )
|
||||
{// out of view range
|
||||
clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
searchstore_clearremote(sd);
|
||||
|
||||
if( pl_sd->status.zeny < pl_sd->buyingstore.zenylimit )
|
||||
{// buyer lost zeny in the mean time? fix the limit
|
||||
pl_sd->buyingstore.zenylimit = pl_sd->status.zeny;
|
||||
}
|
||||
weight = pl_sd->weight;
|
||||
|
||||
// check item list
|
||||
for( i = 0; i < count; i++ )
|
||||
{// itemlist: <index>.W <name id>.W <amount>.W
|
||||
unsigned short nameid, amount;
|
||||
int index;
|
||||
|
||||
index = RBUFW(itemlist,i*6+0)-2;
|
||||
nameid = RBUFW(itemlist,i*6+2);
|
||||
amount = RBUFW(itemlist,i*6+4);
|
||||
|
||||
if( i )
|
||||
{// duplicate check. as the client does this too, only malicious intent should be caught here
|
||||
ARR_FIND( 0, i, k, RBUFW(itemlist,k*6+0)-2 == index );
|
||||
if( k != i )
|
||||
{// duplicate
|
||||
ShowWarning("buyingstore_trade: Found duplicate item on selling list (prevnameid=%hu, prevamount=%hu, nameid=%hu, amount=%hu, account_id=%d, char_id=%d).\n",
|
||||
RBUFW(itemlist,k*6+2), RBUFW(itemlist,k*6+4), nameid, amount, sd->status.account_id, sd->status.char_id);
|
||||
clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, nameid);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if( index < 0 || index >= ARRAYLENGTH(sd->status.inventory) || sd->inventory_data[index] == NULL || sd->status.inventory[index].nameid != nameid || sd->status.inventory[index].amount < amount )
|
||||
{// invalid input
|
||||
clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, nameid);
|
||||
return;
|
||||
}
|
||||
|
||||
if( sd->status.inventory[index].expire_time || !itemdb_cantrade(&sd->status.inventory[index], pc_isGM(sd), pc_isGM(pl_sd)) || memcmp(sd->status.inventory[index].card, buyingstore_blankslots, sizeof(buyingstore_blankslots)) )
|
||||
{// non-tradable item
|
||||
clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, nameid);
|
||||
return;
|
||||
}
|
||||
|
||||
ARR_FIND( 0, pl_sd->buyingstore.slots, listidx, pl_sd->buyingstore.items[listidx].nameid == nameid );
|
||||
if( listidx == pl_sd->buyingstore.slots || pl_sd->buyingstore.items[listidx].amount == 0 )
|
||||
{// there is no such item or the buyer has already bought all of them
|
||||
clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, nameid);
|
||||
return;
|
||||
}
|
||||
|
||||
if( pl_sd->buyingstore.items[listidx].amount < amount )
|
||||
{// buyer does not need that much of the item
|
||||
clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_COUNT, nameid);
|
||||
return;
|
||||
}
|
||||
|
||||
if( pc_checkadditem(pl_sd, nameid, amount) == ADDITEM_OVERAMOUNT )
|
||||
{// buyer does not have enough space for this item
|
||||
clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, nameid);
|
||||
return;
|
||||
}
|
||||
|
||||
if( amount*(unsigned int)sd->inventory_data[index]->weight > pl_sd->max_weight-weight )
|
||||
{// normally this is not supposed to happen, as the total weight is
|
||||
// checked upon creation, but the buyer could have gained items
|
||||
clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, nameid);
|
||||
return;
|
||||
}
|
||||
weight+= amount*sd->inventory_data[index]->weight;
|
||||
|
||||
if( amount*pl_sd->buyingstore.items[listidx].price > pl_sd->buyingstore.zenylimit-zeny )
|
||||
{// buyer does not have enough zeny
|
||||
clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_ZENY, nameid);
|
||||
return;
|
||||
}
|
||||
zeny+= amount*pl_sd->buyingstore.items[listidx].price;
|
||||
}
|
||||
|
||||
// process item list
|
||||
for( i = 0; i < count; i++ )
|
||||
{// itemlist: <index>.W <name id>.W <amount>.W
|
||||
unsigned short nameid, amount;
|
||||
int index;
|
||||
|
||||
index = RBUFW(itemlist,i*6+0)-2;
|
||||
nameid = RBUFW(itemlist,i*6+2);
|
||||
amount = RBUFW(itemlist,i*6+4);
|
||||
|
||||
ARR_FIND( 0, pl_sd->buyingstore.slots, listidx, pl_sd->buyingstore.items[listidx].nameid == nameid );
|
||||
zeny = amount*pl_sd->buyingstore.items[listidx].price;
|
||||
|
||||
// log
|
||||
if( log_config.enable_logs&LOG_BUYING_STORE )
|
||||
{
|
||||
log_pick_pc(sd, "B", nameid, -((int)amount), &sd->status.inventory[index]);
|
||||
log_pick_pc(pl_sd, "B", nameid, amount, &sd->status.inventory[index]);
|
||||
}
|
||||
if( log_config.zeny )
|
||||
log_zeny(sd, "B", pl_sd, zeny);
|
||||
|
||||
// move item
|
||||
pc_additem(pl_sd, &sd->status.inventory[index], amount);
|
||||
pc_delitem(sd, index, amount, 1, 0);
|
||||
pl_sd->buyingstore.items[listidx].amount-= amount;
|
||||
|
||||
// pay up
|
||||
pc_payzeny(pl_sd, zeny);
|
||||
pc_getzeny(sd, zeny);
|
||||
pl_sd->buyingstore.zenylimit-= zeny;
|
||||
|
||||
// notify clients
|
||||
clif_buyingstore_delete_item(sd, index, amount, pl_sd->buyingstore.items[listidx].price);
|
||||
clif_buyingstore_update_item(pl_sd, nameid, amount);
|
||||
}
|
||||
|
||||
// check whether or not there is still something to buy
|
||||
ARR_FIND( 0, pl_sd->buyingstore.slots, i, pl_sd->buyingstore.items[i].amount != 0 );
|
||||
if( i == pl_sd->buyingstore.slots )
|
||||
{// everything was bought
|
||||
clif_buyingstore_trade_failed_buyer(pl_sd, BUYINGSTORE_TRADE_BUYER_NO_ITEMS);
|
||||
}
|
||||
else if( pl_sd->buyingstore.zenylimit == 0 )
|
||||
{// zeny limit reached
|
||||
clif_buyingstore_trade_failed_buyer(pl_sd, BUYINGSTORE_TRADE_BUYER_ZENY);
|
||||
}
|
||||
else
|
||||
{// continue buying
|
||||
return;
|
||||
}
|
||||
|
||||
// cannot continue buying
|
||||
buyingstore_close(pl_sd);
|
||||
|
||||
// remove auto-trader
|
||||
if( pl_sd->state.autotrade )
|
||||
{
|
||||
map_quit(pl_sd);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// Checks if an item is being bought in given player's buying store.
|
||||
bool buyingstore_search(struct map_session_data* sd, unsigned short nameid)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if( !sd->state.buyingstore )
|
||||
{// not buying
|
||||
return false;
|
||||
}
|
||||
|
||||
ARR_FIND( 0, sd->buyingstore.slots, i, sd->buyingstore.items[i].nameid == nameid && sd->buyingstore.items[i].amount );
|
||||
if( i == sd->buyingstore.slots )
|
||||
{// not found
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/// Searches for all items in a buyingstore, that match given ids, price and possible cards.
|
||||
/// @return Whether or not the search should be continued.
|
||||
bool buyingstore_searchall(struct map_session_data* sd, const struct s_search_store_search* s)
|
||||
{
|
||||
unsigned int i, idx;
|
||||
struct s_buyingstore_item* it;
|
||||
|
||||
if( !sd->state.buyingstore )
|
||||
{// not buying
|
||||
return true;
|
||||
}
|
||||
|
||||
for( idx = 0; idx < s->item_count; idx++ )
|
||||
{
|
||||
ARR_FIND( 0, sd->buyingstore.slots, i, sd->buyingstore.items[i].nameid == s->itemlist[idx] && sd->buyingstore.items[i].amount );
|
||||
if( i == sd->buyingstore.slots )
|
||||
{// not found
|
||||
continue;
|
||||
}
|
||||
it = &sd->buyingstore.items[i];
|
||||
|
||||
if( s->min_price && s->min_price > (unsigned int)it->price )
|
||||
{// too low price
|
||||
continue;
|
||||
}
|
||||
|
||||
if( s->max_price && s->max_price < (unsigned int)it->price )
|
||||
{// too high price
|
||||
continue;
|
||||
}
|
||||
|
||||
if( s->card_count )
|
||||
{// ignore cards, as there cannot be any
|
||||
;
|
||||
}
|
||||
|
||||
if( !searchstore_result(s->search_sd, sd->buyer_id, sd->status.account_id, sd->message, it->nameid, it->amount, it->price, buyingstore_blankslots, 0) )
|
||||
{// result set full
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
33
src/map/buyingstore.h
Normal file
@ -0,0 +1,33 @@
|
||||
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
|
||||
// For more information, see LICENCE in the main folder
|
||||
|
||||
#ifndef _BUYINGSTORE_H_
|
||||
#define _BUYINGSTORE_H_
|
||||
|
||||
struct s_search_store_search;
|
||||
|
||||
#define MAX_BUYINGSTORE_SLOTS 5
|
||||
|
||||
struct s_buyingstore_item
|
||||
{
|
||||
int price;
|
||||
unsigned short amount;
|
||||
unsigned short nameid;
|
||||
};
|
||||
|
||||
struct s_buyingstore
|
||||
{
|
||||
struct s_buyingstore_item items[MAX_BUYINGSTORE_SLOTS];
|
||||
int zenylimit;
|
||||
unsigned char slots;
|
||||
};
|
||||
|
||||
bool buyingstore_setup(struct map_session_data* sd, unsigned char slots);
|
||||
void buyingstore_create(struct map_session_data* sd, int zenylimit, unsigned char result, const char* storename, const uint8* itemlist, unsigned int count);
|
||||
void buyingstore_close(struct map_session_data* sd);
|
||||
void buyingstore_open(struct map_session_data* sd, int account_id);
|
||||
void buyingstore_trade(struct map_session_data* sd, int account_id, unsigned int buyer_id, const uint8* itemlist, unsigned int count);
|
||||
bool buyingstore_search(struct map_session_data* sd, unsigned short nameid);
|
||||
bool buyingstore_searchall(struct map_session_data* sd, const struct s_search_store_search* s);
|
||||
|
||||
#endif // _BUYINGSTORE_H_
|
@ -69,6 +69,11 @@ int chat_createpcchat(struct map_session_data* sd, const char* title, const char
|
||||
if( sd->chatID )
|
||||
return 0; //Prevent people abusing the chat system by creating multiple chats, as pointed out by End of Exam. [Skotlex]
|
||||
|
||||
if( sd->vender_id || sd->state.buyingstore )
|
||||
{// not chat, when you already have a store open
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( map[sd->bl.m].flag.nochat )
|
||||
{
|
||||
clif_displaymessage(sd->fd, msg_txt(281));
|
||||
@ -108,7 +113,7 @@ int chat_joinchat(struct map_session_data* sd, int chatid, const char* pass)
|
||||
nullpo_ret(sd);
|
||||
cd = (struct chat_data*)map_id2bl(chatid);
|
||||
|
||||
if( cd == NULL || cd->bl.type != BL_CHAT || cd->bl.m != sd->bl.m || sd->vender_id || sd->chatID || cd->users >= cd->limit )
|
||||
if( cd == NULL || cd->bl.type != BL_CHAT || cd->bl.m != sd->bl.m || sd->vender_id || sd->state.buyingstore || sd->chatID || cd->users >= cd->limit )
|
||||
{
|
||||
clif_joinchatfail(sd,0);
|
||||
return 0;
|
||||
|
947
src/map/clif.c
@ -173,6 +173,43 @@ typedef enum clr_type
|
||||
CLR_TELEPORT,
|
||||
} clr_type;
|
||||
|
||||
enum map_property
|
||||
{// clif_map_property
|
||||
MAPPROPERTY_NOTHING = 0,
|
||||
MAPPROPERTY_FREEPVPZONE = 1,
|
||||
MAPPROPERTY_EVENTPVPZONE = 2,
|
||||
MAPPROPERTY_AGITZONE = 3,
|
||||
MAPPROPERTY_PKSERVERZONE = 4, // message "You are in a PK area. Please beware of sudden attacks." in color 0x9B9BFF (light red)
|
||||
MAPPROPERTY_PVPSERVERZONE = 5,
|
||||
MAPPROPERTY_DENYSKILLZONE = 6,
|
||||
};
|
||||
|
||||
enum map_type
|
||||
{// clif_map_type
|
||||
MAPTYPE_VILLAGE = 0,
|
||||
MAPTYPE_VILLAGE_IN = 1,
|
||||
MAPTYPE_FIELD = 2,
|
||||
MAPTYPE_DUNGEON = 3,
|
||||
MAPTYPE_ARENA = 4,
|
||||
MAPTYPE_PENALTY_FREEPKZONE = 5,
|
||||
MAPTYPE_NOPENALTY_FREEPKZONE = 6,
|
||||
MAPTYPE_EVENT_GUILDWAR = 7,
|
||||
MAPTYPE_AGIT = 8,
|
||||
MAPTYPE_DUNGEON2 = 9,
|
||||
MAPTYPE_DUNGEON3 = 10,
|
||||
MAPTYPE_PKSERVER = 11,
|
||||
MAPTYPE_PVPSERVER = 12,
|
||||
MAPTYPE_DENYSKILL = 13,
|
||||
MAPTYPE_TURBOTRACK = 14,
|
||||
MAPTYPE_JAIL = 15,
|
||||
MAPTYPE_MONSTERTRACK = 16,
|
||||
MAPTYPE_PORINGBATTLE = 17,
|
||||
MAPTYPE_AGIT_SIEGEV15 = 18,
|
||||
MAPTYPE_BATTLEFIELD = 19,
|
||||
MAPTYPE_PVP_TOURNAMENT = 20,
|
||||
MAPTYPE_UNUSED = 29,
|
||||
};
|
||||
|
||||
int clif_setip(const char* ip);
|
||||
void clif_setbindip(const char* ip);
|
||||
void clif_setport(uint16 port);
|
||||
@ -284,7 +321,6 @@ int clif_class_change(struct block_list *bl,int class_,int type);
|
||||
#define clif_mob_class_change(md, class_) clif_class_change(&md->bl, class_, 1)
|
||||
int clif_mob_equip(struct mob_data *md,int nameid); // [Valaris]
|
||||
|
||||
int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range);
|
||||
int clif_skillinfoblock(struct map_session_data *sd);
|
||||
int clif_skillup(struct map_session_data *sd,int skill_num);
|
||||
int clif_addskill(struct map_session_data *sd, int skill);
|
||||
@ -438,9 +474,9 @@ void clif_MainChatMessage(const char* message); //luzza
|
||||
int clif_broadcast2(struct block_list *bl, const char* mes, int len, unsigned long fontColor, short fontType, short fontSize, short fontAlign, short fontY, enum send_target target);
|
||||
int clif_heal(int fd,int type,int val);
|
||||
int clif_resurrection(struct block_list *bl,int type);
|
||||
void clif_set0199(struct map_session_data* sd, int mode);
|
||||
void clif_map_property(struct map_session_data* sd, enum map_property property);
|
||||
int clif_pvpset(struct map_session_data *sd, int pvprank, int pvpnum,int type);
|
||||
int clif_send0199(int map,int type);
|
||||
void clif_map_property_mapall(int map, enum map_property property);
|
||||
void clif_refine(int fd, int fail, int index, int val);
|
||||
void clif_upgrademessage(int fd, int result, int item_id);
|
||||
|
||||
@ -569,4 +605,24 @@ void clif_PartyBookingInsertNotify(struct map_session_data* sd, struct party_boo
|
||||
|
||||
void clif_showdigit(struct map_session_data* sd, unsigned char type, int value);
|
||||
|
||||
/// Buying Store System
|
||||
void clif_buyingstore_open(struct map_session_data* sd);
|
||||
void clif_buyingstore_open_failed(struct map_session_data* sd, unsigned short result, unsigned int weight);
|
||||
void clif_buyingstore_myitemlist(struct map_session_data* sd);
|
||||
void clif_buyingstore_entry(struct map_session_data* sd);
|
||||
void clif_buyingstore_entry_single(struct map_session_data* sd, struct map_session_data* pl_sd);
|
||||
void clif_buyingstore_disappear_entry(struct map_session_data* sd);
|
||||
void clif_buyingstore_disappear_entry_single(struct map_session_data* sd, struct map_session_data* pl_sd);
|
||||
void clif_buyingstore_itemlist(struct map_session_data* sd, struct map_session_data* pl_sd);
|
||||
void clif_buyingstore_trade_failed_buyer(struct map_session_data* sd, short result);
|
||||
void clif_buyingstore_update_item(struct map_session_data* sd, unsigned short nameid, unsigned short amount);
|
||||
void clif_buyingstore_delete_item(struct map_session_data* sd, short index, unsigned short amount, int price);
|
||||
void clif_buyingstore_trade_failed_seller(struct map_session_data* sd, short result, unsigned short nameid);
|
||||
|
||||
/// Search Store System
|
||||
void clif_search_store_info_ack(struct map_session_data* sd);
|
||||
void clif_search_store_info_failed(struct map_session_data* sd, unsigned char reason);
|
||||
void clif_open_search_store_info(struct map_session_data* sd);
|
||||
void clif_search_store_info_click_ack(struct map_session_data* sd, short x, short y);
|
||||
|
||||
#endif /* _CLIF_H_ */
|
||||
|
@ -703,6 +703,32 @@ static bool itemdb_read_stack(char* fields[], int columns, int current)
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Reads items allowed to be sold in buying stores
|
||||
static bool itemdb_read_buyingstore(char* fields[], int columns, int current)
|
||||
{// <nameid>
|
||||
int nameid;
|
||||
struct item_data* id;
|
||||
|
||||
nameid = atoi(fields[0]);
|
||||
|
||||
if( ( id = itemdb_exists(nameid) ) == NULL )
|
||||
{
|
||||
ShowWarning("itemdb_read_buyingstore: Invalid item id %d.\n", nameid);
|
||||
return false;
|
||||
}
|
||||
|
||||
if( !itemdb_isstackable2(id) )
|
||||
{
|
||||
ShowWarning("itemdb_read_buyingstore: Non-stackable item id %d cannot be enabled for buying store.\n", nameid);
|
||||
return false;
|
||||
}
|
||||
|
||||
id->flag.buyingstore = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/*======================================
|
||||
* Applies gender restrictions according to settings. [Skotlex]
|
||||
*======================================*/
|
||||
@ -1019,6 +1045,7 @@ static void itemdb_read(void)
|
||||
sv_readdb(db_path, "item_noequip.txt", ',', 2, 2, -1, &itemdb_read_noequip);
|
||||
sv_readdb(db_path, "item_trade.txt", ',', 3, 3, -1, &itemdb_read_itemtrade);
|
||||
sv_readdb(db_path, "item_delay.txt", ',', 2, 2, MAX_ITEMDELAYS, &itemdb_read_itemdelay);
|
||||
sv_readdb(db_path, "item_buyingstore.txt", ',', 1, 1, -1, &itemdb_read_buyingstore);
|
||||
sv_readdb(db_path, "item_stack.txt", ',', 3, 3, -1, &itemdb_read_stack);
|
||||
}
|
||||
|
||||
|
@ -76,6 +76,7 @@ struct item_data {
|
||||
unsigned delay_consume : 1; // Signifies items that are not consumed immediately upon double-click [Skotlex]
|
||||
unsigned trade_restriction : 7; //Item restrictions mask [Skotlex]
|
||||
unsigned autoequip: 1;
|
||||
unsigned buyingstore : 1;
|
||||
} flag;
|
||||
struct
|
||||
{// item stacking limitation
|
||||
|
@ -492,31 +492,31 @@ int log_config_read(char *cfgName)
|
||||
else if(strcmpi(w1, "log_branch_file") == 0) {
|
||||
strcpy(log_config.log_branch, w2);
|
||||
if(log_config.branch > 0 && !log_config.sql_logs)
|
||||
ShowNotice("Logging Dead Branch Usage to file `%s`.txt\n", w2);
|
||||
ShowNotice("Logging Dead Branch Usage to file `%s`\n", w2);
|
||||
} else if(strcmpi(w1, "log_pick_file") == 0) {
|
||||
strcpy(log_config.log_pick, w2);
|
||||
if(log_config.filter > 0 && !log_config.sql_logs)
|
||||
ShowNotice("Logging Item Picks to file `%s`.txt\n", w2);
|
||||
ShowNotice("Logging Item Picks to file `%s`\n", w2);
|
||||
} else if(strcmpi(w1, "log_zeny_file") == 0) {
|
||||
strcpy(log_config.log_zeny, w2);
|
||||
if(log_config.zeny > 0 && !log_config.sql_logs)
|
||||
ShowNotice("Logging Zeny to file `%s`.txt\n", w2);
|
||||
ShowNotice("Logging Zeny to file `%s`\n", w2);
|
||||
} else if(strcmpi(w1, "log_mvpdrop_file") == 0) {
|
||||
strcpy(log_config.log_mvpdrop, w2);
|
||||
if(log_config.mvpdrop > 0 && !log_config.sql_logs)
|
||||
ShowNotice("Logging MVP Drops to file `%s`.txt\n", w2);
|
||||
ShowNotice("Logging MVP Drops to file `%s`\n", w2);
|
||||
} else if(strcmpi(w1, "log_gm_file") == 0) {
|
||||
strcpy(log_config.log_gm, w2);
|
||||
if(log_config.gm > 0 && !log_config.sql_logs)
|
||||
ShowNotice("Logging GM Level %d Commands to file `%s`.txt\n", log_config.gm, w2);
|
||||
ShowNotice("Logging GM Level %d Commands to file `%s`\n", log_config.gm, w2);
|
||||
} else if(strcmpi(w1, "log_npc_file") == 0) {
|
||||
strcpy(log_config.log_npc, w2);
|
||||
if(log_config.npc > 0 && !log_config.sql_logs)
|
||||
ShowNotice("Logging NPC 'logmes' to file `%s`.txt\n", w2);
|
||||
ShowNotice("Logging NPC 'logmes' to file `%s`\n", w2);
|
||||
} else if(strcmpi(w1, "log_chat_file") == 0) {
|
||||
strcpy(log_config.log_chat, w2);
|
||||
if(log_config.chat > 0 && !log_config.sql_logs)
|
||||
ShowNotice("Logging CHAT to file `%s`.txt\n", w2);
|
||||
ShowNotice("Logging CHAT to file `%s`\n", w2);
|
||||
//support the import command, just like any other config
|
||||
} else if(strcmpi(w1,"import") == 0) {
|
||||
log_config_read(w2);
|
||||
|
@ -36,9 +36,10 @@ typedef enum log_what {
|
||||
LOG_USED_ITEMS = 0x0100, // used by player
|
||||
LOG_MVP_PRIZE = 0x0200,
|
||||
LOG_COMMAND_ITEMS = 0x0400, // created/deleted through @/# commands
|
||||
LOG_STORAGE_ITEMS = 0x0800, // placed/retrieved from storage
|
||||
LOG_GSTORAGE_ITEMS = 0x1000, // placed/retrieved from guild storage
|
||||
LOG_MAILS = 0x2000 // mail system transactions
|
||||
LOG_STORAGE_ITEMS = 0x0800, // placed/retrieved from storage
|
||||
LOG_GSTORAGE_ITEMS = 0x1000, // placed/retrieved from guild storage
|
||||
LOG_MAILS = 0x2000, // mail system transactions
|
||||
LOG_BUYING_STORE = 0x4000, // buying store transactions
|
||||
} log_what;
|
||||
|
||||
extern struct Log_Config {
|
||||
|
@ -162,7 +162,7 @@ int mail_openmail(struct map_session_data *sd)
|
||||
{
|
||||
nullpo_ret(sd);
|
||||
|
||||
if( sd->state.storage_flag || sd->vender_id || sd->state.trading )
|
||||
if( sd->state.storage_flag || sd->vender_id || sd->state.buyingstore || sd->state.trading )
|
||||
return 0;
|
||||
|
||||
clif_Mail_window(sd->fd, 0);
|
||||
|