* 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
This commit is contained in:
Kisuka 2011-03-09 12:50:24 +00:00
parent 54f90425dd
commit 1b38a1964b
131 changed files with 5827 additions and 3608 deletions

View File

@ -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

View File

@ -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
View 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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
View File

@ -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

View File

@ -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

View File

@ -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

File diff suppressed because it is too large Load Diff

View 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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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##

View File

@ -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#

View File

@ -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.

View File

@ -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.

View File

@ -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:

View File

@ -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;

File diff suppressed because it is too large Load Diff

View File

@ -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";

View File

@ -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";

View File

@ -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:

View File

@ -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;
}

View File

@ -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_:

View File

@ -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

View File

@ -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

View File

@ -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 {

View File

@ -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

View File

@ -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]

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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]";

View File

@ -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.";

View File

@ -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;
}

View File

@ -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,";

View File

@ -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,{

View File

@ -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";

View File

@ -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">
&copy; Content Copyright 2005 eAthena Development Team/Evera<br>
&copy; 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>

View File

@ -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">
&copy; Content Copyright 2005 eAthena Development Team/Evera<br>
&copy; 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
View 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
View 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 &lt;-- 100 = 1x drop rate, 1000 = 10x drop rate, etc<br />
item_rate_common_boss: 100 &lt;--- drop rate for bosses<br />
item_drop_common_min: 1 &lt;--- minimal drop rate<br />
item_drop_common_max: 10000 &lt;--- 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>

View File

@ -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">
&copy; Content Copyright 2005 eAthena Development Team/Evera<br>
&copy; 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>

View File

@ -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">
&copy; Content Copyright 2005 eAthena Development Team/Evera<br>
&copy; 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>

View File

@ -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">
&copy; Content Copyright 2005 eAthena Development Team/Evera<br>
&copy; 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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 755 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 567 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

BIN
readme/images/clown.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 729 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 912 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 730 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 617 B

View File

@ -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>&nbsp;Alberta - 100%</li></ul>
<ul><li>&nbsp;Al de Baran - 100%</li></ul>
<ul><li>&nbsp;Amatsu - 100%</li></ul>
<ul><li>&nbsp;Ayothaya - 75%</li></ul>
<ul><li>&nbsp;Comodo - 100%</li></ul>
<ul><li>&nbsp;Einbech - 90%</li></ul>
<ul><li>&nbsp;Einbroch - 75%</li></ul>
<ul><li>&nbsp;Geffen - 100%</li></ul>
<ul><li>&nbsp;Gonryun - 60%</li></ul>
<ul><li>&nbsp;Izlude - 100%</li></ul>
<ul><li>&nbsp;Louyang - 75%</li></ul>
<ul><li>&nbsp;Lutie - 100%</li></ul>
<ul><li>&nbsp;Morocc - 100%</li></ul>
<ul><li>&nbsp;Niflheim - 100%</li></ul>
<ul><li>&nbsp;Payon(New Maps) - 99%</li></ul>
<ul><li>&nbsp;Prontera - 100%</li></ul>
<ul><li>&nbsp;Umbala - 100%</li></ul>
<li><strong>Job Quests</strong> (16/33)</li>
<ul><li>&nbsp;Novice Class (2/2)</li></ul>
<ul><ul><li>&nbsp;Novice - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Super Novice - 100%</li></ul></ul>
<ul><li>&nbsp;1-1 Class (6/6)</li></ul>
<ul><ul><li>&nbsp;Swordman - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Mage - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Archer - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Acolyte - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Merchant - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Thief - 100%</li></ul></ul>
<ul><li>&nbsp;2-1 Class (6/6)</li></ul>
<ul><ul><li>&nbsp;Knight - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Priest - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Wizard - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Blacksmith - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Hunter - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Assassin - 100%</li></ul></ul>
<ul><li>&nbsp;2-2 Class (2/7)</li></ul>
<ul><ul><li>&nbsp;Crusader - 0%</li></ul></ul>
<ul><ul><li>&nbsp;Monk - 0% (Soon)</li></ul></ul>
<ul><ul><li>&nbsp;Sage - 0% (Soon)</li></ul></ul>
<ul><ul><li>&nbsp;Rogue - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Alchemist - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Bard - 0%</li></ul></ul>
<ul><ul><li>&nbsp;Dancer - 100%</li></ul></ul>
<ul><li>&nbsp;2-1-1 Class (0/6)</li></ul>
<ul><li>&nbsp;2-2-1 Class (0/6)</li></ul>
<li><strong>Kafras</strong> - 100%</li>
<li><strong>Guides</strong> - 100%</li>
<li>&nbsp;<strong>War Of Emperium</strong> (4/5)</li>
<ul><li>&nbsp;Prontera - 100%</li></ul>
<ul><li>&nbsp;Geffen - 100%</li></ul>
<ul><li>&nbsp;Payon - 100%</li></ul>
<ul><li>&nbsp;Al De Baran - 100%</li></ul>
<ul><li>&nbsp;Novice - 0%</li></ul>
<li><strong>Quests</strong> (24/25)</li>
<ul><li>&nbsp;Skill Quests (7/7)</li></ul>
<ul><ul><li>&nbsp;Novice - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Swordman - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Mage - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Archer - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Acolyte - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Merchant - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Thief - 100%</li></ul></ul>
<ul><li>Town Quests (9/10)</li></ul>
<ul><ul><li>&nbsp;Prontera - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Morocc - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Geffen - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Izlude - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Alberta - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Al De Baran - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Yuno - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Lutie - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Comodo - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Payon - 20%</li></ul></ul>
<ul><li>Other Quests (9/9)</li></ul>
<ul><ul><li>&nbsp;Dye - 100%</li></ul></ul>
<ul><ul><li>&nbsp;MrSmile - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Juice Making - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Doomed Swords - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Bongun Taming - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Munak Taming - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Tamking - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Bongun Sword - 100%</li></ul></ul>
<ul><ul><li>&nbsp;The lvl 4 Weapon Quest - 100%</li></ul></ul>
<ul><li>Other (7/10)</li></ul>
<ul><ul><li>&nbsp;Card Remover - 100%</li></ul></ul>
<ul><ul><li>&nbsp;PvP (old) - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Time Arena - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Bank - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Wedding - 80%</li></ul></ul>
<ul><ul><li>&nbsp;Valkyrie - 10%</li></ul></ul>
<ul><ul><li>&nbsp;Gefenia - 10%</li></ul></ul>
<ul><ul><li>&nbsp;Heal Npc - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Warp Npc - 100%</li></ul></ul>
<ul><ul><li>&nbsp;Jobchange - 100%</li></ul></ul>
</ul>
</td>
</tr>
<tr>
<td colspan="3">
&copy; Content Copyright 2005 eAthena Development Team/Evera<br>
&copy; 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>

View File

@ -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%;
}

View File

@ -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">
&copy; Content Copyright 2005 eAthena Development Team/Evera<br>
&copy; 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
View 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 />
&nbsp;&nbsp;&nbsp;mes "[NPC Name]";<br>
&nbsp;&nbsp;&nbsp;mes "Hello World";<br>
&nbsp;&nbsp;&nbsp;close;<br>
}
</p>
<p>
<strong>Common Script Commands:</strong>
<ul>
<li><strong>mes</strong><br>
usage: mes &quot;&lt;message&gt;&quot;;<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 &quot;Close&quot; button in an NPC's dialog window.
</li>
<li><strong>next</strong><br>
usage: next;<br>
info: displays a &quot;Next&quot; button in an NPC's dialog window.</li>
<li><strong>getitem</strong><br>
usage: getitem &lt;item id&gt;,&lt;amount&gt;;<br>
info: gives the player an item.
</li>
<li><strong>delitem</strong><br>
usage: delitem &lt;item id&gt;,&lt;amount&gt;;<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>

View File

@ -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">
&copy; Content Copyright 2005 eAthena Development Team/Evera<br>
&copy; 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
View 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;
}

View File

@ -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`),

View File

@ -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`),

View File

@ -0,0 +1 @@
ALTER TABLE `char` ADD `delete_date` INT(11) UNSIGNED NOT NULL DEFAULT '0';

View 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';

View File

@ -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));

View File

@ -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) {

View File

@ -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 {

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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)

View File

@ -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;
}

View File

@ -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, },

View File

@ -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
View 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
View 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_

View File

@ -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;

File diff suppressed because it is too large Load Diff

View File

@ -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_ */

View File

@ -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);
}

View File

@ -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

View File

@ -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);

View File

@ -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 {

View File

@ -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);

Some files were not shown because too many files have changed in this diff Show More