1
0
forked from metin2/server

70 Commits

Author SHA1 Message Date
175816c81d Merge pull request 'Default all localized behavior to European logic' (#22) from Tr0n/server:localization/default-gf-eu into nightly
Reviewed-on: metin2/server#22
2024-04-09 21:47:22 +03:00
b15eb7f3fe fix: wrong delay used for item drop despawn. 2024-04-09 20:33:14 +02:00
3a8d9e38e8 remove duplicate variable definition 2024-04-09 18:13:38 +02:00
4074c3b96a fix out of order access of variables 2024-04-09 18:13:14 +02:00
854fef68e8 revert removal of locale initialization per country. default to English 2024-04-09 18:12:58 +02:00
cf66bb3310 revert name change removal 2024-04-09 17:25:39 +02:00
254f6f6664 remove division by 1 for party exp bonus 2024-04-09 17:24:09 +02:00
0072bc5e14 revert removal of spam db 2024-04-09 17:21:46 +02:00
62f3635b86 revert removed warning for disabled version checks 2024-04-09 17:10:53 +02:00
2c37b2009d revert local testing of string localization 2024-04-09 17:10:38 +02:00
e0701ed5bd restore accidentally removed login logic 2024-04-09 17:04:10 +02:00
21381a4e3a restore accidentally removed fish logic 2024-04-09 17:03:42 +02:00
ba44269071 remove redundant condition for skill book exp consumption 2024-04-09 16:58:02 +02:00
f5ccb17736 remove redundant pointer to lucky pouch loot table 2024-04-09 16:56:43 +02:00
bb52a57ffc remove unreachable branch 2024-04-09 16:53:47 +02:00
8360d6939f set damage penalty on foreign empire maps to constant 9% 2024-04-09 16:53:37 +02:00
1e362d8507 remove isLimitedItem 2024-04-09 16:51:51 +02:00
0a907f41d2 remove unnecessary leftover closures 2024-04-07 22:11:12 +02:00
dbcabd7fa9 reduce LC_InitLocalization logic, purge LC_Is* definitions 2024-04-07 18:10:16 +02:00
fcc2a9e4a0 Logout error messages are now being sent, closes #18 2024-04-07 18:36:10 +03:00
12b6abf373 remove IS_BOTARYABLE_ZONE 2024-04-07 14:19:29 +02:00
e1daa48366 remove all localization 2024-04-07 12:54:57 +02:00
83707434ee Fix small UTF-8 conversion mistakes, converted locale_strings, added KR locale_string file 2024-04-07 10:14:51 +03:00
042414a499 Merge pull request 'encoding' (#20) from Tr0n/server:encoding into nightly
Reviewed-on: metin2/server#20
2024-04-07 08:59:36 +03:00
68c7c4bc4f fix config comment 2024-04-06 18:04:29 +02:00
eafbee616f english locale as base 2024-04-06 17:58:03 +02:00
026cb861a8 fix missing quote mark 2024-04-06 17:57:30 +02:00
1ba21fb1f9 translate remaining SPDLOG calls 2024-04-06 17:57:14 +02:00
8fede9a1df manual translation of non-localized strings 2024-04-06 17:28:22 +02:00
dfb3d08998 manual translation of non-localized strings 2024-04-06 12:50:34 +02:00
326c134f9e manual translation of non-localized strings 2024-04-06 11:13:11 +02:00
9b7536ee9a Initial pass of converting string literals to english 2024-04-06 10:31:54 +02:00
9056f6c6c6 convert some more comments to utf8 2024-04-06 10:24:46 +02:00
8685b02fdc libthecore encoding conversion 2024-04-06 10:20:42 +02:00
341bef9aba Merge branch 'nightly' into comment-encoding 2024-04-06 01:09:03 +02:00
8a1acefeeb move encoding tool to separate repo 2024-04-06 00:42:30 +02:00
eacc808366 convert comments to utf-8 2024-04-05 23:34:45 +02:00
4a1460f36e convert korean characters in string literals to string encoded bytes 2024-04-05 22:24:46 +02:00
aae9b169df encoding fix script 2024-04-05 21:57:49 +02:00
dd74eafc24 fix db cpp encoding 2024-04-01 14:20:00 +02:00
d471d99a24 fix libthecore header encoding 2024-04-01 12:48:58 +02:00
350fb0d424 fix libsql header encoding 2024-04-01 12:48:16 +02:00
869720f9e6 fix libgame header encoding 2024-04-01 12:46:52 +02:00
4fc612552a fix common header encoding 2024-04-01 12:45:35 +02:00
248205ae01 fix db header encoding 2024-04-01 12:43:31 +02:00
82317e6c4d fix game header encoding 2024-04-01 12:39:34 +02:00
847ab2ef89 Fixed erroneous database table parsing due to incorrect SMS phone number removal 2024-03-31 15:30:43 +03:00
ebc479b7df Fixed "Invalid Socket Count 3, set to maximum" error 2024-03-31 09:09:35 +03:00
1ee687f269 Removed unused PROTECT_CHILD_FOR_NEWCIBN 2024-03-31 08:54:34 +03:00
d85ef28eac Removed messenger SMS 2024-03-30 21:14:50 +02:00
01cc27a7df Removed Billing/VCard 2024-03-30 19:58:21 +02:00
72b495c03c Removed PCBang/iCafe code 2024-03-30 18:55:44 +02:00
0c86f802ca Removed unused highscore Lua & DB functions 2024-03-30 18:06:36 +02:00
05a1406c7c Removed database strings and automatic greeting 2024-03-30 17:50:04 +02:00
00c5634c09 Removed country blocking (and exceptions) 2024-03-30 17:09:03 +02:00
42079d56b7 Removed hotbackup 2024-03-30 16:57:24 +02:00
0101618d89 Fixed sectree not found while loading guild buildings 2024-03-25 07:01:22 +02:00
8579828ca6 Implemented official level update fix 2024-03-11 18:08:24 +02:00
3f1ce57fa1 Enforced signed datatypes for char variables, fixing ARM builds 2024-03-03 19:10:49 +02:00
e4cbdcfc4d Remove hardcoded CMake debug flag. Closes #12 2024-03-03 19:03:53 +02:00
bba0294107 Merge pull request 'Refactored the logging code' (#14) from log-rewrite into master
Reviewed-on: metin2/server#14
2024-03-03 19:02:05 +02:00
0aab8162fb Merge branch 'master' into log-rewrite 2024-03-03 18:59:23 +02:00
9fba85f947 Updated README.md with the latest changes 2024-03-03 18:55:48 +02:00
a7f4e4e54d Rewrote the log initialization functions, logs are now saved in rotating files, implemented configurable log levels 2024-03-03 18:51:51 +02:00
7e543bd05f Merge pull request 'fix arm/aarch64 builds.' (#13) from NycuRO/server:fix-arm-aarch into master
Reviewed-on: metin2/server#13
2024-01-09 20:59:11 +02:00
405b05fe59 fix arm/aarch64 builds. 2024-01-09 18:26:50 +02:00
feac4c0598 Applied changes on the db executable. Removed old logging functions. Various global changes. 2024-01-07 22:05:51 +02:00
2f829ae2dc Applied changes on the game executable. 2023-12-31 12:26:59 +02:00
2c8cb0c857 Made a small-scale test with the spdlog library. Incidentally added fmt. 2023-12-30 10:30:52 +02:00
fc3f2f232c CMake build system updates, the docker image automatically compiles quests at build 2023-12-10 10:00:55 +02:00
352 changed files with 29588 additions and 49098 deletions

View File

@ -5,5 +5,14 @@ cmake-build-release/
# Dockerfile (in order to allow changes without rebuilding)
Dockerfile
# Git files
.gitignore
.gitkeep
# Compiled quests
gamefiles/locale/english/quest/object/
gamefiles/locale/english/quest/pre_qc/
gamefiles/locale/english/quest/qc
# Test folder
test/

6
.idea/encodings.xml generated
View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="PROJECT" charset="EUC-KR" />
</component>
</project>

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"cmake.configureOnOpen": true
}

View File

@ -1,8 +1,5 @@
cmake_minimum_required(VERSION 3.12)
# Build mode debug/release?
set(CMAKE_BUILD_TYPE Debug)
# Set C++ standard to C++17
set(CMAKE_CXX_STANDARD 17)
@ -23,15 +20,14 @@ set(METIN2_COMPILER "${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
set(METIN2_CPU_TARGET ${CMAKE_SYSTEM_PROCESSOR})
# Git revision
include(FindGit)
find_package(Git)
find_package(GitInfo)
if(GIT_FOUND)
GIT_WC_INFO(${PROJECT_SOURCE_DIR} Metin2)
set(METIN2_REVISION ${Metin2_WC_REVISION_NAME})
set(METIN2_REVISION ${Metin2_WC_REVISION_HASH})
set(METIN2_LAST_CHANGED_DATE ${Metin2_WC_LAST_CHANGED_DATE})
if (${Metin2_WC_LATEST_TAG} NOT STREQUAL "")
if (Metin2_WC_LATEST_TAG)
set(METIN2_LATEST_TAG ${Metin2_WC_LATEST_TAG})
else()
set(METIN2_LATEST_TAG "unknown")

View File

@ -3,16 +3,20 @@ WORKDIR /app
# Update the system and install various dependencies
RUN apt-get update && \
apt-get install -y git cmake build-essential tar curl zip unzip pkg-config autoconf python3 \
apt-get install -y git cmake ninja-build build-essential tar curl zip unzip pkg-config autoconf python3 \
libdevil-dev libncurses5-dev libbsd-dev
# Arm specific
ENV VCPKG_FORCE_SYSTEM_BINARIES=1
# Install vcpkg and the required libraries
RUN git clone https://github.com/Microsoft/vcpkg.git
RUN bash ./vcpkg/bootstrap-vcpkg.sh
RUN ./vcpkg/vcpkg install boost-system cryptopp effolkronium-random libmysql libevent lzo
RUN ./vcpkg/vcpkg install boost-system cryptopp effolkronium-random libmysql libevent lzo fmt spdlog
COPY . .
# Build the binaries
RUN mkdir build/
RUN cd build && cmake -DCMAKE_TOOLCHAIN_FILE=vcpkg/scripts/buildsystems/vcpkg.cmake ..
RUN cd build && make -j $(nproc)
@ -20,16 +24,19 @@ RUN cd build && make -j $(nproc)
FROM ubuntu:latest as app
WORKDIR /app
RUN apt-get update && apt-get install -y libdevil-dev libbsd-dev && apt-get clean
RUN apt-get update && apt-get install -y python2 libdevil-dev libbsd-dev && apt-get clean
# Copy the binaries from the build stage
COPY --from=build /app/build/src/db/db /bin/db
COPY --from=build /app/build/src/game/game /bin/game
COPY --from=build /app/build/src/quest/quest /bin/quest
COPY --from=build /app/build/src/quest/qc /bin/qc
# Copy the game files
COPY ./gamefiles/ .
# Compile the quests
RUN cd /app/locale/english/quest && python2 make.py
# Symlink the configuration files
RUN ln -s "./conf/CMD" "CMD"
RUN ln -s ./conf/item_names_en.txt item_names.txt

View File

@ -39,7 +39,7 @@ Install `vcpkg` according to the [lastest instructions](https://vcpkg.io/en/gett
Build and install the required libraries:
```shell
vcpkg install boost-system cryptopp effolkronium-random libmysql libevent lzo
vcpkg install boost-system cryptopp effolkronium-random libmysql libevent lzo fmt spdlog
```
Then, it's time to build your binaries. Your commands should look along the lines of:
@ -80,6 +80,7 @@ goodies you wish. Also, a lot of time.
- Switched to the [effolkronium/random PRNG](https://github.com/effolkronium/random) instead of the standard C functions.
- Refactored macros to modern C++ functions.
- Network settings are manually configurable through the `PUBLIC_IP`, `PUBLIC_BIND_IP`, `INTERNAL_IP`, `INTERNAL_BIND_IP` settings in the `CONFIG` file. (Might need further work)
- Refactored logging to use [spdlog](https://github.com/gabime/spdlog) for more consistent function calls.
## 4. Bugfixes
**WARNING: This project is based on the "kraizy" leak. That was over 10 years ago.
@ -88,6 +89,7 @@ This is a very serious security risk and one of the reasons this project is stil
### Gameplay
- Fixed invisibility bug on login/respawn/teleport etc.
- Fixed player level not updating [(thread)](https://metin2.dev/topic/30612-official-level-update-fix-reversed/)
### Exploits
- See the warning above :(
@ -102,7 +104,6 @@ This is a very serious security risk and one of the reasons this project is stil
- Migrate `conf.txt` and `CONFIG` to a modern dotenv-like format, which would enable pretty nice Docker images.
- Add a health check to the Docker image.
- Use the [fmt](https://fmt.dev/latest/index.html) library for safe and modern string formatting.
- Use a modern logging library to clean up the current mess.
- Handle kernel signals (SIGTERM, SIGHUP etc.) for gracefully shutting down the game server.
- Improve memory safety.
- Use fixed width integer types instead of Microsoft-style typedefs.

View File

@ -1,176 +0,0 @@
################################################################################
#
# Program: 3D Slicer
#
# Copyright (c) Kitware Inc.
#
# See COPYRIGHT.txt
# or http://www.slicer.org/copyright/copyright.txt for details.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This file was originally developed by Jean-Christophe Fillion-Robin, Kitware Inc.
# and was partially funded by NIH grant 3P41RR013218-12S1
#
################################################################################
#
# The module defines the following variables:
# GIT_EXECUTABLE - path to git command line client
# GIT_FOUND - true if the command line client was found
# GIT_VERSION_STRING - the version of git found (since CMake 2.8.8)
#
# If the command line client executable is found the macro
# GIT_WC_INFO(<dir> <var-prefix>)
# is defined to extract information of a git working copy at
# a given location.
#
# The macro defines the following variables:
# <var-prefix>_WC_REVISION_HASH - Current SHA1 hash
# <var-prefix>_WC_REVISION - Current SHA1 hash
# <var-prefix>_WC_REVISION_NAME - Name associated with <var-prefix>_WC_REVISION_HASH
# <var-prefix>_WC_URL - output of command `git config --get remote.origin.url'
# <var-prefix>_WC_ROOT - Same value as working copy URL
# <var-prefix>_WC_LAST_CHANGED_DATE - date of last commit
# <var-prefix>_WC_GITSVN - Set to false
#
# ... and also the following ones if it's a git-svn repository:
# <var-prefix>_WC_GITSVN - Set to True if it is a
# <var-prefix>_WC_INFO - output of command `git svn info'
# <var-prefix>_WC_URL - url of the associated SVN repository
# <var-prefix>_WC_ROOT - root url of the associated SVN repository
# <var-prefix>_WC_REVISION - current SVN revision number
# <var-prefix>_WC_LAST_CHANGED_AUTHOR - author of last commit
# <var-prefix>_WC_LAST_CHANGED_DATE - date of last commit
# <var-prefix>_WC_LAST_CHANGED_REV - revision of last commit
# <var-prefix>_WC_LAST_CHANGED_LOG - last log of base revision
#
# Example usage:
# find_package(Git)
# if(GIT_FOUND)
# GIT_WC_INFO(${PROJECT_SOURCE_DIR} Project)
# message("Current revision is ${Project_WC_REVISION_HASH}")
# message("git found: ${GIT_EXECUTABLE}")
# endif()
#
# Look for 'git' or 'eg' (easy git)
#
set(git_names git eg)
# Prefer .cmd variants on Windows unless running in a Makefile
# in the MSYS shell.
#
if(WIN32)
if(NOT CMAKE_GENERATOR MATCHES "MSYS")
# Note: Due to a bug in 'git.cmd' preventing it from returning the exit code of 'git',
# we excluded it from the list of executables to search.
# See http://code.google.com/p/msysgit/issues/detail?id=428
# TODO Check if 'git' exists, get the associated version, if the corresponding version
# is known to have a working version of 'git.cmd', use it.
set(git_names git eg.cmd eg)
endif()
endif()
find_program(GIT_EXECUTABLE ${git_names}
PATHS
"C:/Program Files/Git/bin"
"C:/Program Files (x86)/Git/bin"
DOC "git command line client")
# XXX Comment to workaround https://gitlab.kitware.com/cmake/cmake/issues/15448
# mark_as_advanced(GIT_EXECUTABLE)
if(GIT_EXECUTABLE)
execute_process(COMMAND ${GIT_EXECUTABLE} --version
OUTPUT_VARIABLE git_version
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if (git_version MATCHES "^git version [0-9]")
string(REPLACE "git version " "" GIT_VERSION_STRING "${git_version}")
endif()
unset(git_version)
macro(GIT_WC_INFO dir prefix)
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --verify -q --short=7 HEAD
WORKING_DIRECTORY ${dir}
ERROR_VARIABLE GIT_error
OUTPUT_VARIABLE ${prefix}_WC_REVISION_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(${prefix}_WC_REVISION ${${prefix}_WC_REVISION_HASH})
if(NOT ${GIT_error} EQUAL 0)
message(SEND_ERROR "Command \"${GIT_EXECUTBALE} rev-parse --verify -q --short=7 HEAD\" in directory ${dir} failed with output:\n${GIT_error}")
else(NOT ${GIT_error} EQUAL 0)
execute_process(COMMAND ${GIT_EXECUTABLE} name-rev ${${prefix}_WC_REVISION_HASH}
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_WC_REVISION_NAME
OUTPUT_STRIP_TRAILING_WHITESPACE)
endif(NOT ${GIT_error} EQUAL 0)
execute_process(COMMAND ${GIT_EXECUTABLE} config --get remote.origin.url
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_WC_URL
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${GIT_EXECUTABLE} show -s --format="%ci" ${${prefix}_WC_REVISION_HASH}
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_show_output
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX REPLACE "^([0-9][0-9][0-9][0-9]\\-[0-9][0-9]\\-[0-9][0-9]).*"
"\\1" ${prefix}_WC_LAST_CHANGED_DATE "${${prefix}_show_output}")
set(${prefix}_WC_GITSVN False)
# Check if this git is likely to be a git-svn repository
execute_process(COMMAND ${GIT_EXECUTABLE} config --get-regexp "^svn-remote"
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE git_config_output
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT "${git_config_output}" STREQUAL "")
# In case git-svn is used, attempt to extract svn info
execute_process(COMMAND ${GIT_EXECUTABLE} svn info
WORKING_DIRECTORY ${dir}
TIMEOUT 3
ERROR_VARIABLE git_svn_info_error
OUTPUT_VARIABLE ${prefix}_WC_INFO
RESULT_VARIABLE git_svn_info_result
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(${git_svn_info_result} EQUAL 0)
set(${prefix}_WC_GITSVN True)
string(REGEX REPLACE "^(.*\n)?URL: ([^\n]+).*"
"\\2" ${prefix}_WC_URL "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Revision: ([^\n]+).*"
"\\2" ${prefix}_WC_REVISION "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Repository Root: ([^\n]+).*"
"\\2" ${prefix}_WC_ROOT "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Last Changed Author: ([^\n]+).*"
"\\2" ${prefix}_WC_LAST_CHANGED_AUTHOR "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Last Changed Rev: ([^\n]+).*"
"\\2" ${prefix}_WC_LAST_CHANGED_REV "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Last Changed Date: ([^\n]+).*"
"\\2" ${prefix}_WC_LAST_CHANGED_DATE "${${prefix}_WC_INFO}")
endif(${git_svn_info_result} EQUAL 0)
endif(NOT "${git_config_output}" STREQUAL "")
# If there is no 'remote.origin', default to "NA" value and print a warning message.
if(NOT ${prefix}_WC_URL)
message(WARNING "No remote origin set for git repository: ${dir}" )
set( ${prefix}_WC_URL "NA" )
else()
set(${prefix}_WC_ROOT ${${prefix}_WC_URL})
endif()
endmacro(GIT_WC_INFO)
endif(GIT_EXECUTABLE)
# Handle the QUIETLY and REQUIRED arguments and set GIT_FOUND to TRUE if
# all listed variables are TRUE
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Git DEFAULT_MSG GIT_EXECUTABLE)

View File

@ -0,0 +1,244 @@
################################################################################
#
# Program: FindGitInfo from Slicer
#
# Copyright (c) Kitware Inc.
#
# See COPYRIGHT.txt
# or http://www.slicer.org/copyright/copyright.txt for details.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This file was originally developed by Jean-Christophe Fillion-Robin,
# Kitware Inc. and was partially funded by NIH grant 3P41RR013218-12S1
#
################################################################################
# If the command line client executable is found the macro
# GIT_WC_INFO(<dir> <var-prefix>)
# is defined to extract information of a git working copy at
# a given location.
#
# The macro defines the following variables:
# <var-prefix>_WC_REVISION_HASH - Current SHA1 hash
# <var-prefix>_WC_REVISION - Current SHA1 hash
# <var-prefix>_WC_REVISION_NAME - Name associated with <var-prefix>_WC_REVISION_HASH
# <var-prefix>_WC_URL - output of command `git config --get remote.origin.url'
# <var-prefix>_WC_ROOT - Same value as working copy URL
# <var-prefix>_WC_LAST_CHANGED_DATE - date of last commit
# <var-prefix>_WC_GITSVN - Set to false
# <var-prefix>_WC_LATEST_TAG - Latest tag found in history
# <var-prefix>_WC_LATEST_TAG_LONG - <last tag>-<commits since then>-g<actual commit hash>
#
# ... and also the following ones if it's a git-svn repository:
# <var-prefix>_WC_GITSVN - Set to True if it is a
# <var-prefix>_WC_INFO - output of command `git svn info'
# <var-prefix>_WC_URL - url of the associated SVN repository
# <var-prefix>_WC_ROOT - root url of the associated SVN repository
# <var-prefix>_WC_REVISION - current SVN revision number
# <var-prefix>_WC_LAST_CHANGED_AUTHOR - author of last commit
# <var-prefix>_WC_LAST_CHANGED_DATE - date of last commit
# <var-prefix>_WC_LAST_CHANGED_REV - revision of last commit
# <var-prefix>_WC_LAST_CHANGED_LOG - last log of base revision
#
# Example usage:
# find_package(GitInfo)
# if(GIT_FOUND)
# GIT_WC_INFO(${PROJECT_SOURCE_DIR} Project)
# message("Current revision is ${Project_WC_REVISION_HASH}")
# message("git found: ${GIT_EXECUTABLE}")
# endif()
#
# Look for git. Respect the quiet and required flags passed to this module.
set(FIND_QUIETLY_FLAG "")
if (DEFINED GitInfo_FIND_QUIETLY)
set(FIND_QUIETLY_FLAG "QUIET")
endif ()
set(FIND_REQUIRED_FLAG "")
if (DEFINED GitInfo_FIND_REQUIRED)
set(FIND_REQUIRED_FLAG "REQUIRED")
endif ()
find_package(Git ${FIND_QUIETLY_FLAG} ${FIND_REQUIRED_FLAG})
if(GIT_FOUND)
execute_process(COMMAND ${GIT_EXECUTABLE} --version
OUTPUT_VARIABLE git_version
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if (git_version MATCHES "^git version [0-9]")
string(REPLACE "git version " "" GIT_VERSION_STRING "${git_version}")
endif()
unset(git_version)
macro(GIT_WC_INFO dir prefix)
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --verify -q --short=7 HEAD
WORKING_DIRECTORY ${dir}
ERROR_VARIABLE GIT_error
OUTPUT_VARIABLE ${prefix}_WC_REVISION_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(${prefix}_WC_REVISION ${${prefix}_WC_REVISION_HASH})
if(NOT ${GIT_error} EQUAL 0)
message(SEND_ERROR "Command \"${GIT_EXECUTBALE} rev-parse --verify -q --short=7 HEAD\" in directory ${dir} failed with output:\n${GIT_error}")
else(NOT ${GIT_error} EQUAL 0)
execute_process(COMMAND ${GIT_EXECUTABLE} name-rev ${${prefix}_WC_REVISION_HASH}
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_WC_REVISION_NAME
OUTPUT_STRIP_TRAILING_WHITESPACE)
endif(NOT ${GIT_error} EQUAL 0)
execute_process(COMMAND ${GIT_EXECUTABLE} config --get remote.origin.url
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_WC_URL
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${GIT_EXECUTABLE} show -s --format="%ci" ${${prefix}_WC_REVISION_HASH}
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_show_output
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX REPLACE "^([0-9][0-9][0-9][0-9]\\-[0-9][0-9]\\-[0-9][0-9]).*"
"\\1" ${prefix}_WC_LAST_CHANGED_DATE "${${prefix}_show_output}")
execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=0
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_WC_LATEST_TAG
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET)
execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_WC_LATEST_TAG_LONG
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET)
set(${prefix}_WC_GITSVN False)
# Check if this git is likely to be a git-svn repository
execute_process(COMMAND ${GIT_EXECUTABLE} config --get-regexp "^svn-remote"
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE git_config_output
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT "${git_config_output}" STREQUAL "")
# In case git-svn is used, attempt to extract svn info
execute_process(COMMAND ${GIT_EXECUTABLE} svn info
WORKING_DIRECTORY ${dir}
TIMEOUT 3
ERROR_VARIABLE git_svn_info_error
OUTPUT_VARIABLE ${prefix}_WC_INFO
RESULT_VARIABLE git_svn_info_result
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(${git_svn_info_result} EQUAL 0)
set(${prefix}_WC_GITSVN True)
string(REGEX REPLACE "^(.*\n)?URL: ([^\n]+).*"
"\\2" ${prefix}_WC_URL "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Revision: ([^\n]+).*"
"\\2" ${prefix}_WC_REVISION "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Repository Root: ([^\n]+).*"
"\\2" ${prefix}_WC_ROOT "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Last Changed Author: ([^\n]+).*"
"\\2" ${prefix}_WC_LAST_CHANGED_AUTHOR "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Last Changed Rev: ([^\n]+).*"
"\\2" ${prefix}_WC_LAST_CHANGED_REV "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Last Changed Date: ([^\n]+).*"
"\\2" ${prefix}_WC_LAST_CHANGED_DATE "${${prefix}_WC_INFO}")
endif(${git_svn_info_result} EQUAL 0)
endif(NOT "${git_config_output}" STREQUAL "")
# If there is no 'remote.origin', default to "NA" value and print a warning message.
if(NOT ${prefix}_WC_URL)
message(WARNING "No remote origin set for git repository: ${dir}" )
set( ${prefix}_WC_URL "NA" )
else()
set(${prefix}_WC_ROOT ${${prefix}_WC_URL})
endif()
endmacro(GIT_WC_INFO)
# Get the version info from the latest tag and set it as the projects version.
#
# Parameters:
# prefix The prefix for all version variables.
#
macro(GIT_VERSION_INFO prefix)
# If this project is not deployed via git, the following version file will
# be used as fallback and needs to be deployed along with the sources. These
# will be generated automatically by depending on the global target
# 'project-version-files', if this project has access to the related git
# repositoy.
set(VERSION_FILE "${PROJECT_SOURCE_DIR}/.version")
if (NOT TARGET project-version-files)
add_custom_target(project-version-files)
endif ()
if (EXISTS "${PROJECT_SOURCE_DIR}/.git")
git_wc_info(${PROJECT_SOURCE_DIR} GIT)
# Add commands and targets for generating the required version file for
# source package deploys. The file will also be to a global property, so
# one is able to access a list of all generated version files, e.g. to
# clean up the source directory after the package has been packed.
add_custom_command(
OUTPUT ${VERSION_FILE}
COMMAND ${GIT_EXECUTABLE} describe --tags > ${VERSION_FILE}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
set_property(GLOBAL APPEND
PROPERTY GIT_GENERATED_VERSION_FILES "${VERSION_FILE}")
add_custom_target(project-version-files-${prefix} DEPENDS ${VERSION_FILE})
add_dependencies(project-version-files project-version-files-${prefix})
# If git is not available (e.g. this git was packed as .tar.gz), try to read
# the version-info from a hidden file in the root directory. This file
# should not be versioned, but added at packaging time.
elseif (EXISTS "${VERSION_FILE}")
file(READ "${VERSION_FILE}" GIT_WC_LATEST_TAG_LONG)
string(STRIP "${GIT_WC_LATEST_TAG_LONG}" GIT_WC_LATEST_TAG_LONG)
# If no version could be gathered by git or the version file, print a
# warning, so the user has to define a version in the backup version file.
else ()
if (${ARGN} EQUAL "REQUIRED")
message(FATAL_ERROR "No version provided by git or .version file")
else ()
message(WARNING "No version provided by git or .version file")
endif()
endif ()
if (GIT_WC_LATEST_TAG_LONG MATCHES "^([^0-9]*)([0-9]+)[.]([0-9]+)(.*)")
set(${prefix}_VERSION ${GIT_WC_LATEST_TAG_LONG} CACHE STRING "" FORCE)
set(${prefix}_VERSION_MAJOR ${CMAKE_MATCH_2} CACHE STRING "" FORCE)
set(${prefix}_VERSION_MINOR ${CMAKE_MATCH_3} CACHE STRING "" FORCE)
if (GIT_WC_LATEST_TAG_LONG MATCHES
"^([^0-9]*)([0-9]+)[.]([0-9]+)[.]([0-9]+)")
set(${prefix}_VERSION_PATCH ${CMAKE_MATCH_4} CACHE STRING "" FORCE)
else ()
set(${prefix}_VERSION_PATCH 0 CACHE STRING "" FORCE)
endif()
if (GIT_WC_LATEST_TAG_LONG MATCHES
"^([^0-9]*)([0-9]+)[.]([0-9]+)(.*)-([0-9]+)-")
set(${prefix}_VERSION_TWEAK ${CMAKE_MATCH_5} CACHE STRING "" FORCE)
else ()
set(${prefix}_VERSION_TWEAK 0 CACHE STRING "" FORCE)
endif()
mark_as_advanced(${prefix}_VERSION
${prefix}_VERSION_MAJOR
${prefix}_VERSION_MINOR
${prefix}_VERSION_PATCH
${prefix}_VERSION_TWEAK)
else ()
message(FATAL_ERROR "Invalid version info: '${GIT_WC_LATEST_TAG_LONG}'.")
endif ()
endmacro()
endif(GIT_FOUND)

View File

@ -41,8 +41,6 @@ tstr IMPLEMENTOR
tint IMPLEMENTOR
tcon IMPLEMENTOR
mob_ld IMPLEMENTOR
pcbang_check IMPLEMENTOR
pcbang_update IMPLEMENTOR
setqf IMPLEMENTOR
delqf IMPLEMENTOR
effect IMPLEMENTOR

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,12 @@
# Ignore compiled quest folder
# Ignore compiled quest folders
object/
pre_qc/
# Quest compiler binaries
qc
qc.core
qc.exe
# Compilde Python files
# Compiled Python files
__pycache__/
*.pyc

View File

@ -1,4 +1,4 @@
#!/usr/local/bin/python
#!/bin/python2
import pre_qc
import os
os.system('rm -rf object')
@ -13,7 +13,7 @@ for line in file('locale_list'):
else:
filename = line
if os.system('./qc '+filename):
if os.system('qc '+filename):
print 'Error occured on compile ' + line
os.system('chmod -R 770 object')
import sys

View File

@ -1,151 +0,0 @@
quest dragon_soul begin
state start begin
when levelup or letter with pc.level >= 30 begin
send_letter(gameforge.dragon_soul._1010_sendLetter)
local v = find_npc_by_vnum(20001)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20001))
end
end
when info or button begin
say(gameforge.dragon_soul._1020_say)
end
when 20001.chat.gameforge.dragon_soul._1030_npcChat with pc.level >= 30 begin
target.delete("__TARGET__")
say_title(mob_name(20001))
say(gameforge.dragon_soul._1040_say)
set_state(state_learning)
end
end
state state_learning begin
when letter begin
send_letter(gameforge.dragon_soul._1050_sendLetter)
end
when info or button begin
say(gameforge.dragon_soul._1060_say)
end
when kill begin
if npc.is_pc() then
return
end
if pc.count_item(30270) < 10 then
if drop_gamble_with_flag("ds_drop") then
game.drop_item_with_ownership(30270, 1, 300)
end
end
end
when 20001.chat.gameforge.dragon_soul._1050_sendLetter begin
say_title(mob_name(20001))
if pc.count_item(30270) >= 10 then
say(gameforge.dragon_soul._1070_say)
pc.remove_item(30270, 10)
ds.give_qualification()
char_log(pc.get_player_id(), 'DS_QUALIFICATION', 'SUCCESS')
pc.give_item2(50255)
local today = math.floor(get_global_time() / 86400)
pc.setf("dragon_soul", "eye_timestamp", today)
pc.setf("dragon_soul", "eye_left", 9)
set_state(state_farming)
else
say(gameforge.dragon_soul._1080_say)
end
end
end
state state_farming begin
when letter begin
send_letter(gameforge.dragon_soul._1090_sendLetter)
end
when info or button begin
say(string.format(gameforge.dragon_soul._1100_say, pc.getf("dragon_soul", "eye_left")))
end
when kill begin
if npc.is_pc() then
return
end
if drop_gamble_with_flag("ds_drop") then
local eye_left = pc.getf("dragon_soul", "eye_left")
local haved_gemstone_number = pc.count_item(30270)
if eye_left > haved_gemstone_number / 10 then
game.drop_item_with_ownership(30270, 1, 300)
end
end
end
when 30270.pick begin
local eye_left = pc.getf("dragon_soul", "eye_left")
if eye_left <= 0 then
return
end
if pc.count_item(30270) >= 10 then
pc.setf("dragon_soul", "eye_left", eye_left - 1)
pc.remove_item(30270, 10)
pc.give_item2(50255)
if 1 == eye_left then
notice_multiline(gameforge.dragon_soul._1110_notice, notice)
set_state(state_closed_season)
end
end
end
when 20001.chat.gameforge.dragon_soul._1120_npcChat begin
say_title(mob_name(20001))
local today = math.floor(get_global_time() / 86400)
if today == pc.getf("dragon_soul", "eye_timestamp") then
say(gameforge.dragon_soul._1130_say)
else
say(gameforge.dragon_soul._1140_say)
pc.setf("dragon_soul", "eye_timestamp", today)
pc.setf("dragon_soul", "eye_left", 10)
end
end
end
state state_closed_season begin
when letter begin
send_letter(gameforge.dragon_soul._1150_sendLetter)
end
when info or button begin
say(gameforge.dragon_soul._1160_say)
local today = math.floor(get_global_time() / 86400)
if today == pc.getf("dragon_soul", "eye_timestamp") then
say(gameforge.dragon_soul._1170_say)
else
say(gameforge.dragon_soul._1180_say)
end
end
when 20001.chat.gameforge.dragon_soul._1090_sendLetter begin
say_title(mob_name(20001))
local today = math.floor(get_global_time() / 86400)
if today == pc.getf("dragon_soul", "eye_timestamp") then
say(gameforge.dragon_soul._1130_say)
else
say(gameforge.dragon_soul._1140_say)
pc.setf("dragon_soul", "eye_timestamp", today)
pc.setf("dragon_soul", "eye_left", 10)
set_state(state_farming)
end
end
end
-- deprecated states. so, jump to new state.
state state_1 begin
when login begin
set_state(state_learning)
end
end
state state_2 begin
when login begin
set_state(state_learning)
end
end
state state_3 begin
when login begin
set_state(state_closed_season)
end
end
end

View File

@ -1,41 +0,0 @@
quest dragon_soul_daily_gift begin
state start begin
function is_event_on()
-- <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> dragon_soul_daily_gift_mgr.quest<73><74><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><EFBFBD><EBBFAA><EFBFBD><EFBFBD> Ȯ<><C8AE>.
local s_time = game.get_event_flag("ds_dg_st")
local e_time = game.get_event_flag("ds_dg_et")
local now = os.time()
return now > s_time and now < e_time
end
when 20001.chat.gameforge.dragon_soul_daily_gift._010_npcChat with dragon_soul_daily_gift.is_event_on() begin
local event_id = game.get_event_flag("ds_dg_id")
if pc.getqf("event_id") != event_id then
say_title(mob_name(20001))
if pc.level < 50 then
say(gameforge.dragon_soul_daily_gift._020_say)
return
elseif 0 == ds.is_qualified() then
say(gameforge.dragon_soul_daily_gift._030_say)
return
else
say(gameforge.dragon_soul_daily_gift._040_say)
pc.setqf("event_id", event_id)
wait()
end
end
say_title(mob_name(20001))
if 0 == get_today_count("dragon_soul_daily_gift", "gift") then
-- <20><><EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
say(gameforge.dragon_soul_daily_gift._050_say)
local gift_vnum = game.get_event_flag("ds_dg_item")
pc.give_item2(gift_vnum)
inc_today_count("dragon_soul_daily_gift", "gift")
else
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><>.
say(gameforge.dragon_soul_daily_gift._060_say)
end
end
end
end

View File

@ -1,90 +0,0 @@
quest dragon_soul_daily_gift_mgr begin
state start begin
function is_event_on()
-- <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> dragon_soul_daily_gift_mgr.quest<73><74><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><EFBFBD><EBBFAA><EFBFBD><EFBFBD> Ȯ<><C8AE>.
local s_time = game.get_event_flag("ds_dg_st")
local e_time = game.get_event_flag("ds_dg_et")
local now = os.time()
return now > s_time and now < e_time
end
function date_getter()
say(gameforge.dragon_soul_gift_mgr._040_say)
say("yy-mm-dd hh:mm")
local date = input()
local _, _, y, m, d, hour, min = string.find(date, "(%d+)-(%d+)-(%d+) (%d+):(%d+)")
return y, m, d, hour, min
end
function print_quest_info()
local s_time = game.get_event_flag("ds_dg_st")
local e_time = game.get_event_flag("ds_dg_et")
local gift_vnum = game.get_event_flag("ds_dg_item")
say(os.date("start time[ENTER] year:%Y, month:%m, day:%d hour:%H minite:%M", s_time))
say(os.date(" end time[ENTER] year:%Y, month:%m, day:%d hour:%H minite:%M", e_time))
say(string.format("gift item[ENTER] vnum : %d", gift_vnum))
say_item_vnum(gift_vnum)
end
when 20001.chat.gameforge.dragon_soul_gift_mgr._010_npcChat with pc.is_gm() begin
local sel = 0
if dragon_soul_daily_gift_mgr.is_event_on() then
say(locale.event_on_going)
local sel = select(locale.event_modify, locale.event_info_print, locale.event_cancel, locale.close)
if 2 == sel then
dragon_soul_daily_gift_mgr.print_quest_info()
return
elseif 3 == sel then
game.set_event_flag("ds_dg_et", 0)
return
elseif 4 == sel then
return
end
end
-- Get start time and end time.
local s_y, s_m, s_d, s_hour, s_min
repeat
say(gameforge.dragon_soul_gift_mgr._020_say)
s_y, s_m, s_d, s_hour, s_min = dragon_soul_daily_gift_mgr.date_getter()
s_y = s_y + 2000
say(string.format("year:%d month:%d day:%d hour:%d min:%d", s_y, s_m, s_d, s_hour, s_min))
until 1 == select(gameforge.locale.yes, gameforge.locale.no)
local e_y, e_m, e_d, e_hour, e_min
repeat
say(gameforge.dragon_soul_gift_mgr._030_say)
e_y, e_m, e_d, e_hour, e_min = dragon_soul_daily_gift_mgr.date_getter()
e_y = e_y + 2000
say(string.format("year:%d month:%d day:%d hour:%d min:%d", e_y, e_m, e_d, e_hour, e_min))
until 1 == select(gameforge.locale.yes, gameforge.locale.no)
local s_time = os.time{year=s_y, month=s_m, day=s_d, hour=s_hour, min=s_min}
local e_time = os.time{year=e_y, month=e_m, day=e_d, hour=e_hour, min=e_min}
-- Get gift item vnum
local gift_vnum = input_number("gift vnum")
-- Print settings and confirm.
say(os.date("start time[ENTER] year:%Y, month:%m, day:%d hour:%H minite:%M", s_time))
say(os.date(" end time[ENTER] year:%Y, month:%m, day:%d hour:%H minite:%M", e_time))
say(string.format("gift item[ENTER] vnum : %d", gift_vnum))
say_item_vnum(gift_vnum)
say(gameforge.dragon_soul_gift_mgr._050_say)
if 2 == select(gameforge.locale.yes, gameforge.locale.no) then
return
end
-- <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> event_id<69><64> <20>ٲٸ<D9B2> <20>ȵ<EFBFBD>.
if 0 == sel then
local event_id = game.get_event_flag("ds_dg_id")
game.set_event_flag("ds_dg_id", event_id + 1)
end
game.set_event_flag("ds_dg_st", s_time)
game.set_event_flag("ds_dg_et", e_time)
game.set_event_flag("ds_dg_item", gift_vnum)
say (gameforge.dragon_soul_gift_mgr._060_say)
end
end
end

View File

@ -1,9 +0,0 @@
quest dragon_soul_refine begin
state start begin
when 20001.chat.gameforge.dragon_soul_refine._010_npcChat with ds.is_qualified() != 0 begin
say_title(mob_name(20001))
say (gameforge.dragon_soul_refine._020_say)
ds.open_refine_window()
end
end
end

View File

@ -1,8 +0,0 @@
quest dragon_soul_shop begin
state start begin
when 20001.chat.gameforge.dragon_soul._100_npcChat with ds.is_qualified() begin
say (gameforge.dragon_soul._110_say)
npc.open_shop(13)
end
end
end

View File

@ -1,103 +0,0 @@
quest event_flame_dungeon_open begin
state start begin
when 20381.chat.gameforge.event_flame_dungeon_open._010_npcChat with pc.get_level() >= 90 begin
say(gameforge.event_flame_dungeon_open._020_say)
wait()
say(gameforge.event_flame_dungeon_open._030_say)
wait()
say(gameforge.event_flame_dungeon_open._080_say)
pc.setqf("event_FD_time", 0)
set_state(run)
end
end
state run begin
when 20381.chat.gameforge.event_flame_dungeon_open._040_npcChat with game.get_event_flag("w21open_event")>0 begin
say(gameforge.event_flame_dungeon_open._050_say)
wait()
local t = pc.getqf("event_FD_time")
local killcount = pc.getqf("kill_done")
if killcount == 0 then
say(gameforge.event_flame_dungeon_open._080_say)
elseif (t==0) or (t+86400 < get_global_time()) then
say(gameforge.event_flame_dungeon_open._060_say)
pc.give_item2(71173, 1)
pc.give_item2(71174, 3)
pc.setqf("event_FD_time", get_global_time())
pc.setqf("kill_count_1", 0)
else
say(gameforge.event_flame_dungeon_open._070_say)
end
end
when letter with game.get_event_flag("w21open_event")>0 begin
send_letter(gameforge.event_flame_dungeon_open._010_npcChat)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
event_flame_dungeon_open.kill_count()
end
when button or info with game.get_event_flag("w21open_event")>0 begin
say_title(gameforge.event_flame_dungeon_open._010_npcChat)
say(string.format(gameforge.levelup._26_say, 100 - pc.getqf("kill_count_1")))
end
when 3101.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
event_flame_dungeon_open.kill_count()
end
when 3102.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
event_flame_dungeon_open.kill_count()
end
when 3103.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
event_flame_dungeon_open.kill_count()
end
when 3104.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
event_flame_dungeon_open.kill_count()
end
when 3105.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
event_flame_dungeon_open.kill_count()
end
when 3190.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
event_flame_dungeon_open.kill_count()
end
when 3191.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
event_flame_dungeon_open.kill_count()
end
when 71173.use begin
pc.warp(614200, 706800, 62)
pc.remove_item(71173, 1)
end
function kill_count()
local total_remain = 100
local remain1 = pc.getqf("kill_count_1")
local remain_count = total_remain - remain1
q.set_counter_value(remain_count)
if total_remain == 0 then
pc.setqf("kill_done", 1)
end
end
end
end

View File

@ -1,717 +0,0 @@
quest flame_dungeon begin
state start begin
--when 20394.click with pc.get_level() >= 90 begin
--pc.give_item2(71175, 1)
--set_state(run)
--end
--end
--state run begin
function setting()
return
{
["bossroom_entry_pos"] = {8109,6867},
["boss_pos"] = {686,637},
["doors_pos"] = {
{320,394},
{293,359},
{333,321},
{378,320},
{400,355},
{394,401}
},
["idoors_pos"] = {
{268,447},
{234,359},
{300,264},
{454,217},
{470,355},
{467,469}
},
["doors_dir"] = {135,90,210,152,90,223},
["idoors_dir"] = {135,90,210,135,90,239},
["dungeon_entry_pos"] = {7762, 6739},-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
["DUNGEON_MAN_bpos"] = {690,722},
["DUNGEON_MAN_pos"] = {354,362},
["LEVEL2_STONE_pos"] = {195,352},
["LEVEL4_TARGET_pos"] = {470,175},
["LEVEL5_STONE_pos"] = {
{486, 345},
{511, 336},
{525, 349},
{521, 365},
{503, 372},
{486, 365},
{500, 354}
},
["LEVEL6_TARGET_pos"] = {511,480},
["outside_entry_pos"] = {6142,7068}, --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ¾<D6B4> <20><><EFBFBD>ִ<EFBFBD> <20><>
["YAK_pos"] = {376, 397} -- <20><>ȯ <20><><EFBFBD><EFBFBD>
}
end
function is_flamed(idx) -- <20><><EFBFBD><EFBFBD><E6BCBA> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>
return idx >= 351 * 10000 and idx < (351 + 1) *10000
end
function make_dungeon() -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
local setting = flame_dungeon.setting()
d.new_jump_party(351, setting.dungeon_entry_pos[1], setting.dungeon_entry_pos[2])
-- d.spawn_mob_ac_dir(20385, setting.DUNGEON_MAN_pos[1], setting.DUNGEON_MAN_pos[2],0)
-- d.spawn_mob(YAK,setting.YAK_pos[1],setting.YAK_pos[2])
d.regen_file("data/dungeon/flame_dungeon/npc.txt")
d.setf("level",0)
for i=1,6 do
d.set_unique("door"..i, d.spawn_mob_ac_dir(20387, setting.doors_pos[i][1], setting.doors_pos[i][2],setting.doors_dir[i]))
end
for i=1,6 do
d.set_unique("idoor"..i, d.spawn_mob_ac_dir(20388, setting.idoors_pos[i][1], setting.idoors_pos[i][2],setting.idoors_dir[i]))
end
d.setf("clear_count",0)
d.setf("started",0)
d.setf("dungeon_enter",0) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>? // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : 0 <20><><EFBFBD><EFBFBD> : 1 // ƨ<><C6A8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѽð<D1BD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
end
function go_boss() -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
local setting = flame_dungeon.setting()
if pc.get_level() < 104 then --<2D><><EFBFBD><EFBFBD>Ȯ<EFBFBD><C8AE>
-- syschat(gameforge.flame_dungeon._580_notice)
say(gameforge.flame_dungeon._580_notice)
return
else
--if pc.getf("main_quest_flame_lv103", "__status")==main_quest_flame_lv103.__COMPLETE__ then -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ Ȯ<><C8AE>
-- -- say_title(gameforge.flame_dungeon._010_say)
say(gameforge.flame_dungeon._010_say)
local warp = select(gameforge.flame_dungeon._020_select,gameforge.flame_dungeon._030_select)
if warp == 1 then
d.setf("level",17)
d.jump_all(setting.bossroom_entry_pos[1],setting.bossroom_entry_pos[2])
d.set_regen_file ("data/dungeon/flame_dungeon/".."fd_fild_boss.txt")
-- d.spawn_mob(20385,setting.DUNGEON_MAN_bpos[1],setting.DUNGEON_MAN_bpos[2])
d.spawn_mob(6091,setting.boss_pos[1],setting.boss_pos[2])
end
-- else
-- -- syschat(gameforge.flame_dungeon._040_notice)
-- say(gameforge.flame_dungeon._040_notice)
-- return
-- end
end
end
function level_clear() -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD>
d.setf("level",0)
d.clear_regen()
d.purge_area(750000,620000,817400,689400) -- <20><><EFBFBD><EFBFBD>ü -- d.purge() <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
end
function clear_timer(inx) -- Ÿ<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
clear_server_timer ("flame_dungeon_0m_left_timer", inx)
clear_server_timer ("flame_dungeon_1m_left_timer", inx)
clear_server_timer ("flame_dungeon_5m_left_timer", inx)
clear_server_timer ("flame_dungeon_10m_left_timer", inx)
clear_server_timer ("flame_dungeon_15m_left_timer", inx)
clear_server_timer ("flame_dungeon_30m_left_timer", inx)
clear_server_timer ("flame_dungeon_45m_left_timer", inx)
clear_server_timer ("killed_A_1", inx)
clear_server_timer ("killed_A_2", inx)
clear_server_timer ("flame_dungeon_ticket_remove", inx)
end
when login begin
local idx = pc.get_map_index()
local setting = flame_dungeon.setting()
if idx == 351 then
pc.warp(setting.outside_entry_pos[1]*100, setting.outside_entry_pos[2] * 100, 62)
elseif flame_dungeon.is_flamed(idx) then -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
------------------------------------------------------------------------------------------------------------------------------------------------------
--<2D>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD>ƿ´<C6BF>. <20>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ <20>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>.
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD>ƿ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E6BCBA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> Ȱ<><C8B0>ȭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
------------------------------------------------------------------------------------------------------------------------------------------------------
-- pc.set_warp_location(0, 0 , 0) --ƨ<><C6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>κ<EFBFBD>
pc.set_warp_location(62, setting.outside_entry_pos[1] , setting.outside_entry_pos[2]) -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ƨ<><C6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
local ticketGroup = {71095, 1, 71130, 1}
if d.getf("dungeon_enter") == 0 then -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϸ<C6B4>
local canPass = false
for i=1, table.getn(ticketGroup),2 do
if pc.count_item(ticketGroup[i]) >= ticketGroup[i+1] then
canPass = true
break
end
end
if get_global_time() - pc.getf("flame_dungeon","exit_time") < 30 * 60 then -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѽð<D1BD><C3B0><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD><EFBFBD><EFBFBD>
notice_multiline(gameforge.flame_dungeon._050_notice,d.notice)
say(gameforge.flame_dungeon._060_say)
timer("flame_dungeon_warp_timer", 5)
elseif not canPass then
notice_multiline(gameforge.flame_dungeon._070_notice,d.notice)
say(gameforge.flame_dungeon._080_say)
timer("flame_dungeon_warp_timer", 5)
elseif pc.get_level() < 100 then
notice_multiline(gameforge.flame_dungeon._090_notice,d.notice)
say(gameforge.flame_dungeon._100_say)
timer("flame_dungeon_warp_timer", 5)
end
elseif pc.getf("flame_dungeon","ticket_delete") == 0 then -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> Ƽ<><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for i=1, table.getn(ticketGroup),2 do
if pc.count_item(ticketGroup[i]) >= ticketGroup[i+1] then
pc.remove_item(ticketGroup[i], ticketGroup[i+1])
break
end
end
pc.setf("flame_dungeon","ticket_delete",1)
end
else
pc.setf("flame_dungeon","ticket_delete",0)
end
end
when flame_dungeon_warp_timer.timer begin
local setting = flame_dungeon.setting()
pc.warp(setting.outside_entry_pos[1]*100, setting.outside_entry_pos[2] * 100, 62)
end
when logout begin
local idx = pc.get_map_index()
if flame_dungeon.is_flamed(idx) then
if d.getf("dungeon_enter") == 1 then -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>α׾ƿ<D7BE>
pc.setf("flame_dungeon","exit_time",get_global_time()) -- <20>ν<EFBFBD><CEBD>Ͻ<EFBFBD> <20>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ٵ<EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> or <20>׳<EFBFBD> ƨ<><C6A8><EFBFBD>Ÿ<EFBFBD> <20>ȱ<EFBFBD><C8B1><EFBFBD>
end
end
end
when 20394.chat.gameforge.flame_dungeon._110_npcChat begin
local setting = flame_dungeon.setting()
if party.is_party() then
-- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>
local party_check = 0
if d.find(party.getf("dungeon_index")) then
party_check = (d.getf_from_map_index("party_leader_pid", party.getf("dungeon_index")) == party.get_leader_pid())
end
if d.find(party.getf("dungeon_index")) and party_check then
if get_global_time() - pc.getf("flame_dungeon","exit_time") < 5 * 60 then -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 5<><35> <20><>?
local dungeon_level = d.getf_from_map_index("level", party.getf("dungeon_index"))
if dungeon_level == 17 then -- <20><><EFBFBD><EFBFBD>
pc.warp(setting.bossroom_entry_pos[1] * 100, setting.bossroom_entry_pos[2] * 100, party.getf("dungeon_index"))
else
pc.warp(setting.dungeon_entry_pos[1] * 100, setting.dungeon_entry_pos[2] * 100, party.getf("dungeon_index"))
end
else -- 5<><35> <20>ʰ<EFBFBD><CAB0>Ͽ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
say_title(mob_name(20394))
say(gameforge.flame_dungeon._590_say)
end
else
local pids = {party.get_member_pids()}
local noTicketMembers = {}
local notEnoughLevelMembers = {}
local ticketCheck = true
local levelCheck = true
local ticketGroup = {71095, 1, 71130, 1}
for i, pid in next, pids, nil do
q.begin_other_pc_block(pid)
local canPass = false
for idx=1, table.getn(ticketGroup),2 do
if pc.count_item(ticketGroup[idx]) >= ticketGroup[idx+1] then
canPass = true
break
end
end
if not canPass then
table.insert(noTicketMembers, pc.get_name())
ticketCheck = false
end
if pc.level < 100 then
table.insert(notEnoughLevelMembers, pc.get_name())
levelCheck = false
end
q.end_other_pc_block()
end
if not ticketCheck then
say_title(mob_name(20394))
say(gameforge.flame_dungeon._610_say)
for i, name in next, noTicketMembers, nil do
say(color(1,1,0), " "..name)
end
if levelCheck then
return
else
wait()
end
end
if not levelCheck then
say_title(mob_name(20394))
say(gameforge.flame_dungeon._630_say)
for i, name in next, notEnoughLevelMembers, nil do
say(color(1,1,0), " "..name)
end
return
end
if party.is_leader() then
say(gameforge.flame_dungeon._120_say)
local warp = select(gameforge.flame_dungeon._130_select,gameforge.flame_dungeon._140_select)
if warp == 1 then
if party.is_map_member_flag_lt("exit_time", get_global_time() - 30 * 60 ) then
flame_dungeon.make_dungeon()
else
--say("test : <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ѽð<D1BD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҽ<CABE><D2BD>ϴ<EFBFBD>.")
say(gameforge.flame_dungeon._600_say)
end
end
party.setf("flame_dungeon_boss_kill_count", 0)
else
say(gameforge.flame_dungeon._150_say)
end
end
else
say(gameforge.flame_dungeon._160_say)
end
end
-- when 20394.chat."Test : <20><><EFBFBD>ҽ<EFBFBD>Ȯ<EFBFBD><C8AE>" with is_test_server() begin -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
-- local setting = flame_dungeon.setting()
-- pc.setf("flame_dungeon","fdRtest",1)
-- pc.warp( setting.dungeon_entry_pos[1]*100, setting.dungeon_entry_pos[2]*100, 351)
-- end
when 20394.chat."TEST : Init time limit init" with is_test_server() begin -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
pc.setf("flame_dungeon","exit_time",get_global_time()-1800)
say("Done")
end
-- when 20385.chat."Test : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>" with is_test_server() begin -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
-- say("<22><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : "..d.count_monster())
-- say("level : "..d.getf("level"))
-- say("Dmap index : "..d.get_map_index())
-- say("Pmap index : "..pc.get_map_index())
-- say("access limit : "..pc.getf("flame_dungeon","exit_time"))
-- say("global time : "..get_global_time())
-- if flame_dungeon.is_flamed(d.get_map_index()) then
-- say("in dungeon") -- is_flamed <20>Լ<EFBFBD> üũ
-- end
-- if d.is_unique_dead("stone1") then
-- say("stone1 is dead")
-- else
-- say("stone1 is not dead")
-- end
-- end
-- when 20385.chat."ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" begin -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
-- say("<22>ʱ<EFBFBD>ȭ <20>մϴ<D5B4>")
-- flame_dungeon.clear_timer(d.get_map_index())
-- flame_dungeon.make_dungeon()
-- end
when 20385.chat."Test : Boss Room" with is_test_server() begin -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
flame_dungeon.go_boss()
end
-- < <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<≯<EFBFBD>>
-- when 20385.chat."<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" begin -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ƨ<><C6A8><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ
-- local setting = flame_dungeon.setting()
-- say("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ðڽ<C3B0><DABD>ϱ<EFBFBD>?")
-- local warp = select("Ȯ<><C8AE>","<22><><EFBFBD><EFBFBD>")
-- if warp == 1 then
-- pc.warp(setting.outside_entry_pos[1]*100, setting.outside_entry_pos[2] * 100, 62)
-- end
-- end
when flame_dungeon_45m_left_timer.server_timer begin
if d.select(get_server_timer_arg()) then
notice_multiline(string.format(gameforge.flame_dungeon._180_notice, 45),d.notice)
notice_multiline(gameforge.flame_dungeon._170_notice,d.notice)
server_timer('flame_dungeon_30m_left_timer', 15*60, get_server_timer_arg())
end
end
when flame_dungeon_30m_left_timer.server_timer begin
if d.select(get_server_timer_arg()) then
notice_multiline(string.format(gameforge.flame_dungeon._180_notice, 30),d.notice)
notice_multiline(gameforge.flame_dungeon._170_notice,d.notice)
server_timer('flame_dungeon_15m_left_timer', 15*60, get_server_timer_arg())
end
end
when flame_dungeon_15m_left_timer.server_timer begin
if d.select(get_server_timer_arg()) then
notice_multiline(string.format(gameforge.flame_dungeon._180_notice, 15),d.notice)
notice_multiline(gameforge.flame_dungeon._170_notice,d.notice)
server_timer('flame_dungeon_5m_left_timer', 10*60, get_server_timer_arg())
end
end
when flame_dungeon_5m_left_timer.server_timer begin
if d.select(get_server_timer_arg()) then
notice_multiline(string.format(gameforge.flame_dungeon._180_notice, 5),d.notice)
notice_multiline(gameforge.flame_dungeon._170_notice,d.notice)
server_timer('flame_dungeon_1m_left_timer', 4*60, get_server_timer_arg())
end
end
when flame_dungeon_1m_left_timer.server_timer begin
if d.select(get_server_timer_arg()) then
notice_multiline(string.format(gameforge.flame_dungeon._180_notice, 1),d.notice)
notice_multiline(gameforge.flame_dungeon._170_notice,d.notice)
server_timer ("flame_dungeon_0m_left_timer", 60, get_server_timer_arg())
end
end
when flame_dungeon_0m_left_timer.server_timer begin
local setting = flame_dungeon.setting()
if d.select(get_server_timer_arg()) then
notice_multiline(gameforge.flame_dungeon._190_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._200_notice,d.notice)
server_timer("dungeon_end_timer",10,d.get_map_index())
end
end
-- <<<< <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>>>>> --
when 20385.chat.gameforge.flame_dungeon._210_npcChat with npc.lock() begin -- '0x'<27><> x<><78>° <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> , '1x'<27><> x<><78>° <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
local setting = flame_dungeon.setting()
if d.getf("started") == 0 then
say(gameforge.flame_dungeon._230_say)
say(gameforge.flame_dungeon._240_say)
wait()
d.setf("started",1)
-- <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> ƨ<>ܹ<EFBFBD><DCB9>ȴµ<C8B4> <20>ڱ⸸ <20><><EFBFBD>Ƽ<EFBFBD> exit timer<65><72> <20><><EFBFBD>µǸ<C2B5> <20>ȵǴϱ<C7B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD><D2B6><EFBFBD> <20><>
server_timer ("flame_dungeon_45m_left_timer",15*60, d.get_map_index())
notice_multiline(gameforge.flame_dungeon._250_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._170_notice,d.notice)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>õ<EFBFBD> ó<><C3B3>
-- <20><><EFBFBD><EFBFBD> <20>Ŀ<EFBFBD> Ƽ<><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ƨ<>ܳ<EFBFBD><DCB3><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> Ÿ<≯Ӹ<CCB8> <20>̿<EFBFBD><CCBF><EFBFBD> Ƽ<><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
local pids = {party.get_member_pids()}
local ticketGroup = {71095, 1, 71130, 1}
for i, pid in next, pids, nil do
q.begin_other_pc_block(pid)
local canPass = false
for idx=1, table.getn(ticketGroup),2 do
if pc.count_item(ticketGroup[idx]) >= ticketGroup[idx+1] then
canPass = true
pc.remove_item(ticketGroup[idx], ticketGroup[idx+1])
break
end
end
if not canPass then
pc.warp(setting.outside_entry_pos[1]*100, setting.outside_entry_pos[2] * 100, 62)
end
q.end_other_pc_block()
end
d.setqf2("flame_dungeon","ticket_delete",1)
d.setf("dungeon_enter",1)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
party.setf("dungeon_index", d.get_map_index())
d.setf("party_leader_pid", party.get_leader_pid())
end
if d.getf("level") < 7 then --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϸ<C6B4>
if d.getf("clear_count") == 6 then -- <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
d.setf("level",7)
else
local rand = number(1,6)--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>湮üũ<C3BC><C5A9> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E8BFAD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC><C5A9>
local setlev = 0
d.setf("level",7) -- Ȥ<><C8A4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>
for i=1,50 do
setlev = setlev + 1
if setlev > 6 then
setlev = 1
end
if not d.is_unique_dead("door"..setlev) then
rand = rand - 1
if rand == 0 then
d.setf("level",setlev)
d.setf("clear_count",d.getf("clear_count")+1)
break
end
end
end
end
end
if d.getf("level") == 1 then
say(gameforge.flame_dungeon._260_say)
notice_multiline(gameforge.flame_dungeon._260_say,d.notice)
d.kill_unique("door1")
d.kill_unique("idoor1")
d.setf("level",11)
d.regen_file ("data/dungeon/flame_dungeon/".."fd_a.txt")
server_timer ("killed_A_1", 12, d.get_map_index())
elseif d.getf("level") == 11 then
say(gameforge.flame_dungeon._270_say)
say_title(gameforge.flame_dungeon._280_sayTitle .. d.count_monster())
elseif d.getf("level") == 2 then
say(gameforge.flame_dungeon._290_say)
say(gameforge.flame_dungeon._300_say)
notice_multiline(gameforge.flame_dungeon._290_say,d.notice)
notice_multiline(gameforge.flame_dungeon._300_say,d.notice)
d.spawn_mob(20386, setting.LEVEL2_STONE_pos[1], setting.LEVEL2_STONE_pos[2]) -- <20><><EFBFBD>μ<EFBFBD> <20><>ȯ
d.kill_unique("door2")
d.kill_unique("idoor2")
d.set_regen_file ("data/dungeon/flame_dungeon/".."fd_b.txt")
d.setf("level",12)
elseif d.getf("level") == 12 then
say(gameforge.flame_dungeon._310_say)
elseif d.getf("level") == 3 then
say(gameforge.flame_dungeon._260_say)
notice_multiline(gameforge.flame_dungeon._260_say,d.notice)
d.kill_unique("door3")
d.kill_unique("idoor3")
d.setf("level",13)
d.regen_file ("data/dungeon/flame_dungeon/".."fd_c.txt")
server_timer ("killed_A_1", 12, d.get_map_index())
elseif d.getf("level") == 13 then
say(gameforge.flame_dungeon._270_say)
say_title(gameforge.flame_dungeon._280_sayTitle..d.count_monster())
elseif d.getf("level") == 4 then -- 474 178
say(gameforge.flame_dungeon._320_notice)
notice_multiline(gameforge.flame_dungeon._320_notice,d.notice)
d.setf("level",14)
d.kill_unique("door4")
d.kill_unique("idoor4")
d.set_regen_file ("data/dungeon/flame_dungeon/".."fd_d.txt")
d.spawn_mob(6051,setting.LEVEL4_TARGET_pos[1],setting.LEVEL4_TARGET_pos[2] ) -- Ÿ<>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
elseif d.getf("level") == 14 then
say(gameforge.flame_dungeon._330_say)
say(gameforge.flame_dungeon._340_say)
elseif d.getf("level") == 5 then -- 510 355
say(gameforge.flame_dungeon._350_say)
say(gameforge.flame_dungeon._360_say)
notice_multiline(gameforge.flame_dungeon._350_say,d.notice)
notice_multiline(gameforge.flame_dungeon._360_say,d.notice)
d.kill_unique("door5")
d.kill_unique("idoor5")
d.setf("level",15)
d.set_regen_file ("data/dungeon/flame_dungeon/".."fd_e.txt")
local vis = { 0,0,0,0,0,0,0}
for i=1,7 do
vis[i] = 0
end
for i = 1, 7 do -- <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD>ȯ
local ran = number(1,7)
local st = 0
for j = 1, 50 do
st = st + 1
if st > 7 then
st = 1
end
if vis[st] == 0 then
ran = ran - 1
if ran == 0 then
vis[st] = 1
d.set_unique("stone5_"..st, d.spawn_mob(20386, setting.LEVEL5_STONE_pos[i][1], setting.LEVEL5_STONE_pos[i][2]))
break
end
end
end
end
elseif d.getf("level") == 15 then
say(gameforge.flame_dungeon._370_say)
elseif d.getf("level") == 6 then -- 507 490
say(gameforge.flame_dungeon._380_say)
notice_multiline(gameforge.flame_dungeon._380_say,d.notice)
d.setf("level",16)
d.kill_unique("door6")
d.kill_unique("idoor6")
d.set_regen_file ("data/dungeon/flame_dungeon/".."fd_f.txt")
d.spawn_mob(8057, setting.LEVEL6_TARGET_pos[1],setting.LEVEL6_TARGET_pos[2]) -- Ÿ<>ٿ<EFBFBD><D9BF><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><>ȯ
elseif d.getf("level") == 16 then
say(gameforge.flame_dungeon._390_say)
say(gameforge.flame_dungeon._400_say)
elseif d.getf("level") == 7 then
-- setskin(NOWINDOW)
flame_dungeon.go_boss()
else
say(gameforge.flame_dungeon._410_say)
end
npc.unlock()
end
when dungeon_end_timer.server_timer begin -- <20><><EFBFBD><EFBFBD> Ÿ<≯<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>°<EFBFBD>)
local setting = flame_dungeon.setting()
if d.select(get_server_timer_arg()) then
flame_dungeon.clear_timer(d.get_map_index())
d.set_warp_location(62, setting.outside_entry_pos[1] , setting.outside_entry_pos[2])
d.exit_all()
d.setf("party_leader_pid", 0)
end
end
when killed_A_1.server_timer begin -- Ÿ<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 (level1,level3)
if d.select(get_server_timer_arg()) then
if d.count_monster() <= 0 then -- 1<><31><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if d.getf("level") == 11 then
notice_multiline(gameforge.flame_dungeon._420_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
else
notice_multiline(gameforge.flame_dungeon._420_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
end
d.setf("level",0)
else
server_timer ("killed_A_1", 6, get_server_timer_arg())
end
end
end
when killed_A_2.server_timer begin -- Ÿ<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 (1<><31> 2 <20><><EFBFBD><EFBFBD><EFBFBD>ư<EFBFBD><C6B0><20><><EFBFBD>ư<EFBFBD>)
if d.select(get_server_timer_arg()) then
if d.count_monster() <= 0 then -- 1<><31><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if d.getf("level") == 11 then
notice_multiline(gameforge.flame_dungeon._420_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
else
notice_multiline(gameforge.flame_dungeon._420_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
end
d.setf("level",0)
else
server_timer ("killed_A_2", 6, get_server_timer_arg())
end
end
end
when kill with flame_dungeon.is_flamed(pc.get_map_index()) and d.getf("level") == 12 begin -- 2<><32><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
local i = number(1, 100) -- 100<30><30><EFBFBD><EFBFBD> 1 Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if i == 1 then
game.drop_item (30329, 1)
end
end
when 20386.take with flame_dungeon.is_flamed(pc.get_map_index()) and item.vnum == 30329 and d.getf("level") == 12 begin -- 2<><32><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ծ<EFBFBD><D4BE><EFBFBD><EFBFBD><EFBFBD>
local i = number(1, 5) -- 5<><35><EFBFBD><EFBFBD> 1 Ȯ<><C8AE><EFBFBD><EFBFBD> <20><>¥ <20><><EFBFBD><EFBFBD>
if i == 1 then
npc.purge()
item.remove()
notice_multiline(gameforge.flame_dungeon._440_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
flame_dungeon.level_clear()
else
item.remove()
say(gameforge.flame_dungeon._450_say)
end
end
when 6051.kill with flame_dungeon.is_flamed(pc.get_map_index()) and d.getf("level") == 14 begin
notice_multiline(gameforge.flame_dungeon._460_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
flame_dungeon.level_clear()
end
when kill with flame_dungeon.is_flamed(pc.get_map_index()) and d.getf("level") == 15 begin -- 5<><35><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
local i = number(1, 30) -- 30<33><30><EFBFBD><EFBFBD> 1 Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if i == 1 then
game.drop_item (30330, 1)
end
end
when 20386.take with flame_dungeon.is_flamed(d.get_map_index()) and item.vnum == 30330 and d.getf("level") == 15 begin -- 5<><35><EFBFBD><EFBFBD> <20><>¥<EFBFBD><C2A5><EFBFBD><EFBFBD> <20>Ծ<EFBFBD><D4BE><EFBFBD><EFBFBD><EFBFBD>
local setting = flame_dungeon.setting()
if npc.get_vid() == d.get_unique_vid("stone5_1") then -- ù<><C3B9>° <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ڸ<EFBFBD><DAB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
npc.purge()
item.remove()
say(gameforge.flame_dungeon._470_say)
d.setf("stonekill",2) -- 2<><32> <20><><EFBFBD><EFBFBD> <20>׿<EFBFBD><D7BF><EFBFBD>
if d.count_monster() < 100 then
d.regen_file ("data/dungeon/flame_dungeon/".."fd_e.txt")
end
elseif npc.get_vid() == d.get_unique_vid("stone5_2") then
if d.getf("stonekill") == 2 then -- 2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>˵<EFBFBD> 2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>Կ<EFBFBD><D4BF><EFBFBD> <20><>
npc.purge()
item.remove()
say(gameforge.flame_dungeon._480_say)
d.setf("stonekill",3)
if d.count_monster() < 100 then
d.regen_file ("data/dungeon/flame_dungeon/".."fd_e.txt")
end
else
item.remove()
say(gameforge.flame_dungeon._490_say)
-- say("2<><32>")
end
elseif npc.get_vid() == d.get_unique_vid("stone5_3") then
if d.getf("stonekill") == 3 then
npc.purge()
item.remove()
say(gameforge.flame_dungeon._500_say)
d.setf("stonekill",4)
if d.count_monster() < 100 then
d.regen_file ("data/dungeon/flame_dungeon/".."fd_e.txt")
end
else
item.remove()
say(gameforge.flame_dungeon._490_say)
-- say("3<><33>")
end
elseif npc.get_vid() == d.get_unique_vid("stone5_4") then
if d.getf("stonekill") == 4 then
npc.purge()
item.remove()
say(gameforge.flame_dungeon._510_say)
d.setf("stonekill",5)
if d.count_monster() < 100 then
d.regen_file ("data/dungeon/flame_dungeon/".."fd_e.txt")
end
else
item.remove()
say(gameforge.flame_dungeon._490_say)
-- say("4<><34>")
end
elseif npc.get_vid() == d.get_unique_vid("stone5_5") then
if d.getf("stonekill") == 5 then
npc.purge()
item.remove()
say(gameforge.flame_dungeon._520_say)
d.setf("stonekill",6)
if d.count_monster() < 100 then
d.regen_file ("data/dungeon/flame_dungeon/".."fd_e.txt")
end
else
item.remove()
say(gameforge.flame_dungeon._490_say)
-- say("5<><35>")
end
elseif npc.get_vid() == d.get_unique_vid("stone5_6") then
if d.getf("stonekill") == 6 then
npc.purge()
item.remove()
say(gameforge.flame_dungeon._530_say)
d.setf("stonekill",7)
if d.count_monster() < 100 then
d.regen_file ("data/dungeon/flame_dungeon/".."fd_e.txt")
end
else
item.remove()
say(gameforge.flame_dungeon._490_say)
-- say("6<><36>")
end
else
if d.getf("stonekill") == 7 then
npc.purge()
item.remove()
notice_multiline(gameforge.flame_dungeon._440_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
flame_dungeon.level_clear()
else
item.remove()
say(gameforge.flame_dungeon._490_say)
-- say("7<><37>")
end
end
end
when 8057.kill with flame_dungeon.is_flamed(d.get_map_index()) and d.getf("level") ==16 begin -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD> <20><>
notice_multiline(gameforge.flame_dungeon._540_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
flame_dungeon.level_clear()
end
when 6091.kill with flame_dungeon.is_flamed(d.get_map_index()) and d.getf("level") ==17 begin -- <20><><EFBFBD><EFBFBD> <20>׿<EFBFBD><D7BF><EFBFBD><EFBFBD><EFBFBD>
notice_multiline(gameforge.flame_dungeon._550_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._560_notice,d.notice)
server_timer("dungeon_end_timer", 60,d.get_map_index())
flame_dungeon.level_clear()
-- <20><>Ƽ<EFBFBD><C6BC> <20><>, <20>߸<EFBFBD>õ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ(104<30><34>, 105<30><35> <20><><EFBFBD><EFBFBD>Ʈ) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD>.
if party.is_party() then
party.setf("flame_dungeon_boss_kill_count", 1)
end
end
end
end

View File

@ -1,541 +0,0 @@
quest main_quest_flame_lv100 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 100 begin
set_state (state1_1)
end
end
-- Ź<><C5B9><EFBFBD><EFBFBD> <20><>ü
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv100._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._010_sendLetter)
say(gameforge.main_quest_flame_lv100._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv100._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv100._030_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv100._040_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv100._060_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv100._070_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv100._080_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_2)
end
when leave begin
--q.done()
end
end
state state1_2 begin
when enter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> óġ <20><> <20><><EFBFBD><EFBFBD>
pc.setqf("kill_count_1", 0)
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv100._090_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv100._010_sendLetter)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
main_quest_flame_lv100.kill_count()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._100_sayTitle)
say(gameforge.main_quest_flame_lv100._110_say)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv98._680_counterName)
say(string.format(gameforge.main_quest_lv98._670_sayReward, 300 - pc.getqf("kill_count_1")))
end
when 20377.chat.gameforge.main_quest_flame_lv100._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv100._120_say)
end
when 2202.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
when 2203.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
when 2204.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
when 2205.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
-- <20><> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> vnum<75><6D> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20>Ͽ<EFBFBD><CFBF><EFBFBD>.
when 7020.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
when 7021.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
when 7022.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
when 7023.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
function kill_count()
local total_remain = 0
local remain1 = 300 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = total_remain + remain1
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state1_3")
end
end
when leave begin
pc.setqf("kill_count_1", 0)
--q.done()
end
end
state state1_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv100._130_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv100._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._010_sendLetter)
say(gameforge.main_quest_flame_lv100._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv100._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv100._150_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 38143000))
pc.give_exp2(38143000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 149000))
pc.change_money(149000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30051),1))
pc.give_item2(30051, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50814),10))
pc.give_item2(50814, 10)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_1)
end
when leave begin
--q.done()
end
end
-- Ź<><C5B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>1-1
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv100._160_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20001)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20001))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._160_sendLetter)
say(gameforge.main_quest_flame_lv100._170_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20001.chat.gameforge.main_quest_flame_lv100._160_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._180_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._190_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv100._200_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._210_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv100._220_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._230_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_2)
end
when leave begin
--q.done()
end
end
state state2_2 begin -- <20><><EFBFBD><20><><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD> <20>κ<EFBFBD>. <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ľ<EFBFBD><C4BE><EFBFBD> <20>ȵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> state <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ϸ<EFBFBD><CFB7><EFBFBD> <20><> <20>ִ<EFBFBD>.
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv100._240_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv100._160_sendLetter)
q.set_counter_name(gameforge.main_quest_flame_lv100._250_say)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._260_sayTitle)
say(gameforge.main_quest_flame_lv100._270_say)
say(gameforge.main_quest_flame_lv100._250_say)
local remain1 = 10 - pc.count_item(90010)
local remain2 = 50 - pc.count_item(30010)
local remain3 = 10 - pc.count_item(30025)
local remain4 = 200 - pc.count_item(51001)
if remain1 < 0 then
remain1 = 0
end
if remain2 < 0 then
remain2 = 0
end
if remain3 < 0 then
remain3 = 0
end
if remain4 < 0 then
remain4 = 0
end
say(string.format(gameforge.main_quest_lv98._690_sayReward,item_name(90010) ,remain1,item_name(30010) ,remain2))
say(string.format(gameforge.main_quest_lv98._690_sayReward,item_name(30025) , remain3,item_name(51001) , remain4))
say()
q.set_counter_value(remain1 + remain2 + remain3 + remain4)
local check = remain1 + remain2 + remain3 + remain4
if check <= 0 then
set_state (state2_3)
end
end
when 20001.chat.gameforge.main_quest_flame_lv100._160_sendLetter begin
if pc.count_item(90010) >= 10 and pc.count_item(30010) >= 50
and pc.count_item(30025) >= 10 and pc.count_item(51001) >= 200 then
pc.remove_item ( 90010,10)
pc.remove_item ( 30010,50)
pc.remove_item ( 30025,10)
pc.remove_item ( 51001,200)
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._280_say)
wait()
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2(48584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 150000))
pc.change_money(150000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30015),2))
pc.give_item2(30015, 2)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70043),1))
pc.give_item2_select(70043)
item.set_socket(2, 60)
set_state (state3_1)
else
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._290_say)
end
end
when leave begin
--q.done()
end
end
state state2_3 begin -- <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ҵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>Ŀ<EFBFBD> <20><><EFBFBD><20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><E7BFA1> <20><><EFBFBD><EFBFBD> <20>ɸ<EFBFBD> state2_2<5F><32> <20>ٽ<EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20>ȴ<EFBFBD>.
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv100._300_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv100._160_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20001)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20001))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._160_sendLetter)
say(gameforge.main_quest_flame_lv100._310_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20001.chat.gameforge.main_quest_flame_lv100._160_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(90010) >= 10 and pc.count_item(30010) >= 50
and pc.count_item(30025) >= 10 and pc.count_item(51001) >= 200 then
pc.remove_item ( 90010,10)
pc.remove_item ( 30010,50)
pc.remove_item ( 30025,10)
pc.remove_item ( 51001,200)
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._280_say)
wait()
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2(48584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 150000))
pc.change_money(150000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30015),2))
pc.give_item2(30015, 2)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70043),1))
pc.give_item2_select(70043)
item.set_socket(2, 60)
say()
set_state (state3_1)
else
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._290_say)
set_state (state2_2)
end
end
when leave begin
--q.done()
end
end
-- Ź<><C5B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>1-2
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv100._320_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20001)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20001))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._320_sendLetter)
say(gameforge.main_quest_flame_lv100._170_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20001.chat.gameforge.main_quest_flame_lv100._320_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._330_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv100._340_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._350_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_2)
end
when leave begin
--q.done()
end
end
state state3_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv100._240_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv100._320_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20016)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20016))
end
q.set_counter_name(gameforge.main_quest_flame_lv100._250_say)
q.set_counter_value(1)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._360_sayTitle)
say(gameforge.main_quest_flame_lv100._370_say)
say(gameforge.main_quest_flame_lv100._250_say)
say(gameforge.main_quest_flame_lv100._380_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20016.chat.gameforge.main_quest_flame_lv100._320_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20016))
say(gameforge.main_quest_flame_lv100._390_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv100._400_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20016))
say(gameforge.main_quest_flame_lv100._410_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv100._420_say)
pc.give_item2(31077, 1)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_3)
end
when 20001.chat.gameforge.main_quest_flame_lv100._320_sendLetter begin
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._430_say)
end
when leave begin
--q.done()
end
end
state state3_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv100._440_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv100._320_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20001)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20001))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._320_sendLetter)
say(gameforge.main_quest_flame_lv100._310_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20001.chat.gameforge.main_quest_flame_lv100._320_sendLetter begin
target.delete("__TARGET__")
pc.remove_item(31077, pc.count_item(31077))
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._450_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 35843000))
pc.give_exp2(35843000)
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 152000))
pc.change_money(152000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50708),10))
pc.give_item2(50708, 10)
say()
say_reward(string.format(gameforge.main_quest_flame_lv99._430_say, 101))
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (__COMPLETE__)
set_quest_state ("main_quest_flame_lv101", "state0")
end
when leave begin
--q.done()
end
end
state __COMPLETE__ begin
when enter begin
--q.done()
end
end
end

View File

@ -1,521 +0,0 @@
quest main_quest_flame_lv101 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 101 begin
set_state (state1_1)
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv101._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._010_sendLetter)
say(gameforge.main_quest_flame_lv101._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv101._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._030_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._040_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._050_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv101._070_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._080_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_2)
end
when leave begin
--q.done()
end
end
state state1_2 begin -- <20>ܼ<EFBFBD> X, <20><><EFBFBD><EFBFBD> X
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv101._090_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._010_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
q.set_counter_value(2)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._100_sayTitle)
say(gameforge.main_quest_flame_lv101._110_say)
say(gameforge.main_quest_lv97._670_counterName)
say(string.format(gameforge.main_quest_lv90._1190_say, item_name(31074), 1))
say(string.format(gameforge.main_quest_lv90._1190_say, item_name(31079), 1))
say()
say_reward(gameforge.main_quest_flame_lv101._120_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv101._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._130_say)
end
when 20393.click begin
say(gameforge.main_quest_flame_lv101._140_say)
set_state (state1_3) -- <20>ܼ<EFBFBD> X, <20><><EFBFBD><EFBFBD> O
end
when kill with pc.get_map_index() >= 351 * 10000 and pc.get_map_index() < (351 + 1) *10000 begin
if number(1,100) == 1 then
pc.give_item2(31074, 1)
set_state (state1_4) -- <20>ܼ<EFBFBD> O, <20><><EFBFBD><EFBFBD> X
end
end
when leave begin
--q.done()
end
end
state state1_3 begin -- <20>ܼ<EFBFBD> X, <20><><EFBFBD><EFBFBD> O
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv101._150_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._010_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
q.set_counter_value(1)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._100_sayTitle)
say(gameforge.main_quest_flame_lv101._110_say)
say(gameforge.main_quest_lv97._670_counterName)
say(string.format(gameforge.main_quest_lv90._1190_say, item_name(31074), 1))
say(string.format(gameforge.main_quest_lv90._1190_say, item_name(31079), 0))
say()
say_reward(gameforge.main_quest_flame_lv101._120_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv101._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._160_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._180_say)
end
when kill with pc.get_map_index() >= 351 * 10000 and pc.get_map_index() < (351 + 1) *10000 begin
if number(1,100) == 1 then
pc.give_item2(31074, 1)
set_state ("state1_5") -- <20>ܼ<EFBFBD> O, <20><><EFBFBD><EFBFBD> O
end
end
when leave begin
--q.done()
end
end
state state1_4 begin -- <20>ܼ<EFBFBD> O, <20><><EFBFBD><EFBFBD> X
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv101._190_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._010_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
q.set_counter_value(1)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._100_sayTitle)
say(gameforge.main_quest_flame_lv101._110_say)
say(gameforge.main_quest_lv97._670_counterName)
say(string.format(gameforge.main_quest_lv90._1190_say, item_name(31074), 0))
say(string.format(gameforge.main_quest_lv90._1190_say, item_name(31079), 1))
say()
say_reward(gameforge.main_quest_flame_lv101._120_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv101._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._200_say)
end
when 20393.click begin
say(gameforge.main_quest_flame_lv101._140_say)
set_state (state1_5)
end
when leave begin
--q.done()
end
end
state state1_5 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv101._210_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._010_sendLetter)
say(gameforge.main_quest_flame_lv101._220_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv101._010_sendLetter begin
target.delete("__TARGET__")
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.remove_item(31074, pc.count_item(31074))
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._230_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv101._250_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(gameforge.main_quest_flame_lv101._260_sayTitle)
say(gameforge.main_quest_flame_lv101._270_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._280_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 37003000))
pc.give_exp2(37003000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 153000))
pc.change_money(153000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30047),2))
pc.give_item2(30047, 2)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(27992),2)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pc.give_item2(27992, 1)
pc.give_item2(27992, 1)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_1)
end
when leave begin
--q.done()
end
end
-- <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ص<EFBFBD>
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv101._290_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._290_sendLetter)
say(gameforge.main_quest_flame_lv101._300_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv101._290_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._310_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._330_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv101._340_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._350_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_2)
end
when leave begin
--q.done()
end
end
state state2_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv101._360_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._290_sendLetter)
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
main_quest_flame_lv101.item_count()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._100_sayTitle)
say(gameforge.main_quest_flame_lv101._520_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv97._670_counterName)
say(string.format(gameforge.main_quest_lv90._1190_say,item_name(31080), 1 - pc.count_item(31080)))
end
when 20380.chat.gameforge.main_quest_flame_lv101._290_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._370_say)
end
when 2206.kill begin
if number(1,100) == 1 then
pc.give_item2(31080, 1)
main_quest_flame_lv101.item_count()
end
end
function item_count()
if pc.count_item(31080) >= 1 then
set_state ("state2_3")
end
q.set_counter_value(1 - pc.count_item(31080))
end
when leave begin
--q.done()
end
end
state state2_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv101._380_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._290_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._290_sendLetter)
say(gameforge.main_quest_flame_lv101._390_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv101._290_sendLetter begin
target.delete("__TARGET__")
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.remove_item(31080, pc.count_item(31080))
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._400_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2( 48584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 154000))
pc.change_money(154000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72024),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ
pc.give_item2_select(72024)
item.set_socket(2, 180)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71094),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.give_item2(71094, 1)
say()
set_state (state2_4)
end
when leave begin
--q.done()
end
end
state state2_4 begin
when enter begin
--<2D>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.setqf("limit_time", get_time() + 60*60*24)
end
when login begin
--<2D>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
local remain_time = pc.getqf("limit_time") - get_time()
timer("time_over", remain_time)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._290_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._290_sendLetter)
say(gameforge.main_quest_flame_lv101._390_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
local remain_time = pc.getqf("limit_time") - get_time()
local left_hour = math.mod(remain_time / (60 * 60), 24);
local left_minute = math.mod(remain_time / 60, 60);
say(string.format(gameforge.main_quest_flame_lv101._410_say, left_hour, left_minute))
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv101._290_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._420_say)
end
when time_over.timer begin
set_state ("state3_1")
end
when leave begin
pc.setqf("limit_time", 0);
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv101._430_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._430_sendLetter)
say(gameforge.main_quest_flame_lv101._300_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv101._430_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._440_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._450_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv101._340_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
set_state (state3_2)
end
when leave begin
--q.done()
end
end
state state3_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv101._470_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._430_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._480_sayTitle)
say(gameforge.main_quest_flame_lv101._490_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv101._430_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._500_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._510_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(gameforge.main_quest_lv27._120_sayTitle)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2( 48584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 156000))
pc.change_money( 156000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72016),1)) -- <20><>3<EFBFBD><33> <20><>
pc.give_item2_select(72016)
item.set_socket(2, 60)
say()
say_title(string.format(gameforge.main_quest_flame_lv99._430_say, 102))
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (__COMPLETE__)
set_quest_state ("main_quest_flame_lv102", "state0")
end
when leave begin
--q.done()
end
end
state __COMPLETE__ begin
when enter begin
--q.done()
end
end
end

View File

@ -1,623 +0,0 @@
quest main_quest_flame_lv102 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 102 begin
set_state (state1_1)
end
end
-- <20><><EFBFBD><EFBFBD>
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv102._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._010_sendLetter)
say(gameforge.main_quest_flame_lv102._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv102._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._030_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._040_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv102._050_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._060_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_2)
end
when leave begin
--q.done()
end
end
state state1_2 begin --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD> <20>κ<EFBFBD>.
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv102._070_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv102._010_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
main_quest_flame_lv102.kill_count()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._080_sayTitle)
say(gameforge.main_quest_flame_lv102._090_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȳ<EFBFBD><C8B3><EFBFBD>
local remain1 = 30 - pc.getqf("mob1")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 30 - pc.getqf("mob2")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 30 - pc.getqf("mob3")
if remain3 < 0 then
remain3 = 0
end
local remain4 = 30 - pc.getqf("mob4")
if remain4 < 0 then
remain4 = 0
end
say(gameforge.main_quest_lv97._670_counterName)
say(string.format(gameforge.main_quest_flame_lv102._100_say,mob_name(6005), remain1,mob_name(6006), remain2))
say(string.format(gameforge.main_quest_flame_lv102._110_say,mob_name(6007), remain3,mob_name(6008), remain4))
end
when 20377.chat.gameforge.main_quest_flame_lv102._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._120_say)
end
when 6005.kill begin
if number(1,1) == 1 then
local kill_count = pc.getqf("mob1")
pc.setqf("mob1", kill_count + 1)
main_quest_flame_lv102.kill_count()
end
end
when 6006.kill begin
if number(1,1) == 1 then
local kill_count = pc.getqf("mob2")
pc.setqf("mob2", kill_count + 1)
main_quest_flame_lv102.kill_count()
end
end
when 6007.kill begin
if number(1,1) == 1 then
local kill_count = pc.getqf("mob3")
pc.setqf("mob3", kill_count + 1)
main_quest_flame_lv102.kill_count()
end
end
when 6008.kill begin
if number(1,1) == 1 then
local kill_count = pc.getqf("mob4")
pc.setqf("mob4", kill_count + 1)
main_quest_flame_lv102.kill_count()
end
end
function kill_count()
local total_remain = 0
local remain1 = 30 - pc.getqf("mob1")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 30 - pc.getqf("mob2")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 30 - pc.getqf("mob3")
if remain3 < 0 then
remain3 = 0
end
local remain4 = 30 - pc.getqf("mob4")
if remain4 < 0 then
remain4 = 0
end
total_remain = remain1 + remain2 + remain3 + remain4
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state1_3")
end
end
when leave begin
--q.done()
end
end
state state1_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv102._130_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv102._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._010_sendLetter)
say(gameforge.main_quest_flame_lv102._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv102._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._150_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._170_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 49584000))
pc.give_exp2( 49584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 157000))
pc.change_money(157000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72723),1)) -- ȭ<><C8AD><EFBFBD><EFBFBD> <20>ູ(<28><>)
pc.give_item2(72723, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70050),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
pc.give_item2(70050, 1)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD> <20>߸<EFBFBD>õ?!
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv102._180_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._180_sendLetter)
say(gameforge.main_quest_flame_lv102._190_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv102._180_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._200_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._220_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._250_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv102._050_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._260_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_2)
end
when leave begin
--q.done()
end
end
state state2_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv102._270_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv102._180_sendLetter)
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._280_sayTitle)
say(gameforge.main_quest_flame_lv102._290_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv97._670_counterName)
say(string.format(gameforge.main_quest_lv90._1190_say,item_name(31081), 10 - pc.count_item(31081)))
say_reward(gameforge.main_quest_flame_lv102._300_sayReward)
end
when 20380.chat.gameforge.main_quest_flame_lv102._180_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._310_say)
end
when kill with pc.get_map_index() >= 351 * 10000 and pc.get_map_index() < (351 + 1) *10000 begin
if number(1,50) == 1 then
pc.give_item2(31081, 1)
main_quest_flame_lv102.item_count()
end
end
function item_count()
if pc.count_item(31081) >= 10 then
set_state ("state2_3")
end
q.set_counter_value(10 - pc.count_item(31081))
end
when leave begin
--q.done()
end
end
state state2_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv102._320_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv102._180_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._180_sendLetter)
say(gameforge.main_quest_flame_lv102._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv102._180_sendLetter begin
target.delete("__TARGET__")
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.remove_item(31081, pc.count_item(31081))
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._330_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(gameforge.main_quest_lv27._120_sayTitle)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 52484000))
pc.give_exp2( 52484000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 159000))
pc.change_money( 159000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72301),5)) -- <20><EFBFBD><E0BAB9> <20><>
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_1)
end
when leave begin
--q.done()
end
end
-- Ź<><C5B9><EFBFBD><EFBFBD> <20><>ȭ
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv102._350_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._350_sendLetter)
say(gameforge.main_quest_flame_lv102._190_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv102._350_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._360_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._380_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._390_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv102._050_say)
set_state (state3_2)
end
when leave begin
--q.done()
end
end
state state3_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv102._410_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv102._350_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._420_sayTitle)
say(gameforge.main_quest_flame_lv102._430_say)
say(gameforge.main_quest_lv97._670_counterName)
local remain1 = 50 - pc.count_item(50819)
local remain2 = 100 - pc.count_item(51001)
if remain1 < 0 then
remain1 = 0
end
if remain2 < 0 then
remain2 = 0
end
say(string.format(gameforge.main_quest_lv98._690_sayReward,item_name(50819) ,remain1,item_name(51001) ,remain2))
q.set_counter_value(remain1 + remain2)
if remain1 + remain2 == 0 then
set_state ("state3_3")
end
end
when 20017.chat.gameforge.main_quest_flame_lv102._350_sendLetter begin
if pc.count_item(50819) >= 50 and pc.count_item(51001) >= 100 then
pc.remove_item ( 50819,50)
pc.remove_item ( 51001,100)
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._440_say)
wait()
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2( 48584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 160000))
pc.change_money( 160000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50708),10)) -- <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
pc.give_item2(50708, 10)
say()
set_state (state4_1)
else
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._450_say)
end
end
when leave begin
--q.done()
end
end
state state3_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv102._460_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv102._350_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20017)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20017))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._350_sendLetter)
say(gameforge.main_quest_flame_lv102._470_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20017.chat.gameforge.main_quest_flame_lv102._350_sendLetter begin
if pc.count_item(50819) >= 50 and pc.count_item(51001) >= 100 then
pc.remove_item ( 50819,50)
pc.remove_item ( 51001,100)
target.delete("__TARGET__")
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._440_say)
wait()
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2( 48584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 160000))
pc.change_money( 160000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50708),10)) -- <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
pc.give_item2(50708, 10)
say()
set_state (state4_1)
else
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._450_say)
set_state (state3_2)
end
end
when leave begin
--q.done()
end
end
-- <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD>
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv102._480_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20017)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20017))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._480_sendLetter)
say(gameforge.main_quest_flame_lv102._490_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20017.chat.gameforge.main_quest_flame_lv102._480_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._500_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv102._510_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._520_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv102._050_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._530_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state4_2)
end
when leave begin
--q.done()
end
end
state state4_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv102._540_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv102._480_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._480_sendLetter)
say(gameforge.main_quest_flame_lv102._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20017.chat.gameforge.main_quest_flame_lv102._480_sendLetter begin
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._550_say)
end
when 20377.chat.gameforge.main_quest_flame_lv102._480_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._560_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv102._570_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._580_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 42584000))
pc.give_exp2(42584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 161000))
pc.change_money( 161000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(76011),1)) -- <20><><EFBFBD><EFBFBD>
pc.give_item2_select(76011)
item.set_socket(2, 60)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50707),5)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pc.give_item2(50707, 5)
say()
say_title(string.format(gameforge.main_quest_flame_lv99._430_say, 103))
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (__COMPLETE__)
set_quest_state ("main_quest_flame_lv103", "state0")
end
when leave begin
--q.done()
end
end
state __COMPLETE__ begin
when enter begin
--q.done()
end
end
end

View File

@ -1,694 +0,0 @@
quest main_quest_flame_lv103 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 103 begin
set_state (state1_1)
end
end
-- <20><><EFBFBD><EFBFBD><E6BCBA> <20><><EFBFBD><EFBFBD>
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv103._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._010_sendLetter)
say(gameforge.main_quest_flame_lv103._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._030_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._040_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv103._220_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._060_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_2)
end
when leave begin
--q.done()
end
end
state state1_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._070_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20393)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20393))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._080_sayTitle)
say(gameforge.main_quest_flame_lv103._090_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._100_say)
end
when 20393.click begin
target.delete("__TARGET__")
say_title(mob_name(20393))
say(gameforge.main_quest_flame_lv103._110_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_3)
end
when leave begin
--q.done()
end
end
state state1_3 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv103._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._010_sendLetter)
say(gameforge.main_quest_flame_lv103._120_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._130_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._150_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._170_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 42554000))
pc.give_exp2( 42554000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 163000))
pc.change_money( 163000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv103._180_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._180_sendLetter)
say(gameforge.main_quest_flame_lv103._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._180_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._190_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._200_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._210_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv103._220_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_2)
end
when leave begin
--q.done()
end
end
state state2_2 begin
when enter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> óġ <20><> <20><><EFBFBD><EFBFBD>
pc.setqf("kill_count_1", 0)
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._230_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._180_sendLetter)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
main_quest_flame_lv103.kill_count_state2_2()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._240_sayTitle)
say(gameforge.main_quest_flame_lv103._250_say)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv98._680_counterName)
say(string.format(gameforge.main_quest_lv98._670_sayReward,"<22><><EFBFBD><20><><EFBFBD><EFBFBD>", 1000 - pc.getqf("kill_count_1")))
say_reward(gameforge.main_quest_flame_lv103._260_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv103._180_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._270_say)
end
when kill with pc.get_map_index() >= 351 * 10000 and pc.get_map_index() < (351 + 1) *10000 begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv103.kill_count_state2_2()
end
function kill_count_state2_2()
local total_remain = 0
local remain1 = 1000 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = remain1
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state2_3")
end
end
when leave begin
pc.setqf("kill_count_1", 0)
--q.done()
end
end
state state2_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._280_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._180_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._180_sendLetter)
say(gameforge.main_quest_flame_lv103._120_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._180_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._290_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 53784000))
pc.give_exp2(53784000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 164000))
pc.change_money(164000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70024),1)) -- <20><EFBFBD><E0BAB9> <20><><EFBFBD><EFBFBD>
pc.give_item2(70024, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30039),3)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pc.give_item2(30039, 3)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD><E6BCBA> <20><>ĩ<EFBFBD>Ÿ<EFBFBD>
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv103._300_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._300_sendLetter)
say(gameforge.main_quest_flame_lv103._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._300_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._310_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv103._220_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_2)
end
when leave begin
--q.done()
end
end
state state3_2 begin
when enter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> óġ <20><> <20><><EFBFBD><EFBFBD>
pc.setqf("kill_count_1", 0)
pc.setqf("kill_count_2", 0)
pc.setqf("kill_count_3", 0)
pc.setqf("kill_count_4", 0)
pc.setqf("kill_count_5", 0)
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._330_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._300_sendLetter)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
main_quest_flame_lv103.kill_count_state3_2()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._340_sayTitle)
say(gameforge.main_quest_flame_lv103._350_say)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv98._680_counterName)
local total_remain = 0
local remain1 = 50 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = total_remain + remain1
local remain2 = 50 - pc.getqf("kill_count_2")
if remain2 < 0 then
remain2 = 0
end
total_remain = total_remain + remain2
local remain3 = 50 - pc.getqf("kill_count_3")
if remain3 < 0 then
remain3 = 0
end
total_remain = total_remain + remain3
local remain4 = 50 - pc.getqf("kill_count_4")
if remain4 < 0 then
remain4 = 0
end
total_remain = total_remain + remain4
local remain5 = 50 - pc.getqf("kill_count_5")
if remain5 < 0 then
remain5 = 0
end
say(string.format(gameforge.main_quest_lv98._690_sayReward ,mob_name(6005), remain1,mob_name(6006), remain2))
say(string.format(gameforge.main_quest_lv98._690_sayReward ,mob_name(6007), remain3,mob_name(6008), remain4))
say(string.format(gameforge.main_quest_lv98._670_sayReward,mob_name(6009), remain5))
say_reward(gameforge.main_quest_flame_lv103._260_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv103._300_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._360_say)
end
when 6005.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv103.kill_count_state3_2()
end
when 6006.kill begin
local kill_count = pc.getqf("kill_count_2")
pc.setqf("kill_count_2", kill_count+1)
main_quest_flame_lv103.kill_count_state3_2()
end
when 6007.kill begin
local kill_count = pc.getqf("kill_count_3")
pc.setqf("kill_count_3", kill_count+1)
main_quest_flame_lv103.kill_count_state3_2()
end
when 6008.kill begin
local kill_count = pc.getqf("kill_count_4")
pc.setqf("kill_count_4", kill_count+1)
main_quest_flame_lv103.kill_count_state3_2()
end
when 6009.kill begin
local kill_count = pc.getqf("kill_count_5")
pc.setqf("kill_count_5", kill_count+1)
main_quest_flame_lv103.kill_count_state3_2()
end
function kill_count_state3_2()
local total_remain = 0
local remain1 = 50 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = total_remain + remain1
local remain2 = 50 - pc.getqf("kill_count_2")
if remain2 < 0 then
remain2 = 0
end
total_remain = total_remain + remain2
local remain3 = 50 - pc.getqf("kill_count_3")
if remain3 < 0 then
remain3 = 0
end
total_remain = total_remain + remain3
local remain4 = 50 - pc.getqf("kill_count_4")
if remain4 < 0 then
remain4 = 0
end
total_remain = total_remain + remain4
local remain5 = 50 - pc.getqf("kill_count_5")
if remain5 < 0 then
remain5 = 0
end
total_remain = total_remain + remain5
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state3_3")
end
end
when leave begin
pc.setqf("kill_count_1", 0)
pc.setqf("kill_count_2", 0)
pc.setqf("kill_count_3", 0)
pc.setqf("kill_count_4", 0)
pc.setqf("kill_count_5", 0)
--q.done()
end
end
state state3_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._370_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._300_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._300_sendLetter)
say(gameforge.main_quest_flame_lv103._120_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._300_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._380_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 54491000))
pc.give_exp2(54491000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 166000))
pc.change_money(166000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72001),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.give_item2_select(72001)
item.set_socket(2, 60)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state4_1)
end
when leave begin
--q.done()
end
end
-- <20>߸<EFBFBD>õ <20><><EFBFBD><EFBFBD>1-1
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv103._390_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._390_sendLetter)
say(gameforge.main_quest_flame_lv103._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._390_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._400_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv103._220_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state4_2)
end
when leave begin
--q.done()
end
end
state state4_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._410_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._390_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._080_sayTitle)
say(gameforge.main_quest_flame_lv103._420_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv103._390_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv103._430_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv103._440_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv103._460_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv103._220_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state4_3)
end
when leave begin
--q.done()
end
end
state state4_3 begin
when enter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> óġ <20><> <20><><EFBFBD><EFBFBD>
pc.setqf("kill_count_1", 0)
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._480_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._390_sendLetter)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
main_quest_flame_lv103.kill_count_state4_3()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._490_sayTitle)
say(gameforge.main_quest_flame_lv103._500_say)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_flame_lv103._510_say)
say(string.format(gameforge.main_quest_lv90._1190_say,mob_name(8057), 1 - pc.getqf("kill_count_1")))
say_reward(gameforge.main_quest_flame_lv103._260_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv103._390_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._520_say)
end
when 8057.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv103.kill_count_state4_3()
end
function kill_count_state4_3()
local total_remain = 0
local remain1 = 1 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = total_remain + remain1
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state4_4")
end
end
when leave begin
pc.setqf("kill_count_1", 0)
--q.done()
end
end
state state4_4 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._530_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._390_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._390_sendLetter)
say(gameforge.main_quest_flame_lv103._120_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._390_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._540_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 49586000))
pc.give_exp2(49586000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 167000))
pc.change_money(167000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(31078),1)) -- <20><>ȭ<EFBFBD><C8AD> -- <20><><EFBFBD><EFBFBD>
pc.give_item2(31078, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30015),2)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǰ
pc.give_item2(30015, 2)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70043),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
pc.give_item2_select(70043)
item.set_socket(2, 60)
say()
say_title(string.format(gameforge.main_quest_flame_lv99._430_say, 104))
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (__COMPLETE__)
set_quest_state ("main_quest_flame_lv104", "state0")
end
when leave begin
--q.done()
end
end
state __COMPLETE__ begin
when enter begin
--q.done()
end
end
end

View File

@ -1,738 +0,0 @@
quest main_quest_flame_lv104 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 104 begin
set_state (state1_1)
end
end
-- <20>߸<EFBFBD>õ <20><><EFBFBD><EFBFBD> 1-2
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv104._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._010_sendLetter)
say(gameforge.main_quest_flame_lv104._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv104._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._030_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._040_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._050_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_2)
end
when leave begin
--q.done()
end
end
state state1_2 begin
when enter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> óġ <20><> <20><><EFBFBD><EFBFBD>
pc.setqf("kill_count_1", 0)
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._060_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._010_sendLetter)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
-- <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߸<EFBFBD>õ<EFBFBD><C3B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20>ϴ<EFBFBD> <20>ڵ<EFBFBD>.
if party.is_party() then
local map_index = pc.get_map_index()
-- <20><><EFBFBD><EFBFBD><E6BCBA> <20><><EFBFBD><EFBFBD><EFBFBD>ߴٴ<DFB4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if map_index >= 351 * 10000 and map_index < (351 + 1) *10000 then
pc.setqf("in_dungeon", 1)
else -- <20><><EFBFBD><EFBFBD><E6BCBA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
if pc.getqf("in_dungeon") == 1 then
if party.getf("flame_dungeon_boss_kill_count") == 1 then
set_state (state1_3)
end
pc.setqf("in_dungeon", 0)
end
end
end
main_quest_flame_lv104.kill_count()
end
when logout begin
if party.is_party() then
if party.getf("flame_dungeon_boss_kill_count") == 0 then
pc.setqf("in_dungeon", 0)
end
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._070_sayTitle)
say(gameforge.main_quest_flame_lv104._080_say)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv98._680_counterName)
say(string.format(gameforge.main_quest_lv98._670_sayReward,mob_name(6091), 1 - pc.getqf("kill_count_1")))
say_reward(gameforge.main_quest_flame_lv104._090_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv104._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._100_say)
end
when 31078.use begin -- <20><>ȭ<EFBFBD><C8AD>
affect.add(apply.MAX_HP, 1000, 60 * 60)
affect.add(apply.DEF_GRADE_BONUS, 25, 60 * 60)
affect.add(apply.MELEE_MAGIC_ATTBONUS_PER, 10, 60 * 60)
pc.remove_item(31078,1)
end
when 6091.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv104.kill_count()
end
function kill_count()
local total_remain = 0
local remain1 = 1 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = total_remain + remain1
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state1_3")
end
end
when leave begin
pc.setqf("kill_count_1", 0)
pc.setqf("in_dungeon", 0)
--q.done()
end
end
state state1_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._120_notice,notice)
say_title(mob_name(6091))
say(gameforge.main_quest_flame_lv104._110_say)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._010_sendLetter)
say(gameforge.main_quest_flame_lv104._130_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv104._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._140_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._150_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._160_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 64491000))
pc.give_exp2(64491000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 168000))
pc.change_money(168000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71026),1)) -- <20><>ö
pc.give_item2(71026, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71025),2)) -- <20>߰<EFBFBD><DFB0><EFBFBD>
pc.give_item2(71025, 1)
pc.give_item2(71025, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70102),5)) -- <20><><EFBFBD><EFBFBD>
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50706),20)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pc.give_item2(50706, 20)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>1-1
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv104._170_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._170_sendLetter)
say(gameforge.main_quest_flame_lv104._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv104._170_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._180_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._190_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._050_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_2)
end
when leave begin
--q.done()
end
end
state state2_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._200_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._170_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._210_sayTitle)
say(gameforge.main_quest_flame_lv104._220_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv104._170_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._230_say)
end
when 20380.chat.gameforge.main_quest_flame_lv104._170_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._240_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._250_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._260_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._270_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._050_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_3)
end
when leave begin
--q.done()
end
end
state state2_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._280_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._170_sendLetter)
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
main_quest_flame_lv104.item_count_state2_3()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._280_notice)
say(gameforge.main_quest_flame_lv104._290_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv97._670_counterName)
local item_count = pc.getqf("item_count_1")
local remain = 5 - item_count
if remain < 0 then
remain = 0
end
say(string.format(gameforge.main_quest_lv90._1190_say,item_name(31082), remain))
say_reward(gameforge.main_quest_flame_lv104._090_sayReward)
main_quest_flame_lv104.item_count_state2_3()
end
when 20380.chat.gameforge.main_quest_flame_lv104._170_sendLetter with pc.count_item(31082) > 0 begin
pc.remove_item(31082, 1)
-- <20><>ǰ <20><><EFBFBD><EFBFBD>
if number(1, 100) <= 90 then
local item_count = pc.getqf("item_count_1")
item_count = item_count + 1
pc.setqf("item_count_1", item_count)
if item_count < 5 then -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
say_title(mob_name(20380))
say(string.format(gameforge.main_quest_flame_lv104._300_say, 5 - item_count))
else -- <20><>ǰ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ä<><C3A4>.
pc.remove_item(31082, pc.count_item(31082))
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._310_say)
wait()
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 57583000))
pc.give_exp2(57583000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 170000))
pc.change_money( 170000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72723),1)) -- ȭ<><C8AD><EFBFBD><EFBFBD> <20>ູ(<28><>)
pc.give_item2(72723, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70050),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
pc.give_item2(70050, 1)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_1)
end
else -- <20><>ǰ <20><><EFBFBD><EFBFBD>
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._320_say)
end
main_quest_flame_lv104.item_count_state2_3()
end
when 6005.kill begin
if number(1,50) == 1 then
pc.give_item2(31082, 1)
main_quest_flame_lv104.item_count_state2_3()
end
end
when 6006.kill begin
if number(1,50) == 1 then
pc.give_item2(31082, 1)
main_quest_flame_lv104.item_count_state2_3()
end
end
when 6007.kill begin
if number(1,50) == 1 then
pc.give_item2(31082, 1)
main_quest_flame_lv104.item_count_state2_3()
end
end
when 6008.kill begin
if number(1,50) == 1 then
pc.give_item2(31082, 1)
main_quest_flame_lv104.item_count_state2_3()
end
end
when 6009.kill begin
if number(1,50) == 1 then
pc.give_item2(31082, 1)
main_quest_flame_lv104.item_count_state2_3()
end
end
function item_count_state2_3()
local item_count = pc.getqf("item_count_1")
local remain = 5 - item_count
if remain <= 0 then
remain = 0
end
q.set_counter_value(remain)
end
when leave begin
pc.setqf("item_count_1", 0)
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>1-2
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv104._330_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._330_sendLetter)
say(gameforge.main_quest_flame_lv104._340_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv104._330_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._350_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._360_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._050_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_2)
end
when leave begin
--q.done()
end
end
state state3_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._370_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._330_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._280_notice)
say(gameforge.main_quest_flame_lv104._380_say)
say(gameforge.main_quest_lv97._670_counterName)
local remain1 = 100 - pc.count_item(50814)
if remain1 < 0 then
remain1 = 0
end
say(string.format(gameforge.main_quest_lv90._1190_say,item_name(50814) ,remain1))
say()
q.set_counter_value(remain1)
if remain1 == 0 then
set_state (state3_3)
end
end
when 20380.chat.gameforge.main_quest_flame_lv104._330_sendLetter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if pc.count_item(50814) >= 100 then
pc.remove_item(50814, 100)
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._390_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._400_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._410_say)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 46581000))
pc.give_exp2(46581000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 171000))
pc.change_money( 171000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30045),2)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ħ
pc.give_item2(30045, 2)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50817),10)) -- <20><>Ȱ<EFBFBD>ɾ<EFBFBD>
pc.give_item2(50817, 10)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state4_1)
else
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._420_say)
end
end
when leave begin
--q.done()
end
end
state state3_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._430_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._330_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._280_notice)
say(gameforge.main_quest_flame_lv104._440_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv104._330_sendLetter begin
target.delete("__TARGET__")
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if pc.count_item(50814) >= 100 then
pc.remove_item(50814, 100)
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._390_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._400_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._410_say)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 46581000))
pc.give_exp2(46581000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 171000))
pc.change_money( 171000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30045),2)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ħ
pc.give_item2(30045, 2)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50817),10)) -- <20><>Ȱ<EFBFBD>ɾ<EFBFBD>
pc.give_item2(50817, 10)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state4_1)
else
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._420_say)
set_state (state3_2)
end
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>1-3
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv104._450_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._450_sendLetter)
say(gameforge.main_quest_flame_lv104._340_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv104._450_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._460_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._470_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._050_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state4_2)
end
when leave begin
--q.done()
end
end
state state4_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._480_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._450_sendLetter)
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
main_quest_flame_lv104.item_count_state4_2()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._450_sendLetter)
say(gameforge.main_quest_flame_lv104._490_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv97._670_counterName)
local remain = 5 - pc.count_item(31024)
if remain < 0 then
remain = 0
end
say(string.format(gameforge.main_quest_lv90._1190_say,item_name(31024), remain))
end
when 20380.chat.gameforge.main_quest_flame_lv104._450_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._500_say)
end
when 3291.kill begin
if number(1,1) == 1 then
pc.give_item2(31024, 1)
main_quest_flame_lv104.item_count_state4_2()
end
end
function item_count_state4_2()
if pc.count_item(31024) >= 5 then
set_state ("state4_3")
end
q.set_counter_value(5 - pc.count_item(31024))
end
when leave begin
--q.done()
end
end
state state4_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._520_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._450_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._450_sendLetter)
say(gameforge.main_quest_flame_lv104._440_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv104._450_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31024) < 5 then
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._500_say)
set_state (state4_2)
else
pc.remove_item(31024, 5)
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._510_say)
wait()
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 45580000))
pc.give_exp2( 45580000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 173000))
pc.change_money(173000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30015),2)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǰ
pc.give_item2(30015, 2)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70043),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
pc.give_item2_select(70043)
item.set_socket(2, 60)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(31083),3)) -- <20><><EFBFBD><EFBFBD> <20>ָӴ<D6B8>
pc.give_item2(31083, 3)
say()
say_title(string.format(gameforge.main_quest_flame_lv99._430_say, 105))
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_quest_state ("main_quest_flame_lv105", "state0")
set_state (__COMPLETE__)
end
end
when leave begin
--q.done()
end
end
state __COMPLETE__ begin
when enter begin
--q.done()
end
end
end

View File

@ -1,541 +0,0 @@
quest main_quest_flame_lv105 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 105 begin
set_state (state1_1)
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv105._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._010_sendLetter)
say(gameforge.main_quest_flame_lv105._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv105._010_sendLetter begin
target.delete("__TARGET__")
pc.remove_item(31083, 3)
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._030_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv105._040_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._050_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._060_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv105._070_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_2)
end
when leave begin
--q.done()
end
end
state state1_2 begin
when enter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> óġ <20><> <20><><EFBFBD><EFBFBD>
pc.setqf("kill_count_1", 0)
pc.setqf("kill_count_2", 0)
pc.setqf("kill_count_3", 0)
pc.setqf("kill_count_4", 0)
pc.setqf("kill_count_5", 0)
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv105._080_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv105._010_sendLetter)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
main_quest_flame_lv105.kill_count_state1_2()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._090_sayTitle)
say(gameforge.main_quest_flame_lv105._100_say)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv98._680_counterName)
local remain1 = 10 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 10 - pc.getqf("kill_count_2")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 10 - pc.getqf("kill_count_3")
if remain3 < 0 then
remain3 = 0
end
local remain4 = 10 - pc.getqf("kill_count_4")
if remain4 < 0 then
remain4 = 0
end
local remain5 = 10 - pc.getqf("kill_count_5")
if remain5 < 0 then
remain5 = 0
end
say(string.format(gameforge.main_quest_lv98._690_sayReward ,mob_name(6005), remain1,mob_name(6006), remain2))
say(string.format(gameforge.main_quest_lv98._690_sayReward ,mob_name(6007), remain3,mob_name(6008), remain4))
say(string.format(gameforge.main_quest_lv98._670_sayReward,mob_name(6009), remain5))
say_reward(gameforge.main_quest_flame_lv105._110_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv105._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._120_say)
end
when 6005.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv105.kill_count_state1_2()
end
when 6006.kill begin
local kill_count = pc.getqf("kill_count_2")
pc.setqf("kill_count_2", kill_count+1)
main_quest_flame_lv105.kill_count_state1_2()
end
when 6007.kill begin
local kill_count = pc.getqf("kill_count_3")
pc.setqf("kill_count_3", kill_count+1)
main_quest_flame_lv105.kill_count_state1_2()
end
when 6008.kill begin
local kill_count = pc.getqf("kill_count_4")
pc.setqf("kill_count_4", kill_count+1)
main_quest_flame_lv105.kill_count_state1_2()
end
when 6009.kill begin
local kill_count = pc.getqf("kill_count_5")
pc.setqf("kill_count_5", kill_count+1)
main_quest_flame_lv105.kill_count_state1_2()
end
function kill_count_state1_2()
local total_remain = 0
local remain1 = 10 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = total_remain + remain1
local remain2 = 10 - pc.getqf("kill_count_2")
if remain2 < 0 then
remain2 = 0
end
total_remain = total_remain + remain2
local remain3 = 10 - pc.getqf("kill_count_3")
if remain3 < 0 then
remain3 = 0
end
total_remain = total_remain + remain3
local remain4 = 10 - pc.getqf("kill_count_4")
if remain4 < 0 then
remain4 = 0
end
total_remain = total_remain + remain4
local remain5 = 10 - pc.getqf("kill_count_5")
if remain5 < 0 then
remain5 = 0
end
total_remain = total_remain + remain5
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state1_3")
end
end
when leave begin
pc.setqf("kill_count_1", 0)
pc.setqf("kill_count_2", 0)
pc.setqf("kill_count_3", 0)
pc.setqf("kill_count_4", 0)
pc.setqf("kill_count_5", 0)
--q.done()
end
end
state state1_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv105._130_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv105._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._010_sendLetter)
say(gameforge.main_quest_flame_lv105._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv105._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._150_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2(48584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 174000))
pc.change_money(174000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30033),3)) -- <09><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>׸<EFBFBD>
pc.give_item2(30033, 3)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD>
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv105._160_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._160_sendLetter)
say(gameforge.main_quest_flame_lv105._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv105._160_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._170_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._180_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv105._070_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_2)
end
when leave begin
--q.done()
end
end
state state2_2 begin
when enter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> óġ <20><> <20><><EFBFBD><EFBFBD>
pc.setqf("kill_count_1", 0)
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv105._190_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv105._160_sendLetter)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
-- <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߸<EFBFBD>õ<EFBFBD><C3B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20>ϴ<EFBFBD> <20>ڵ<EFBFBD>.
if party.is_party() then
local map_index = pc.get_map_index()
-- <20><><EFBFBD><EFBFBD><E6BCBA> <20><><EFBFBD><EFBFBD><EFBFBD>ߴٴ<DFB4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if map_index >= 351 * 10000 and map_index < (351 + 1) *10000 then
pc.setqf("in_dungeon", 1)
else -- <20><><EFBFBD><EFBFBD><E6BCBA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
if pc.getqf("in_dungeon") == 1 then
if party.getf("flame_dungeon_boss_kill_count") == 1 then
set_state (state2_3)
end
pc.setqf("in_dungeon", 0)
end
end
end
main_quest_flame_lv105.kill_count_state2_2()
end
when logout begin
if party.is_party() then
if party.getf("flame_dungeon_boss_kill_count") == 0 then
pc.setqf("in_dungeon", 0)
end
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._200_sayTitle)
say(gameforge.main_quest_flame_lv105._210_say)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv98._680_counterName)
say(string.format(gameforge.main_quest_lv98._670_sayReward,mob_name(6091), 1 - pc.getqf("kill_count_1")))
say_reward(gameforge.main_quest_flame_lv105._110_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv105._160_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._220_say)
end
when 6091.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv105.kill_count_state2_2()
end
function kill_count_state2_2()
local total_remain = 0
local remain1 = 1 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = total_remain + remain1
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state2_3")
end
end
when leave begin
pc.setqf("kill_count_1", 0)
pc.setqf("in_dungeon", 0)
--q.done()
end
end
state state2_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv105._230_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv105._160_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._160_sendLetter)
say(gameforge.main_quest_flame_lv105._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv105._160_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._240_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 60583000))
pc.give_exp2(60583000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 175000))
pc.change_money(175000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71026),1)) -- <20><>ö
pc.give_item2(71026, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71025),2)) -- <20>߰<EFBFBD><DFB0><EFBFBD>
pc.give_item2(71025, 1)
pc.give_item2(71025, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72001),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.give_item2_select(72001)
item.set_socket(2, 60)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv105._250_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._250_sendLetter)
say(gameforge.main_quest_flame_lv105._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv105._250_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._260_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._270_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv105._070_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(31083),1))
pc.give_item2(31083, 1)
set_state (state3_2)
end
when leave begin
--q.done()
end
end
state state3_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv105._280_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv105._250_sendLetter)
q.set_counter_name(gameforge.main_quest_flame_lv105._290_say)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._300_sayTitle)
say(gameforge.main_quest_flame_lv105._310_say)
say_title(gameforge.main_quest_flame_lv105._290_say)
say(gameforge.main_quest_flame_lv105._320_say)
say()
say_reward(gameforge.main_quest_flame_lv105._110_sayReward)
end
when 20390.take with item.vnum == 31083 begin
item.remove()
say_title(gameforge.main_quest_flame_lv105._330_sayTitle)
say(gameforge.main_quest_flame_lv105._340_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_3)
end
when leave begin
--q.done()
end
end
state state3_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv105._350_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv105._250_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._250_sendLetter)
say(gameforge.main_quest_flame_lv105._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv105._250_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._360_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv105._370_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._380_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2(177000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 177000))
pc.change_money(177000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72024),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ
pc.give_item2_select(72024)
item.set_socket(2, 180)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71094),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.give_item2(71094, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71001),5)) -- <09>־ȼ<D6BE><C8BC><EFBFBD>
pc.give_item2(71001, 5)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (__COMPLETE__)
end
when leave begin
--q.done()
end
end
state __COMPLETE__ begin
when enter begin
--q.done()
end
end
end

View File

@ -1,483 +0,0 @@
quest main_quest_flame_lv99 begin
state start begin
when login or levelup or enter with pc.get_level() >= 99 begin
if pc.getf("main_quest_lv98", "__status")==main_quest_lv98.__COMPLETE__ then
set_state ( state0 )
end
end
end
state state0 begin
when login or levelup or enter with pc.level >= 99 begin
set_state (state1_1)
end
end
-- <20>ٽ<EFBFBD> <20><><EFBFBD>۵Ǵ<DBB5> <20><><EFBFBD><EFBFBD> : <20>ӹ<EFBFBD><D3B9>ޱ<EFBFBD>
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv99._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._010_sendLetter)
say(gameforge.main_quest_flame_lv99._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv99._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._030_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._050_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._060_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv99._070_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._080_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_2)
end
when leave begin
--q.done()
end
end
state state1_2 begin -- <20>ٽ<EFBFBD> <20><><EFBFBD>۵Ǵ<DBB5> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(string.format(gameforge.main_quest_flame_lv99._090_notice, 127, 928),notice)
end
when letter begin
target.pos ("__TARGET__",127,928,62,"")
send_letter (gameforge.main_quest_flame_lv99._010_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._100_sayTitle)
say(gameforge.main_quest_flame_lv99._110_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_info)
end
when 20377.chat.gameforge.main_quest_flame_lv99._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._120_say)
end
-- <20><><EFBFBD><EFBFBD> --
when __TARGET__.target.arrive begin
target.delete("__TARGET__")
set_state (state1_3)
end
when leave begin
--q.done()
end
end
state state1_3 begin -- <20>ٽ<EFBFBD> <20><><EFBFBD>۵Ǵ<DBB5> <20><><EFBFBD><EFBFBD> : <20>Ϸ<EFBFBD> & <20><><EFBFBD><EFBFBD><EFBFBD>ޱ<EFBFBD>
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv99._130_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv99._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._010_sendLetter)
say(gameforge.main_quest_flame_lv99._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv99._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._150_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv99._160_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._170_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 33003000))
pc.give_exp2( 33003000)
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 145000))
pc.change_money( 145000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50705),10))
pc.give_item2(50705, 10)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD>1-1 : <20>ӹ<EFBFBD><D3B9>ޱ<EFBFBD>
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv99._180_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._180_sendLetter)
say(gameforge.main_quest_flame_lv99._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv99._180_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._190_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv99._070_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_2)
end
when leave begin
--q.done()
end
end
state state2_2 begin -- <20><><EFBFBD><EFBFBD>1-1 : <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> ã<>ư<EFBFBD><C6B0><EFBFBD> <20><><EFBFBD><EFBFBD>..
when letter begin
send_letter(gameforge.main_quest_flame_lv99._180_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._180_sendLetter)
say(gameforge.main_quest_flame_lv99._200_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv99._180_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._210_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._240_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_3)
end
when leave begin
--q.done()
end
end
state state2_3 begin -- <20><><EFBFBD><EFBFBD>1-1 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
when enter begin
notice_multiline(gameforge.main_quest_flame_lv99._250_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv99._180_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._260_sayTitle)
say(gameforge.main_quest_flame_lv99._270_say)
end
when 20380.chat.gameforge.main_quest_flame_lv99._180_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._280_say)
end
when 2202.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
when 2203.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
when 2204.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
when 2205.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
-- <20><> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> vnum<75><6D> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20>Ͽ<EFBFBD><CFBF><EFBFBD>.
when 7020.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
when 7021.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
when 7022.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
when 7023.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD>1-1 : <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0><EFBFBD>.
state state2_4 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv99._290_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv99._180_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._180_sendLetter)
say(gameforge.main_quest_flame_lv99._200_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv99._180_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._300_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 37003000))
pc.give_exp2(37003000)
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 146000))
pc.change_money(146000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72001),1))
pc.give_item2_select(72001)
item.set_socket(2, 60)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30046),1))
pc.give_item2(30046, 1)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD>1-2 : <20>ӹ<EFBFBD><D3B9>ޱ<EFBFBD>
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv99._310_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._310_sendLetter)
say(gameforge.main_quest_flame_lv99._320_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv99._310_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._330_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv99._340_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._350_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv99._360_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_2)
end
when leave begin
--q.done()
end
end
state state3_2 begin -- <20><><EFBFBD><EFBFBD>1-2
when enter begin
notice_multiline(gameforge.main_quest_flame_lv99._370_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv99._310_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20391)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20391))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._380_sayTitle)
say(gameforge.main_quest_flame_lv99._390_say)
say(gameforge.main_quest_lv97._670_counterName)
say(string.format(gameforge.main_quest_lv90._1190_say,item_name(31076), 1 - pc.count_item(31076)))
--say_reward(locale.target_info)
end
when 20380.chat.gameforge.main_quest_flame_lv99._310_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._400_say)
end
-- <20>¾<EFBFBD><C2BE><EFBFBD> NPC<50><43> Ŭ<><C5AC><EFBFBD>Ͽ<EFBFBD> <20>¾<EFBFBD><C2BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 20391.click begin
target.delete("__TARGET__")
pc.give_item2(31076, 1)
set_state (state3_3)
end
when leave begin
--q.done()
end
end
state state3_3 begin -- <20><><EFBFBD><EFBFBD>1-2
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv99._410_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv99._310_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._310_sendLetter)
say(gameforge.main_quest_flame_lv99._200_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv99._310_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31076) >= 1 then
pc.remove_item ( 31076, pc.count_item(31076))
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._420_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_title(gameforge.main_quest_lv27._120_sayTitle)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 35003000))
pc.give_exp2(35003000)
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 147000))
pc.change_money(147000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30021),1))
pc.give_item2(30021, 1)
say()
say_title(string.format(gameforge.main_quest_flame_lv99._430_say, 100))
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (__COMPLETE__)
set_quest_state ("main_quest_flame_lv100", "state0")
else
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._400_say)
set_state (state3_2)
end
end
when leave begin
--q.done()
end
end
state __COMPLETE__ begin
when enter begin
--q.done()
end
end
end

View File

@ -1,484 +0,0 @@
quest main_quest_lv60 begin
state start begin
when login or levelup or enter with pc.get_level() >= 60 begin
if pc.getf("main_quest_lv55", "__status")==main_quest_lv55.__COMPLETE__ then
set_state ( quest1_begin )
end
end
end
state run begin
when login or levelup or enter with pc.get_level() >= 60 begin
set_state ( quest1_begin )
end
end
state quest1_begin begin
when letter begin --<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>1
send_letter(gameforge.main_quest_lv60._10_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local vid_20011 = find_npc_by_vnum(20011)
if 0 != vid_20011 then
target.vid("__TARGET__", vid_20011, mob_name(20011))
end
end
when button or info begin -- <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>1 <20><><EFBFBD><EFBFBD>
say_title(gameforge.main_quest_lv60._10_sendLetter)
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._20_say)
say("")
end
when __TARGET__.target.click begin
target.delete("__TARGET__")
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._30_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv60._40_say)
say("")
wait()
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._50_say)
say("")
set_state ( quest2_begin )
end
end
state quest2_begin begin
-----------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>2------------
when letter begin
send_letter(gameforge.main_quest_lv60._60_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.main_quest_lv60._60_sendLetter)
say(gameforge.main_quest_lv60._70_say)
say("")
end
when __TARGET__.target.click begin
target.delete("__TARGET__")
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._80_say)
say("")
wait()
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._90_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv60._100_say)
say("")
wait()
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._110_say)
set_state (quest2_ongoing)
end
end
state quest2_ongoing begin --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD>ϰ<EFBFBD> Ź<><C5B9><EFBFBD><EFBFBD> <20>޾ƿ<DEBE><C6BF><EFBFBD><EFBFBD><EFBFBD> <20>̼<EFBFBD><CCBC><EFBFBD> <20>޾Ҵ<DEBE>.
-----------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>2------------
when letter begin
send_letter(gameforge.main_quest_lv60._60_sendLetter)
-- <20><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> npc<70><63> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.)
local v = find_npc_by_vnum(20371)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20371))
end
end
when button or info begin
say_title(gameforge.main_quest_lv60._60_sendLetter)
say(gameforge.main_quest_lv60._120_say)
say("")
end
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>õ<EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
when 20011.gameforge.main_quest_lv60._60_sendLetter begin
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._130_say)
say("")
end
--<2D><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
when 20371.click begin
target.delete("__TARGET__")
say_reward(gameforge.main_quest_lv60._140_sayReward)
pc.give_item2 ( 31001 )
say("")
set_state (quest2_end)
end
end
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ź<><C5B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
state quest2_end begin
-----------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>2------------
when letter begin
send_letter(gameforge.main_quest_lv60._60_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.main_quest_lv60._60_sendLetter)
say(gameforge.main_quest_lv60._150_say)
say("")
end
when __TARGET__.target.click begin
pc.remove_item ( 31001, 1 )
target.delete("__TARGET__")
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._160_say)
say("")
wait()
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._170_say)
say("")
wait()
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._180_say)
say("")
wait()
say_title(locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 980000))
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 175000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71001).." ".."10"..locale.count_postfix))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50721).." ".."10"..locale.count_postfix))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50725).." ".."10"..locale.count_postfix))
say("")
-- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> --
-- <20>̰<EFBFBD><CCB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
pc.give_exp2(980000)
pc.change_money(175000)
pc.give_item2(71001, 10) -- <20>־ȼ<D6BE><C8BC><EFBFBD>
pc.give_item2(50721, 10) -- <20><><EFBFBD><EFBFBD><EFBFBD>Ʋ<EFBFBD>
pc.give_item2(50725, 10) -- <20><>â<EFBFBD><C3A2>
set_state (quest3_begin)
end
end
state quest3_begin begin
-------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>3---------
when letter begin
send_letter(gameforge.main_quest_lv60._220_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.main_quest_lv60._220_sendLetter)
say(gameforge.main_quest_lv60._230_say)
say("")
end
when __TARGET__.target.click begin
target.delete("__TARGET__")
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._240_say)
say("")
set_state (quest3_ongoing1)
end
end
state quest3_ongoing1 begin
-------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>3---------
when letter begin
send_letter(gameforge.main_quest_lv60._220_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD> <20><>ġ<EFBFBD><C4A1> ǥ<><C7A5><EFBFBD>Ѵ<EFBFBD>.--
--------------------------------
--------------------------------
end
when button or info begin
say_title(gameforge.main_quest_lv60._220_sendLetter)
say(gameforge.main_quest_lv60._230_say)
say("")
end
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>õ<EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
when 20011.chat.gameforge.main_quest_lv60._220_sendLetter begin
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._260_say)
say("")
end
--<2D><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1000<30><30><EFBFBD><EFBFBD> 1 Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
when 2305.kill begin
if number (1,100) == 1 then
pc.give_item2 (31002, 1 )
say_reward(gameforge.main_quest_lv60._270_sayReward)
say("")
--3.<2E><><EFBFBD><EFBFBD>
set_state (quest3_end1)
end
end
end
-- <20><><EFBFBD><EFBFBD><EBB9AE><EFBFBD><EFBFBD> <20>ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
state quest3_end1 begin
-------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>3---------
when letter begin
send_letter(gameforge.main_quest_lv60._220_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.main_quest_lv60._220_sendLetter)
say(gameforge.main_quest_lv60._230_say)
say("")
end
when __TARGET__.target.click begin
target.delete("__TARGET__")
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._280_say)
say("")
wait()
--@@@@@@@@@<40><><EFBFBD><EFBFBD>@@@@@@@@@@--
--1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
pc.remove_item (31002, 1 )
say(gameforge.main_quest_lv60._290_say)
say("")
set_state (quest3_ongoing2)
end
end
state quest3_ongoing2 begin
--<2D><> <20><><EFBFBD>¿<EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> '<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>' <20><><EFBFBD><EFBFBD>Ʈ <20>÷<EFBFBD><C3B7>׸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
-- <20>ʱⰪ<CAB1><E2B0AA> 9<><39> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31> <20>ٿ<EFBFBD> 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
-- 0<><30> <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ȭ<EFBFBD><C8AD>Ų<EFBFBD><C5B2>.
when enter begin
pc.setqf("remain_item",9)
end
--*************************--
-------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>3_1---------
when letter begin
send_letter(gameforge.main_quest_lv60._220_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD> <20><>ġ<EFBFBD><C4A1> ǥ<><C7A5><EFBFBD>Ѵ<EFBFBD>.--
--------------------------------
--------------------------------
end
when button or info begin
say_title(gameforge.main_quest_lv60._220_sendLetter)
say(gameforge.main_quest_lv60._230_say)
say("")
q.set_counter(gameforge.main_quest_lv60._250_counter, pc.getqf("remain_item"))
end
-----------------------------
--*************************--
--<2D><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1000<30><30><EFBFBD><EFBFBD> 1 Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF>ش<EFBFBD>.
when 2305.kill begin
if number (1,100) == 1 then
local remain_item_prev = pc.getqf("remain_item")
pc.setqf("remain_item",remain_item_prev-1)
pc.give_item2 (31002, 1 )
notice(string.format(gameforge.main_quest_lv60._300_say,pc.getqf("remain_item")))
-- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ѿ<D1BE><EEB0A3>.
if pc.getqf("remain_item")==0 then
-- <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD> <20><>ġ ǥ<>ø<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD> --
-------------------------------------
-------------------------------------
set_state (quest3_end2)
end
end
end
end
state quest3_end2 begin
--*************************--
-------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>3_1---------
when letter begin
send_letter(gameforge.main_quest_lv60._220_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.main_quest_lv60._220_sendLetter)
say(gameforge.main_quest_lv60._230_say)
say("")
q.set_counter(gameforge.main_quest_lv60._250_counter, pc.getqf("remain_item"))
end
-----------------------------
--*************************--
when __TARGET__.target.click begin
target.delete("__TARGET__")
pc.remove_item (31002, pc.count_item (31002) )
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._310_say)
say("")
wait()
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._320_say)
say("")
wait()
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._330_say)
say("")
wait()
say_title(locale.reward)
----"12345678901234567890123456789012345678901234567890"|
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 3300000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71094).." ".."3"..locale.count_postfix))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30056)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30025)))
say("")
-- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> --
pc.give_exp2(3300000)
pc.give_item2(71094, 3) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> * 3
pc.give_item2(30056) -- <20>Ź<EFBFBD><C5B9><EFBFBD>
pc.give_item2(30025) -- <20>Ź<EFBFBD><C5B9><EFBFBD> <20><><EFBFBD>ָӴ<D6B8>
set_state (quest4_begin)
end
end
state quest4_begin begin
--*************************--
-------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>4-----------
when letter begin
send_letter(gameforge.main_quest_lv60._340_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.main_quest_lv60._340_sendLetter)
say(gameforge.main_quest_lv60._350_say)
say("")
end
-----------------------------
--*************************--
when __TARGET__.target.click begin
target.delete("__TARGET__")
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._360_say)
say("")
wait()
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._370_say)
say("")
wait()
say_title(pc.getname())
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._380_say)
say("")
wait()
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._390_say)
say("")
wait()
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._400_say)
say("")
wait()
----"12345678901234567890123456789012345678901234567890"|
say_reward(gameforge.main_quest_lv60._410_sayReward)
say("")
--@@@ <20><><EFBFBD><EFBFBD> @@@--
--1. <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD>.
clear_letter()
set_quest_state ("main_quest_lv66", "state_0")
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

View File

@ -1,375 +0,0 @@
quest main_quest_lv66 begin
state start begin
end
state state_0 begin
when login or levelup or enter with pc.level >= 66 begin
set_state (state_1)
end
end
state state_1 begin
when letter begin
send_letter (gameforge.main_quest_lv66._10_sendLetter)
local v = find_npc_by_vnum (20011)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
end
when button or info begin
say_title (gameforge.main_quest_lv66._10_sendLetter)
say (gameforge.main_quest_lv66._20_say)
end
when 20011.chat.gameforge.main_quest_lv66._10_sendLetter begin
target.delete("__TARGET__")
say_title ( mob_name(20011))
say(gameforge.main_quest_lv66._30_say)
end
when 1091.kill begin
-- target.delete("__TARGET__")
set_state (state_2)
end
end
state state_2 begin
when letter begin
local v = find_npc_by_vnum (20011)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv66._10_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._10_sendLetter)
say (gameforge.main_quest_lv66._40_say)
end
when 20011.chat.gameforge.main_quest_lv66._10_sendLetter begin
target.delete("__TARGET__")
say_title ( mob_name(20011))
say(gameforge.main_quest_lv66._50_say)
set_state (state_3)
end
end
state state_3 begin
when letter begin
local v = find_npc_by_vnum (20011)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv66._60_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._60_sendLetter)
say(gameforge.main_quest_lv66._70_say)
end
when 20011.chat.gameforge.main_quest_lv66._60_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20011))
say(gameforge.main_quest_lv66._80_say)
wait()
say_title ( mob_name(20011))
say(gameforge.main_quest_lv66._90_say)
wait()
say_title ( mob_name(20011))
say(gameforge.main_quest_lv66._100_say)
wait()
say_title ( mob_name(20011))
say(gameforge.main_quest_lv66._110_say)
wait()
say_title ( mob_name(20011))
say(gameforge.main_quest_lv66._120_say)
wait()
--say_title ("<22><><EFBFBD><EFBFBD> :")
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 5800000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72301).." ".."3"..locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30046)))
pc.give_exp2(5800000)
pc.give_item2(72301) -- <20><EFBFBD><E0BAB9> <20><> * 3
pc.give_item2(72301)
pc.give_item2(72301)
pc.give_item2(30046) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
set_state (state_4)
end
end
state state_4 begin
when letter begin
local v = find_npc_by_vnum (pc_find_square_guard_vid())
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv66._130_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._130_sendLetter)
say (gameforge.main_quest_lv66._140_say)
end
when 11000.chat.gameforge.main_quest_lv66._130_sendLetter or 11002.chat.gameforge.main_quest_lv66._130_sendLetter or 11004.chat.gameforge.main_quest_lv66._130_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(11000))
say(gameforge.main_quest_lv66._150_say)
wait()
say_title(mob_name(11000))
say(gameforge.main_quest_lv66._160_say)
set_state (state_5)
end
end
state state_5 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv66._170_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv66._170_sendLetter)
say (gameforge.main_quest_lv66._140_say)
end
when 20369.chat.gameforge.main_quest_lv66._170_sendLetter begin
target.delete("__TARGET__")
say_title(gameforge.main_quest_lv66._190_sayTitle)
say(gameforge.main_quest_lv66._200_say)
set_state (state_6)
end
end
state state_6 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv66._210_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._210_sendLetter)
say (gameforge.main_quest_lv66._220_say)
end
when 20369.chat.gameforge.main_quest_lv66._210_sendLetter begin
target.delete("__TARGET__")
say_title(gameforge.main_quest_lv66._190_sayTitle)
say(gameforge.main_quest_lv66._230_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv66._240_say)
wait()
say_title(gameforge.main_quest_lv66._190_sayTitle)
say(gameforge.main_quest_lv66._250_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv66._260_say)
wait()
say_title(gameforge.main_quest_lv66._190_sayTitle)
say(gameforge.main_quest_lv66._270_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv66._280_say)
wait()
say_title(mob_name(20369))
say(gameforge.main_quest_lv66._290_say)
wait()
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._310_say)
set_state (state_7)
end
end
state state_7 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv66._320_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._320_sendLetter)
say (gameforge.main_quest_lv66._330_say)
end
when 20369.chat.gameforge.main_quest_lv66._320_sendLetter begin
target.delete("__TARGET__")
say_title( gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._340_say)
wait()
say_title( gameforge.main_quest_lv66._300_sayTitle)
say(string.format(gameforge.main_quest_lv66._350_say,item_name(30033)))
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv66._360_say)
wait()
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._370_say)
set_state (state_8)
end
end
state state_8 begin
when enter begin
pc.setqf ("rgd_kill", 0)
pc.setqf ("state_8_start", get_global_time())
notice_multiline(string.format(gameforge.main_quest_lv66._380_notice, 30), notice)
timer("rgd_kill_timer", 30 * 60 / 2)
end
when letter begin
send_letter (gameforge.main_quest_lv66._390_sendLetter)
local t = pc.getqf ("state_8_start") + 30 * 60 - get_global_time()
q.set_clock(locale.stash.enlarge_1_timer, t)
q.set_counter_name (mob_name (2313))
q.set_counter_value (200)
end
when button or info begin
say_title (gameforge.main_quest_lv66._390_sendLetter)
say (string.format(gameforge.main_quest_lv66._400_say, 200))
local t = pc.getqf ("state_8_start") + 30 * 60 - get_global_time()
if t < 0 then
say(gameforge.main_quest_lv66._410_say)
else
say(string.format(gameforge.main_quest_lv66._420_say, t / 60))
end
end
when 2313.kill begin
if pc.getqf("rgd_kill") >= 200 - 1 then
pc.give_item2 (31003, 1)
pc.setqf ("rgd_kill", 0)
q.set_counter_value (0)
set_state (state_9)
else
pc.setqf ("rgd_kill", pc.getqf ("rgd_kill") + 1)
q.set_counter_value (200 - pc.getqf ("rgd_kill"))
end
end
when rgd_kill_timer.timer begin
local t = pc.getqf ("state_8_start") + 30 * 60 - get_global_time()
notice (string.format(gameforge.main_quest_lv66._420_say, t / 60))
end
end
state state_9 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv66._390_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._390_sendLetter)
say(gameforge.main_quest_lv66._430_say)
end
when 20369.chat.gameforge.main_quest_lv66._390_sendLetter begin
target.delete("__TARGET__")
pc.remove_item (31003, 1)
if (pc.getqf ("state_8_start") + 30 * 60 - get_global_time()) >= 0 then
q.done()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._440_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._450_say)
wait()
say_title (locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 2900000))
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 200000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30033)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50727).." ".."10"..locale.count_postfix))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50728).." ".."10"..locale.count_postfix))
pc.give_exp2(2900000)
pc.change_money(200000)
pc.give_item2(30033) -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>׸<EFBFBD>
pc.give_item2(50727, 10) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 10
pc.give_item2(50728, 10) -- <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD> 10
else
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._460_say)
wait()
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._470_say)
wait()
say_title (locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 2000000))
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 100000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50727).." ".."10"..locale.count_postfix))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50728).." ".."10"..locale.count_postfix))
pc.give_exp2(2000000)
pc.change_money(100000)
pc.give_item2(50727, 10) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 10
pc.give_item2(50728, 10) -- <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD> 10
end
set_state (state_10)
end
end
state state_10 begin
when letter begin
local v = find_npc_by_vnum (20370)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv66._480_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._480_sendLetter)
say(gameforge.main_quest_lv66._490_say)
end
when 20370.chat.gameforge.main_quest_lv66._480_sendLetter begin
target.delete("__TARGET__")
say_title( mob_name(20370))
say(gameforge.main_quest_lv66._500_say)
wait()
say_title ( pc.getname())
say(gameforge.main_quest_lv66._510_say)
wait()
say_title ( mob_name(20370))
say(gameforge.main_quest_lv66._520_say)
wait()
say_title ( pc.getname())
say(gameforge.main_quest_lv66._530_say)
wait()
say_title ( mob_name(20370))
say(gameforge.main_quest_lv66._540_say)
wait()
say_title ( mob_name(20370))
say(gameforge.main_quest_lv66._550_say)
set_state (state_11)
end
end
state state_11 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv66._560_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._560_sendLetter)
say (gameforge.main_quest_lv66._570_say)
end
when 20369.chat.gameforge.main_quest_lv66._560_sendLetter begin
target.delete("__TARGET__")
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._580_say)
wait()
say_title ( pc.getname())
say(gameforge.main_quest_lv66._590_say)
wait()
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._600_say)
wait()
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._610_say)
wait()
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._620_say)
set_state (__COMPLETE__)
q.done()
set_quest_state ("main_quest_lv72", "state_0")
end
end
state __COMPLETE__ begin
end
end

View File

@ -1,220 +0,0 @@
quest main_quest_lv72 begin
state start begin
end
state state_0 begin
when login or levelup or enter with pc.level >= 72 begin
set_state (state_1)
end
end
state state_1 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv72._10_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv72._10_sendLetter)
say (gameforge.main_quest_lv72._20_say)
end
when 20369.chat.gameforge.main_quest_lv72._10_sendLetter begin
target.delete("__TARGET__")
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._30_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._40_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._50_say)
set_state (state_2)
end
end
state state_2 begin
when letter begin
local v = find_npc_by_vnum (20372)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv72._60_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv72._60_sendLetter)
say (gameforge.main_quest_lv72._70_say)
end
when 20372.click begin
target.delete("__TARGET__")
say(gameforge.main_quest_lv72._80_say)
wait()
say_title(mob_name(20372))
say(gameforge.main_quest_lv72._90_say)
wait()
say_title(mob_name(20372))
say(gameforge.main_quest_lv72._100_say)
wait()
say(gameforge.main_quest_lv72._110_say)
pc.give_item2 (30160, 1)
set_state (report_discovery)
end
end
state report_discovery begin
when button or info begin
return
end
when 20369.chat.gameforge.main_quest_lv72._60_sendLetter begin
pc.remove_item (30160)
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._120_say)
wait()
say_title ( pc.getname())
say(gameforge.main_quest_lv72._130_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._140_say)
wait()
say_title ( pc.getname())
say(gameforge.main_quest_lv72._150_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._160_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._170_say)
wait()
if number (1,2) == 1 then
drug = 30009
else
drug = 30083
end
say_title (locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 3100000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70005)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(drug)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30039)))
pc.give_exp2(3100000)
pc.give_item2(70005) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.give_item2(drug) -- <20>˼<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> (+<2B><> <20><><EFBFBD><EFBFBD>)
pc.give_item2(30039) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
set_state (state_4)
end
end
state state_4 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv72._180_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv72._180_sendLetter)
say(gameforge.main_quest_lv72._190_say)
end
when 20369.chat.gameforge.main_quest_lv72._180_sendLetter begin
target.delete("__TARGET__")
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._200_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._210_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._220_say)
pc.setqf ("collect_beads", 0)
set_state (state_5)
end
end
state state_5 begin
when letter begin
send_letter(gameforge.main_quest_lv72._180_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv72._180_sendLetter)
say(gameforge.main_quest_lv72._190_say)
end
when 1105.kill or 1106.kill or 1107.kill begin
if number(1, 100) > 1 then
return
end
local n = pc.getqf ("pass_beads")
local i = pc.count_item (31005)
if n < 50 and pc.count_item (31005) < 50 - n then
notice_multiline(gameforge.main_quest_lv72._240_notice, notice)
notice_multiline(string.format(gameforge.main_quest_lv72._250_notice, 50 - n - 1), notice)
pc.give_item2 (31005, 1)
end
end
when 20369.chat.gameforge.main_quest_lv72._180_sendLetter with pc.count_item (31005) > 0 begin
local now = get_global_time()
local today = now - math.mod (now, 86400)
local can_report_num
if pc.getqf ("last_access_date") != today then
pc.setqf ("last_access_date", today)
pc.setqf ("blue_bead_todays_report_num", 1)
else
local reported_num = pc.getqf("blue_bead_todays_report_num")
if 10 - reported_num <= 0 then
say(gameforge.main_quest_lv72._260_say)
return
else
if not pc.is_gm() then
pc.setqf ("blue_bead_todays_report_num", reported_num + 1)
end
end
end
pc.remove_item (31005, 1)
local n = pc.getqf("pass_beads")
if number (1,100) > 60 then
say_title (mob_name(20369))
say(gameforge.main_quest_lv72._270_say)
return
elseif n < 50 -1 then
pc.setqf ("pass_beads", n + 1)
say_title (gameforge.main_quest_lv66._300_sayTitle)
say (string.format(gameforge.main_quest_lv72._280_say, 50 - n - 1))
else
pc.setqf("pass_beads", 0)
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._290_say)
wait()
say_title (locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 20000000))
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 225000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71035).." ".."3"..locale.count_postfix))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70043)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72024)))
pc.give_exp2(20000000)
pc.change_money(225000)
pc.give_item2(71035)
pc.give_item2(71035)
pc.give_item2(71035)
pc.give_item2(70043)
pc.give_item2(72024)
wait()
say(gameforge.main_quest_lv72._300_say)
set_state (__COMPLETE__)
q.done()
set_quest_state ("main_quest_lv78", "state_0")
end
end
end
state __COMPLETE__ begin
end
end

View File

@ -1,228 +0,0 @@
quest main_quest_lv78 begin
state start begin
end
state state_0 begin
when login or levelup or enter with pc.level >= 78 begin
set_state (state_1)
end
end
state state_1 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv78._10_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv78._10_sendLetter)
say (gameforge.main_quest_lv78._20_say)
end
when 20369.chat.gameforge.main_quest_lv78._10_sendLetter begin
target.delete("__TARGET__")
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._30_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._40_say)
set_state (make_red_bead)
end
end
state make_red_bead begin
when enter begin
pc.setqf ("first_make_time", 0)
end
when 2205.kill or 2204.kill or 2203.kill begin
if number(1, 500) == 1 then
pc.give_item2 (31007, 1)
end
end
when 20369.chat.gameforge.main_quest_lv78._10_sendLetter begin
if pc.count_item (31006) >= 20 then
say_title (mob_name(20369))
say(string.format(gameforge.main_quest_lv78._50_say, 20))
wait()
say_title (locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 36000000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72725)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70024)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70004)))
pc.give_exp2(36000000)
pc.give_item2(72725) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ູ(<28><>)
pc.give_item2(70024) -- <20><EFBFBD><E0BAB9> <20><><EFBFBD><EFBFBD>
pc.give_item2(70004) -- <20>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.remove_item (31006, pc.count_item (31006))
set_state (state_2)
return
end
local t = get_global_time()
local today = t - math.mod (t, 86400)
if pc.getqf ("first_make_time") != today then
pc.setqf ("first_make_time", today)
pc.setqf ("make_count", 0)
end
if pc.count_item (90010) < 1 or pc.count_item (30019) < 1 or
pc.count_item (31007) < 1 then
say_title (gameforge.main_quest_lv66._300_sayTitle)
say (gameforge.main_quest_lv78._60_say)
return
end
local n = pc.getqf ("make_count")
if n >= 7 then
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._70_say)
return
else
pc.remove_item(90010, 1)
pc.remove_item(30019, 1)
pc.remove_item(31007, 1)
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._80_say)
wait()
pc.setqf ("make_count", n + 1)
local n = number (1,100)
if n > 60 then
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._90_say)
wait()
elseif pc.count_item (31006) < 20 then
pc.give_item2 (31006, 1)
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._100_say)
say_item_vnum(31006)
wait ()
else
say_title (mob_name(20369))
say(string.format(gameforge.main_quest_lv78._50_say, 20))
wait()
say_title (locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 36000000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72725)))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70024)))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70004)))
pc.give_exp2(36000000)
pc.give_item2(72725) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ູ(<28><>)
pc.give_item2(70024) -- <20><EFBFBD><E0BAB9> <20><><EFBFBD><EFBFBD>
pc.give_item2(70004) -- <20>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.remove_item (31006, pc.count_item (31006))
set_state (state_2)
end
end
end
end
state state_2 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv78._110_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv78._110_sendLetter)
say(gameforge.main_quest_lv78._120_say)
end
when 20369.chat.gameforge.main_quest_lv78._110_sendLetter with pc.count_item (31004) < 100 begin
target.delete("__TARGET__")
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._130_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._140_say)
end
when 2315.kill or 2314.kill begin
if number (1, 300) == 1 then
pc.give_item2 (31004, 1)
local n = pc.count_item (31004)
if n < 100 then
notice (string.format(gameforge.main_quest_lv78._150_say, 100 - n))
else
notice_multiline(gameforge.main_quest_lv78._160_notice, notice)
end
end
end
when 20369.chat.gameforge.main_quest_lv78._110_sendLetter with pc.count_item (31004) >= 100 begin
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._170_say)
wait()
say_title ( pc.getname())
say(gameforge.main_quest_lv78._180_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._190_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._200_say)
wait()
say_title (locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48000000))
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 230000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72729)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70035)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70003)))
pc.give_exp2(48000000)
pc.change_money(230000)
pc.give_item2(72729) -- ȭ<><C8AD><EFBFBD><EFBFBD> <20>ູ(<28><>)
pc.give_item2(70035) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö
pc.give_item2(70003) -- <20><><EFBFBD><EFBFBD>
pc.remove_item (31004, pc.count_item (31004))
set_state (state_3)
end
end
state state_3 begin
when letter begin
local v = find_npc_by_vnum (20018)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv78._210_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv78._210_sendLetter)
say(gameforge.main_quest_lv78._220_say)
end
when 20018.chat.gameforge.main_quest_lv78._210_sendLetter begin
target.delete("__TARGET__")
say_title ( mob_name(20018))
say(gameforge.main_quest_lv78._230_say)
wait()
say_title ( pc.get_name ())
say(gameforge.main_quest_lv78._240_say)
wait()
say_title ( mob_name(20018))
say(gameforge.main_quest_lv78._250_say)
wait()
say_title ( pc.get_name ())
say(gameforge.main_quest_lv78._260_say)
wait()
say_title ( mob_name(20018))
say(gameforge.main_quest_lv78._270_say)
wait()
say_title ( pc.get_name ())
say(gameforge.main_quest_lv78._280_say)
wait()
say_title ( mob_name(20018))
say(gameforge.main_quest_lv78._290_say)
wait()
say_title(locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30319).." ".."2"..locale.count_postfix))
pc.give_item2(30319,2)
wait()
say(gameforge.main_quest_lv78._300_say)
set_state (__COMPLETE__)
q.done()
set_quest_state("main_quest_lv84", "state_0")
end
end
state __COMPLETE__ begin
end
end

View File

@ -1,151 +0,0 @@
quest main_quest_lv84 begin
state start begin
end
state state_0 begin
when login or levelup or enter with pc.level >= 84 begin
set_state (state_1)
end
end
state state_1 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv84._10_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv84._10_sendLetter)
say(gameforge.main_quest_lv84._20_say)
end
when 20369.chat.gameforge.main_quest_lv84._10_sendLetter begin
target.delete("__TARGET__")
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._30_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._40_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._50_say)
pc.give_item2(31008)
set_state (state_4)
end
end
state state_4 begin
when letter begin
send_letter(gameforge.main_quest_lv84._60_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv84._60_sendLetter)
say(gameforge.main_quest_lv84._70_say)
end
when 31008.use with pc.get_map_index() >= 2160000 and pc.get_map_index() < 2170000 begin --and pc.getf("devilcatacomb_zone", "level") == 5 begin
party.give_buff(303, POINT_ATT_SPEED, 20, 13, 1800, 0, true, true)
party.give_buff(303, POINT_MOV_SPEED, 20, 12, 1800, 0, true, true)
party.give_buff(303, POINT_CASTING_SPEED, 20, 0, 1800, 0, true, true)
party.give_buff(303, POINT_ATTBONUS_MONSTER, 30, 0, 1800, 0, true, true)
party.give_buff(303, POINT_MAX_HP_PCT, 10, 0, 1800, 0, true, true)
party.give_buff(303, POINT_MAX_SP_PCT, 10, 0, 1800, 0, true, true)
say(gameforge.main_quest_lv84._80_say)
end
when 2591.kill begin
say_title(locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 63000000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71026).." ".."2"..locale.count_postfix))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70051)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70050)))
pc.give_exp2(63000000)
pc.change_money(250000)
pc.give_item2(71026) -- <20><>ö
pc.give_item2(71026) -- <20><>ö
pc.give_item2(70051) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
pc.give_item2(70050) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
set_state (state_2)
end
end
state state_2 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv84._90_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv84._90_sendLetter)
say (gameforge.main_quest_lv84._100_say)
end
when 20369.chat.gameforge.main_quest_lv84._90_sendLetter begin
target.delete("__TARGET__")
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._110_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._120_say)
end
when 2597.kill begin
say_reward(gameforge.main_quest_lv84._130_sayReward)
say(gameforge.main_quest_lv84._140_say)
set_state (state_3)
end
end
state state_3 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv84._150_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv84._150_sendLetter)
say (gameforge.main_quest_lv84._160_say)
end
when 20369.chat.gameforge.main_quest_lv84._150_sendLetter begin
target.delete("__TARGET__")
say_title (" ")
say(gameforge.main_quest_lv84._170_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._180_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._190_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._200_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._210_say)
wait()
say_title (locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 84000000))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 250000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(71025).." ".."2"..locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70038)))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(71107)))
pc.give_exp2(84000000)
pc.change_money(250000)
pc.give_item2(71025) -- <20>߰<EFBFBD><DFB0><EFBFBD>
pc.give_item2(71025) -- <20>߰<EFBFBD><DFB0><EFBFBD>
pc.give_item2(70038) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.give_item2(71107) -- õ<><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
end
end

File diff suppressed because it is too large Load Diff

View File

@ -1,768 +0,0 @@
quest main_quest_lv91 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 91 begin
set_state (state1_1)
end
end
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
state state1_1 begin
when letter begin
send_letter (gameforge.main_quest_lv91._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv91._010_sendLetter)
say(gameforge.main_quest_lv91._020_say)
end
when 20378.chat.gameforge.main_quest_lv91._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._030_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._050_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._060_say)
wait()
set_state (state1_2)
end
end
state state1_2 begin
when letter begin
send_letter(gameforge.main_quest_lv91._010_sendLetter)
--q.set_counter_name(locale.main_quest_lv91.remain_mob)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv91._070_sayTitle)
say(gameforge.main_quest_lv91._080_say)
-- say()
-- say_reward(locale.main_quest_lv91.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
--say_title(gameforge.main_quest_lv91._760_say)
--local remain = 10 - pc.getqf("mob1_1_killed")
--if remain < 0 then
-- remain = 0
--end
--q.set_counter_value(remain)
--say_title(string.format(gameforge.main_quest_lv91._770_say,mob_name(3205),remain))
end
--[[
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv91._010_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._520_say)
end
--]]
when 3205.kill begin
local mob1_1_killed = pc.getqf("mob1_1_killed")
if mob1_1_killed < 10 then
pc.setqf("mob1_1_killed", mob1_1_killed + 1)
local remain = 10 - pc.getqf("mob1_1_killed")
if remain < 0 then
remain = 0
end
--q.set_counter_value(remain)
if remain == 0 then
say_title(mob_name(3205))
say(gameforge.main_quest_lv91._100_say)
notice_multiline(gameforge.main_quest_lv91._090_1_notice,notice)
notice_multiline(gameforge.main_quest_lv91._090_2_notice,notice)
set_state (state1_3)
end
end
end
end
state state1_3 begin
when letter begin
send_letter(gameforge.main_quest_lv91._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
--q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv91._010_sendLetter)
say(gameforge.main_quest_lv91._110_say)
end
when 20378.chat.gameforge.main_quest_lv91._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._120_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._130_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._150_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 18803050))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30051),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(50814),10,locale.count_postfix))
say("")
pc.give_exp2(18803050)
--pc.change_money(0)
pc.give_item2(30051, 1)
pc.give_item2(50814, 10)
set_state (state2_1)
end
end
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_lv91._160_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv91._160_sendLetter)
say(gameforge.main_quest_lv91._170_say)
end
when 20378.chat.gameforge.main_quest_lv91._160_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._180_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._190_say)
set_state (state2_2)
end
end
state state2_2 begin
when letter begin
send_letter(gameforge.main_quest_lv91._160_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv91._200_sayTitle)
say(gameforge.main_quest_lv91._210_say)
say_item_vnum(31075)
-- say()
-- say_reward(locale.main_quest_lv91.pos_info)
-- say()
-- say()
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv91._160_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._220_say)
end
when 3291.kill begin
if number(1,500) == 1 then
if pc.count_item(31075) < 1 then
notice_multiline(gameforge.main_quest_lv91._230_1_notice,notice)
notice_multiline(gameforge.main_quest_lv91._230_2_notice,notice)
pc.give_item2(31075, 1)
set_state (state2_3)
end
end
end
end
-- <20><><EFBFBD><EFBFBD>Ʈ <20>Ϸ<EFBFBD>
state state2_3 begin
when letter begin
send_letter(gameforge.main_quest_lv91._160_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv91._160_sendLetter)
say(gameforge.main_quest_lv91._240_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3291.kill begin
if number(1,500) == 1 then
if pc.count_item(31075) < 1 then
notice_multiline(gameforge.main_quest_lv91._230_1_notice,notice)
notice_multiline(gameforge.main_quest_lv91._230_2_notice,notice)
pc.give_item2(31075, 1)
end
end
end
when 20378.chat.gameforge.main_quest_lv91._160_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31075) >= 1 then
pc.remove_item ( 31075, pc.count_item(31075))
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._250_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._260_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 24873650))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(50722),20,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72016),1,locale.count_postfix))
say("")
pc.give_exp2(24873650)
--pc.change_money(0)
pc.give_item2(50722, 20)
pc.give_item2_select(72016)
item.set_socket(2, 120)
set_state (state3_1)
else
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._220_say)
set_state (state2_2)
end
end
end
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_lv91._270_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv91._270_sendLetter)
say(gameforge.main_quest_lv91._280_say)
end
when 20380.chat.gameforge.main_quest_lv91._270_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._290_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._300_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._310_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._320_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._330_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._340_say)
set_state (state3_2)
end
end
state state3_2 begin
when letter begin
send_letter(gameforge.main_quest_lv91._270_sendLetter)
q.set_counter_name(gameforge.main_quest_lv90._1180_say)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv91._350_sayTitle)
say(gameforge.main_quest_lv91._360_say)
say_item_vnum(31018)
say(gameforge.main_quest_lv90._1180_say)
local remain = 10 - pc.getqf("item3_1_checked")
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
say_reward(string.format(gameforge.main_quest_lv90._1190_say,item_name(31018),remain))
-- say()
-- say_reward(locale.main_quest_lv91.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20380.chat.gameforge.main_quest_lv91._270_sendLetter with pc.count_item(31018) > 0 begin
if pc.count_item(31018) > 0 then
pc.remove_item(31018, 1)
if number(1, 100 ) <= 70 then -- <20><>ǰ <20><><EFBFBD><EFBFBD>
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._380_say)
pc.setqf("item3_1_checked", pc.getqf("item3_1_checked") + 1)
local remain = 10 - pc.getqf("item3_1_checked")
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
if pc.getqf("item3_1_checked") >= 10 then -- <20><>ǰ <20><><EFBFBD><EFBFBD> <20>޼<EFBFBD>
pc.remove_item(31018, pc.count_item(31018))
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._390_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 25805450))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 214000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30009),2,locale.count_postfix))
say("")
pc.give_exp2(25805450)
pc.change_money(214000)
pc.give_item2(30009, 2)
set_state (state4_1)
q.set_counter_name("")
else -- <20><>ǰ <20><><EFBFBD><EFBFBD> <20>̴<EFBFBD>
say(string.format(gameforge.main_quest_lv91._400_say,remain))
end
else -- <20><>ǰ <20><><EFBFBD><EFBFBD>
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._370_say)
end
end
end
when 3601.kill or 3602.kill or 3603.kill or 3604.kill or 3605.kill begin
if number(1,300) == 1 then
pc.give_item2(31018, 1)
notice_multiline(gameforge.main_quest_lv91._410_1_notice,notice)
notice_multiline(gameforge.main_quest_lv91._410_2_notice,notice)
end
end
end
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_lv91._420_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv91._420_sendLetter)
say(gameforge.main_quest_lv91._430_say)
end
when 20380.chat.gameforge.main_quest_lv91._420_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._440_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._450_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._460_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._470_say)
set_state (state4_2)
end
end
state state4_2 begin
when letter begin
send_letter(gameforge.main_quest_lv91._420_sendLetter)
q.set_counter_name(gameforge.main_quest_lv90._1180_say)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv91._480_sayTitle)
say(gameforge.main_quest_lv91._490_say)
say_item_vnum(31019)
say(gameforge.main_quest_lv90._1180_say)
local remain = 3 - pc.getqf("item4_1_checked")
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
say_reward(string.format(gameforge.main_quest_lv90._1190_say,item_name(31019),remain))
-- say()
-- say_reward(locale.main_quest_lv91.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20380.chat.gameforge.main_quest_lv91._420_sendLetter with pc.count_item(31019) > 0 begin
if pc.count_item(31019) > 0 then
local cur_t = get_global_time() - 60 * 60 * 9
local today_date = cur_t - math.mod(cur_t,86400)
local last_checked_date = pc.getqf("last_checked_date")
if today_date ~= last_checked_date then
pc.setqf("last_checked_date", today_date)
pc.setqf("today_item4_1_checked",0)
end
local today_item4_1_checked = pc.getqf("today_item4_1_checked")
if today_item4_1_checked >= 1 then --1<><31> <20><>ǰ <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD>
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._500_say)
else -- <20><>ǰ <20>õ<EFBFBD>.
pc.remove_item(31019, 1)
if number(1, 100 ) <= 70 then -- <20><>ǰ <20><><EFBFBD><EFBFBD>
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._510_say)
pc.setqf("item4_1_checked", pc.getqf("item4_1_checked") + 1)
pc.setqf("today_item4_1_checked", pc.getqf("today_item4_1_checked") + 1)
local remain = 3 - pc.getqf("item4_1_checked")
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
if pc.getqf("item4_1_checked") >= 3 then -- <20><>ǰ <20><><EFBFBD><EFBFBD> <20>޼<EFBFBD>
pc.remove_item(31019, pc.count_item(31019))
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._520_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 27874000))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 225000))
say("")
pc.give_exp2(27874000)
pc.change_money(225000)
set_state (state5_1)
q.set_counter_name("")
else -- <20><>ǰ <20><><EFBFBD><EFBFBD> <20>̴<EFBFBD>
say(string.format(gameforge.main_quest_lv91._530_say,remain))
end
else -- <20><>ǰ <20><><EFBFBD><EFBFBD>
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._540_say)
end
end
end
end
when 3690.kill or 3691.kill begin
if number(1,300) == 1 then
pc.give_item2(31019, 1)
notice_multiline(gameforge.main_quest_lv91._550_1_notice,notice)
notice_multiline(gameforge.main_quest_lv91._550_2_notice,notice)
end
end
end
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
state state5_1 begin
when letter begin
send_letter(gameforge.main_quest_lv91._560_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv91._560_sendLetter)
say(gameforge.main_quest_lv91._570_say)
end
when 20378.chat.gameforge.main_quest_lv91._560_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv91._580_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv91._590_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._600_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv91._610_say)
set_state (state5_2)
end
end
state state5_2 begin
when letter begin
send_letter(gameforge.main_quest_lv91._560_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv91._620_sayTitle)
say(gameforge.main_quest_lv91._630_say)
say_item_vnum(31020)
-- say()
-- say_reward(locale.main_quest_lv91.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
when 20382.click begin
if pc.count_item(31020) < 1 then
pc.give_item2(31020, 1)
notice_multiline(gameforge.main_quest_lv91._640_1_notice,notice)
set_state (state5_3)
end
end
when 20380.chat.gameforge.main_quest_lv91._560_sendLetter with pc.count_item(31020) >= 1 begin
target.delete("__TARGET__")
pc.remove_item(31020, pc.count_item(31020))
say_title(mob_name(20380))
say(gameforge.main_quest_lv91._650_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._660_say)
wait()
say_title(mob_name(20380))
say(gameforge.main_quest_lv91._670_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 6766050))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30045),2,locale.count_postfix))
say("")
say_title(gameforge.main_quest_lv91._780_say)
pc.give_exp2(6766050)
--pc.change_money(0)
pc.give_item2(30045, 2)
clear_letter()
set_quest_state ("main_quest_lv92", "state0")
set_state (__COMPLETE__)
end
end
-- <20><><EFBFBD><EFBFBD>Ʈ <20>Ϸ<EFBFBD>
state state5_3 begin
when letter begin
send_letter(gameforge.main_quest_lv91._560_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv91._560_sendLetter)
say(gameforge.main_quest_lv91._680_say)
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>н<EFBFBD> <20><><EFBFBD><EFBFBD>.
when 20382.click begin
if pc.count_item(31020) < 1 then
pc.give_item2(31020, 1)
notice_multiline(gameforge.main_quest_lv91._640_1_notice,notice)
end
end
when 20380.chat.gameforge.main_quest_lv91._560_sendLetter with pc.count_item(31020) >= 1 begin
target.delete("__TARGET__")
pc.remove_item(31020, pc.count_item(31020))
say_title(mob_name(20380))
say(gameforge.main_quest_lv91._650_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._660_say)
wait()
say_title(mob_name(20380))
say(gameforge.main_quest_lv91._670_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 6766050))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30045),2,locale.count_postfix))
say("")
say_title(gameforge.main_quest_lv91._780_say)
pc.give_exp2(6766050)
--pc.change_money(0)
pc.give_item2(30045, 2)
clear_letter()
set_quest_state ("main_quest_lv92", "state0")
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

View File

@ -1,699 +0,0 @@
quest main_quest_lv92 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 92 begin
set_state (state1_1)
end
end
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_lv92._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._010_sendLetter)
say(gameforge.main_quest_lv92._020_say)
end
when 20378.chat.gameforge.main_quest_lv92._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._030_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._040_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._050_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._060_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._070_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._080_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._090_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._100_say)
set_state (state1_2)
q.set_counter_value(4)
end
end
--<2D><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state1_2 begin
when letter begin
send_letter(gameforge.main_quest_lv92._010_sendLetter)
local remain_item = 4 - pc.count_item(31010)
if remain_item <= 0 then
remain_item = 0
end
q.set_counter_name("<22><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
q.set_counter_value(remain_item)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv92._110_sayTitle)
say(gameforge.main_quest_lv92._120_say)
say_item_vnum(31010)
say(gameforge.main_quest_lv90._1180_say)
local remain_item = 4 - pc.count_item(31010)
if remain_item <= 0 then
remain_item = 0
end
q.set_counter_value(remain_item)
say_reward(string.format("%s: %d %s",item_name(31010),remain_item,locale.count_postfix))
-- say()
-- say_reward(locale.main_quest_lv92.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv92._010_sendLetter begin
if pc.count_item(31010) >= 4 then
pc.remove_item ( 31010, pc.count_item(31010))
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._160_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 33874000))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 200000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(50817),10,locale.count_postfix))
say("")
pc.give_exp2(33874000)
pc.change_money(200000)
pc.give_item2(50817, 10)
set_state (state2_1)
else
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._130_say)
set_state (state1_2)
end
end
when 3504.kill or 3505.kill begin
if number(1,500) == 1 then
if pc.count_item(31010) < 4 then
pc.give_item2(31010, 1)
--<2D><><EFBFBD><EFBFBD>Ʈ <20>޴<EFBFBD> â ī<><C4AB>Ʈ
local remain_item = 4 - pc.count_item(31010)
if remain_item <= 0 then
remain_item = 0
end
q.set_counter_value(remain_item)
if pc.count_item(31010) >= 4 then
notice_multiline(gameforge.main_quest_lv92._140_1_notice,notice)
notice_multiline(gameforge.main_quest_lv92._140_2_notice,notice)
set_state (state1_3)
end
end
end
end
end
state state1_3 begin
when letter begin
q.set_counter_name("")
send_letter(gameforge.main_quest_lv92._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._010_sendLetter)
say(gameforge.main_quest_lv92._150_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3504.kill or 3505.kill begin
if number(1,500) == 1 then
if pc.count_item(31010) < 4 then
pc.give_item2(31010, 1)
--<2D><><EFBFBD><EFBFBD>Ʈ <20>޴<EFBFBD> â ī<><C4AB>Ʈ
local remain_item = 4 - pc.count_item(31010)
if remain_item <= 0 then
remain_item = 0
end
q.set_counter_value(remain_item)
if pc.count_item(31010) >= 4 then
notice_multiline(gameforge.main_quest_lv92._140_1_notice,notice)
notice_multiline(gameforge.main_quest_lv92._140_2_notice,notice)
end
end
end
end
when 20378.chat.gameforge.main_quest_lv92._010_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31010) >= 4 then
pc.remove_item ( 31010, pc.count_item(31010))
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._160_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 33874000))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 200000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(50817),10,locale.count_postfix))
say("")
pc.give_exp2(33874000)
pc.change_money(200000)
pc.give_item2(50817, 10)
set_state (state2_1)
else
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._130_say)
set_state (state1_2)
end
end
end
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
state state2_1 begin
when letter begin
q.set_counter_name("")
send_letter(gameforge.main_quest_lv92._170_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._170_sendLetter)
say(gameforge.main_quest_lv92._180_say)
end
when 20378.chat.gameforge.main_quest_lv92._170_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._190_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._200_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._210_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._220_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._230_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._240_say)
set_state (state2_2)
end
end
--<2D><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state2_2 begin
when letter begin
send_letter(gameforge.main_quest_lv92._170_sendLetter)
local v = find_npc_by_vnum(20379)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20379))
end
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv92._250_sayTitle)
say(gameforge.main_quest_lv92._260_say)
say_item_vnum(31010)
-- say()
-- say_reward(locale.main_quest_lv92.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv92._170_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._270_say)
end
when 20379.chat.gameforge.main_quest_lv92._170_sendLetter begin
say_title(mob_name(20379))
say(gameforge.main_quest_lv92._280_say)
notice_multiline(gameforge.main_quest_lv92._290_1_notice,notice)
notice_multiline(gameforge.main_quest_lv92._290_2_notice,notice)
pc.give_item2(31010, 1)
set_state (state2_3)
end
end
state state2_3 begin
when letter begin
send_letter(gameforge.main_quest_lv92._170_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._170_sendLetter)
say(gameforge.main_quest_lv92._360_say)
end
when 20378.chat.gameforge.main_quest_lv92._170_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31010) >= 1 then
pc.remove_item ( 31010, pc.count_item(31010))
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._300_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._310_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._320_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._330_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._340_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._350_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 20874600))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30047),2,locale.count_postfix))
say("")
pc.give_exp2(20874600)
--pc.change_money(0)
pc.give_item2(30047, 2)
set_state (state3_1)
else
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._270_say)
set_state (state2_2)
end
end
end
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_lv92._370_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._370_sendLetter)
say(gameforge.main_quest_lv92._380_say)
end
when 20378.chat.gameforge.main_quest_lv92._370_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv92._390_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._400_say)
set_state (state3_2)
end
end
state state3_2 begin
when letter begin
send_letter(gameforge.main_quest_lv92._370_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._370_sendLetter)
say(gameforge.main_quest_lv92._410_say)
end
when 20380.chat.gameforge.main_quest_lv92._370_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv92._420_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._430_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv92._440_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._450_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv92._460_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._470_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv92._480_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._490_say)
set_state (state3_3)
end
end
state state3_3 begin
when letter begin
q.set_counter_name("<22><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
send_letter(gameforge.main_quest_lv92._370_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv92._500_sayTitle)
say(gameforge.main_quest_lv92._510_say)
say_item_vnum(31022)
say(gameforge.main_quest_lv90._1180_say)
local remain_item = 10 - pc.count_item(31022)
if remain_item <= 0 then
remain_item = 0
end
q.set_counter_value(remain_item)
say_reward(string.format("%s: %d %s",item_name(31022),remain_item,locale.count_postfix))
-- say()
-- say_reward(locale.main_quest_lv92.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20380.chat.gameforge.main_quest_lv92._370_sendLetter begin
if pc.count_item(31022) >= 10 then
pc.remove_item ( 31022, pc.count_item(31022))
say_title(mob_name(20380))
say(gameforge.main_quest_lv92._540_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 34874000))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(27992),2,locale.count_postfix))
say("")
pc.give_exp2(34874000)
--pc.change_money(0)
pc.give_item2(27992, 1)
pc.give_item2(27992, 1)
set_state (state4_1)
else
say_title(mob_name(20380))
say(gameforge.main_quest_lv92._520_say)
end
end
when 3490.kill or 3491.kill begin
if number(1,500) == 1 then
if pc.count_item(31022) < 10 then
pc.give_item2(31022, 1)
local remain_item = 10 - pc.count_item(31022)
if remain_item <= 0 then
remain_item = 0
end
q.set_counter_value(remain_item)
if pc.count_item(31022) >= 10 then
notice_multiline(gameforge.main_quest_lv92._530_1_notice,notice)
notice_multiline(gameforge.main_quest_lv92._530_2_notice,notice)
set_state (state3_4)
end
end
end
end
end
state state3_4 begin
when letter begin
q.set_counter_name("")
send_letter(gameforge.main_quest_lv92._370_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._370_sendLetter)
say(gameforge.main_quest_lv92._550_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3490.kill or 3491.kill begin
if number(1,500) == 1 then
if pc.count_item(31022) < 10 then
pc.give_item2(31022, 1)
if pc.count_item(31022) >= 10 then
notice_multiline(gameforge.main_quest_lv92._530_1_notice,notice)
notice_multiline(gameforge.main_quest_lv92._530_2_notice,notice)
end
end
end
end
when 20380.chat.gameforge.main_quest_lv92._370_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31022) >= 10 then
pc.remove_item ( 31022, pc.count_item(31022))
say_title(mob_name(20380))
say(gameforge.main_quest_lv92._540_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 34874000))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(27992),2,locale.count_postfix))
say("")
pc.give_exp2(34874000)
--pc.change_money(0)
pc.give_item2(27992, 1)
pc.give_item2(27992, 1)
set_state (state4_1)
else
say_title(mob_name(20380))
say(gameforge.main_quest_lv92._520_say)
set_state (state3_3)
end
end
end
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_lv92._560_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._560_sendLetter)
say(gameforge.main_quest_lv92._570_say)
end
when 20378.chat.gameforge.main_quest_lv92._560_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv92._580_say)
wait()
say(gameforge.main_quest_lv92._590_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv92._600_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 24911280))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(27993),2,locale.count_postfix))
say("")
say_title(gameforge.main_quest_lv92._610_say)
pc.give_exp2(24911280)
--pc.change_money(0)
pc.give_item2(27993, 1)
pc.give_item2(27993, 1)
clear_letter()
set_quest_state ("main_quest_lv93", "state0")
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

View File

@ -1,715 +0,0 @@
quest main_quest_lv93 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 93 begin
set_state (state1_1)
end
end
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_lv93._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._010_sendLetter)
say(gameforge.main_quest_lv93._020_say)
end
when 20378.chat.gameforge.main_quest_lv93._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv93._030_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv93._040_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._050_say)
set_state (state1_2)
end
end
state state1_2 begin
when letter begin
send_letter(gameforge.main_quest_lv93._010_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._010_sendLetter)
say(gameforge.main_quest_lv93._130_say)
end
when 20380.chat.gameforge.main_quest_lv93._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._060_say)
wait()
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._070_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._080_say)
set_state (state1_3)
end
end
--<2D><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state1_3 begin
when letter begin
send_letter(gameforge.main_quest_lv93._010_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv93._090_sayTitle)
say(gameforge.main_quest_lv93._100_say)
say_item_vnum(31029)
-- say()
-- say_reward(locale.main_quest_lv93.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20380.chat.gameforge.main_quest_lv93._010_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._110_say)
end
when 3191.kill begin
if number(1,1000) == 1 then
if pc.count_item(31029) < 1 then
pc.give_item2(31029, 1)
if pc.count_item(31029) >= 1 then
notice_multiline(gameforge.main_quest_lv93._120_1_notice,notice)
set_state (state1_4)
end
end
end
end
end
state state1_4 begin
when letter begin
send_letter(gameforge.main_quest_lv93._010_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._010_sendLetter)
say(gameforge.main_quest_lv93._130_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3191.kill begin
if number(1,1000) == 1 then
if pc.count_item(31029) < 1 then
pc.give_item2(31029, 1)
if pc.count_item(31029) >= 1 then
notice_multiline(gameforge.main_quest_lv93._120_1_notice,notice)
set_state (state1_4)
end
end
end
end
when 20380.chat.gameforge.main_quest_lv93._010_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31029) >= 1 then
pc.remove_item ( 31029, pc.count_item(31029))
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._140_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 27874422))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(27994),1,locale.count_postfix))
say("")
pc.give_exp2(27874422)
--pc.change_money(0)
pc.give_item2(27994, 1)
set_state (state2_1)
else
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._110_say)
set_state (state1_3)
end
end
end
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_lv93._150_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._150_sendLetter)
say(gameforge.main_quest_lv93._160_say)
end
when 20380.chat.gameforge.main_quest_lv93._150_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._170_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._180_say)
set_state (state2_2)
end
end
--<2D><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state2_2 begin
when letter begin
send_letter(gameforge.main_quest_lv93._150_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv93._190_sayTitle)
say(gameforge.main_quest_lv93._200_say)
say_item_vnum(31030)
-- say()
-- say_reward(locale.main_quest_lv93.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20380.chat.gameforge.main_quest_lv93._150_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._210_say)
end
when 3791.kill begin
if number(1,1000) == 1 then
if pc.count_item(31030) < 1 then
pc.give_item2(31030, 1)
if pc.count_item(31030) >= 1 then
notice_multiline(gameforge.main_quest_lv93._220_1_notice,notice)
notice_multiline(gameforge.main_quest_lv93._220_2_notice,notice)
set_state (state2_3)
end
end
end
end
end
state state2_3 begin
when letter begin
send_letter(gameforge.main_quest_lv93._150_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._150_sendLetter)
say(gameforge.main_quest_lv93._230_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3791.kill begin
if number(1,1000) == 1 then
if pc.count_item(31030) < 1 then
pc.give_item2(31030, 1)
if pc.count_item(31030) >= 1 then
notice_multiline(gameforge.main_quest_lv93._220_1_notice,notice)
notice_multiline(gameforge.main_quest_lv93._220_2_notice,notice)
set_state (state2_3)
end
end
end
end
when 20380.chat.gameforge.main_quest_lv93._150_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31030) >= 1 then
pc.remove_item ( 31030, pc.count_item(31030))
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._240_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 28914020))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 302000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30048),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(50819),10,locale.count_postfix))
say("")
pc.give_exp2(28914020)
pc.change_money(302000)
pc.give_item2(30048, 1)
pc.give_item2(50819, 10)
set_state (state3_1)
else
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._210_say)
set_state (state2_2)
end
end
end
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_lv93._250_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._250_sendLetter)
say(gameforge.main_quest_lv93._260_say)
end
when 20380.chat.gameforge.main_quest_lv93._250_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv93._270_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._280_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv93._290_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._300_say)
set_state (state3_2)
end
end
state state3_2 begin
when letter begin
send_letter(gameforge.main_quest_lv93._250_sendLetter)
local v = find_npc_by_vnum(20008)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20008))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._310_sayTitle)
say(gameforge.main_quest_lv93._320_say)
end
when 20008.chat.gameforge.main_quest_lv93._250_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20008))
say(gameforge.main_quest_lv93._330_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._340_say)
wait()
say_title(mob_name(20008))
say(gameforge.main_quest_lv93._350_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._360_say)
wait()
say_title(mob_name(20008))
say(gameforge.main_quest_lv93._370_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 17904600))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 30000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(71094),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72024),1,locale.count_postfix))
say("")
pc.give_exp2(17904600)
pc.change_money(30000)
pc.give_item2(71094, 1)
pc.give_item2_select(72024)
set_state (state3_3)
clear_letter()
local cur_t = get_global_time()
pc.setf("main_quest_lv93","ockgu_access_time",cur_t)
end
end
state state3_3 begin
when login with get_global_time() - pc.getf("main_quest_lv93","ockgu_access_time") >= 24*60*60 begin
set_state (state4_1)
end
when 20008.chat.gameforge.main_quest_lv93._400_npcChat begin
if get_global_time() - pc.getf("main_quest_lv93","ockgu_access_time") >= 24*60*60 then
set_state (state4_1)
else
say_title(mob_name(20008))
say(gameforge.main_quest_lv93._390_say)
end
end
end
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_lv93._400_npcChat)
local v = find_npc_by_vnum(20008)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20008))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._400_npcChat)
say(gameforge.main_quest_lv93._410_say)
end
when 20008.chat.gameforge.main_quest_lv93._400_npcChat begin
target.delete("__TARGET__")
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._420_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._430_say)
wait()
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._440_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._450_say)
wait()
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._460_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._470_say)
wait()
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._480_say)
set_state (state4_2)
end
end
-- <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> --
state state4_2 begin
when letter begin
send_letter(gameforge.main_quest_lv93._400_npcChat)
q.set_counter_name(gameforge.main_quest_lv94._1080_say)
end
when button or info begin
say_title(gameforge.main_quest_lv93._490_sayTitle)
say(gameforge.main_quest_lv93._500_say)
say_item_vnum_inline(50724,0,3)
say_item_vnum_inline(50726,1,3)
say_item_vnum_inline(50707,2,3)
local remain1 = 200 - pc.count_item(50724)
local remain2 = 200 - pc.count_item(50726)
local remain3 = 200 - pc.count_item(50707)
if remain1 < 0 then
remain1 = 0
end
if remain2 < 0 then
remain2 = 0
end
if remain3 < 0 then
remain3 = 0
end
say(string.format(gameforge.main_quest_lv93._630_say,item_name(50724) ,remain1,item_name(50726) ,remain2,item_name(50707) , remain3))
q.set_counter_value(remain1 + remain2 + remain3)
if remain1 + remain2 + remain3 == 0 then
notice_multiline(gameforge.main_quest_lv93._650_1_notice,notice)
notice_multiline(gameforge.main_quest_lv93._650_2_notice,notice)
end
end
--[[
when 50724.pick or 50724.take or 50726.pick or 50726.take or 50707.pick or 50707.take begin
local remain1 = 200 - pc.count_item(50724)
local remain2 = 200 - pc.count_item(50726)
local remain3 = 200 - pc.count_item(50707)
if remain1 < 0 then
remain1 = 0
end
if remain2 < 0 then
remain2 = 0
end
if remain3 < 0 then
remain3 = 0
end
q.set_counter_value(remain1 + remain2 + remain3)
end
]]--
when 20008.chat.gameforge.main_quest_lv93._400_npcChat begin
if pc.count_item(50724) >= 200 and pc.count_item(50726) >= 200 and pc.count_item(50707) >= 200 then
pc.remove_item ( 50724,200)
pc.remove_item ( 50726,200)
pc.remove_item ( 50707,200)
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._520_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._530_say)
set_state (state4_3)
clear_letter()
local cur_t = get_global_time()
pc.setf("main_quest_lv93","item4_make_start_time",cur_t)
else
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._640_say)
end
end
end
state state4_3 begin
when login with get_global_time() - pc.getf("main_quest_lv93","item4_make_start_time") >= 24*60*60 begin
set_state (state4_4)
q.set_counter_name("")
end
when 20008.chat.gameforge.main_quest_lv93._400_npcChat begin
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._540_say)
end
end
state state4_4 begin
when letter begin
send_letter(gameforge.main_quest_lv93._400_npcChat)
local v = find_npc_by_vnum(20008)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20008))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._400_npcChat)
say(gameforge.main_quest_lv93._550_say)
end
when 20008.chat.gameforge.main_quest_lv93._400_npcChat begin
target.delete("__TARGET__")
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._560_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._570_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 31374000))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(31031),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(50706),20,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72301),5,locale.count_postfix))
say("")
pc.give_exp2(31374000)
--pc.change_money(0)
pc.give_item2(31031, 1)
pc.give_item2(50706, 20)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
set_state (state5_1)
end
end
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
state state5_1 begin
when letter begin
send_letter(gameforge.main_quest_lv93._580_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._580_sendLetter)
say(gameforge.main_quest_lv93._590_say)
end
when 20380.chat.gameforge.main_quest_lv93._580_sendLetter begin
target.delete("__TARGET__")
pc.remove_item(31031,pc.count_item(31031))
say_title(mob_name( 20380))
say(gameforge.main_quest_lv93._600_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._610_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 19920820))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 335000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72723),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70050),1,locale.count_postfix))
say("")
say_title(gameforge.main_quest_lv93._620_say)
pc.give_exp2(19920820)
pc.change_money(335000)
pc.give_item2(72723, 1)
pc.give_item2_select(70050)
item.set_socket(2, 120)
clear_letter()
set_quest_state ("main_quest_lv94", "state0")
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

File diff suppressed because it is too large Load Diff

View File

@ -1,731 +0,0 @@
quest main_quest_lv95 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 95 begin
set_state (state1_1)
end
end
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_lv95._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._010_sendLetter)
say(gameforge.main_quest_lv95._020_say)
end
when 20378.chat.gameforge.main_quest_lv95._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._030_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv95._040_say)
wait()
set_state (state1_2)
end
end
--<2D><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state1_2 begin
when letter begin
send_letter(gameforge.main_quest_lv95._010_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv95._070_sayTitle)
say(gameforge.main_quest_lv95._080_say)
--say_item_vnum(31015)
-- say()
-- say_reward(locale.main_quest_lv95.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ƿԴ<C6BF>.--
when 20378.chat.gameforge.main_quest_lv95._010_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._090_say)
say("")
end
when 3904.kill begin
if pc.count_item(31015) < 1 then
pc.give_item2 ( 31015, 1 )
notice_multiline(gameforge.main_quest_lv95._100_1_notice,notice)
notice_multiline(gameforge.main_quest_lv95._100_2_notice,notice)
notice_multiline(gameforge.main_quest_lv95._750_say,notice)
set_state (state1_3)
end
end
end
state state1_3 begin
when letter begin
send_letter(gameforge.main_quest_lv95._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._010_sendLetter)
say(gameforge.main_quest_lv95._110_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3904.kill begin
if pc.count_item(31015) < 1 then
pc.give_item2 ( 31015, 1 )
notice_multiline(gameforge.main_quest_lv95._100_1_notice,notice)
notice_multiline(gameforge.main_quest_lv95._100_2_notice,notice)
notice_multiline(gameforge.main_quest_lv95._750_say,notice)
end
end
when 20378.chat.gameforge.main_quest_lv95._010_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31015) >= 1 then
pc.remove_item ( 31015, pc.count_item(31015))
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._120_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._140_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._150_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._170_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 27532396))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 302000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(27994),1,locale.count_postfix))
say("")
pc.give_exp2(27532396)
pc.change_money(302000)
pc.give_item2(27994, 1)
set_state (state2_1)
else --<2D>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Դ<EFBFBD>.
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._090_say)
say("")
set_state (state1_2)
end
end
end
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_lv95._180_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._180_sendLetter)
say(gameforge.main_quest_lv95._190_say)
end
when 20378.chat.gameforge.main_quest_lv95._180_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._200_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv95._220_say)
set_state (state2_2)
end
end
state state2_2 begin
when letter begin
send_letter(gameforge.main_quest_lv95._180_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv95._230_sayTitle)
say(gameforge.main_quest_lv95._240_say)
say_item_vnum(31037)
-- say()
-- say_reward(locale.main_quest_lv95.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv95._180_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._250_say)
end
when 3890.kill begin
if pc.count_item(31037) < 1 then
if number (1,5) == 1 then
if pc.count_item(31037) < 1 then
pc.give_item2 ( 31037, 1 )
end
notice_multiline(gameforge.main_quest_lv95._260_1_notice,notice)
notice_multiline(gameforge.main_quest_lv95._260_2_notice,notice)
set_state (state2_3)
end
end
end
end
state state2_3 begin
when letter begin
send_letter(gameforge.main_quest_lv95._180_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._180_sendLetter)
say(gameforge.main_quest_lv95._270_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3890.kill begin
if pc.count_item(31037) < 1 then
if number (1,5) == 1 then
if pc.count_item(31037) < 1 then
pc.give_item2 ( 31037, 1 )
end
notice_multiline(gameforge.main_quest_lv95._260_1_notice,notice)
notice_multiline(gameforge.main_quest_lv95._260_2_notice,notice)
end
end
end
when 20378.chat.gameforge.main_quest_lv95._180_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31037) >= 1 then
pc.remove_item ( 31037, pc.count_item(31037))
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._280_say)
wait()
say(gameforge.main_quest_lv95._290_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._300_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._310_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 29032586))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30048),1,locale.count_postfix))
say("")
pc.give_exp2(29032586)
--pc.change_money(0)
pc.give_item2(30048, 1)
set_state (state3_1)
else -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._250_say)
set_state (state2_2)
end
end
end
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_lv95._320_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._320_sendLetter)
say(gameforge.main_quest_lv95._330_say)
end
when 20378.chat.gameforge.main_quest_lv95._320_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._340_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._350_say)
set_state (state3_2)
end
end
state state3_2 begin
when letter begin
send_letter(gameforge.main_quest_lv95._320_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv95._370_sayTitle)
say(gameforge.main_quest_lv95._380_say)
-- say()
-- say_reward(locale.main_quest_lv95.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv95._320_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._390_say)
end
when 3891.kill begin
notice_multiline(gameforge.main_quest_lv95._400_notice,notice)
say(gameforge.main_quest_lv95._410_say)
wait()
say(gameforge.main_quest_lv95._420_say)
set_state (state3_3)
end
end
state state3_3 begin
when letter begin
send_letter(gameforge.main_quest_lv95._320_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._320_sendLetter)
say(gameforge.main_quest_lv95._430_say)
end
when 20378.chat.gameforge.main_quest_lv95._320_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._440_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv95._450_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._460_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 33003907))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(71094),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72024),1,locale.count_postfix))
say("")
pc.give_exp2(33003907)
--pc.change_money(0)
pc.give_item2(71094, 1)
pc.give_item2_select(72024)
item.set_socket(2, 180)
set_state (state4_1)
end
end
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_lv95._470_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._470_sendLetter)
say(gameforge.main_quest_lv95._480_say)
end
when 20378.chat.gameforge.main_quest_lv95._470_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._490_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._510_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._520_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv95._530_say)
set_state (state4_2)
end
end
-- <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> --
state state4_2 begin
when letter begin
send_letter(gameforge.main_quest_lv95._470_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv95._540_sayTitle)
say(gameforge.main_quest_lv95._550_say)
say_item_vnum(31043)
-- say()
-- say_reward(locale.main_quest_lv95.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
-- Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC> --
when 20378.chat.gameforge.main_quest_lv95._470_sendLetter begin
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._560_say)
end
when 3303.kill begin
if pc.count_item(31043) < 1 then
if number (1,5) == 1 then
pc.give_item2 ( 31043, 1 )
notice_multiline(gameforge.main_quest_lv95._570_1_notice,notice)
notice_multiline(gameforge.main_quest_lv95._570_2_notice,notice)
set_state (state4_3)
end
end
end
end
state state4_3 begin
when letter begin
send_letter(gameforge.main_quest_lv95._470_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._470_sendLetter)
say(gameforge.main_quest_lv95._580_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3303.kill begin
if pc.count_item(31043) < 1 then
if number (1,5) == 1 then
pc.give_item2 ( 31043, 1 )
notice_multiline(gameforge.main_quest_lv95._570_1_notice,notice)
notice_multiline(gameforge.main_quest_lv95._570_2_notice,notice)
end
end
end
when 20378.chat.gameforge.main_quest_lv95._470_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31043) >= 1 then
pc.remove_item ( 31043, pc.count_item(31043))
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._590_say)
wait()
say_reward(gameforge.main_quest_lv95._600_sayReward)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._610_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._620_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 30943586))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 335000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72301),5,locale.count_postfix))
say("")
pc.give_exp2(30943586)
pc.change_money(335000)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
set_state (state5_1)
else
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._560_say)
set_state (state4_2)
end
end
end
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
-- <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> --
state state5_1 begin
when letter begin
send_letter(gameforge.main_quest_lv95._630_sendLetter)
q.set_counter_name(gameforge.main_quest_lv95._760_say)
end
when button or info begin
if pc.get_map_index() == 1 then
addmapsignal(500 * 100, 500 * 100)
addmapsignal(600 * 100, 500 * 100)
addmapsignal(700 * 100, 300 * 100)
end
say_title(gameforge.main_quest_lv95._640_sayTitle)
say(gameforge.main_quest_lv95._650_say)
say_item_vnum(31043)
say(gameforge.main_quest_lv95._760_say)
local remain = 2 - pc.count_item(31043)
if remain < 0 then
remain = 0
end
say_reward(string.format(gameforge.main_quest_lv95._770_sayReward,item_name(31043),remain))
q.set_counter_value(remain)
-- say()
-- say_reward(locale.main_quest_lv95.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
-- Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC> --
when 20378.chat.gameforge.main_quest_lv95._630_sendLetter begin
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._660_say)
end
when 3303.kill begin
if pc.count_item(31043) < 2 then
if number (1,4) == 1 then
pc.give_item2 ( 31043, 1 )
local remain = 2 - pc.count_item(31043)
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
if pc.count_item(31043) >= 2 then
set_state (state5_2)
end
end
end
end
end
state state5_2 begin
when letter begin
send_letter(gameforge.main_quest_lv95._630_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv95._630_sendLetter)
say(gameforge.main_quest_lv95._670_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3303.kill begin
if pc.count_item(31043) < 2 then
if number (1,4) == 1 then
pc.give_item2 ( 31043, 1 )
end
end
end
when 20378.chat.gameforge.main_quest_lv95._630_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31043) >= 2 then
pc.remove_item ( 31043, pc.count_item(31043))
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._680_say)
wait()
say_reward(gameforge.main_quest_lv95._690_sayReward)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._700_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv95._710_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._720_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 31932545))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 337000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72723),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70050),1,locale.count_postfix))
say("")
say_title(gameforge.main_quest_lv95._740_say)
pc.give_exp2(31932545)
pc.change_money(337000)
pc.give_item2(72723, 1)
pc.give_item2(70050, 1)
clear_letter()
set_quest_state ("main_quest_lv96", "state0")
set_state (__COMPLETE__)
else
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._660_say)
set_state (state5_1)
end
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

View File

@ -1,750 +0,0 @@
quest main_quest_lv96 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 96 begin
set_state (state1_1)
end
end
------------------------------------<2D><><EFBFBD>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD>1-1------------------------------------
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_lv96._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv96._010_sendLetter)
say(gameforge.main_quest_lv96._020_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv96._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._030_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._060_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv96._070_say)
say("")
set_state (state1_2)
end
end
--<2D><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state1_2 begin
when letter begin
send_letter(gameforge.main_quest_lv96._010_sendLetter)
q.set_counter_name(gameforge.main_quest_lv96._570_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv96._080_sayTitle)
say(gameforge.main_quest_lv96._090_say)
say("")
say_item_vnum(31038)
say(gameforge.main_quest_lv96._570_counterName)
local remain = 100 - pc.count_item(31038)
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward,item_name(31038),remain))
-- say()
-- say_reward(locale.main_quest_lv96.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ƿԴ<C6BF>.--
when 20378.chat.gameforge.main_quest_lv96._010_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._100_say)
say("")
end
when 3701.kill or 3702.kill or 3703.kill or 3704.kill or 3705.kill or 3790.kill or 3791.kill begin
if pc.count_item(31038) < 100 then
if number (1,50) == 1 then
pc.give_item2 ( 31038, 1 )
local remain = 100 - pc.count_item(31038)
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
if pc.count_item(31038) >= 100 then
notice_multiline(gameforge.main_quest_lv96._110_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._110_2_notice,notice)
set_state (state1_3)
end
end
end
end
end
state state1_3 begin
when letter begin
send_letter(gameforge.main_quest_lv96._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv96._010_sendLetter)
say(gameforge.main_quest_lv96._120_say)
say("")
say("")
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3701.kill or 3702.kill or 3703.kill or 3704.kill or 3705.kill or 3790.kill or 3791.kill begin
if pc.count_item(31038) < 100 then
if number (1,50) == 1 then
pc.give_item2 ( 31038, 1 )
if pc.count_item(31038) >= 100 then
notice_multiline(gameforge.main_quest_lv96._110_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._110_2_notice,notice)
end
end
end
end
when 20378.chat.gameforge.main_quest_lv96._010_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31038) >= 100 then
pc.remove_item ( 31038, pc.count_item(31038))
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._130_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 39032537))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 346000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30051),1,locale.count_postfix))
say("")
pc.give_exp2(39032537)
pc.change_money(346000)
pc.give_item2(30051, 1)
set_state (state2_1)
else --<2D>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Դ<EFBFBD>.
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._100_say)
say("")
set_state (state1_2)
end
end
end
------------------------------------<2D><><EFBFBD>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD>1-2------------------------------------
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_lv96._140_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv96._140_sendLetter)
say(gameforge.main_quest_lv96._150_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv96._140_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._160_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv96._190_say)
say("")
set_state (state2_2)
end
end
state state2_2 begin
when letter begin
send_letter(gameforge.main_quest_lv96._140_sendLetter)
q.set_counter_name(gameforge.main_quest_lv96._570_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv96._200_sayTitle)
say(gameforge.main_quest_lv96._210_say)
say("")
say_item_vnum_inline(31039,0,2)
say_item_vnum_inline(31040,1,2)
say(gameforge.main_quest_lv96._570_counterName)
local remain1 = 1 - pc.count_item(31039)
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.count_item(31040)
if remain2 < 0 then
remain2 = 0
end
q.set_counter_value(remain1 + remain2)
say_reward(string.format(gameforge.main_quest_lv96._580_sayReward,item_name(31039),remain1))
say_reward(string.format(gameforge.main_quest_lv96._580_sayReward,item_name(31040),remain2))
-- say()
-- say_reward(locale.main_quest_lv96.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv96._140_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._220_say)
say("")
end
when 3801.kill or 3802.kill or 3803.kill or 3804.kill or 3805.kill or 3890.kill or 3891.kill begin
if pc.count_item(31039) < 1 or pc.count_item(31040) < 1 then
if number (1,100) == 1 then
if pc.count_item(31039) < 1 then
pc.give_item2 ( 31039, 1 )
end
if pc.count_item(31040) < 1 then
pc.give_item2 ( 31040, 1 )
end
local remain1 = 1 - pc.count_item(31039)
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.count_item(31040)
if remain2 < 0 then
remain2 = 0
end
q.set_counter_value(remain1 + remain2)
notice_multiline(gameforge.main_quest_lv96._230_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._230_2_notice,notice)
set_state (state2_3)
end
end
end
end
state state2_3 begin
when letter begin
send_letter(gameforge.main_quest_lv96._140_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv96._140_sendLetter)
say(gameforge.main_quest_lv96._240_say)
say("")
say("")
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3801.kill or 3802.kill or 3803.kill or 3804.kill or 3805.kill or 3890.kill or 3891.kill begin
if pc.count_item(31039) < 1 or pc.count_item(31040) < 1 then
if number (1,100) == 1 then
if pc.count_item(31039) < 1 then
pc.give_item2 ( 31039, 1 )
end
if pc.count_item(31040) < 1 then
pc.give_item2 ( 31040, 1 )
end
notice_multiline(gameforge.main_quest_lv96._230_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._230_2_notice,notice)
end
end
end
when 20378.chat.gameforge.main_quest_lv96._140_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31039) >= 1 and pc.count_item(31040) >= 1 then
pc.remove_item ( 31039, pc.count_item(31039))
pc.remove_item ( 31040, pc.count_item(31040))
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._250_say)
say("")
set_state (state2_4)
else
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._220_say)
say("")
set_state (state2_2)
end
end
end
--<2D><><EFBFBD>ڿ<EFBFBD><DABF>Է<EFBFBD>
state state2_4 begin
when letter begin
send_letter(gameforge.main_quest_lv96._140_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv96._140_sendLetter)
say(gameforge.main_quest_lv96._260_say)
say("")
say("")
end
when 20380.chat.gameforge.main_quest_lv96._140_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_lv96._270_say)
say("")
wait()
say_title(mob_name(20380))
say(gameforge.main_quest_lv96._290_say)
say("")
set_state (state2_5)
end
end
--<2D>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5BFA1>
state state2_5 begin
when letter begin
send_letter(gameforge.main_quest_lv96._140_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv96._140_sendLetter)
say(gameforge.main_quest_lv96._240_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv96._140_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._590_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 40732586))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 357000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72016),1,locale.count_postfix))
say("")
pc.give_exp2(40732586)
pc.change_money(357000)
pc.give_item2_select(72016)
item.set_socket(2, 120)
set_state (state3_1)
end
end
------------------------------------<2D><><EFBFBD>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD>1-3------------------------------------
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_lv96._300_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv96._300_sendLetter)
say(gameforge.main_quest_lv96._310_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv96._300_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv96._320_say)
say("")
wait()
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(31073),1,locale.count_postfix))
say("")
wait()
if pc.count_item(31073) < 1 then
pc.give_item2(31073,1)
end
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv96._330_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv96._340_say)
say("")
set_state (state3_2)
end
end
state state3_2 begin
when letter begin
send_letter(gameforge.main_quest_lv96._300_sendLetter)
q.set_counter_name(gameforge.main_quest_lv96._570_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv96._350_sayTitle)
say(gameforge.main_quest_lv96._360_say)
say("")
say_item_vnum(31039)
say(gameforge.main_quest_lv96._570_counterName)
local remain = 100 - pc.getqf("checked_pocket")
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
say_reward(string.format(gameforge.main_quest_lv96._580_sayReward,item_name(31039),remain))
-- say()
-- say_reward(locale.main_quest_lv96.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
when 31073.use begin
affect.add(apply.CON, 10, 60 * 60)
affect.add(apply.INT, 10, 60 * 60)
affect.add(apply.STR, 10, 60 * 60)
affect.add(apply.DEX, 10, 60 * 60)
pc.remove_item(31073,1)
end
when 3801.kill or 3802.kill or 3803.kill or 3804.kill or 3805.kill or 3890.kill or 3891.kill begin
if number (1,100) == 1 then
pc.give_item2 ( 31039, 1 )
notice_multiline(gameforge.main_quest_lv96._620_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._620_2_notice,notice)
end
end
when 20380.chat.gameforge.main_quest_lv96._300_sendLetter with pc.count_item(31039) > 0 begin
pc.remove_item (31039, 1)
if number(1,100) <= 70 then -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv96._370_say)
say("")
local checked = pc.getqf("checked_pocket")
pc.setqf("checked_pocket", checked + 1)
local remain = 100 - pc.getqf("checked_pocket")
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
if pc.getqf("checked_pocket") >= 100 then
pc.remove_item ( 31039, pc.count_item(31039))
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv96._380_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 42983593))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30009),2,locale.count_postfix))
say("")
pc.give_exp2(42983593)
--pc.change_money(0)
pc.give_item2(30009, 2)
set_state (state4_1)
else
say(string.format(gameforge.main_quest_lv96._390_say,remain))
say("")
end
else -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv96._630_say)
say("")
end
end
end
------------------------------------<2D><><EFBFBD>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD>1-4-----------------------------------
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_lv96._400_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv96._400_sendLetter)
say(gameforge.main_quest_lv96._410_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv96._400_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv96._420_say)
say("")
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv96._430_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv96._450_say)
say("")
set_state (state4_2)
end
end
-- <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> --
state state4_2 begin
when letter begin
send_letter(gameforge.main_quest_lv96._400_sendLetter)
q.set_counter_name(gameforge.main_quest_lv96._480_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv96._460_sayTitle)
say(gameforge.main_quest_lv96._470_say)
say("")
say_title(gameforge.main_quest_lv96._480_counterName)
local remain1 = 1 - pc.getqf("kill_tree1")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("kill_tree2")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 1 - pc.getqf("kill_tree3")
if remain3 < 0 then
remain3 = 0
end
q.set_counter_value(remain1 + remain2 + remain3)
say_reward(string.format(gameforge.main_quest_lv96._490_say,mob_name(3911) ,remain1, mob_name(3912),remain2 , mob_name(3913),remain3))
say("")
-- say()
-- say_reward(locale.main_quest_lv96.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
-- Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC> --
when 20378.chat.gameforge.main_quest_lv96._400_sendLetter begin
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv96._500_say)
say("")
end
when 3911.kill begin
pc.setqf("kill_tree1",1)
if pc.getqf("kill_tree1") == 1 and pc.getqf("kill_tree2") == 1 and pc.getqf("kill_tree3") == 1 then
notice_multiline(gameforge.main_quest_lv96._510_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._510_2_notice,notice)
set_state (state4_3)
end
local remain1 = 1 - pc.getqf("kill_tree1")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("kill_tree2")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 1 - pc.getqf("kill_tree3")
if remain3 < 0 then
remain3 = 0
end
q.set_counter_value(remain1 + remain2 + remain3)
end
when 3912.kill begin
pc.setqf("kill_tree2",1)
if pc.getqf("kill_tree1") == 1 and pc.getqf("kill_tree2") == 1 and pc.getqf("kill_tree3") == 1 then
notice_multiline(gameforge.main_quest_lv96._510_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._510_2_notice,notice)
set_state (state4_3)
end
local remain1 = 1 - pc.getqf("kill_tree1")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("kill_tree2")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 1 - pc.getqf("kill_tree3")
if remain3 < 0 then
remain3 = 0
end
q.set_counter_value(remain1 + remain2 + remain3)
end
when 3913.kill begin
pc.setqf("kill_tree3",1)
if pc.getqf("kill_tree1") == 1 and pc.getqf("kill_tree2") == 1 and pc.getqf("kill_tree3") == 1 then
notice_multiline(gameforge.main_quest_lv96._510_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._510_2_notice,notice)
set_state (state4_3)
end
local remain1 = 1 - pc.getqf("kill_tree1")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("kill_tree2")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 1 - pc.getqf("kill_tree3")
if remain3 < 0 then
remain3 = 0
end
q.set_counter_value(remain1 + remain2 + remain3)
end
end
state state4_3 begin
when letter begin
send_letter(gameforge.main_quest_lv96._400_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv96._400_sendLetter)
say(gameforge.main_quest_lv96._520_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv96._400_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv96._530_say)
say("")
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv96._550_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 44941086))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 379000))
say("")
say_title(gameforge.main_quest_lv96._560_sayTitle)
pc.give_exp2(44941086)
pc.change_money(379000)
clear_letter()
if pc.count_item(31073) > 1 then
pc.remove_item(31073,pc.count_item(31073))
end
set_quest_state ("main_quest_lv97", "state0")
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

View File

@ -1,657 +0,0 @@
quest main_quest_lv97 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 97 begin
set_state (state1_1)
end
end
----------------------------------õ<><C3B5><EFBFBD>ų<EFBFBD> óġ----------------------------------
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_lv97._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._010_sendLetter)
say(gameforge.main_quest_lv97._020_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv97._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._030_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._040_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._050_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv97._060_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._070_say)
say("")
set_state (state1_2)
end
end
--<2D><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state1_2 begin
when letter begin
send_letter(gameforge.main_quest_lv97._010_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv97._080_sayTitle)
say(gameforge.main_quest_lv97._090_say)
-- say("")
-- say_reward(locale.main_quest_lv97.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ƿԴ<C6BF>.--
when 20378.chat.gameforge.main_quest_lv97._010_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._650_say)
end
when 3905.kill begin
if pc.count_item(31074) < 1 then
pc.give_item2 ( 31074, 1 )
end
notice_multiline(gameforge.main_quest_lv97._100_notice,notice)
say(gameforge.main_quest_lv97._110_say)
say("")
wait()
say(gameforge.main_quest_lv97._120_say)
say("")
set_state (state1_3)
end
end
state state1_3 begin
when letter begin
send_letter(gameforge.main_quest_lv97._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._010_sendLetter)
say(gameforge.main_quest_lv97._130_say)
say("")
say("")
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3905.kill begin
if pc.count_item(31074) < 1 then
pc.give_item2 ( 31074, 1 )
end
notice_multiline(gameforge.main_quest_lv97._100_notice,notice)
say(gameforge.main_quest_lv97._110_say)
say("")
wait()
say(gameforge.main_quest_lv97._120_say)
say("")
end
when 20378.chat.gameforge.main_quest_lv97._010_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31074) >= 1 then
pc.remove_item ( 31074, pc.count_item(31074))
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._140_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv97._150_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._160_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._190_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 45941088))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30045),2,locale.count_postfix))
say("")
pc.give_exp2(45941088)
--pc.change_money(0)
pc.give_item2(30045, 2)
set_state (state2_1)
else --<2D>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Դ<EFBFBD>.
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._650_say)
set_state (state1_2)
end
end
end
---------------------------------- <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ----------------------------------
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_lv97._200_sendLetter)
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._200_sendLetter)
say(gameforge.main_quest_lv97._210_say)
say("")
say("")
end
when 20377.chat.gameforge.main_quest_lv97._200_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_lv97._220_say)
say("")
wait()
say_title(mob_name(20377))
say(gameforge.main_quest_lv97._230_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv97._260_say)
set_state (state2_2)
end
end
state state2_2 begin
when letter begin
send_letter(gameforge.main_quest_lv97._200_sendLetter)
local v = find_npc_by_vnum(20001)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20001))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._270_sayTitle)
say(gameforge.main_quest_lv97._280_say)
say("")
say_item_vnum(31041)
say("")
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20377.chat.gameforge.main_quest_lv97._200_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_lv97._290_say)
say("")
end
when 20001.chat.gameforge.main_quest_lv97._200_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20001))
say(gameforge.main_quest_lv97._660_say)
if pc.count_item(31041) < 1 then
pc.give_item2(31041, 1)
notice_multiline(gameforge.main_quest_lv97._300_notice,notice)
end
set_state (state2_3)
end
end
state state2_3 begin
when letter begin
send_letter(gameforge.main_quest_lv97._200_sendLetter)
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._200_sendLetter)
say(gameforge.main_quest_lv97._300_notice)
say("")
say("")
end
when 20377.chat.gameforge.main_quest_lv97._200_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31041) >= 1 then
pc.remove_item ( 31041, pc.count_item(31041))
say_title(mob_name(20377))
say(gameforge.main_quest_lv97._310_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 41032531))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format ("%s: %d %s", item_name(71001),3,locale.count_postfix))
say("")
pc.give_exp2(41032531)
--pc.change_money(0)
pc.give_item2(71001, 3)
set_state (state3_1)
else -- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߷ȴ<DFB7>.
say_title(mob_name(20377))
say(gameforge.main_quest_lv97._170_say)
say("")
set_state (state2_2)
end
end
end
---------------------------------- <20>Ĺ<EFBFBD> Ȱ<><C8B0> Ȯ<><C8AE>----------------------------------
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_lv97._320_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._320_sendLetter)
say(gameforge.main_quest_lv97._330_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv97._320_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._340_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._350_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._370_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv97._380_say)
say("")
set_state (state3_2)
end
end
state state3_2 begin
when letter begin
send_letter(gameforge.main_quest_lv97._320_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv97._390_sayTitle)
say(gameforge.main_quest_lv97._400_say)
say("")
say_title(gameforge.main_quest_lv97._670_counterName)
local remain1 = 2 - pc.getqf("mob3_1_kill")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("mob3_2_kill")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 1 - pc.getqf("mob3_3_kill")
if remain3 < 0 then
remain3 = 0
end
local remain4 = 1 - pc.getqf("mob3_4_kill")
if remain4 < 0 then
remain4 = 0
end
q.set_counter_value(remain1 + remain2 + remain3 + remain4)
say_reward(string.format(gameforge.main_quest_lv97._680_sayReward,mob_name(3907),remain1,mob_name(3908),remain2))
say_reward(string.format(gameforge.main_quest_lv97._680_sayReward,mob_name(3909),remain3,mob_name(3910),remain4))
-- say("")
-- say_reward(locale.main_quest_lv97.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
when 20378.chat.gameforge.main_quest_lv97._320_sendLetter begin
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._410_say)
say("")
end
function kill_count()
local remain1 = 2 - pc.getqf("mob3_1_kill")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("mob3_2_kill")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 1 - pc.getqf("mob3_3_kill")
if remain3 < 0 then
remain3 = 0
end
local remain4 = 1 - pc.getqf("mob3_4_kill")
if remain4 < 0 then
remain4 = 0
end
local total_remain = remain1 + remain2 + remain3 + remain4
q.set_counter_value(total_remain)
return total_remain
end
when 3907.kill begin
pc.setqf("mob3_1_kill",pc.getqf("mob3_1_kill") + 1)
if main_quest_lv97.kill_count() == 0 then
notice_multiline(gameforge.main_quest_lv97._690_1_notice,notice)
notice_multiline(gameforge.main_quest_lv97._690_2_notice,notice)
set_state (state3_3)
end
end
when 3908.kill begin
pc.setqf("mob3_2_kill",pc.getqf("mob3_2_kill") + 1)
if main_quest_lv97.kill_count() == 0 then
notice_multiline(gameforge.main_quest_lv97._690_1_notice,notice)
notice_multiline(gameforge.main_quest_lv97._690_2_notice,notice)
set_state (state3_3)
end
end
when 3909.kill begin
pc.setqf("mob3_3_kill",pc.getqf("mob3_3_kill") + 1)
if main_quest_lv97.kill_count() == 0 then
notice_multiline(gameforge.main_quest_lv97._690_1_notice,notice)
notice_multiline(gameforge.main_quest_lv97._690_2_notice,notice)
set_state (state3_3)
end
end
when 3910.kill begin
pc.setqf("mob3_4_kill",pc.getqf("mob3_4_kill") + 1)
if main_quest_lv97.kill_count() == 0 then
notice_multiline(gameforge.main_quest_lv97._690_1_notice,notice)
notice_multiline(gameforge.main_quest_lv97._690_2_notice,notice)
set_state (state3_3)
end
end
end
state state3_3 begin
when letter begin
send_letter(gameforge.main_quest_lv97._320_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv97._320_sendLetter)
say(gameforge.main_quest_lv97._420_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv97._320_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._430_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 47898648))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 214000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30033),3,locale.count_postfix))
say("")
pc.give_exp2(47898648)
pc.change_money(214000)
pc.give_item2(30033, 3)
set_state (state4_1)
end
end
---------------------------------- <20><>ȣ<EFBFBD>ų<EFBFBD><C5B3><EFBFBD> <20><><EFBFBD><EFBFBD>, õ<><C3B5><EFBFBD>ų<EFBFBD>----------------------------------
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_lv97._440_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._440_sendLetter)
say(gameforge.main_quest_lv97._450_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv97._440_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._460_say)
say("")
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._480_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv97._490_say)
say("")
set_state (state4_2)
end
end
-- <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> --
state state4_2 begin
when letter begin
send_letter(gameforge.main_quest_lv97._440_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv97._700_sayTitle)
say(gameforge.main_quest_lv97._710_say)
end
-- Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC> --
when 20378.chat.gameforge.main_quest_lv97._440_sendLetter begin
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._530_say)
say("")
end
when 3910.kill begin
notice_multiline(gameforge.main_quest_lv97._550_1_notice,notice)
notice_multiline(gameforge.main_quest_lv97._550_2_notice,notice)
set_state (state4_3)
end
end
-- <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> --
state state4_3 begin
when letter begin
send_letter(gameforge.main_quest_lv97._440_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv97._510_sayTitle)
say(gameforge.main_quest_lv97._520_say)
say("")
end
-- Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC> --
when 20378.chat.gameforge.main_quest_lv97._440_sendLetter begin
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._540_say)
say("")
end
when 3906.kill begin -- õ<><C3B5><EFBFBD>ų<EFBFBD> óġ
notice_multiline(gameforge.main_quest_lv97._560_notice,notice)
say(gameforge.main_quest_lv97._570_say)
say("")
wait()
say(gameforge.main_quest_lv97._580_say)
say("")
if pc.count_item(31017) < 1 then
pc.give_item2(31017, 1)
end
set_state (state4_4)
end
end
state state4_4 begin
when letter begin
send_letter(gameforge.main_quest_lv97._440_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._440_sendLetter)
say(gameforge.main_quest_lv97._420_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv97._440_sendLetter begin
pc.remove_item(31017,pc.count_item(31017))
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._590_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv97._600_say)
say("")
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._610_say)
say("")
wait()
say_reward(gameforge.main_quest_lv97._620_sayReward)
say("")
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._630_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 49586571))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 225000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70024),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30039),3,locale.count_postfix))
say("")
say_title(gameforge.main_quest_lv97._640_sayTitle)
pc.give_exp2(49586571)
pc.change_money(225000)
pc.give_item2(70024, 1)
pc.give_item2(30039, 3)
clear_letter()
set_quest_state ("main_quest_lv98", "state0")
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

View File

@ -1,774 +0,0 @@
quest main_quest_lv98 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 98 begin
set_state (state1_1)
end
end
----------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 1-1----------------------------------
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_lv98._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv98._010_sendLetter)
say(gameforge.main_quest_lv98._020_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
when 20378.chat.gameforge.main_quest_lv98._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._030_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._040_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv98._050_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._060_say)
say("")
set_state (state1_2)
end
end
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state1_2 begin
when letter begin
send_letter(gameforge.main_quest_lv98._010_sendLetter)
q.set_counter_name(gameforge.main_quest_lv98._660_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv98._540_sayTitle)
say(gameforge.main_quest_lv98._550_say)
say("")
say_item_vnum(31026)
say_title(gameforge.main_quest_lv98._660_counterName)
local remain = 100 - pc.count_item(31026)
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
say_reward(string.format(gameforge.main_quest_lv98._670_sayReward,item_name(31026),remain))
-- say()
-- say_reward(locale.main_quest_lv98.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ƿԴ<C6BF>.--
when 20378.chat.gameforge.main_quest_lv98._010_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._070_say)
say("")
end
when 3601.kill or 3602.kill or 3603.kill or 3604.kill or 3605.kill or 3690.kill or 3691.kill begin
if number (1,50) == 1 then
if pc.count_item(31026) < 100 then
pc.give_item2 ( 31026, 1 )
local remain = 100 - pc.count_item(31026)
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
if pc.count_item(31026) >= 100 then
notice_multiline(gameforge.main_quest_lv98._080_1_notice, notice)
notice_multiline(gameforge.main_quest_lv98._080_2_notice,notice)
set_state (state1_3)
end
end
end
end
end
state state1_3 begin
when letter begin
send_letter(gameforge.main_quest_lv98._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv98._010_sendLetter)
say(gameforge.main_quest_lv98._560_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3601.kill or 3602.kill or 3603.kill or 3604.kill or 3605.kill or 3690.kill or 3691.kill begin
if number (1,50) == 1 then
if pc.count_item(31026) < 100 then
pc.give_item2 ( 31026, 1 )
if pc.count_item(31026) >= 100 then
notice_multiline(gameforge.main_quest_lv98._080_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._080_2_notice,notice)
end
end
end
end
when 20378.chat.gameforge.main_quest_lv98._010_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31026) >= 100 then
pc.remove_item ( 31026, pc.count_item(31026))
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._090_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 40898550))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 346000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72308),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(76011),1,locale.count_postfix))
say("")
pc.give_exp2(40898550)
pc.change_money(346000)
pc.give_item2(72308, 1)
pc.give_item2_select(76011)
item.set_socket(2, 120)
set_state (state2_1)
else --<2D>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Դ<EFBFBD>.
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._070_say)
say("")
set_state (state1_2)
end
end
end
---------------------------------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 1-2 ----------------------------------
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_lv98._130_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv98._130_sendLetter)
say(gameforge.main_quest_lv98._140_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
when 20378.chat.gameforge.main_quest_lv98._130_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._150_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv98._160_say)
say("")
set_state (state2_2)
end
end
state state2_2 begin
when letter begin
send_letter(gameforge.main_quest_lv98._130_sendLetter)
q.set_counter_name(gameforge.main_quest_lv98._660_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv98._130_sendLetter)
say(gameforge.main_quest_lv98._590_say)
say("")
say_item_vnum(31042)
say_title(gameforge.main_quest_lv98._660_counterName)
local remain = 100 - pc.count_item(31042)
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
say_reward(string.format(gameforge.main_quest_lv98._670_sayReward,item_name(31042),remain))
-- say()
-- say_reward(locale.main_quest_lv98.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv98._130_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._170_say)
say("")
end
when 3401.kill or 3402.kill or 3403.kill or 3404.kill or 3405.kill or 3490.kill or 3491.kill begin
if number (1,50) == 1 then
if pc.count_item(31042) < 100 then
pc.give_item2 ( 31042, 1 )
local remain = 100 - pc.count_item(31042)
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
if pc.count_item(31042) >= 100 then
notice_multiline(gameforge.main_quest_lv98._180_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._180_2_notice,notice)
set_state (state2_3)
end
end
end
end
end
state state2_3 begin
when letter begin
send_letter(gameforge.main_quest_lv98._130_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv98._130_sendLetter)
say(gameforge.main_quest_lv98._600_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3401.kill or 3402.kill or 3403.kill or 3404.kill or 3405.kill or 3490.kill or 3491.kill begin
if number (1,50) == 1 then
if pc.count_item(31042) < 100 then
pc.give_item2 ( 31042, 1 )
if pc.count_item(31042) >= 100 then
notice_multiline(gameforge.main_quest_lv98._180_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._180_2_notice,notice)
end
end
end
end
when 20378.chat.gameforge.main_quest_lv98._130_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31042) >= 100 then
pc.remove_item ( 31042, pc.count_item(31042))
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._190_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 42646751))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 357000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(71026),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(71025),2,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70102),5,locale.count_postfix))
say("")
pc.give_exp2(42646751)
pc.change_money(357000)
pc.give_item2(71026, 1)
pc.give_item2(71025, 1)
pc.give_item2(71025, 1)
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
set_state (state3_1)
else -- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߷ȴ<DFB7>.
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._170_say)
say("")
set_state (state2_2)
end
end
end
---------------------------------- <20><>Ȱ <20><><EFBFBD><EFBFBD>----------------------------------
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_lv98._200_sendLetter)
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_lv98._200_sendLetter)
say(gameforge.main_quest_lv98._210_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
when 20377.chat.gameforge.main_quest_lv98._200_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._220_say)
say("")
wait()
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._260_say)
say("")
wait()
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._280_say)
say("")
set_state (state3_2)
end
end
state state3_2 begin
when letter begin
send_letter(gameforge.main_quest_lv98._200_sendLetter)
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv98._610_sayTitle)
say(gameforge.main_quest_lv98._620_say)
say("")
say(gameforge.main_quest_lv98._680_counterName)
local remain1 = 50 - pc.getqf("mob3_1_kill")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("mob3_2_kill")
if remain2 < 0 then
remain2 = 0
end
q.set_counter_value(remain1 + remain2)
say_reward(string.format(gameforge.main_quest_lv98._690_sayReward,mob_name(3805),remain1,mob_name(3890),remain2))
-- say()
-- say_reward(locale.main_quest_lv98.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
when 20377.chat.gameforge.main_quest_lv98._200_sendLetter begin
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._300_say)
say("")
end
when 3805.kill begin
local mob3_1_kill = pc.getqf("mob3_1_kill")
if mob3_1_kill < 50 then
pc.setqf("mob3_1_kill",mob3_1_kill +1)
local remain1 = 50 - pc.getqf("mob3_1_kill")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("mob3_2_kill")
if remain2 < 0 then
remain2 = 0
end
q.set_counter_value(remain1 + remain2)
end
if pc.getqf("mob3_1_kill") >= 50 and pc.getqf("mob3_2_kill") >= 1 then
notice_multiline(gameforge.main_quest_lv98._310_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._310_2_notice,notice)
set_state (state3_3)
end
end
when 3890.kill begin
local mob3_2_kill = pc.getqf("mob3_2_kill")
if mob3_2_kill < 1 then
pc.setqf("mob3_2_kill",1)
local remain1 = 50 - pc.getqf("mob3_1_kill")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("mob3_2_kill")
if remain2 < 0 then
remain2 = 0
end
q.set_counter_value(remain1 + remain2)
end
if pc.getqf("mob3_1_kill") >= 50 and pc.getqf("mob3_2_kill") >= 1 then
notice_multiline(gameforge.main_quest_lv98._310_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._310_2_notice,notice)
set_state (state3_3)
end
end
end
state state3_3 begin
when letter begin
send_letter(gameforge.main_quest_lv98._200_sendLetter)
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv98._200_sendLetter)
say(gameforge.main_quest_lv98._630_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
when 20377.chat.gameforge.main_quest_lv98._200_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._320_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584941))
--say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30021),1,locale.count_postfix))
say("")
pc.give_exp2(48584941)
--pc.change_money(0)
pc.give_item2(30021, 1)
set_state (state4_1)
end
end
---------------------------------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>λ<EFBFBD>----------------------------------
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_lv98._330_sendLetter)
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_lv98._330_sendLetter)
say(gameforge.main_quest_lv98._340_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
when 20377.chat.gameforge.main_quest_lv98._330_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._350_say)
say("")
wait()
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._360_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv98._380_say)
say("")
set_state (state4_2)
end
end
-- <20>λ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> --
state state4_2 begin
when letter begin
send_letter(gameforge.main_quest_lv98._330_sendLetter)
q.set_counter_name(gameforge.main_quest_lv98._700_counterName)
local v_npc1 = find_npc_by_vnum(20381)
local v_npc2 = find_npc_by_vnum(9002)
local v_npc3 = find_npc_by_vnum(9003)
local v_npc4 = find_npc_by_vnum(9001)
if 0 != v_npc1 and pc.getqf("click_npc1") ~= 1 then
target.vid("__target_npc1__", v_npc1, mob_name(20381))
end
if 0 != v_npc2 and pc.getqf("click_npc2") ~= 1 then
target.vid("__target_npc2__", v_npc2, mob_name(9002))
end
if 0 != v_npc3 and pc.getqf("click_npc3") ~= 1 then
target.vid("__target_npc3__", v_npc3, mob_name(9003))
end
if 0 != v_npc4 and pc.getqf("click_npc4") ~= 1 then
target.vid("__target_npc4__", v_npc4, mob_name(9001))
end
end
when button or info begin
say_title(gameforge.main_quest_lv98._640_sayTitle)
say(gameforge.main_quest_lv98._650_say)
say("")
say_title(gameforge.main_quest_lv98._700_counterName)
local npc1 = " "
if pc.getqf("click_npc1") == 1 then
npc1 = "O"
end
local npc2 = " "
if pc.getqf("click_npc2") == 1 then
npc2 = "O"
end
local npc3 = " "
if pc.getqf("click_npc3") == 1 then
npc3 = "O"
end
local npc4 = " "
if pc.getqf("click_npc4") == 1 then
npc4 = "O"
end
local remain = 4 - pc.getqf("click_npc1") - pc.getqf("click_npc2") - pc.getqf("click_npc3") - pc.getqf("click_npc4")
q.set_counter_value(remain)
say(string.format(gameforge.main_quest_lv98._710_say,npc1,npc2))
say(string.format(gameforge.main_quest_lv98._720_say,npc3,npc4))
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
-- Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC> --
when 20377.chat.gameforge.main_quest_lv98._330_sendLetter begin
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._390_say)
say("")
wait()
end
when __target_npc1__.target.click or 20381.click with pc.getqf("click_npc1") ~= 1 begin -- <20><><EFBFBD><EFBFBD>
target.delete("__target_npc1__")
pc.setqf("click_npc1",1)
say_title(mob_name(20381))
say(gameforge.main_quest_lv98._400_say)
say("")
local remain = 4 - pc.getqf("click_npc1") - pc.getqf("click_npc2") - pc.getqf("click_npc3") - pc.getqf("click_npc4")
q.set_counter_value(remain)
if pc.getqf("click_npc1") == 1 and pc.getqf("click_npc2") == 1 and pc.getqf("click_npc3") == 1 and pc.getqf("click_npc4") == 1 then
notice_multiline(gameforge.main_quest_lv98._440_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._440_2_notice,notice)
set_state (state4_3)
end
end
when __target_npc2__.target.click or 9002.click with pc.getqf("click_npc2") ~= 1 begin -- <20><><EFBFBD>
target.delete("__target_npc2__")
pc.setqf("click_npc2",1)
say_title(mob_name(9002))
say(gameforge.main_quest_lv98._410_say)
say("")
local remain = 4 - pc.getqf("click_npc1") - pc.getqf("click_npc2") - pc.getqf("click_npc3") - pc.getqf("click_npc4")
q.set_counter_value(remain)
if pc.getqf("click_npc1") == 1 and pc.getqf("click_npc2") == 1 and pc.getqf("click_npc3") == 1 and pc.getqf("click_npc4") == 1 then
notice_multiline(gameforge.main_quest_lv98._440_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._440_2_notice,notice)
set_state (state4_3)
end
end
when __target_npc3__.target.click or 9003.click with pc.getqf("click_npc3") ~= 1 begin -- <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD>
target.delete("__target_npc3__")
pc.setqf("click_npc3",1)
say_title(mob_name(9003))
say(gameforge.main_quest_lv98._430_say)
say("")
local remain = 4 - pc.getqf("click_npc1") - pc.getqf("click_npc2") - pc.getqf("click_npc3") - pc.getqf("click_npc4")
q.set_counter_value(remain)
if pc.getqf("click_npc1") == 1 and pc.getqf("click_npc2") == 1 and pc.getqf("click_npc3") == 1 and pc.getqf("click_npc4") == 1 then
notice_multiline(gameforge.main_quest_lv98._440_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._440_2_notice,notice)
set_state (state4_3)
end
end
when __target_npc4__.target.click or 9001.click with pc.getqf("click_npc4") ~= 1 begin -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
target.delete("__target_npc4__")
pc.setqf("click_npc4",1)
say_title(mob_name(9001))
say(gameforge.main_quest_lv98._420_say)
say("")
local remain = 4 - pc.getqf("click_npc1") - pc.getqf("click_npc2") - pc.getqf("click_npc3") - pc.getqf("click_npc4")
q.set_counter_value(remain)
if pc.getqf("click_npc1") == 1 and pc.getqf("click_npc2") == 1 and pc.getqf("click_npc3") == 1 and pc.getqf("click_npc4") == 1 then
notice_multiline(gameforge.main_quest_lv98._440_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._440_2_notice,notice)
set_state (state4_3)
end
end
end
state state4_3 begin
when letter begin
send_letter(gameforge.main_quest_lv98._330_sendLetter)
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_lv98._330_sendLetter)
say(gameforge.main_quest_lv98._630_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
when 20377.chat.gameforge.main_quest_lv98._330_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._450_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 32033398))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 379000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30015),2,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70043),1,locale.count_postfix))
say("")
pc.give_exp2(32033398)
pc.change_money(379000)
pc.give_item2(30015, 2)
pc.give_item2_select(70043)
item.set_socket(2, 60)
set_state (state5_1)
end
end
----------------------------------<2D>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>----------------------------------
state state5_1 begin
when letter begin
send_letter(gameforge.main_quest_lv98._480_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv98._480_sendLetter)
say(gameforge.main_quest_lv98._490_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
when 20378.chat.gameforge.main_quest_lv98._480_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._500_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._520_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 38739560))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 390000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30006),1,locale.count_postfix))
say("")
pc.give_exp2(38739560)
pc.change_money(390000)
pc.give_item2(30006, 1)
clear_letter()
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

View File

@ -1,44 +0,0 @@
quest new_christmas_2012 begin
state start begin
function has_santa()
return (game.get_event_flag("new_xmas_event") > 0)
end
when 20126.chat.gameforge.new_christmas._010_npcChat begin
say_title(mob_name(20126))
say (gameforge.new_christmas._020_say )
wait()
say_title(mob_name(20126))
say (gameforge.new_christmas._030_say )
wait()
say_title(mob_name(20126))
say (gameforge.new_christmas._040_say )
wait()
set_quest_state("new_christmas_2012_nog", "nog_first_give")
set_quest_state("new_christmas_2012_sock", "baby_dear_give")
set_state ("__COMPLETE__")
end
when login or enter with new_christmas_2012.has_santa() begin
if pc.get_map_index() == 1 or pc.get_map_index() == 21 or pc.get_map_index() == 41 then
if find_npc_by_vnum(20384) == 0 then
if pc.get_map_index() == 1 then
mob.spawn(20384, 625, 676, 0, 0 )
elseif pc.get_map_index() == 21 then
mob.spawn(20384, 542, 551, 0, 0)
elseif pc.get_map_index() == 41 then
mob.spawn(20384, 442, 717, 0, 0)
end
end
end
end
end
state __COMPLETE__ begin
when 20126.chat."init christmas quest" with is_test_server() or pc.is_gm() begin
set_state ("start")
set_quest_state("new_christmas_2012_nog", "start")
set_quest_state("new_christmas_2012_sock", "start")
say ("init complete")
end
end
end

View File

@ -1,36 +0,0 @@
quest new_christmas_2012_nog begin
state start begin
end
state nog_first_give begin
when 20126.chat.gameforge.new_christmas._050_npcChat begin
say_title(mob_name(20126))
say (gameforge.new_christmas._060_say)
wait()
say_title(mob_name(20126))
say (gameforge.new_christmas._070_say)
wait()
pc.give_item2 (50216, 6)
pc.setqf ("last_nog_give_time", get_global_time())
say_title(mob_name(20126))
say (gameforge.new_christmas._080_say)
set_state(nog_give)
end
end
state nog_give begin
when 20126.chat.gameforge.new_christmas._090_npcChat begin
say_title(mob_name(20126))
say (gameforge.new_christmas._100_say)
wait()
if get_global_time() - pc.getqf ("last_nog_give_time") >= 86400 then
say_title(mob_name(20126))
say (gameforge.new_christmas._110_say)
pc.setqf ("last_nog_give_time", get_global_time())
pc.give_item2 (50216, 6)
else
say_title(mob_name(20126))
say (gameforge.new_christmas._120_say)
end
end
end
end

View File

@ -1,70 +0,0 @@
quest new_christmas_2012_sock begin
state start begin
end
state baby_dear_give begin
when 20126.chat.gameforge.new_christmas_sock._010_npcChat begin
say_title(mob_name(20126))
say (gameforge.new_christmas_sock._020_say)
wait()
say_title(mob_name(20126))
say (gameforge.new_christmas_sock._030_say)
wait()
say_title(mob_name(20126))
say (gameforge.new_christmas_sock._040_say)
wait()
say_title(mob_name(20126))
pc.give_item2_select (53007, 1)
item.set_socket (0, get_global_time() + 7200)
pc.setqf ("last_reindeer_give_time", get_global_time())
set_state(sock_take)
end
end
state sock_take begin
when 20126.chat.gameforge.new_christmas_sock._080_npcChat begin
if get_global_time() - pc.getqf ("last_reindeer_give_time") < 86400 then
say_title (mob_name (20126))
say (gameforge.new_christmas_sock._090_say)
else
say_title (mob_name (20126))
say (gameforge.new_christmas_sock._040_say)
pc.give_item2_select (53007, 1)
item.set_socket (0, get_global_time() + 7200)
pc.setqf ("last_reindeer_give_time", get_global_time())
end
end
when 20126.chat."reset flags / reindeer, socks" with is_test_server() begin
pc.setqf ("last_reindeer_give_time", 0)
pc.setqf("last_sock_cooldown_time", 0)
end
when 20126.chat.gameforge.new_christmas_sock._050_npcChat begin
if get_time() < pc.getqf("last_sock_cooldown_time") then
say_title (mob_name(20126))
say (gameforge.new_christmas_sock._100_say)
else
local n = pc.count_item(50010)
if n < 5 then
say_title(mob_name(20126))
say (gameforge.new_christmas_sock._060_say)
wait()
else
say_title(mob_name(20126))
say (gameforge.new_christmas_sock._070_say)
wait()
pc.remove_item (50010, 5)
say_title(locale.reward)
pc.give_item2(71144)
say_reward (string.format("%s : 1%s",item_name(71144), locale.count_postfix))
if is_test_server() then
pc.setqf("last_sock_cooldown_time", get_time() + 20)
else
pc.setqf("last_sock_cooldown_time", get_time()+60*60*24) -----------------------------------24 stunden nun
end
end
end
end
end
end

View File

@ -1,470 +0,0 @@
quest spider_dungeon_3floor_boss begin
state start begin
--2, <20><><EFBFBD><EFBFBD> <20><> <20>ð<EFBFBD>.
when spider_end_timer.server_timer with game.get_event_flag("spider_dead"..get_channel_id()) == 0 begin --
warp_all_in_area_to_area(82700, 612700, 93700,625700, 69100, 614800, 69100, 614800)
game.set_event_flag("spider_lair_ongoing_"..get_channel_id(),0)
game.set_event_flag("spider_lair_leader_"..get_channel_id(), 0)
game.set_event_flag("spider_dead"..get_channel_id(),0)
purge_area(82700, 612700, 93700,625700)
end
when spider_dead_timer.server_timer begin
warp_all_in_area_to_area(82700, 612700, 93700,625700, 69100, 614800, 69100, 614800)
game.set_event_flag("spider_lair_ongoing_"..get_channel_id(), 0)
game.set_event_flag("spider_lair_leader_"..get_channel_id(), 0)
game.set_event_flag("spider_dead"..get_channel_id(),0)
purge_area(82700, 612700, 93700,625700)
end
when login or levelup or enter with pc.get_level() >= 50 begin
set_state( step1 )
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
say(gameforge.spider_dungeon_3floor_boss._20_say)
end
end
state step1 begin
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
say(gameforge.spider_dungeon_3floor_boss._20_say)
end
when 20355.chat.gameforge.spider_dungeon_3floor_boss._50_npcChat begin --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5BFA1> <20><><EFBFBD><EFBFBD> <20>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
say_title(mob_name(20355))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.spider_dungeon_3floor_boss._60_say)
set_state( step2 )
pc.give_item2(76019)
end
end
state step2 begin --<2D>񼮿<EFBFBD> Ź<><C5B9><EFBFBD><EFBFBD> <20>߷<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
-----------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>2------------
when letter begin
send_letter(gameforge.spider_dungeon_3floor_boss._70_sendLetter)
local v = find_npc_by_vnum(30130)
if 0 != v then
target.vid("__TARGET__", v, mob_name(30130))
end
end
when button or info begin
say_title(gameforge.spider_dungeon_3floor_boss._70_sendLetter)
say(gameforge.spider_dungeon_3floor_boss._80_say)
say("")
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._70_sendLetter begin
target.delete("__TARGET__")
say_title(pc.getname())
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.spider_dungeon_3floor_boss._90_say)
set_state(step3)
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
say(gameforge.spider_dungeon_3floor_boss._20_say)
end
when 20355.chat.gameforge.spider_dungeon_3floor_boss._50_npcChat begin
say_title(mob_name(20355))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.spider_dungeon_3floor_boss._100_say)
end
end
state step3 begin --Ź<><C5B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>񿡰<EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0><EFBFBD>.
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
say(gameforge.spider_dungeon_3floor_boss._20_say)
end
when letter begin
send_letter(gameforge.spider_dungeon_3floor_boss._110_sendLetter)
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20355)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20355))
end
end
when button or info begin
say_title(gameforge.spider_dungeon_3floor_boss._110_sendLetter)
say(gameforge.spider_dungeon_3floor_boss._120_say)
say("")
end
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>õ<EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
when 20355.chat.gameforge.spider_dungeon_3floor_boss._110_sendLetter begin
say_title(mob_name(20355))
say(gameforge.spider_dungeon_3floor_boss._130_say)
set_state(step4)
end
end
state step4 begin --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ź<><C5B9><EFBFBD><EFBFBD> <20>ñ<EFBFBD><C3B1><EFBFBD>.
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
say(gameforge.spider_dungeon_3floor_boss._20_say)
end
-----------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>2------------
when letter begin
send_letter(gameforge.spider_dungeon_3floor_boss._110_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.spider_dungeon_3floor_boss._110_sendLetter)
say(gameforge.spider_dungeon_3floor_boss._140_say)
say("")
end
when 20011.chat.gameforge.spider_dungeon_3floor_boss._110_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20011))
say(gameforge.spider_dungeon_3floor_boss._150_say)
say("")
set_state(step5)
end
when 20355.chat.gameforge.spider_dungeon_3floor_boss._110_sendLetter begin
say_title(mob_name(20355))
say(gameforge.spider_dungeon_3floor_boss._130_say)
end
end
state step5 begin --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
say(gameforge.spider_dungeon_3floor_boss._20_say)
end
when letter begin
send_letter(gameforge.spider_dungeon_3floor_boss._110_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20355)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20355))
end
end
when button or info begin
say_title(gameforge.spider_dungeon_3floor_boss._170_sayTitle)
say(gameforge.spider_dungeon_3floor_boss._180_say)
say("")
end
when 20355.chat.gameforge.spider_dungeon_3floor_boss._190_npcChat begin
target.delete("__TARGET__")
say_title(mob_name(20355))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.spider_dungeon_3floor_boss._200_say)
say("")
set_state(step6) pc.give_item2(76019)
end
when 20011.chat.gameforge.spider_dungeon_3floor_boss._110_sendLetter begin
say_title(mob_name(20011))
say(gameforge.spider_dungeon_3floor_boss._160_say)
say("")
end
end
state step6 begin --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ͻ<EFBFBD>Ų<EFBFBD><C5B2>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
say(gameforge.spider_dungeon_3floor_boss._20_say)
end
when letter begin
send_letter(gameforge.spider_dungeon_3floor_boss._190_npcChat)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.spider_dungeon_3floor_boss._190_npcChat)
say(gameforge.spider_dungeon_3floor_boss._200_say)
say("")
end
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>õ<EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
when 20011.chat.gameforge.spider_dungeon_3floor_boss._190_npcChat begin
target.delete("__TARGET__")
say_title(mob_name(20011))
say(gameforge.spider_dungeon_3floor_boss._230_say)
set_state(boss_ok)
end
end
state boss_ok begin -- <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ְ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ẕ́<C5B9> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
when 20011.chat.gameforge.spider_dungeon_3floor_boss._210_npcChat begin
if pc.count_item(30025) > 0 and pc.count_item(30056) > 0 and pc.count_item(30057) > 0 and pc.count_item(30058) > 0 and pc.count_item(30059) > 0 and pc.count_item(30326) > 0 then
say_title(mob_name(20011))
say(gameforge.spider_dungeon_3floor_boss._250_say)
pc.remove_item(30025, 1)
pc.remove_item(30056, 1)
pc.remove_item(30057, 1)
pc.remove_item(30058, 1)
pc.remove_item(30059, 1)
pc.remove_item(30326, 1)
if math.random(1,2000) <= 1000 then
say(gameforge.spider_dungeon_3floor_boss._260_say)
pc.give_item2(30324, 1)
else
say(gameforge.spider_dungeon_3floor_boss._270_say)
end
else
say_title(mob_name(20011))
say(gameforge.spider_dungeon_3floor_boss._280_say)
end
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
if game.get_event_flag("spider_lair_ongoing_"..get_channel_id()) == 1 then
local starttime = game.get_event_flag("spider_lair_start_time_"..get_channel_id())
local current_time = get_global_time()
if party.get_leader_pid() == game.get_event_flag("spider_lair_leader_"..get_channel_id()) then
if starttime + 300 >= current_time and party.get_leader_pid() == game.get_event_flag("spider_lair_leader_"..get_channel_id()) and game.get_event_flag("spider_lair_ongoing_"..get_channel_id()) == 1 then
say(gameforge.spider_dungeon_3floor_boss._300_say) -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
local warp = select(locale.confirm,locale.cancel)
if warp == 1 then
pc.setqf("firstIn",1)
pc.setqf("retry_limit_time", starttime + 1200 + 3600 )
set_state(inLair)
pc.warp(88100,614800)
return
end
else
say(gameforge.spider_dungeon_3floor_boss._310_say) -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
return
end
else
local remain_time = (game.get_event_flag("spider_lair_end_time_"..get_channel_id() ) - get_global_time()) / 60
if remain_time < 0 then
say(gameforge.spider_dungeon_3floor_boss._410_say)
game.set_event_flag("spider_lair_ongoing_"..get_channel_id(),0)
game.set_event_flag("spider_lair_leader_"..get_channel_id(), 0)
game.set_event_flag("spider_dead"..get_channel_id(),0)
return
end
say(gameforge.spider_dungeon_3floor_boss._320_say)
--- here we should change to string.format %s key
say(string.format(gameforge.spider_dungeon_3floor_boss._330_say, math.ceil(remain_time)))
return
end
elseif pc.getqf("retry_limit_time") > get_global_time() then
local access_limit = (pc.getqf("retry_limit_time") - get_global_time()) / 60
say(gameforge.spider_dungeon_3floor_boss._340_say)
-- here we should also change to string.format %s key
say(string.format(gameforge.spider_dungeon_3floor_boss._350_say, math.ceil(access_limit)))
return
elseif party.is_leader() then
if false == pc.can_warp() then
say(gameforge.spider_dungeon_3floor_boss._360_say)
return
end
if pc.count_item(30324) > 0 then
say(gameforge.spider_dungeon_3floor_boss._370_say)
local warp = select(locale.confirm,locale.cancel)
if warp == 1 then
set_state(inLair)
pc.remove_item(30324, 1)
mob.spawn(2094,369,551,0,0)
--<2D><> <20><><EFBFBD><EFBFBD>.
game.set_event_flag("spider_lair_ongoing_"..get_channel_id() , 1)
game.set_event_flag("spider_lair_start_time_"..get_channel_id() , get_global_time())
game.set_event_flag("spider_lair_end_time_"..get_channel_id() , get_global_time() + 1200)
game.set_event_flag("spider_lair_leader_"..get_channel_id() , party.get_leader_pid())
pc.setqf("retry_limit_time", get_global_time() + 1200 + 3600 )
pc.setqf("firstIn",1)
server_timer("spider_end_timer", 1200 )
pc.warp(88100,614800)
end
return
else
say(gameforge.spider_dungeon_3floor_boss._380_say)
return
end
else --<2D><><EFBFBD><EFBFBD> <20>ƴϴ<C6B4>.
say(gameforge.spider_dungeon_3floor_boss._390_say)
return
end
end
end
state inLair begin
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
when login begin
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD>.
--if pc.getqf("firstIn") == 1 and party.get_leader_pid() == game.get_event_flag("spider_lair_leader_"..get_channel_id()) then
if get_global_time() < pc.getqf("retry_limit_time") - 3600 and party.get_leader_pid() == game.get_event_flag("spider_lair_leader_"..get_channel_id()) then
pc.setqf("firstIn",0)
elseif pc.getx() >= 827 and pc.getx() <= 937 and pc.gety() >= 6127 and pc.gety() <= 6257 then
pc.warp(95900,571000)
pc.remove_item(30327, 1)
else -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ðܳ<C3B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ۿ<EFBFBD><DBBF><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20>ϰ<EFBFBD> <20>Ǹ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
pc.remove_item(30327, 1)
set_state( boss_ok )
local limit = pc.getqf("retry_limit_time")
if limit > ( get_global_time() + 3600 ) then
limit = ( get_global_time() + 3600 )
end
pc.setqf("retry_limit_time", limit )
local duration = limit - get_global_time()
end
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
if game.get_event_flag("spider_lair_ongoing_"..get_channel_id()) == 1 then
local starttime = game.get_event_flag("spider_lair_start_time_"..get_channel_id())
local current_time = get_global_time()
if party.get_leader_pid() == game.get_event_flag("spider_lair_leader_"..get_channel_id()) then
if starttime + 300 >= current_time and party.get_leader_pid() == game.get_event_flag("spider_lair_leader_"..get_channel_id()) and game.get_event_flag("spider_lair_ongoing_"..get_channel_id()) == 1 then
say(gameforge.spider_dungeon_3floor_boss._300_say) -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
local warp = select(locale.confirm,locale.cancel)
if warp == 1 then
pc.warp(88100,614800)
return
end
end
end
end
end
when 2092.kill begin --<2D><><EFBFBD>հŹ<D5B0> <20><><EFBFBD><EFBFBD>
server_timer("spider_dead_timer", 180)
game.set_event_flag("spider_dead"..get_channel_id(), 1)
notice_multiline(gameforge.spider_dungeon_3floor_boss._400_say,notice_in_map)
end
when 2095.kill begin --<2D>Ź̾<C5B9> <20><><EFBFBD><EFBFBD>
local kingVid = game.get_event_flag("king_vid")
local remain_egg = game.get_event_flag("remain_egg"..get_channel_id())
notice_multiline(gameforge.spider_dungeon_3floor_boss._420_notice,notice_in_map)
if remain_egg > 0 then
remain_egg = remain_egg - 1
game.set_event_flag("remain_egg"..get_channel_id(), remain_egg)
end
--<2D>Ź<EFBFBD><C5B9><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> <20><><EFBFBD><EFBFBD>
npc.set_vid_attack_mul(kingVid, 10/(remain_egg + 1))
--<2D>Ź̰<C5B9> <20>޴<EFBFBD> <20><><EFBFBD>ط<EFBFBD> <20><><EFBFBD><EFBFBD>
npc.set_vid_damage_mul(kingVid, 10/(remain_egg + 1))
end
-- 2012.4.5 <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD>
when 30327.use with pc.getx() >= 827 and pc.get_map_index() == 217 and pc.getx() <= 937 and pc.gety() >= 6127 and pc.gety() <= 6257 begin
--say("<22>ʹ<EFBFBD>ȣ : "..pc.get_map_index())
pc.remove_item(30327, 1)
i = mob.spawn(2095,400,566,0,0)
mob.spawn(2095,400,594,0,0)
mob.spawn(2095,362,600,0,0)
mob.spawn(2095,337,599,0,0)
mob.spawn(2095,335,581,0,0)
mob.spawn(2095,344,562,0,0)
mob.spawn(2095,364,588,0,0)
mob.spawn(2095,379,562,0,0)
mob.spawn(2095,368,525,0,0)
local kingVid = mob.spawn(2092,367,588,0,0)
game.set_event_flag("king_vid",kingVid)
--game.set_event_flag("remain_egg",9)
game.set_event_flag("remain_egg"..get_channel_id(), 9)
end
end
end

View File

@ -1,158 +0,0 @@
quest test_att_resist begin
state start begin
when 20001.chat."ATT_TEST : ITEM - BASIC" with is_test_server() begin
say("Test items for basic")
say("Check damage with these")
local item_armor
local item_helmet
local item_bracelet
local job = pc.get_job()
if job == 0 then -- WARRIOR
item_armor = 11299
item_helmet = 12249
item_bracelet = 14109
elseif job==1 then -- ASSASSIN
item_armor = 11499
item_helmet = 12389
item_bracelet = 14109
elseif job==2 then -- SURA
item_armor = 11699
item_helmet = 12529
item_bracelet = 14109
elseif job==3 then -- SHAMAN
item_armor = 11899
item_helmet = 12669
item_bracelet = 14109
end
pc.give_item2_select(item_armor)
pc.give_item2_select(item_helmet)
pc.give_item2_select(item_bracelet)
end
when 20001.chat."ATT_TEST : ITEM - FIRE" with is_test_server() begin
say("Test items for Fire resist")
say("Use items and Type /state to check resist stat")
local item_armor
local item_helmet
local item_bracelet
local job = pc.get_job()
if job == 0 then -- WARRIOR
item_armor = 11299
item_helmet = 12249
item_bracelet = 14109
elseif job==1 then -- ASSASSIN
item_armor = 11499
item_helmet = 12389
item_bracelet = 14109
elseif job==2 then -- SURA
item_armor = 11699
item_helmet = 12529
item_bracelet = 14109
elseif job==3 then -- SHAMAN
item_armor = 11899
item_helmet = 12669
item_bracelet = 14109
end
pc.give_item2_select(item_armor)
item.set_value(0, 35, 15)
pc.give_item2_select(item_helmet)
item.set_value(0, 35, 15)
pc.give_item2_select(item_bracelet)
item.set_value(0, 35, 15)
end
when 20001.chat."ATT_TEST : ITEM - ELEC" with is_test_server() begin
say("Test items for ELEC resist")
say("Use items and Type /state to check resist stat")
local item_armor
local item_helmet
local item_bracelet
local job = pc.get_job()
if job == 0 then -- WARRIOR
item_armor = 11299
item_helmet = 12249
item_bracelet = 14109
elseif job==1 then -- ASSASSIN
item_armor = 11499
item_helmet = 12389
item_bracelet = 14109
elseif job==2 then -- SURA
item_armor = 11699
item_helmet = 12529
item_bracelet = 14109
elseif job==3 then -- SHAMAN
item_armor = 11899
item_helmet = 12669
item_bracelet = 14109
end
pc.give_item2_select(item_armor)
item.set_value(0, 36, 15)
pc.give_item2_select(item_helmet)
item.set_value(0, 36, 15)
pc.give_item2_select(item_bracelet)
item.set_value(0, 36, 15)
end
when 20001.chat."ATT_TEST : ITEM - WIND" with is_test_server() begin
say("Test items for WIND resist")
say("Use items and Type /state to check resist stat")
local item_armor
local item_helmet
local item_bracelet
local job = pc.get_job()
if job == 0 then -- WARRIOR
item_armor = 11299
item_helmet = 12249
item_bracelet = 14109
elseif job==1 then -- ASSASSIN
item_armor = 11499
item_helmet = 12389
item_bracelet = 14109
elseif job==2 then -- SURA
item_armor = 11699
item_helmet = 12529
item_bracelet = 14109
elseif job==3 then -- SHAMAN
item_armor = 11899
item_helmet = 12669
item_bracelet = 14109
end
pc.give_item2_select(item_armor)
item.set_value(0, 38, 15)
pc.give_item2_select(item_helmet)
item.set_value(0, 38, 15)
pc.give_item2_select(item_bracelet)
item.set_value(0, 38, 15)
end
when 20001.chat."ATT_TEST : MOB - FIRE" with is_test_server() begin
say("spawn FIRE monster")
say("check damage with basic and resist armors")
mob.spawn(2201, pc.get_local_x(), pc.get_local_y(),0,1,1)
end
when 20001.chat."ATT_TEST : MOB - ELEC" with is_test_server() begin
say("spawn ELEC monster")
say("check damage with basic and resist armors")
mob.spawn(2401, pc.get_local_x(), pc.get_local_y(),0,1,1)
end
when 20001.chat."ATT_TEST : MOB - WIND" with is_test_server() begin
say("spawn WIND monster")
say("check damage with basic and resist armors")
mob.spawn(777, pc.get_local_x(), pc.get_local_y(),0,1,1)
end
end
end

View File

@ -174,8 +174,6 @@ guild.level
guild.name
guild.war_bet
guild.war_enter
highscore.register
highscore.show
horse.advance
horse.feed
horse.get_grade

View File

@ -1,23 +0,0 @@
#!/usr/local/bin/python
import pre_qc
import os
import sys
os.system('rm -rf object')
os.system('mkdir object')
#os.system('rm -rf pre_qc')
os.system('mkdir pre_qc')
os.system('chgrp quest object')
for line in file('locale_list'):
r = pre_qc.run (line)
if r == True:
filename = 'pre_qc/'+line
else:
filename = line
if os.system('./qc '+filename):
print 'Error occured on compile ' + line
os.system('chmod -R 770 object')
import sys
sys.exit(-1)
os.system('chmod -R 770 object')

View File

@ -1,8 +0,0 @@
quest test begin
state start begin
when 20355.chat."bbbb" begin
setskin(NOWINDOW)
say_show_item(90013)
end
end
end

View File

@ -2,15 +2,15 @@
#define __HEADER_VNUM_HELPER__
/**
<EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰų<CFB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD> <20>ҽ<EFBFBD><D2BD><EFBFBD><EFBFBD><EFBFBD> <20>ĺ<EFBFBD><C4BA><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
<EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>=VNum)<29><> <20>ϵ<EFBFBD><CFB5>ڵ<EFBFBD><DAB5>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>־ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ſ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>
이미 존재하거나 앞으로 추가될 아이템, 몹 등을 소스에서 식별할 때 현재는 모두
식별자(숫자=VNum)를 하드코딩하는 방식으로 되어있어서 가독성이 매우 떨어지는데
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD> <20>ҽ<EFBFBD><D2BD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><C8A4> <20><>)<29><><EFBFBD><EFBFBD> <20><> <20><> <20>ְ<EFBFBD> <20><><EFBFBD>ڴ<EFBFBD> <20><>ö<EFBFBD><C3B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>.
앞으로는 소스만 봐도 어떤 아이템(혹은 몹)인지 알 수 있게 하자는 승철님의 제안으로 추가.
* <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵµ<C7B4> PCH<43><48> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؾ<EFBFBD><D8BE>ϴ<EFBFBD>
<EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> cpp<70><70><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> include <20>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
* 이 파일은 변경이 잦을것으로 예상되는데 PCH에 넣으면 바뀔 때마다 전체 컴파일 해야하니
일단은 필요한 cpp파일에서 include 해서 쓰도록 했음.
* cpp<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ~ <20><>ũ<EFBFBD>ؾ<EFBFBD><D8BE>ϴ<EFBFBD> <20>׳<EFBFBD> common<6F><6E> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD>. (game, db<64><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
* cpp에서 구현하면 컴파일 ~ 링크해야하니 그냥 common에 헤더만 넣었음. (game, db프로젝트 둘 다 사용 예정)
@date 2011. 8. 29.
*/
@ -19,35 +19,35 @@
class CItemVnumHelper
{
public:
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> DVD<56><44> <20>һ<EFBFBD><D2BB><EFBFBD> <20><>ȯ<EFBFBD><C8AF>
static const bool IsPhoenix(DWORD vnum) { return 53001 == vnum; } // NOTE: <EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 53001 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mob-vnum<EFBFBD><EFBFBD> 34001 <EFBFBD>Դϴ<EFBFBD>.
/// 독일 DVD용 불사조 소환권
static const bool IsPhoenix(DWORD vnum) { return 53001 == vnum; } // NOTE: 불사조 소환 아이템은 53001 이지만 mob-vnum 34001 입니다.
/// <EFBFBD>󸶴<EFBFBD> <20>̺<EFBFBD>Ʈ <20>ʽ´<CABD><C2B4><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>󸶴<EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> Ư<><C6AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȱ<EFBFBD><C8B0><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ٰ<EFBFBD> <20><>)
/// 라마단 이벤트 초승달의 반지 (원래는 라마단 이벤트용 특수 아이템이었으나 앞으로 여러 방향으로 재활용해서 계속 쓴다고 함)
static const bool IsRamadanMoonRing(DWORD vnum) { return 71135 == vnum; }
/// <EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ´<CABD><C2B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
/// 할로윈 사탕 (스펙은 초승달의 반지와 동일)
static const bool IsHalloweenCandy(DWORD vnum) { return 71136 == vnum; }
/// ũ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0BAB9> <20><><EFBFBD><EFBFBD>
/// 크리스마스 행복의 반지
static const bool IsHappinessRing(DWORD vnum) { return 71143 == vnum; }
/// <EFBFBD>߷<EFBFBD>Ÿ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD>Ʈ
/// 발렌타인 사랑의 팬던트
static const bool IsLovePendant(DWORD vnum) { return 71145 == vnum; }
};
class CMobVnumHelper
{
public:
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> DVD<56><44> <20>һ<EFBFBD><D2BB><EFBFBD> <20><> <20><>ȣ
/// 독일 DVD용 불사조 몹 번호
static bool IsPhoenix(DWORD vnum) { return 34001 == vnum; }
static bool IsIcePhoenix(DWORD vnum) { return 34003 == vnum; }
/// PetSystem<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>ΰ<EFBFBD>?
/// PetSystem이 관리하는 펫인가?
static bool IsPetUsingPetSystem(DWORD vnum) { return (IsPhoenix(vnum) || IsReindeerYoung(vnum)) || IsIcePhoenix(vnum); }
/// 2011<EFBFBD><EFBFBD> ũ<><C5A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><> (<28>Ʊ<EFBFBD> <20><><EFBFBD><EFBFBD>)
/// 2011년 크리스마스 이벤트용 펫 (아기 순록)
static bool IsReindeerYoung(DWORD vnum) { return 34002 == vnum; }
/// <EFBFBD>󸶴<EFBFBD> <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>渶(20119) .. <20>ҷ<EFBFBD><D2B7><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20>󸶴<EFBFBD> <20>渶 Ŭ<><C5AC>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, 20219)
/// 라마단 이벤트 보상용 흑마(20119) .. 할로윈 이벤트용 라마단 흑마 클론(스펙은 같음, 20219)
static bool IsRamadanBlackHorse(DWORD vnum) { return 20119 == vnum || 20219 == vnum || 22022 == vnum; }
};

View File

@ -26,7 +26,7 @@ public:
int get_price () { return offer_price; }
} TAuctionSimpleItemInfo;
// <EFBFBD><EFBFBD> auction <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// auction 정보들.
// primary key (item_id)
typedef struct _auction : public _base_auction
{
@ -49,8 +49,8 @@ public:
empire = _empire;
}
// <EFBFBD><EFBFBD> <20>޼ҵ<DEBC><D2B5><EFBFBD><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> auction<6F><6E><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҵ<EFBFBD>.
// 이 메소드들은 어떤 변수가 auction에서 어떤 역할을 하는지 까먹을 까봐
// 만들어놓았다.
// by rtsummit
DWORD get_item_id () { return item_id; }
DWORD get_bidder_id () { return bidder_id; }
@ -89,7 +89,7 @@ typedef struct _sale : public _base_auction
} TSaleItemInfo;
// wish<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// wish는 실제하는 아이템은 없다.
// primary key (item_num, wisher_id)
typedef struct _wish : public _base_auction
{
@ -118,9 +118,9 @@ enum AuctionCmd {OPEN_AUCTION, OPEN_WISH_AUCTION, OPEN_MY_AUCTION, OPEN_MY_WISH_
AUCTION_REBID, AUCTION_BID_CANCEL,
};
// <EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD> FAIL <EFBFBD>տ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>;<EFBFBD><CDBE>Ѵ<EFBFBD>.
// <EFBFBD>ֳ<EFBFBD>, <= AUCTION_FAIL <EFBFBD>̷<EFBFBD> CHECK<EFBFBD><EFBFBD> <20><> <20>Űŵ<C5B0>
// <EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD> SUCCESS <EFBFBD>ڿ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>;<EFBFBD><CDBE>Ѵ<EFBFBD>. <20>ٵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֱ<EFBFBD> <20>Ϸ<EFBFBD><CFB7><EFBFBD>...
// 반드시 FAIL 앞에, 실패 류 들이 와야한다.
// 왜냐, <= AUCTION_FAIL 이런 CHECK을 할 거거든
// 반대로 SUCCESS 뒤에, 성공 류 들이 와야한다. 근데 성공류가 있긴 하려나...
enum AuctionResult { AUCTION_EXPIRED, AUCTION_NOT_EXPIRED, AUCTION_NOT_ENOUGH_MONEY,
AUCTION_SOLD, AUCTION_CANCEL, AUCTION_ALREADY_IN, AUCTION_NOT_IN, AUCTION_FAIL, AUCTION_SUCCESS };
@ -218,7 +218,7 @@ typedef struct command_auction
cmd = AUCTION_CHANGING_MONEY;
price1 = _money;
}
// bid<EFBFBD><EFBFBD> cmd<EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD>.
// bid cmd만 다르다.
void rebid (DWORD _item_id, int _bidPrice)
{
cmd = AUCTION_REBID;
@ -322,7 +322,7 @@ typedef struct auction_impur : public command_auction
// auction_type;
// start_idx;
// size;
// conditions; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ö<EFBFBD>Բ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>.<2E><><EFBFBD><EFBFBD>
// conditions; 정렬은 승철님께 조언을 구해보자.ㅇㅇ
//}
//
//get_auction_detail_item_info

View File

@ -1,15 +0,0 @@
#ifndef __INC_METIN_II_COMMON_BILLING_H__
#define __INC_METIN_II_COMMON_BILLING_H__
enum EBillingTypes
{
BILLING_NONE,
BILLING_IP_FREE,
BILLING_FREE,
BILLING_IP_TIME,
BILLING_IP_DAY,
BILLING_TIME,
BILLING_DAY,
};
#endif

View File

@ -41,8 +41,8 @@ namespace building
int lNPCX;
int lNPCY;
DWORD dwGroupVnum; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD>
DWORD dwDependOnGroupVnum; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>׷<EFBFBD>
DWORD dwGroupVnum; // 같은 그룹은 하나만 건설가능
DWORD dwDependOnGroupVnum; // 지어져 있어야하는 그룹
} TObjectProto;
typedef struct SObject

View File

@ -31,8 +31,8 @@ enum EItemDragonSoulSockets
ITEM_SOCKET_DRAGON_SOUL_ACTIVE_IDX = 2,
ITEM_SOCKET_CHARGING_AMOUNT_IDX = 2,
};
// <EFBFBD><EFBFBD> <20>̰<EFBFBD> <20><>ģ<EFBFBD><C4A3> <20>ƴϾ<C6B4>?
// <EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>ϸ<EFBFBD> <20><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -_-;;;
// 헐 이거 미친거 아니야?
// 나중에 소켓 확장하면 어쩌려고 이지랄 -_-;;;
enum EItemUniqueSockets
{
ITEM_SOCKET_UNIQUE_SAVE_TIME = ITEM_SOCKET_MAX_NUM - 2,
@ -42,18 +42,18 @@ enum EItemUniqueSockets
enum EItemTypes
{
ITEM_NONE, //0
ITEM_WEAPON, //1//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_ARMOR, //2//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_USE, //3//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ITEM_WEAPON, //1//무기
ITEM_ARMOR, //2//갑옷
ITEM_USE, //3//아이템 사용
ITEM_AUTOUSE, //4
ITEM_MATERIAL, //5
ITEM_SPECIAL, //6 //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_SPECIAL, //6 //스페셜 아이템
ITEM_TOOL, //7
ITEM_LOTTERY, //8//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_ELK, //9//<EFBFBD><EFBFBD>
ITEM_LOTTERY, //8//복권
ITEM_ELK, //9//
ITEM_METIN, //10
ITEM_CONTAINER, //11
ITEM_FISH, //12//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_FISH, //12//낚시
ITEM_ROD, //13
ITEM_RESOURCE, //14
ITEM_CAMPFIRE, //15
@ -61,21 +61,21 @@ enum EItemTypes
ITEM_SKILLBOOK, //17
ITEM_QUEST, //18
ITEM_POLYMORPH, //19
ITEM_TREASURE_BOX, //20//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_TREASURE_KEY, //21//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ITEM_TREASURE_BOX, //20//보물상자
ITEM_TREASURE_KEY, //21//보물상자 열쇠
ITEM_SKILLFORGET, //22
ITEM_GIFTBOX, //23
ITEM_PICK, //24
ITEM_HAIR, //25//<EFBFBD>Ӹ<EFBFBD>
ITEM_TOTEM, //26//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_BLEND, //27//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20>ٴ<EFBFBD> <20>
ITEM_COSTUME, //28//<EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (2011<31><31> 8<><38> <20>߰<EFBFBD><DFB0><EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20>ý<EFBFBD><C3BD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
ITEM_DS, //29 //<EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>
ITEM_SPECIAL_DS, //30 // Ư<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5> (DS_SLOT<4F><54> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> UNIQUE <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><>)
ITEM_EXTRACT, //31 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
ITEM_SECONDARY_COIN, //32 ?? <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>??
ITEM_RING, //33 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_BELT, //34 <EFBFBD><EFBFBD>Ʈ
ITEM_HAIR, //25//머리
ITEM_TOTEM, //26//토템
ITEM_BLEND, //27//생성될때 랜덤하게 속성이 붙는 약물
ITEM_COSTUME, //28//코스츔 아이템 (2011년 8월 추가된 코스츔 시스템용 아이템)
ITEM_DS, //29 //용혼석
ITEM_SPECIAL_DS, //30 // 특수한 용혼석 (DS_SLOT에 착용하는 UNIQUE 아이템이라 생각하면 됨)
ITEM_EXTRACT, //31 추출도구.
ITEM_SECONDARY_COIN, //32 ?? 명도전??
ITEM_RING, //33 반지
ITEM_BELT, //34 벨트
};
enum EMetinSubTypes
@ -111,8 +111,8 @@ enum EArmorSubTypes
enum ECostumeSubTypes
{
COSTUME_BODY = ARMOR_BODY, // [<EFBFBD>߿<EFBFBD>!!] ECostumeSubTypes enum value<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EArmorSubTypes<EFBFBD><EFBFBD> <20>װͰ<D7B0> <20><><EFBFBD>ƾ<EFBFBD> <20><>.
COSTUME_HAIR = ARMOR_HEAD, // <EFBFBD>̴<EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20>߰<EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD>̰ڴٴ<DAB4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȱ<><C8B0><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
COSTUME_BODY = ARMOR_BODY, // [중요!!] ECostumeSubTypes enum value는 종류별로 EArmorSubTypes의 그것과 같아야 함.
COSTUME_HAIR = ARMOR_HEAD, // 이는 코스츔 아이템에 추가 속성을 붙이겠다는 사업부의 요청에 따라서 기존 로직을 활용하기 위함임.
COSTUME_NUM_TYPES,
};
@ -215,8 +215,8 @@ enum EUseSubTypes
USE_UNBIND,
USE_TIME_CHARGE_PER,
USE_TIME_CHARGE_FIX, // 28
USE_PUT_INTO_BELT_SOCKET, // 29 <EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
USE_PUT_INTO_RING_SOCKET, // 30 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>ũ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
USE_PUT_INTO_BELT_SOCKET, // 29 벨트 소켓에 사용할 수 있는 아이템
USE_PUT_INTO_RING_SOCKET, // 30 반지 소켓에 사용할 수 있는 아이템 (유니크 반지 말고, 새로 추가된 반지 슬롯)
};
enum EExtractSubTypes
@ -270,7 +270,7 @@ enum EItemFlag
{
ITEM_FLAG_REFINEABLE = (1 << 0),
ITEM_FLAG_SAVE = (1 << 1),
ITEM_FLAG_STACKABLE = (1 << 2), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ĥ <20><> <20><><EFBFBD><EFBFBD>
ITEM_FLAG_STACKABLE = (1 << 2), // 여러개 합칠 수 있음
ITEM_FLAG_COUNT_PER_1GOLD = (1 << 3),
ITEM_FLAG_SLOW_QUERY = (1 << 4),
ITEM_FLAG_UNUSED01 = (1 << 5), // UNUSED
@ -287,24 +287,24 @@ enum EItemFlag
enum EItemAntiFlag
{
ITEM_ANTIFLAG_FEMALE = (1 << 0), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_MALE = (1 << 1), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_WARRIOR = (1 << 2), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_ASSASSIN = (1 << 3), // <EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_SURA = (1 << 4), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_SHAMAN = (1 << 5), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_GET = (1 << 6), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_DROP = (1 << 7), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_SELL = (1 << 8), // <EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_EMPIRE_A = (1 << 9), // A <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_EMPIRE_B = (1 << 10), // B <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_EMPIRE_C = (1 << 11), // C <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_SAVE = (1 << 12), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_GIVE = (1 << 13), // <EFBFBD>ŷ<EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_PKDROP = (1 << 14), // PK<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_STACK = (1 << 15), // <EFBFBD><EFBFBD>ĥ <20><> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_MYSHOP = (1 << 16), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_SAFEBOX = (1 << 17), // â<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_FEMALE = (1 << 0), // 여성 사용 불가
ITEM_ANTIFLAG_MALE = (1 << 1), // 남성 사용 불가
ITEM_ANTIFLAG_WARRIOR = (1 << 2), // 무사 사용 불가
ITEM_ANTIFLAG_ASSASSIN = (1 << 3), // 자객 사용 불가
ITEM_ANTIFLAG_SURA = (1 << 4), // 수라 사용 불가
ITEM_ANTIFLAG_SHAMAN = (1 << 5), // 무당 사용 불가
ITEM_ANTIFLAG_GET = (1 << 6), // 집을 수 없음
ITEM_ANTIFLAG_DROP = (1 << 7), // 버릴 수 없음
ITEM_ANTIFLAG_SELL = (1 << 8), // 팔 수 없음
ITEM_ANTIFLAG_EMPIRE_A = (1 << 9), // A 제국 사용 불가
ITEM_ANTIFLAG_EMPIRE_B = (1 << 10), // B 제국 사용 불가
ITEM_ANTIFLAG_EMPIRE_C = (1 << 11), // C 제국 사용 불가
ITEM_ANTIFLAG_SAVE = (1 << 12), // 저장되지 않음
ITEM_ANTIFLAG_GIVE = (1 << 13), // 거래 불가
ITEM_ANTIFLAG_PKDROP = (1 << 14), // PK시 떨어지지 않음
ITEM_ANTIFLAG_STACK = (1 << 15), // 합칠 수 없음
ITEM_ANTIFLAG_MYSHOP = (1 << 16), // 개인 상점에 올릴 수 없음
ITEM_ANTIFLAG_SAFEBOX = (1 << 17), // 창고에 넣을 수 없음
};
enum EItemWearableFlag
@ -333,18 +333,20 @@ enum ELimitTypes
LIMIT_DEX,
LIMIT_INT,
LIMIT_CON,
// TODO: Remove this and re-check the validity of item_proto afterwards
LIMIT_PCBANG,
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ǽð<C7BD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> (socket0<74><30> <20>Ҹ<EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>: unix_timestamp Ÿ<EFBFBD><EFBFBD>)
/// 착용 여부와 상관 없이 실시간으로 시간 차감 (socket0에 소멸 시간이 박힘: unix_timestamp 타입)
LIMIT_REAL_TIME,
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> ó<><C3B3> <20><><EFBFBD><EFBFBD><><C8A4> <20><><EFBFBD><EFBFBD>) <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> Ÿ<≯<EFBFBD> <20><><EFBFBD><EFBFBD>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> socket0<74><30> <20><><EFBFBD><EFBFBD>ɽð<C9BD>(<28>ʴ<EFBFBD><CAB4><EFBFBD>, 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> limit value<75><65> <20><><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִٰ<D6B4>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> socket1<74><31> <20><><EFBFBD><EFBFBD> Ƚ<><C8BD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> socket0<EFBFBD><EFBFBD> unix_timestamp Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҹ<EFBFBD><D2B8>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>.
/// 아이템을 맨 처음 사용(혹은 착용) 한 순간부터 리얼타임 타이머 시작
/// 최초 사용 전에는 socket0에 사용가능시간(초단위, 0이면 프로토의 limit value값 사용) 값이 쓰여있다가
/// 아이템 사용시 socket1에 사용 횟수가 박히고 socket0 unix_timestamp 타입의 소멸시간이 박힘.
LIMIT_REAL_TIME_START_FIRST_USE,
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// socket0<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>ʴ<EFBFBD><CAB4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD> 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> limit value<EFBFBD><EFBFBD><EFBFBD><EFBFBD> socket0<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
/// 아이템을 착용 중일 때만 사용 시간이 차감되는 아이템
/// socket0에 남은 시간이 초단위로 박힘. (아이템 최초 사용시 해당 값이 0이면 프로토의 limit value값을 socket0에 복사)
LIMIT_TIMER_BASED_ON_WEAR,
LIMIT_MAX_NUM

View File

@ -16,17 +16,15 @@ enum EMisc
ABILITY_MAX_NUM = 50,
EMPIRE_MAX_NUM = 4,
BANWORD_MAX_LEN = 24,
SMS_MAX_LEN = 80,
MOBILE_MAX_LEN = 32,
SOCIAL_ID_MAX_LEN = 18,
MAP_ALLOW_MAX_LEN = 128,
GUILD_NAME_MAX_LEN = 12,
SHOP_HOST_ITEM_MAX_NUM = 40, /* ȣ<EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> */
SHOP_GUEST_ITEM_MAX_NUM = 18, /* <EFBFBD>Խ<EFBFBD>Ʈ<EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> */
SHOP_HOST_ITEM_MAX_NUM = 40, /* 호스트의 최대 아이템 개수 */
SHOP_GUEST_ITEM_MAX_NUM = 18, /* 게스트의 최대 아이템 개수 */
SHOP_PRICELIST_MAX_NUM = 40, ///< <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
SHOP_PRICELIST_MAX_NUM = 40, ///< 개인상점 가격정보 리스트에서 유지할 가격정보의 최대 갯수
CHAT_MAX_LEN = 512,
@ -80,19 +78,19 @@ enum EMisc
/**
**** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (DB<EFBFBD><EFBFBD> Item Position) ****
**** 현재까지 할당 된 아이템 영역 정리 (DB Item Position) ****
+------------------------------------------------------+ 0
| ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20>κ<EFBFBD><CEBA> (45ĭ * 2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) 90ĭ |
| 캐릭터 기본 인벤토리 (45 * 2페이지) 90 |
+------------------------------------------------------+ 90 = INVENTORY_MAX_NUM(90)
| ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> â (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) 32ĭ |
| 캐릭터 장비 창 (착용중인 아이템) 32 |
+------------------------------------------------------+ 122 = INVENTORY_MAX_NUM(90) + WEAR_MAX_NUM(32)
| <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> â (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5>) 12ĭ |
| 용혼석 장비 창 (착용중인 용혼석) 12 |
+------------------------------------------------------+ 134 = 122 + DS_SLOT_MAX(6) * DRAGON_SOUL_DECK_MAX_NUM(2)
| <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> â <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD>) 18ĭ |
| 용혼석 장비 창 예약 (아직 미사용) 18 |
+------------------------------------------------------+ 152 = 134 + DS_SLOT_MAX(6) * DRAGON_SOUL_DECK_RESERVED_MAX_NUM(3)
| <EFBFBD><EFBFBD>Ʈ <20>κ<EFBFBD><CEBA>丮 (<28><>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20><>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȱ<><C8B0>)|
| 벨트 인벤토리 (벨트 착용시에만 벨트 레벨에 따라 활성)|
+------------------------------------------------------+ 168 = 152 + BELT_INVENTORY_SLOT_COUNT(16) = INVENTORY_AND_EQUIP_CELL_MAX
| <EFBFBD>̻<EFBFBD><EFBFBD><EFBFBD> |
| 미사용 |
+------------------------------------------------------+ ??
*/
};
@ -127,10 +125,10 @@ enum EWearPositions
WEAR_COSTUME_BODY, // 19
WEAR_COSTUME_HAIR, // 20
WEAR_RING1, // 21 : <EFBFBD>ű<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 (<28><><EFBFBD><EFBFBD>)
WEAR_RING2, // 22 : <EFBFBD>ű<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
WEAR_RING1, // 21 : 신규 반지슬롯1 (왼쪽)
WEAR_RING2, // 22 : 신규 반지슬롯2 (오른쪽)
WEAR_BELT, // 23 : <EFBFBD>ű<EFBFBD> <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>
WEAR_BELT, // 23 : 신규 벨트슬롯
WEAR_MAX = 32 //
};
@ -141,7 +139,7 @@ enum EDragonSoulDeckType
DRAGON_SOUL_DECK_1,
DRAGON_SOUL_DECK_MAX_NUM = 2,
DRAGON_SOUL_DECK_RESERVED_MAX_NUM = 3, // NOTE: <EFBFBD>߿<EFBFBD>! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>з<EFBFBD><D0B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>. DS DECK<43><4B> <20>ø<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ݵ<EFBFBD><DDB5><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>ŭ RESERVED<45><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20><>!
DRAGON_SOUL_DECK_RESERVED_MAX_NUM = 3, // NOTE: 중요! 아직 사용중이진 않지만, 3페이지 분량을 예약 해 둠. DS DECK을 늘릴 경우 반드시 그 수만큼 RESERVED에서 차감해야 함!
};
enum ESex
@ -163,7 +161,7 @@ enum EDirection
DIR_MAX_NUM
};
#define ABILITY_MAX_LEVEL 10 /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> */
#define ABILITY_MAX_LEVEL 10 /* 기술 최대 레벨 */
enum EAbilityDifficulty
{
@ -176,9 +174,9 @@ enum EAbilityDifficulty
enum EAbilityCategory
{
CATEGORY_PHYSICAL, /* <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ */
CATEGORY_MENTAL, /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ */
CATEGORY_ATTRIBUTE, /* <EFBFBD>ɷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ */
CATEGORY_PHYSICAL, /* 신체적 어빌리티 */
CATEGORY_MENTAL, /* 정신적 어빌리티 */
CATEGORY_ATTRIBUTE, /* 능력 어빌리티 */
CATEGORY_NUM_TYPES
};
@ -248,13 +246,13 @@ enum EParts
enum EChatType
{
CHAT_TYPE_TALKING, /* <EFBFBD>׳<EFBFBD> ä<><C3A4> */
CHAT_TYPE_INFO, /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><>) */
CHAT_TYPE_NOTICE, /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
CHAT_TYPE_PARTY, /* <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> */
CHAT_TYPE_GUILD, /* <EFBFBD><EFBFBD><EFBFBD> */
CHAT_TYPE_COMMAND, /* <EFBFBD>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD> */
CHAT_TYPE_SHOUT, /* <EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD> */
CHAT_TYPE_TALKING, /* 그냥 채팅 */
CHAT_TYPE_INFO, /* 정보 (아이템을 집었다, 경험치를 얻었다. 등) */
CHAT_TYPE_NOTICE, /* 공지사항 */
CHAT_TYPE_PARTY, /* 파티말 */
CHAT_TYPE_GUILD, /* 길드말 */
CHAT_TYPE_COMMAND, /* 일반 명령 */
CHAT_TYPE_SHOUT, /* 외치기 */
CHAT_TYPE_WHISPER,
CHAT_TYPE_BIG_NOTICE,
CHAT_TYPE_MONARCH_NOTICE,
@ -397,38 +395,38 @@ enum EApplyTypes
APPLY_ATTBONUS_SURA, // 61
APPLY_ATTBONUS_SHAMAN, // 62
APPLY_ATTBONUS_MONSTER, // 63
APPLY_MALL_ATTBONUS, // 64 <EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD> +x%
APPLY_MALL_DEFBONUS, // 65 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +x%
APPLY_MALL_EXPBONUS, // 66 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ +x%
APPLY_MALL_ITEMBONUS, // 67 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x/10<EFBFBD><EFBFBD>
APPLY_MALL_GOLDBONUS, // 68 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x/10<EFBFBD><EFBFBD>
APPLY_MAX_HP_PCT, // 69 <EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +x%
APPLY_MAX_SP_PCT, // 70 <EFBFBD>ִ<EFBFBD> <20><><EFBFBD>ŷ<EFBFBD> +x%
APPLY_SKILL_DAMAGE_BONUS, // 71 <EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * (100+x)%
APPLY_NORMAL_HIT_DAMAGE_BONUS, // 72 <EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * (100+x)%
APPLY_SKILL_DEFEND_BONUS, // 73 <EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> * (100-x)%
APPLY_NORMAL_HIT_DEFEND_BONUS, // 74 <EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> * (100-x)%
APPLY_PC_BANG_EXP_BONUS, // 75 PC<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EXP <20><><EFBFBD>ʽ<EFBFBD>
APPLY_PC_BANG_DROP_BONUS, // 76 PC<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ʽ<EFBFBD>
APPLY_MALL_ATTBONUS, // 64 공격력 +x%
APPLY_MALL_DEFBONUS, // 65 방어력 +x%
APPLY_MALL_EXPBONUS, // 66 경험치 +x%
APPLY_MALL_ITEMBONUS, // 67 아이템 드롭율 x/10
APPLY_MALL_GOLDBONUS, // 68 돈 드롭율 x/10
APPLY_MAX_HP_PCT, // 69 최대 생명력 +x%
APPLY_MAX_SP_PCT, // 70 최대 정신력 +x%
APPLY_SKILL_DAMAGE_BONUS, // 71 스킬 데미지 * (100+x)%
APPLY_NORMAL_HIT_DAMAGE_BONUS, // 72 평타 데미지 * (100+x)%
APPLY_SKILL_DEFEND_BONUS, // 73 스킬 데미지 방어 * (100-x)%
APPLY_NORMAL_HIT_DEFEND_BONUS, // 74 평타 데미지 방어 * (100-x)%
APPLY_PC_BANG_EXP_BONUS, // 75 PC방 아이템 EXP 보너스
APPLY_PC_BANG_DROP_BONUS, // 76 PC방 아이템 드롭율 보너스
APPLY_EXTRACT_HP_PCT, // 77 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> HP <EFBFBD>Ҹ<EFBFBD>
APPLY_EXTRACT_HP_PCT, // 77 사용시 HP 소모
APPLY_RESIST_WARRIOR, // 78 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_RESIST_ASSASSIN, // 79 <EFBFBD>ڰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_RESIST_SURA, // 80 <EFBFBD><EFBFBD><EFBFBD>󿡰<EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_RESIST_SHAMAN, // 81 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_ENERGY, // 82 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
APPLY_DEF_GRADE, // 83 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. DEF_GRADE_BONUS<EFBFBD><EFBFBD> Ŭ<>󿡼<EFBFBD> <20>ι<EFBFBD><CEB9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20><><EFBFBD><EFBFBD>(...)<29><> <20>ִ<EFBFBD>.
APPLY_COSTUME_ATTR_BONUS, // 84 <EFBFBD>ڽ<EFBFBD>Ƭ <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD>ġ <20><><EFBFBD>ʽ<EFBFBD>
APPLY_MAGIC_ATTBONUS_PER, // 85 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> +x%
APPLY_MELEE_MAGIC_ATTBONUS_PER, // 86 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20>и<EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> +x%
APPLY_RESIST_WARRIOR, // 78 무사에게 저항
APPLY_RESIST_ASSASSIN, // 79 자객에게 저항
APPLY_RESIST_SURA, // 80 수라에게 저항
APPLY_RESIST_SHAMAN, // 81 무당에게 저항
APPLY_ENERGY, // 82 기력
APPLY_DEF_GRADE, // 83 방어력. DEF_GRADE_BONUS는 클라에서 두배로 보여지는 의도된 버그(...)가 있다.
APPLY_COSTUME_ATTR_BONUS, // 84 코스튬 아이템에 붙은 속성치 보너스
APPLY_MAGIC_ATTBONUS_PER, // 85 마법 공격력 +x%
APPLY_MELEE_MAGIC_ATTBONUS_PER, // 86 마법 + 밀리 공격력 +x%
APPLY_RESIST_ICE, // 87 <EFBFBD>ñ<EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_RESIST_EARTH, // 88 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_RESIST_DARK, // 89 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_RESIST_ICE, // 87 냉기 저항
APPLY_RESIST_EARTH, // 88 대지 저항
APPLY_RESIST_DARK, // 89 어둠 저항
APPLY_ANTI_CRITICAL_PCT, //90 ũ<EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_ANTI_PENETRATE_PCT, //91 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_ANTI_CRITICAL_PCT, //90 크리티컬 저항
APPLY_ANTI_PENETRATE_PCT, //91 관통타격 저항
MAX_APPLY_NUM, //
@ -580,7 +578,7 @@ enum EGuildWarState
GUILD_WAR_OVER,
GUILD_WAR_RESERVE,
GUILD_WAR_DURATION = 30*60, // 1<EFBFBD>ð<EFBFBD>
GUILD_WAR_DURATION = 30*60, // 1시간
GUILD_WAR_WIN_POINT = 1000,
GUILD_WAR_LADDER_HALF_PENALTY_TIME = 12*60*60,
};
@ -624,13 +622,13 @@ enum EMoneyLogType
enum EPremiumTypes
{
PREMIUM_EXP, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD> 1.2<EFBFBD><EFBFBD>
PREMIUM_ITEM, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2<><32>
PREMIUM_SAFEBOX, // â<EFBFBD><EFBFBD><EFBFBD><EFBFBD><31><C4AD><EFBFBD><EFBFBD> 3ĭ
PREMIUM_AUTOLOOT, // <EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20>ݱ<EFBFBD>
PREMIUM_FISH_MIND, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE> <20><><EFBFBD><EFBFBD>
PREMIUM_MARRIAGE_FAST, // <EFBFBD>ݽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
PREMIUM_GOLD, // <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1.5<EFBFBD><EFBFBD>
PREMIUM_EXP, // 경험치가 1.2
PREMIUM_ITEM, // 아이템 드롭율이 2배
PREMIUM_SAFEBOX, // 창고가 1칸에서 3
PREMIUM_AUTOLOOT, // 돈 자동 줍기
PREMIUM_FISH_MIND, // 고급 물고기 낚일 확률 상승
PREMIUM_MARRIAGE_FAST, // 금실 증가 양을 빠르게합니다.
PREMIUM_GOLD, // 돈 드롭율이 1.5
PREMIUM_MAX_NUM = 9
};
@ -660,28 +658,18 @@ enum SPECIAL_EFFECT
SE_AUTO_HPUP,
SE_AUTO_SPUP,
SE_EQUIP_RAMADAN_RING, // <EFBFBD>󸶴<EFBFBD> <20>ʽ´<CABD><C2B4><EFBFBD> <20><><EFBFBD><EFBFBD>(71135) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>Ʈ (<28>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ƴ<EFBFBD>)
SE_EQUIP_HALLOWEEN_CANDY, // <EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(-_-;)<29><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߵ<EFBFBD><DFB5>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
SE_EQUIP_HAPPINESS_RING, // ũ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0BAB9> <20><><EFBFBD><EFBFBD>(71143) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>Ʈ (<28>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ƴ<EFBFBD>)
SE_EQUIP_LOVE_PENDANT, // <EFBFBD>߷<EFBFBD>Ÿ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD>Ʈ(71145) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>Ʈ (<28>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ƴ<EFBFBD>)
SE_EQUIP_RAMADAN_RING, // 라마단 초승달의 반지(71135) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님)
SE_EQUIP_HALLOWEEN_CANDY, // 할로윈 사탕을 착용(-_-;)한 순간에 발동하는 이펙트
SE_EQUIP_HAPPINESS_RING, // 크리스마스 행복의 반지(71143) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님)
SE_EQUIP_LOVE_PENDANT, // 발렌타인 사랑의 팬던트(71145) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님)
} ;
enum ETeenFlags
{
TEENFLAG_NONE = 0,
TEENFLAG_1HOUR,
TEENFLAG_2HOUR,
TEENFLAG_3HOUR,
TEENFLAG_4HOUR,
TEENFLAG_5HOUR,
};
#include "item_length.h"
// inventory<EFBFBD><EFBFBD> position<EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ü
// int<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ͻ<EFBFBD><CFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȯ<EFBFBD><C8AF> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
// <EFBFBD>κ<EFBFBD> <20><><EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> window_type<70><65> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD>, cell <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>޾ұ<DEBE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20>ϳ<EFBFBD> <20><><EFBFBD>̾ inventory type<70>̶<EFBFBD><CCB6><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,)
// <EFBFBD>κ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD> ȣ<><C8A3><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> ??<3F><><EFBFBD>̴<EFBFBD>.
// inventory position을 나타내는 구조체
// int와의 암시적 형변환이 있는 이유는,
// 인벤 관련된 모든 함수가 window_type은 받지 않고, cell 하나만 받았기 때문에,(기존에는 인벤이 하나 뿐이어서 inventory type이란게 필요없었기 때문에,)
// 인벤 관련 모든 함수 호출부분을 수정하는 것이 난감하기 ??문이다.
enum EDragonSoulRefineWindowSize
{
@ -730,7 +718,7 @@ typedef struct SItemPos
return cell < INVENTORY_AND_EQUIP_SLOT_MAX;
case DRAGON_SOUL_INVENTORY:
return cell < (DRAGON_SOUL_INVENTORY_MAX_NUM);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> window<EFBFBD><EFBFBD> valid üũ<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// 동적으로 크기가 정해지는 window valid 체크를 할 수가 없다.
case SAFEBOX:
case MALL:
return false;

View File

@ -6,7 +6,7 @@
typedef DWORD IDENT;
/**
* @version 05/06/10 Bang2ni - Myshop Pricelist <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ HEADER_XX_MYSHOP_PRICELIST_XXX <EFBFBD>߰<EFBFBD>
* @version 05/06/10 Bang2ni - Myshop Pricelist 관련 패킷 HEADER_XX_MYSHOP_PRICELIST_XXX 추가
*/
enum
{
@ -49,7 +49,6 @@ enum
HEADER_GD_ADD_AFFECT = 32,
HEADER_GD_REMOVE_AFFECT = 33,
HEADER_GD_HIGHSCORE_REGISTER = 34,
HEADER_GD_ITEM_FLUSH = 35,
HEADER_GD_PARTY_CREATE = 36,
@ -63,7 +62,6 @@ enum
HEADER_GD_RELOAD_PROTO = 43,
HEADER_GD_CHANGE_NAME = 44,
HEADER_GD_SMS = 45,
HEADER_GD_GUILD_CHANGE_LADDER_POINT = 46,
HEADER_GD_GUILD_USE_SKILL = 47,
@ -99,38 +97,27 @@ enum
HEADER_GD_AUTH_LOGIN = 100,
HEADER_GD_LOGIN_BY_KEY = 101,
HEADER_GD_BILLING_EXPIRE = 104,
HEADER_GD_VCARD = 105,
HEADER_GD_BILLING_CHECK = 106,
HEADER_GD_MALL_LOAD = 107,
HEADER_GD_MYSHOP_PRICELIST_UPDATE = 108, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û
HEADER_GD_MYSHOP_PRICELIST_REQ = 109, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>û
HEADER_GD_MYSHOP_PRICELIST_UPDATE = 108, ///< 가격정보 갱신 요청
HEADER_GD_MYSHOP_PRICELIST_REQ = 109, ///< 가격정보 리스트 요청
HEADER_GD_BLOCK_CHAT = 110,
// PCBANG_IP_LIST_BY_AUTH
HEADER_GD_PCBANG_REQUEST_IP_LIST = 111,
HEADER_GD_PCBANG_CLEAR_IP_LIST = 112,
HEADER_GD_PCBANG_INSERT_IP = 113,
// END_OF_PCBANG_IP_LIST_BY_AUTH
HEADER_GD_HAMMER_OF_TOR = 114,
HEADER_GD_RELOAD_ADMIN = 115, ///<<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û
HEADER_GD_BREAK_MARRIAGE = 116, ///< <EFBFBD><EFBFBD>ȥ <20>ı<EFBFBD>
HEADER_GD_ELECT_MONARCH = 117, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
HEADER_GD_CANDIDACY = 118, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
HEADER_GD_ADD_MONARCH_MONEY = 119, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
HEADER_GD_TAKE_MONARCH_MONEY = 120, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
HEADER_GD_COME_TO_VOTE = 121, ///< ǥ<EFBFBD><EFBFBD>
HEADER_GD_RMCANDIDACY = 122, ///< <EFBFBD>ĺ<EFBFBD> <20><><EFBFBD><EFBFBD> (<28><EFBFBD><EEBFB5>)
HEADER_GD_SETMONARCH = 123, ///<<EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD><EFBFBD><EFBFBD> (<28><EFBFBD><EEBFB5>)
HEADER_GD_RMMONARCH = 124, ///<<EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD>
HEADER_GD_RELOAD_ADMIN = 115, ///<운영자 정보 요청
HEADER_GD_BREAK_MARRIAGE = 116, ///< 결혼 파기
HEADER_GD_ELECT_MONARCH = 117, ///< 군주 투표
HEADER_GD_CANDIDACY = 118, ///< 군주 등록
HEADER_GD_ADD_MONARCH_MONEY = 119, ///< 군주 돈 증가
HEADER_GD_TAKE_MONARCH_MONEY = 120, ///< 군주 돈 감소
HEADER_GD_COME_TO_VOTE = 121, ///< 표결
HEADER_GD_RMCANDIDACY = 122, ///< 후보 제거 (운영자)
HEADER_GD_SETMONARCH = 123, ///<군주설정 (운영자)
HEADER_GD_RMMONARCH = 124, ///<군주삭제
HEADER_GD_DEC_MONARCH_MONEY = 125,
HEADER_GD_CHANGE_MONARCH_LORD = 126,
HEADER_GD_BLOCK_COUNTRY_IP = 127, // <20><><EFBFBD>뿪 IP-Block
HEADER_GD_BLOCK_EXCEPTION = 128, // <20><><EFBFBD>뿪 IP-Block <20><><EFBFBD><EFBFBD>
HEADER_GD_REQ_CHANGE_GUILD_MASTER = 129,
@ -139,7 +126,7 @@ enum
HEADER_GD_UPDATE_HORSE_NAME = 131,
HEADER_GD_REQ_HORSE_NAME = 132,
HEADER_GD_DC = 133, // Login Key<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
HEADER_GD_DC = 133, // Login Key를 지움
HEADER_GD_VALID_LOGOUT = 134,
@ -238,12 +225,6 @@ enum
HEADER_DG_CHANGE_CHARACTER_PRIV = 127,
HEADER_DG_BILLING_REPAIR = 128,
HEADER_DG_BILLING_EXPIRE = 129,
HEADER_DG_BILLING_LOGIN = 130,
HEADER_DG_VCARD = 131,
HEADER_DG_BILLING_CHECK = 132,
HEADER_DG_CREATE_OBJECT = 140,
HEADER_DG_DELETE_OBJECT = 141,
HEADER_DG_UPDATE_LAND = 142,
@ -257,23 +238,21 @@ enum
HEADER_DG_WEDDING_START = 155,
HEADER_DG_WEDDING_END = 156,
HEADER_DG_MYSHOP_PRICELIST_RES = 157, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
HEADER_DG_RELOAD_ADMIN = 158, ///< <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD>
HEADER_DG_BREAK_MARRIAGE = 159, ///< <EFBFBD><EFBFBD>ȥ <20>ı<EFBFBD>
HEADER_DG_ELECT_MONARCH = 160, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
HEADER_DG_CANDIDACY = 161, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
HEADER_DG_ADD_MONARCH_MONEY = 162, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
HEADER_DG_TAKE_MONARCH_MONEY = 163, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
HEADER_DG_COME_TO_VOTE = 164, ///< ǥ<EFBFBD><EFBFBD>
HEADER_DG_RMCANDIDACY = 165, ///< <EFBFBD>ĺ<EFBFBD> <20><><EFBFBD><EFBFBD> (<28><EFBFBD><EEBFB5>)
HEADER_DG_SETMONARCH = 166, ///<<EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD><EFBFBD><EFBFBD> (<28><EFBFBD><EEBFB5>)
HEADER_DG_RMMONARCH = 167, ///<<EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD>
HEADER_DG_MYSHOP_PRICELIST_RES = 157, ///< 가격정보 리스트 응답
HEADER_DG_RELOAD_ADMIN = 158, ///< 운영자 정보 리로드
HEADER_DG_BREAK_MARRIAGE = 159, ///< 결혼 파기
HEADER_DG_ELECT_MONARCH = 160, ///< 군주 투표
HEADER_DG_CANDIDACY = 161, ///< 군주 등록
HEADER_DG_ADD_MONARCH_MONEY = 162, ///< 군주 돈 증가
HEADER_DG_TAKE_MONARCH_MONEY = 163, ///< 군주 돈 감소
HEADER_DG_COME_TO_VOTE = 164, ///< 표결
HEADER_DG_RMCANDIDACY = 165, ///< 후보 제거 (운영자)
HEADER_DG_SETMONARCH = 166, ///<군주설정 (운영자)
HEADER_DG_RMMONARCH = 167, ///<군주삭제
HEADER_DG_DEC_MONARCH_MONEY = 168,
HEADER_DG_CHANGE_MONARCH_LORD_ACK = 169,
HEADER_DG_UPDATE_MONARCH_INFO = 170,
HEADER_DG_BLOCK_COUNTRY_IP = 171, // <20><><EFBFBD>뿪 IP-Block
HEADER_DG_BLOCK_EXCEPTION = 172, // <20><><EFBFBD>뿪 IP-Block <20><><EFBFBD><EFBFBD> account
HEADER_DG_ACK_CHANGE_GUILD_MASTER = 173,
@ -364,7 +343,7 @@ typedef struct SPlayerItem
DWORD count;
DWORD vnum;
LONG alSockets[ITEM_SOCKET_MAX_NUM]; // <EFBFBD><EFBFBD><EFBFBD>Ϲ<EFBFBD>ȣ
LONG alSockets[ITEM_SOCKET_MAX_NUM]; // 소켓번호
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
@ -441,7 +420,6 @@ typedef struct SPlayerTable
BYTE skill_group;
LONG lAlignment;
char szMobile[MOBILE_MAX_LEN + 1];
WORD stat_reset_count;
@ -572,9 +550,9 @@ typedef struct SShopItemTable
DWORD vnum;
BYTE count;
TItemPos pos; // PC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD>
DWORD price; // PC, shop_table_ex.txt <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD>
BYTE display_pos; // PC, shop_table_ex.txt <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ġ.
TItemPos pos; // PC 상점에만 이용
DWORD price; // PC, shop_table_ex.txt 상점에만 이용
BYTE display_pos; // PC, shop_table_ex.txt 상점에만 이용, 보일 위치.
} TShopItemTable;
typedef struct SShopTable
@ -638,12 +616,12 @@ typedef struct SItemTable : public SEntityTable
BYTE bSpecular;
BYTE bGainSocketPct;
WORD sAddonType; // <EFBFBD><20>Ӽ<EFBFBD>
WORD sAddonType; // 기본 속성
// <EFBFBD>Ʒ<EFBFBD> limit flag<EFBFBD><EFBFBD><EFBFBD><EFBFBD> realtime<EFBFBD><EFBFBD> üũ <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VNUM<55><4D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD>,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ź<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD><DBB8><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD>쿡 LIMIT_MAX_NUM<55><4D><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鼭 üũ<C3BC>ϴ<EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> Ŀ<><C4BF> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>.
char cLimitRealTimeFirstUseIndex; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> limit <EFBFBD>ʵ尪 <20>߿<EFBFBD><DFBF><EFBFBD> LIMIT_REAL_TIME_FIRST_USE <EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1)
char cLimitTimerBasedOnWearIndex; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> limit <EFBFBD>ʵ尪 <20>߿<EFBFBD><DFBF><EFBFBD> LIMIT_TIMER_BASED_ON_WEAR <EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1)
// 아래 limit flag들은 realtime에 체크 할 일이 많고, 아이템 VNUM당 고정된 값인데,
// 현재 구조대로 매번 아이템마다 필요한 경우에 LIMIT_MAX_NUM까지 루프돌면서 체크하는 부하가 커서 미리 저장 해 둠.
char cLimitRealTimeFirstUseIndex; // 아이템 limit 필드값 중에서 LIMIT_REAL_TIME_FIRST_USE 플래그의 위치 (없으면 -1)
char cLimitTimerBasedOnWearIndex; // 아이템 limit 필드값 중에서 LIMIT_TIMER_BASED_ON_WEAR 플래그의 위치 (없으면 -1)
} TItemTable;
@ -681,7 +659,7 @@ typedef struct SPlayerLoadPacket
{
DWORD account_id;
DWORD player_id;
BYTE account_index; /* account <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ */
BYTE account_index; /* account 에서의 위치 */
} TPlayerLoadPacket;
typedef struct SPlayerCreatePacket
@ -758,9 +736,9 @@ typedef struct SEmpireSelectPacket
typedef struct SPacketGDSetup
{
char szPublicIP[16]; // Public IP which listen to users
BYTE bChannel; // ä<EFBFBD><EFBFBD>
WORD wListenPort; // Ŭ<EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>Ʈ <20><>ȣ
WORD wP2PPort; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ű<EFBFBD><C5B0> P2P <20><>Ʈ <20><>ȣ
BYTE bChannel; // 채널
WORD wListenPort; // 클라이언트가 접속하는 포트 번호
WORD wP2PPort; // 서버끼리 연결 시키는 P2P 포트 번호
LONG alMaps[MAP_ALLOW_MAX_LEN];
DWORD dwLoginCount;
BYTE bAuthServer;
@ -851,14 +829,6 @@ typedef struct SPacketGDRemoveAffect
BYTE bApplyOn;
} TPacketGDRemoveAffect;
typedef struct SPacketGDHighscore
{
DWORD dwPID;
LONG lValue;
char cDir;
char szBoard[21];
} TPacketGDHighscore;
typedef struct SPacketPartyCreate
{
DWORD dwLeaderPID;
@ -938,8 +908,8 @@ typedef struct SPacketGuildWar
LONG lInitialScore;
} TPacketGuildWar;
// Game -> DB : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD>
// DB -> Game : <EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Game -> DB : 상대적 변화값
// DB -> Game : 토탈된 최종값
typedef struct SPacketGuildWarScore
{
DWORD dwGuildGainPoint;
@ -960,8 +930,8 @@ typedef struct SRefineTable
//DWORD result_vnum;
DWORD id;
BYTE material_count;
DWORD cost; // <EFBFBD>ҿ<EFBFBD> <20><><EFBFBD><EFBFBD>
DWORD prob; // Ȯ<EFBFBD><EFBFBD>
DWORD cost; // 소요 비용
DWORD prob; // 확률
TRefineMaterial materials[REFINE_MATERIAL_MAX_NUM];
} TRefineTable;
@ -997,14 +967,6 @@ typedef struct SPacketGuildLadderPoint
LONG lChange;
} TPacketGuildLadderPoint;
typedef struct SPacketGDSMS
{
char szFrom[CHARACTER_NAME_MAX_LEN + 1];
char szTo[CHARACTER_NAME_MAX_LEN + 1];
char szMobile[MOBILE_MAX_LEN + 1];
char szMsg[SMS_MAX_LEN + 1];
} TPacketGDSMS;
typedef struct SPacketGuildUseSkill
{
DWORD dwGuild;
@ -1032,9 +994,7 @@ typedef struct SPacketGDAuthLogin
char szLogin[LOGIN_MAX_LEN + 1];
char szSocialID[SOCIAL_ID_MAX_LEN + 1];
DWORD adwClientKey[4];
BYTE bBillType;
DWORD dwBillID;
DWORD iPremiumTimes[PREMIUM_MAX_NUM];
DWORD iPremiumTimes[PREMIUM_MAX_NUM];
} TPacketGDAuthLogin;
typedef struct SPacketGDLoginByKey
@ -1046,14 +1006,14 @@ typedef struct SPacketGDLoginByKey
} TPacketGDLoginByKey;
/**
* @version 05/06/08 Bang2ni - <EFBFBD><EFBFBD><EFBFBD>ӽð<EFBFBD> <20>߰<EFBFBD>
* @version 05/06/08 Bang2ni - 지속시간 추가
*/
typedef struct SPacketGiveGuildPriv
{
BYTE type;
DWORD value;
DWORD guild_id;
time_t duration_sec; ///< <EFBFBD><EFBFBD><EFBFBD>ӽð<EFBFBD>
time_t duration_sec; ///< 지속시간
} TPacketGiveGuildPriv;
typedef struct SPacketGiveEmpirePriv
{
@ -1088,7 +1048,7 @@ typedef struct SPacketDGChangeCharacterPriv
} TPacketDGChangeCharacterPriv;
/**
* @version 05/06/08 Bang2ni - <EFBFBD><EFBFBD><EFBFBD>ӽð<EFBFBD> <20>߰<EFBFBD>
* @version 05/06/08 Bang2ni - 지속시간 추가
*/
typedef struct SPacketDGChangeGuildPriv
{
@ -1096,7 +1056,7 @@ typedef struct SPacketDGChangeGuildPriv
DWORD value;
DWORD guild_id;
BYTE bLog;
time_t end_time_sec; ///< <EFBFBD><EFBFBD><EFBFBD>ӽð<EFBFBD>
time_t end_time_sec; ///< 지속시간
} TPacketDGChangeGuildPriv;
typedef struct SPacketDGChangeEmpirePriv
@ -1146,26 +1106,6 @@ typedef struct SPacketSetEventFlag
LONG lValue;
} TPacketSetEventFlag;
typedef struct SPacketBillingLogin
{
DWORD dwLoginKey;
BYTE bLogin;
} TPacketBillingLogin;
typedef struct SPacketBillingRepair
{
DWORD dwLoginKey;
char szLogin[LOGIN_MAX_LEN + 1];
char szHost[MAX_HOST_LENGTH + 1];
} TPacketBillingRepair;
typedef struct SPacketBillingExpire
{
char szLogin[LOGIN_MAX_LEN + 1];
BYTE bBillType;
DWORD dwRemainSeconds;
} TPacketBillingExpire;
typedef struct SPacketLoginOnSetup
{
DWORD dwID;
@ -1193,15 +1133,6 @@ typedef struct SPacketGDHammerOfTor
DWORD delay;
} TPacketGDHammerOfTor;
typedef struct SPacketGDVCard
{
DWORD dwID;
char szSellCharacter[CHARACTER_NAME_MAX_LEN + 1];
char szSellAccount[LOGIN_MAX_LEN + 1];
char szBuyCharacter[CHARACTER_NAME_MAX_LEN + 1];
char szBuyAccount[LOGIN_MAX_LEN + 1];
} TPacketGDVCard;
typedef struct SGuildReserve
{
DWORD dwID;
@ -1277,27 +1208,27 @@ typedef struct
DWORD dwPID2;
} TPacketWeddingEnd;
/// <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><> <20>ڿ<EFBFBD> byCount <EFBFBD><EFBFBD>ŭ<EFBFBD><EFBFBD> TItemPriceInfo <EFBFBD><EFBFBD> <20>´<EFBFBD>.
/// 개인상점 가격정보의 헤더. 가변 패킷으로 이 뒤에 byCount 만큼의 TItemPriceInfo 가 온다.
typedef struct SPacketMyshopPricelistHeader
{
DWORD dwOwnerID; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD> ID
BYTE byCount; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
DWORD dwOwnerID; ///< 가격정보를 가진 플레이어 ID
BYTE byCount; ///< 가격정보 갯수
} TPacketMyshopPricelistHeader;
/// <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// 개인상점의 단일 아이템에 대한 가격정보
typedef struct SItemPriceInfo
{
DWORD dwVnum; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vnum
DWORD dwPrice; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwVnum; ///< 아이템 vnum
DWORD dwPrice; ///< 가격
} TItemPriceInfo;
/// <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>̺<EFBFBD>
/// 개인상점 아이템 가격정보 리스트 테이블
typedef struct SItemPriceListTable
{
DWORD dwOwnerID; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD> ID
BYTE byCount; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
DWORD dwOwnerID; ///< 가격정보를 가진 플레이어 ID
BYTE byCount; ///< 가격정보 리스트의 갯수
TItemPriceInfo aPriceInfo[SHOP_PRICELIST_MAX_NUM]; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
TItemPriceInfo aPriceInfo[SHOP_PRICELIST_MAX_NUM]; ///< 가격정보 리스트
} TItemPriceListTable;
typedef struct
@ -1306,24 +1237,15 @@ typedef struct
LONG lDuration;
} TPacketBlockChat;
// PCBANG_IP_LIST
typedef struct SPacketPCBangIP
{
DWORD id;
DWORD ip;
} TPacketPCBangIP;
// END_OF_PCBANG_IP_LIST
//ADMIN_MANAGER
typedef struct TAdminInfo
{
DWORD m_ID; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
char m_szAccount[32]; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char m_szName[32]; //ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>
char m_szContactIP[16]; //<EFBFBD><EFBFBD><EFBFBD>پ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char m_szServerIP[16]; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD m_Authority; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD m_ID; //고유ID
char m_szAccount[32]; //계정
char m_szName[32]; //캐릭터이름
char m_szContactIP[16]; //접근아이피
char m_szServerIP[16]; //서버아이피
DWORD m_Authority; //권한
} tAdminInfo;
//END_ADMIN_MANAGER
@ -1344,20 +1266,20 @@ typedef struct SPacketReloadAdmin
typedef struct TMonarchInfo
{
DWORD pid[4]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID
int64_t money[4]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
char name[4][32]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
char date[4][32]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>¥
DWORD pid[4]; // 군주의 PID
int64_t money[4]; // 군주의 별개 돈
char name[4][32]; // 군주의 이름
char date[4][32]; // 군주 등록 날짜
} MonarchInfo;
typedef struct TMonarchElectionInfo
{
DWORD pid; // <EFBFBD><EFBFBD>ǥ <20>ѻ<EFBFBD><D1BB><EFBFBD> PID
DWORD selectedpid; // <EFBFBD><EFBFBD>ǥ <20><><EFBFBD><EFBFBD> PID ( <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> )
char date[32]; // <EFBFBD><EFBFBD>ǥ <20><>¥
DWORD pid; // 투표 한사람 PID
DWORD selectedpid; // 투표 당한 PID ( 군주 참가자 )
char date[32]; // 투표 날짜
} MonarchElectionInfo;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E2B8B6>
// 군주 출마자
typedef struct tMonarchCandidacy
{
DWORD pid;
@ -1379,26 +1301,6 @@ typedef struct tChangeMonarchLordACK
char szDate[32];
} TPacketChangeMonarchLordACK;
// Block Country Ip
typedef struct tBlockCountryIp
{
DWORD ip_from;
DWORD ip_to;
} TPacketBlockCountryIp;
enum EBlockExceptionCommand
{
BLOCK_EXCEPTION_CMD_ADD = 1,
BLOCK_EXCEPTION_CMD_DEL = 2,
};
// Block Exception Account
typedef struct tBlockException
{
BYTE cmd; // 1 == add, 2 == delete
char login[LOGIN_MAX_LEN + 1];
}TPacketBlockException;
typedef struct tChangeGuildMaster
{
DWORD dwGuildID;
@ -1429,14 +1331,14 @@ typedef struct tNeedLoginLogInfo
DWORD dwPlayerID;
} TPacketNeedLoginLogInfo;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE> <20><>Ŷ <20><><EFBFBD><EFBFBD>
//독일 선물 알림 기능 테스트용 패킷 정보
typedef struct tItemAwardInformer
{
char login[LOGIN_MAX_LEN + 1];
char command[20]; //<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD>
DWORD vnum; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char command[20]; //명령어
DWORD vnum; //아이템
} TPacketItemAwardInfromer;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˸<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>
// 선물 알림 기능 삭제용 패킷 정보
typedef struct tDeleteAwardID
{
DWORD dwID;

View File

@ -1,20 +0,0 @@
/*********************************************************************
* date : 2007.06.07
* file : teen_packet.h
* author : mhh
* description :
*/
#ifndef _teen_packet_h_
#define _teen_packet_h_
#define HEADER_GT_LOGIN 0x10
#define HEADER_GT_LOGOUT 0x11
#define HEADER_TG_TEEN_NOTICE 0x12
#define HEADER_TG_FORCE_LOGOUT 0x13
#define HEADER_TG_LOGIN_NOTICE 0x14
#endif /* _teen_packet_h_ */

View File

@ -1,3 +1,6 @@
#ifndef __INC_METIN2_UTILS_H__
#define __INC_METIN2_UTILS_H__
/*----- atoi function -----*/
inline bool str_to_number (bool& out, const char *in)
{
@ -72,3 +75,5 @@ inline bool str_to_number (float& out, const char *in)
}
/*----- atoi function -----*/
#endif

View File

@ -10,6 +10,6 @@
#define __COMPILER__ "@METIN2_COMPILER@"
#define __CPU_TARGET__ "@METIN2_CPU_TARGET@"
void WriteVersion(std::ostream& out);
void WriteVersion();
#endif

View File

@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.8)
project(db CXX)
file(GLOB_RECURSE sources
src/*.cpp src/*.h
src/*.cpp src/*.h
)
# Add the src directory to the include path
@ -11,18 +11,25 @@ include_directories(src)
add_executable(${PROJECT_NAME} ${sources})
# Set the default log level based on the build type
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "This is a debug build. Log level will be set to 'trace' for target '${PROJECT_NAME}'.")
target_compile_definitions(${PROJECT_NAME} PRIVATE SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE)
endif()
# Treat char variables as signed, especially useful for ARM builds
target_compile_options(${PROJECT_NAME} PUBLIC -fsigned-char)
# Find dependencies
#
# vcpkg dependencies
#
# Boost
find_package(Boost COMPONENTS system REQUIRED)
target_link_libraries (${PROJECT_NAME} PRIVATE Boost::boost Boost::system)
# Pthreads
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Threads::Threads)
# LibBSD
target_link_libraries(${PROJECT_NAME} PRIVATE bsd)
# Libevent
find_package(Libevent CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE libevent::core libevent::extra libevent::pthreads)
@ -31,4 +38,16 @@ target_link_libraries(${PROJECT_NAME} PRIVATE libevent::core libevent::extra lib
find_package(effolkronium_random CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE effolkronium_random)
#
# System-provided dependencies
#
# Pthreads
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Threads::Threads)
# LibBSD
target_link_libraries(${PROJECT_NAME} PRIVATE bsd)
target_link_libraries(${PROJECT_NAME} PRIVATE libpoly libsql libthecore)

View File

@ -135,7 +135,7 @@ void AuctionManager::LoadAuctionItem()
}
int rows;
if ((rows = mysql_num_rows(res)) <= 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음
{
return;
}
@ -182,7 +182,7 @@ void AuctionManager::LoadAuctionInfo()
}
int rows;
if ((rows = mysql_num_rows(res)) <= 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음
{
return;
}
@ -226,7 +226,7 @@ void AuctionManager::LoadSaleInfo()
}
int rows;
if ((rows = mysql_num_rows(res)) <= 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음
{
return;
}
@ -269,7 +269,7 @@ void AuctionManager::LoadWishInfo()
}
int rows;
if ((rows = mysql_num_rows(res)) <= 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음
{
return;
}
@ -311,7 +311,7 @@ void AuctionManager::LoadMyBidInfo ()
}
int rows;
if ((rows = mysql_num_rows(res)) <= 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음
{
return;
}
@ -406,13 +406,13 @@ AuctionResult AuctionManager::EnrollInAuction(CItemCache* item_cache, TAuctionIt
CItemCache* c = GetItemCache (item_info.item_id);
if (c != NULL)
{
sys_err ("item id : %d is already in AuctionManager", item_info.item_id);
SPDLOG_ERROR("item id : {} is already in AuctionManager", item_info.item_id);
return AUCTION_FAIL;
}
if (!Auction.InsertItemInfo (&item_info))
{
sys_err ("item id : %d is already in AuctionBoard", item_info.item_id);
SPDLOG_ERROR("item id : {} is already in AuctionBoard", item_info.item_id);
return AUCTION_FAIL;
}
@ -429,19 +429,19 @@ AuctionResult AuctionManager::EnrollInSale(CItemCache* item_cache, TSaleItemInfo
CItemCache* c = GetItemCache (item_info.item_id);
if (c != NULL)
{
sys_err ("item id : %d is already in AuctionManager", item_info.item_id);
SPDLOG_ERROR("item id : {} is already in AuctionManager", item_info.item_id);
return AUCTION_FAIL;
}
if (!Wish.GetItemInfoCache (WishBoard::Key (item_info.item_num, item_info.wisher_id)))
{
sys_err ("item_num : %d, wisher_id : %d is not in wish auction.", item_info.item_num, item_info.wisher_id);
SPDLOG_ERROR("item_num : {}, wisher_id : {} is not in wish auction.", item_info.item_num, item_info.wisher_id);
return AUCTION_FAIL;
}
if (!Sale.InsertItemInfo (&item_info))
{
sys_err ("item id : %d is already in SaleBoard", item_info.item_id);
SPDLOG_ERROR("item id : {} is already in SaleBoard", item_info.item_id);
return AUCTION_FAIL;
}
@ -457,7 +457,7 @@ AuctionResult AuctionManager::EnrollInWish(TWishItemInfo &item_info)
{
if (!Wish.InsertItemInfo (&item_info))
{
sys_err ("wisher_id : %d, item_num : %d is already in WishBoard", item_info.offer_id, item_info.item_num);
SPDLOG_ERROR("wisher_id : {}, item_num : {} is already in WishBoard", item_info.offer_id, item_info.item_num);
return AUCTION_FAIL;
}
@ -469,7 +469,7 @@ AuctionResult AuctionManager::Bid(DWORD bidder_id, const char* bidder_name, DWOR
CItemCache* c = GetItemCache (item_id);
if (c == NULL)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
@ -506,7 +506,7 @@ AuctionResult AuctionManager::Impur(DWORD purchaser_id, const char* purchaser_na
CItemCache* c = GetItemCache (item_id);
if (c == NULL)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
@ -518,7 +518,7 @@ AuctionResult AuctionManager::Impur(DWORD purchaser_id, const char* purchaser_na
return AUCTION_EXPIRED;
}
// <EFBFBD><20>ع<EFBFBD><D8B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>, <20><><EFBFBD>Ŵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// 즉구 해버렸으므로, 경매는 끝났다.
item_info->expired_time = 0;
item_info->bidder_id = purchaser_id;
item_info->set_bidder_name (purchaser_name);
@ -533,14 +533,14 @@ AuctionResult AuctionManager::GetAuctionedItem (DWORD actor_id, DWORD item_id, T
CItemCache* c = GetItemCache (item_id);
if (c == NULL)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
CAuctionItemInfoCache* item_info_cache = Auction.GetItemInfoCache(item_id);
if (item_info_cache == NULL)
{
sys_err ("how can this accident happen?");
SPDLOG_ERROR("how can this accident happen?");
return AUCTION_FAIL;
}
@ -561,14 +561,14 @@ AuctionResult AuctionManager::BuySoldItem (DWORD actor_id, DWORD item_id, TPlaye
CItemCache* c = GetItemCache (item_id);
if (c == NULL)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
CSaleItemInfoCache* item_info_cache = Sale.GetItemInfoCache(item_id);
if (item_info_cache == NULL)
{
sys_err ("how can this accident happen?");
SPDLOG_ERROR("how can this accident happen?");
return AUCTION_FAIL;
}
@ -584,14 +584,14 @@ AuctionResult AuctionManager::CancelAuction (DWORD actor_id, DWORD item_id, TPla
CItemCache* c = GetItemCache (item_id);
if (c == NULL)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
CAuctionItemInfoCache* item_info_cache = Auction.GetItemInfoCache(item_id);
if (item_info_cache == NULL)
{
sys_err ("how can this accident happen?");
SPDLOG_ERROR("how can this accident happen?");
return AUCTION_FAIL;
}
TAuctionItemInfo* item_info = item_info_cache->Get(false);
@ -618,14 +618,14 @@ AuctionResult AuctionManager::CancelSale (DWORD actor_id, DWORD item_id, TPlayer
CItemCache* c = GetItemCache (item_id);
if (c == NULL)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
CSaleItemInfoCache* item_info_cache = Sale.GetItemInfoCache(item_id);
if (item_info_cache == NULL)
{
sys_err ("how can this accident happen?");
SPDLOG_ERROR("how can this accident happen?");
return AUCTION_FAIL;
}
TSaleItemInfo* item_info = item_info_cache->Get(false);
@ -639,13 +639,13 @@ AuctionResult AuctionManager::DeleteAuctionItem (DWORD actor_id, DWORD item_id)
{
if (DeleteItemCache (item_id) == false)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
if (Auction.DeleteItemInfoCache (item_id) == NULL)
{
sys_err ("how can this accident happen?");
SPDLOG_ERROR("how can this accident happen?");
return AUCTION_FAIL;
}
return AUCTION_SUCCESS;
@ -655,13 +655,13 @@ AuctionResult AuctionManager::DeleteSaleItem (DWORD actor_id, DWORD item_id)
{
if (DeleteItemCache (item_id) == false)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
if (Sale.DeleteItemInfoCache (item_id) == NULL)
{
sys_err ("how can this accident happen?");
SPDLOG_ERROR("how can this accident happen?");
return AUCTION_FAIL;
}
return AUCTION_SUCCESS;
@ -672,7 +672,7 @@ AuctionResult AuctionManager::ReBid(DWORD bidder_id, const char* bidder_name, DW
CItemCache* c = GetItemCache (item_id);
if (c == NULL)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}

View File

@ -243,7 +243,7 @@ private:
TItemInfoCacheMap item_cache_map;
};
// pc<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
// pc가 입찰에 참여했던 경매를 관리.
class MyBidBoard
{
public:
@ -255,7 +255,7 @@ public:
int GetMoney (DWORD player_id, DWORD item_id);
bool Delete (DWORD player_id, DWORD item_id);
// <EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// 이미 있으면 덮어 씌운다.
void Insert (DWORD player_id, DWORD item_id, int money);
private:
@ -267,11 +267,11 @@ private:
class AuctionManager : public singleton <AuctionManager>
{
private:
// auction<EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD>.
// auction에 등록된 아이템들.
typedef std::unordered_map<DWORD, CItemCache *> TItemCacheMap;
TItemCacheMap auction_item_cache_map;
// auction<EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>͵<EFBFBD>
// auction에 등록된 정보 중 가격, 등등 아이템 테이블에 포함되지 않는 정보들을 관리하는 것들
AuctionBoard Auction;
SaleBoard Sale;
WishBoard Wish;

View File

@ -1,214 +0,0 @@
// vim:ts=4 sw=4
/*********************************************************************
* date : 2007.05.31
* file : BlockCountry.cpp
* author : mhh
* description :
*/
#include "stdafx.h"
#include "BlockCountry.h"
#include "DBManager.h"
#define DO_ALL_BLOCK_IP(iter) \
for ((iter) = m_block_ip.begin(); (iter) != m_block_ip.end(); ++(iter))
#define DO_ALL_BLOCK_EXCEPTION(iter) \
for ((iter) = m_block_exception.begin(); (iter) != m_block_exception.end(); ++(iter))
CBlockCountry::CBlockCountry()
{
}
CBlockCountry::~CBlockCountry()
{
BLOCK_IP *block_ip;
BLOCK_IP_VECTOR::iterator iter;
DO_ALL_BLOCK_IP(iter)
{
block_ip = *iter;
delete block_ip;
}
m_block_ip.clear();
}
bool CBlockCountry::Load()
{
// load blocked ip
{
char szQuery[256];
snprintf(szQuery, sizeof(szQuery), "SELECT IP_FROM, IP_TO, COUNTRY_NAME FROM iptocountry");
SQLMsg * pMsg = CDBManager::instance().DirectQuery(szQuery, SQL_ACCOUNT);
if (pMsg->Get()->uiNumRows == 0)
{
sys_err(" DirectQuery failed(%s)", szQuery);
delete pMsg;
return false;
}
MYSQL_ROW row;
for (int n = 0; (row = mysql_fetch_row(pMsg->Get()->pSQLResult)) != NULL; ++n)
{
BLOCK_IP *block_ip = new BLOCK_IP;
block_ip->ip_from = strtoul(row[0], NULL, 10);
block_ip->ip_to = strtoul(row[1], NULL, 10);
strlcpy(block_ip->country, row[2], sizeof(block_ip->country));
m_block_ip.push_back(block_ip);
sys_log(0, "BLOCKED_IP : %u - %u", block_ip->ip_from, block_ip->ip_to);
}
delete pMsg;
}
// load block exception account
{
char szQuery[256];
snprintf(szQuery, sizeof(szQuery), "SELECT login FROM block_exception");
SQLMsg * pMsg = CDBManager::instance().DirectQuery(szQuery, SQL_ACCOUNT);
if (pMsg->Get()->uiNumRows == 0)
{
sys_err(" DirectQuery failed(%s)", szQuery);
delete pMsg;
return true;
}
MYSQL_ROW row;
for (int n = 0; (row = mysql_fetch_row(pMsg->Get()->pSQLResult)) != NULL; ++n)
{
const char *login = row[0];
m_block_exception.push_back(strdup(login));
sys_log(0, "BLOCK_EXCEPTION = %s", login);
}
delete pMsg;
}
return true;
}
bool CBlockCountry::IsBlockedCountryIp(const char *user_ip)
{
BLOCK_IP* block_ip;
BLOCK_IP_VECTOR::iterator iter;
struct in_addr st_addr;
#ifndef __WIN32__
if (0 == inet_aton(user_ip, &st_addr))
#else
unsigned int in_address;
in_address = inet_addr(user_ip);
st_addr.s_addr = in_address;
if (INADDR_NONE == in_address)
#endif
return true; // <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
DO_ALL_BLOCK_IP(iter)
{
block_ip = *iter;
if (st_addr.s_addr >= block_ip->ip_from && st_addr.s_addr <= block_ip->ip_to)
return true;
}
return false;
}
void CBlockCountry::SendBlockedCountryIp(CPeer *peer)
{
sys_log(0, "SendBlockedCountryIp start");
BLOCK_IP *block_ip;
BLOCK_IP_VECTOR::iterator iter;
TPacketBlockCountryIp packet;
DO_ALL_BLOCK_IP(iter)
{
block_ip = *iter;
packet.ip_from = block_ip->ip_from;
packet.ip_to = block_ip->ip_to;
peer->EncodeHeader(HEADER_DG_BLOCK_COUNTRY_IP, 0, sizeof(TPacketBlockCountryIp));
peer->Encode(&packet, sizeof(packet));
}
sys_log(0, "[DONE] CBlockCountry::SendBlockedCountryIp() : count = %d",
m_block_ip.size());
sys_log(0, "SendBlockedCountryIp end");
} /* end of CBlockCountry::SendBlockedCountryIp() */
void CBlockCountry::SendBlockException(CPeer *peer)
{
BLOCK_EXCEPTION_VECTOR::iterator iter;
DO_ALL_BLOCK_EXCEPTION(iter)
{
const char *login = *iter;
this->SendBlockExceptionOne(peer, login, BLOCK_EXCEPTION_CMD_ADD);
}
} /* end of CBlockCountry::SendBlockException() */
void CBlockCountry::SendBlockExceptionOne(CPeer *peer, const char *login, BYTE cmd)
{
if (NULL == peer || NULL == login)
return;
if (BLOCK_EXCEPTION_CMD_ADD != cmd && BLOCK_EXCEPTION_CMD_DEL != cmd)
return;
TPacketBlockException packet;
packet.cmd = cmd;
strlcpy(packet.login, login, sizeof(packet.login));
peer->EncodeHeader(HEADER_DG_BLOCK_EXCEPTION, 0, sizeof(TPacketBlockException));
peer->Encode(&packet, sizeof(packet));
}
void CBlockCountry::AddBlockException(const char *login)
{
BLOCK_EXCEPTION_VECTOR::iterator iter;
DO_ALL_BLOCK_EXCEPTION(iter)
{
const char *saved_login = *iter;
if (!strcmp(saved_login, login))
return;
}
m_block_exception.push_back(strdup(login));
return;
}
void CBlockCountry::DelBlockException(const char *login)
{
BLOCK_EXCEPTION_VECTOR::iterator iter;
DO_ALL_BLOCK_EXCEPTION(iter)
{
const char *saved_login = *iter;
if (!strcmp(saved_login, login))
{
::free((void*)saved_login);
m_block_exception.erase(iter);
return;
}
}
return;
}

View File

@ -1,44 +0,0 @@
// vim: ts=4 sw=4
// Date : 2007.05.31
// File : BlockCountry.h
// Author : mhh
// Description :
#ifndef __INC_METIN_II_BLOCKCOUNTRY_H__
#define __INC_METIN_II_BLOCKCOUNTRY_H__
#include "Peer.h"
#define MAX_COUNTRY_NAME_LENGTH 50
class CBlockCountry : public singleton<CBlockCountry>
{
private:
struct BLOCK_IP
{
DWORD ip_from;
DWORD ip_to;
char country[MAX_COUNTRY_NAME_LENGTH + 1];
};
typedef std::vector<BLOCK_IP*> BLOCK_IP_VECTOR;
BLOCK_IP_VECTOR m_block_ip;
typedef std::vector<const char*> BLOCK_EXCEPTION_VECTOR;
BLOCK_EXCEPTION_VECTOR m_block_exception;
public:
CBlockCountry();
~CBlockCountry();
public:
bool Load();
bool IsBlockedCountryIp(const char *user_ip);
void SendBlockedCountryIp(CPeer *peer);
void SendBlockException(CPeer *peer);
void SendBlockExceptionOne(CPeer *peer, const char *login, BYTE cmd);
void AddBlockException(const char *login);
void DelBlockException(const char *login);
};
#endif

View File

@ -29,12 +29,12 @@ CItemCache::~CItemCache()
{
}
// <EFBFBD>̰<EFBFBD> <20>̻<EFBFBD><CCBB>ѵ<EFBFBD>...
// Delete<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Cache<68><65> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>ϴ°<CFB4> <20>ƴѰ<C6B4>???
// <EFBFBD>ٵ<EFBFBD> Cache<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <EFBFBD><EFBFBD> ã<><C3A3> <20>ǰ<EFBFBD>?
// <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD> <20>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>...
// <EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD>... Ȯ<>λ<EFBFBD><CEBB><EFBFBD>??????
// 이거 이상한데...
// Delete를 했으면, Cache도 해제해야 하는것 아닌가???
// 근데 Cache를 해제하는 부분이 없어.
// 못 찾은 건가?
// 이렇게 해놓으면, 계속 시간이 될 때마다 아이템을 계속 지워...
// 이미 사라진 아이템인데... 확인사살??????
// fixme
// by rtsummit
void CItemCache::Delete()
@ -44,8 +44,7 @@ void CItemCache::Delete()
//char szQuery[QUERY_MAX_LEN];
//szQuery[QUERY_MAX_LEN] = '\0';
if (g_test_server)
sys_log(0, "ItemCache::Delete : DELETE %u", m_data.id);
SPDLOG_TRACE("ItemCache::Delete : DELETE {}", m_data.id);
m_data.vnum = 0;
m_bNeedQuery = true;
@ -53,19 +52,18 @@ void CItemCache::Delete()
OnFlush();
//m_bNeedQuery = false;
//m_lastUpdateTime = time(0) - m_expireTime; // <EFBFBD>ٷ<EFBFBD> Ÿ<>Ӿƿ<D3BE> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20><><EFBFBD><EFBFBD>.
//m_lastUpdateTime = time(0) - m_expireTime; // 바로 타임아웃 되도록 하자.
}
void CItemCache::OnFlush()
{
if (m_data.vnum == 0) // vnum<EFBFBD><EFBFBD> 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> ǥ<>õ<EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
if (m_data.vnum == 0) // vnum이 0이면 삭제하라고 표시된 것이다.
{
char szQuery[QUERY_MAX_LEN];
snprintf(szQuery, sizeof(szQuery), "DELETE FROM item%s WHERE id=%u", GetTablePostfix(), m_data.id);
CDBManager::instance().ReturnQuery(szQuery, QID_ITEM_DESTROY, 0, NULL);
if (g_test_server)
sys_log(0, "ItemCache::Flush : DELETE %u %s", m_data.id, szQuery);
SPDLOG_TRACE("ItemCache::Flush : DELETE {} {}", m_data.id, szQuery);
}
else
{
@ -141,8 +139,7 @@ void CItemCache::OnFlush()
char szItemQuery[QUERY_MAX_LEN + QUERY_MAX_LEN + 100];
snprintf(szItemQuery, sizeof(szItemQuery), "REPLACE INTO item%s (%s) VALUES(%s)", GetTablePostfix(), szColumns, szValues);
if (g_test_server)
sys_log(0, "ItemCache::Flush :REPLACE (%s)", szItemQuery);
SPDLOG_TRACE("ItemCache::Flush :REPLACE ({})", szItemQuery);
CDBManager::instance().ReturnQuery(szItemQuery, QID_ITEM_SAVE, 0, NULL);
@ -167,8 +164,7 @@ CPlayerTableCache::~CPlayerTableCache()
void CPlayerTableCache::OnFlush()
{
if (g_test_server)
sys_log(0, "PlayerTableCache::Flush : %s", m_data.name);
SPDLOG_TRACE("PlayerTableCache::Flush : {}", m_data.name);
char szQuery[QUERY_MAX_LEN];
CreatePlayerSaveQuery(szQuery, sizeof(szQuery), &m_data);
@ -190,7 +186,7 @@ CItemPriceListTableCache::CItemPriceListTableCache()
void CItemPriceListTableCache::UpdateList(const TItemPriceListTable* pUpdateList)
{
//
// <EFBFBD>̹<EFBFBD> ij<>̵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD> <20>ߺ<EFBFBD><DFBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3> <20>ߺ<EFBFBD><DFBA><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> tmpvec <EFBFBD><EFBFBD> <20>ִ´<D6B4>.
// 이미 캐싱된 아이템과 중복된 아이템을 찾고 중복되지 않는 이전 정보는 tmpvec 에 넣는다.
//
std::vector<TItemPriceInfo> tmpvec;
@ -206,12 +202,12 @@ void CItemPriceListTableCache::UpdateList(const TItemPriceListTable* pUpdateList
}
//
// pUpdateList <EFBFBD><EFBFBD> m_data <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> tmpvec <20><> <20>տ<EFBFBD><D5BF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ŭ <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// pUpdateList m_data 에 복사하고 남은 공간을 tmpvec 의 앞에서 부터 남은 만큼 복사한다.
//
if (pUpdateList->byCount > SHOP_PRICELIST_MAX_NUM)
{
sys_err("Count overflow!");
SPDLOG_ERROR("Count overflow!");
return;
}
@ -219,7 +215,7 @@ void CItemPriceListTableCache::UpdateList(const TItemPriceListTable* pUpdateList
memcpy(m_data.aPriceInfo, pUpdateList->aPriceInfo, sizeof(TItemPriceInfo) * pUpdateList->byCount);
int nDeletedNum; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
int nDeletedNum; // 삭제된 가격정보의 갯수
if (pUpdateList->byCount < SHOP_PRICELIST_MAX_NUM)
{
@ -238,8 +234,8 @@ void CItemPriceListTableCache::UpdateList(const TItemPriceListTable* pUpdateList
m_bNeedQuery = true;
sys_log(0,
"ItemPriceListTableCache::UpdateList : OwnerID[%u] Update [%u] Items, Delete [%u] Items, Total [%u] Items",
SPDLOG_DEBUG(
"ItemPriceListTableCache::UpdateList : OwnerID[{}] Update [{}] Items, Delete [{}] Items, Total [{}] Items",
m_data.dwOwnerID, pUpdateList->byCount, nDeletedNum, m_data.byCount);
}
@ -248,14 +244,14 @@ void CItemPriceListTableCache::OnFlush()
char szQuery[QUERY_MAX_LEN];
//
// <EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 이 캐시의 소유자에 대한 기존에 DB 에 저장된 아이템 가격정보를 모두 삭제한다.
//
snprintf(szQuery, sizeof(szQuery), "DELETE FROM myshop_pricelist%s WHERE owner_id = %u", GetTablePostfix(), m_data.dwOwnerID);
CDBManager::instance().ReturnQuery(szQuery, QID_ITEMPRICE_DESTROY, 0, NULL);
//
// ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DB <20><> <20><><EFBFBD><EFBFBD>.
// 캐시의 내용을 모두 DB 에 쓴다.
//
for (int idx = 0; idx < m_data.byCount; ++idx)
@ -266,7 +262,7 @@ void CItemPriceListTableCache::OnFlush()
CDBManager::instance().ReturnQuery(szQuery, QID_ITEMPRICE_SAVE, 0, NULL);
}
sys_log(0, "ItemPriceListTableCache::Flush : OwnerID[%u] Update [%u]Items", m_data.dwOwnerID, m_data.byCount);
SPDLOG_DEBUG("ItemPriceListTableCache::Flush : OwnerID[{}] Update [{}]Items", m_data.dwOwnerID, m_data.byCount);
m_bNeedQuery = false;
}
@ -287,8 +283,7 @@ void CAuctionItemInfoCache::Delete()
if (m_data.item_num == 0)
return;
if (g_test_server)
sys_log(0, "CAuctionItemInfoCache::Delete : DELETE %u", m_data.item_id);
SPDLOG_TRACE("CAuctionItemInfoCache::Delete : DELETE {}", m_data.item_id);
m_data.item_num = 0;
m_bNeedQuery = true;

View File

@ -29,7 +29,7 @@ class CPlayerTableCache : public cache<TPlayerTable>
// MYSHOP_PRICE_LIST
/**
* @class CItemPriceListTableCache
* @brief <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> ij<><C4B3> class
* @brief 개인상점의 아이템 가격정보 리스트에 대한 캐시 class
* @version 05/06/10 Bang2ni - First release.
*/
class CItemPriceListTableCache : public cache< TItemPriceListTable >
@ -38,20 +38,20 @@ class CItemPriceListTableCache : public cache< TItemPriceListTable >
/// Constructor
/**
* ij<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
* 캐시 만료 시간을 설정한다.
*/
CItemPriceListTableCache(void);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
/// 리스트 갱신
/**
* @param [in] pUpdateList <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
* @param [in] pUpdateList 갱신할 리스트
*
* ij<EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> á<><C3A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<>̵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
* 캐시된 가격정보를 갱신한다.
* 가격정보 리스트가 가득 찼을 경우 기존에 캐싱된 정보들을 뒤에서 부터 삭제한다.
*/
void UpdateList(const TItemPriceListTable* pUpdateList);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// 가격정보를 DB 에 기록한다.
virtual void OnFlush(void);
private:

File diff suppressed because it is too large Load Diff

View File

@ -48,10 +48,10 @@ class CClientManager : public singleton<CClientManager>
typedef std::unordered_map<short, BYTE> TChannelStatusMap;
// MYSHOP_PRICE_LIST
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>û <20><><EFBFBD><EFBFBD>
/// 아이템 가격정보 리스트 요청 정보
/**
* first: Peer handle
* second: <EFBFBD><EFBFBD>û<EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> ID
* second: 요청한 플레이어의 ID
*/
typedef std::pair< DWORD, DWORD > TItemPricelistReqInfo;
// END_OF_MYSHOP_PRICE_LIST
@ -77,7 +77,7 @@ class CClientManager : public singleton<CClientManager>
pAccountTable = NULL;
player_id = dwPID;
};
//<EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//독일선물기능용 생성자
ClientHandleInfo(DWORD argHandle, DWORD dwPID, DWORD accountId)
{
dwHandle = argHandle;
@ -116,7 +116,7 @@ class CClientManager : public singleton<CClientManager>
void SetChinaEventServer(bool flag) { m_bChinaEventServer = flag; }
bool IsChinaEventServer() { return m_bChinaEventServer; }
DWORD GetUserCount(); // <EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
DWORD GetUserCount(); // 접속된 사용자 수를 리턴 한다.
void SendAllGuildSkillRechargePacket();
void SendTime();
@ -136,23 +136,23 @@ class CClientManager : public singleton<CClientManager>
void UpdateItemCache();
// MYSHOP_PRICE_LIST
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<>ø<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
/// 가격정보 리스트 캐시를 가져온다.
/**
* @param [in] dwID <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.(<28>÷<EFBFBD><C3B7>̾<EFBFBD> ID)
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param [in] dwID 가격정보 리스트의 소유자.(플레이어 ID)
* @return 가격정보 리스트 캐시의 포인터
*/
CItemPriceListTableCache* GetItemPriceListCache(DWORD dwID);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<>ø<EFBFBD> <20>ִ´<D6B4>.
/// 가격정보 리스트 캐시를 넣는다.
/**
* @param [in] pItemPriceList ij<EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
* @param [in] pItemPriceList 캐시에 넣을 아이템 가격정보 리스트
*
* ij<EFBFBD>ð<EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Update <EFBFBD><EFBFBD> <20>ƴ<EFBFBD> replace <EFBFBD>Ѵ<EFBFBD>.
* 캐시가 이미 있으면 Update 가 아닌 replace 한다.
*/
void PutItemPriceListCache(const TItemPriceListTable* pItemPriceList);
/// Flush <EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<>ø<EFBFBD> Flush <20><><EFBFBD>ְ<EFBFBD> ij<>ÿ<EFBFBD><C3BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// Flush 시간이 만료된 아이템 가격정보 리스트 캐시를 Flush 해주고 캐시에서 삭제한다.
void UpdateItemPriceListCache(void);
// END_OF_MYSHOP_PRICE_LIST
@ -170,8 +170,8 @@ class CClientManager : public singleton<CClientManager>
void SendNotice(const char * c_pszFormat, ...);
std::string GetCommand(char* str); //<EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
void ItemAward(CPeer * peer, char* login); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
std::string GetCommand(char* str); //독일선물기능에서 명령어 얻는 함수
void ItemAward(CPeer * peer, char* login); //독일 선물 기능
CPeer * AddPeer(bufferevent* bufev, sockaddr* addr);
void RemovePeer(CPeer * pPeer);
@ -199,9 +199,9 @@ class CClientManager : public singleton<CClientManager>
bool InitializeObjectTable();
bool InitializeMonarch();
// mob_proto.txt, item_proto.txt<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> mob_proto, item_proto<EFBFBD><EFBFBD> real db<EFBFBD><EFBFBD> <20>ݿ<EFBFBD>.
// item_proto, mob_proto<EFBFBD><EFBFBD> db<EFBFBD><EFBFBD> <20>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD> <20>ʾƵ<CABE>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0>µ<EFBFBD><C2B5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
// <EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EEBFA1> db<EFBFBD><EFBFBD> item_proto, mob_proto<EFBFBD><EFBFBD> <20>о<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>Ѵ<EFBFBD>.
// mob_proto.txt, item_proto.txt에서 읽은 mob_proto, item_proto real db에 반영.
// item_proto, mob_proto db에 반영하지 않아도, 게임 돌아가는데는 문제가 없지만,
// 운영툴 등에서 db item_proto, mob_proto를 읽어 쓰기 때문에 문제가 발생한다.
bool MirrorMobTableIntoDB();
bool MirrorItemTableIntoDB();
@ -260,20 +260,20 @@ class CClientManager : public singleton<CClientManager>
// END_PLAYER_INDEX_CREATE_BUG_FIX
// MYSHOP_PRICE_LIST
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Result ó<EFBFBD><EFBFBD>
/// 가격정보 로드 쿼리에 대한 Result 처리
/**
* @param peer <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> Game server <EFBFBD><EFBFBD> peer <EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pMsg <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Result <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param peer 가격정보를 요청한 Game server peer 객체 포인터
* @param pMsg 쿼리의 Result 로 받은 객체의 포인터
*
* <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ij<>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> peer <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
* 로드된 가격정보 리스트를 캐시에 저장하고 peer 에게 리스트를 보내준다.
*/
void RESULT_PRICELIST_LOAD(CPeer* peer, SQLMsg* pMsg);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Result ó<EFBFBD><EFBFBD>
/// 가격정보 업데이트를 위한 로드 쿼리에 대한 Result 처리
/**
* @param pMsg <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Result <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pMsg 쿼리의 Result 로 받은 객체의 포인터
*
* <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<>ø<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ѵ<EFBFBD>.
* 로드된 정보로 가격정보 리스트 캐시를 만들고 업데이트 받은 가격정보로 업데이트 한다.
*/
void RESULT_PRICELIST_LOAD_FOR_UPDATE(SQLMsg* pMsg);
// END_OF_MYSHOP_PRICE_LIST
@ -310,9 +310,6 @@ class CClientManager : public singleton<CClientManager>
void SendPartyOnSetup(CPeer * peer);
void QUERY_HIGHSCORE_REGISTER(CPeer * peer, TPacketGDHighscore* data);
void RESULT_HIGHSCORE_REGISTER(CPeer * pkPeer, SQLMsg * msg);
void QUERY_FLUSH_CACHE(CPeer * pkPeer, const char * c_pData);
void QUERY_PARTY_CREATE(CPeer * peer, TPacketPartyCreate* p);
@ -327,7 +324,6 @@ class CClientManager : public singleton<CClientManager>
void QUERY_CHANGE_NAME(CPeer * peer, DWORD dwHandle, TPacketGDChangeName * p);
void GetPlayerFromRes(TPlayerTable * player_table, MYSQL_RES* res);
void QUERY_SMS(CPeer * pkPeer, TPacketGDSMS * p);
void QUERY_LOGIN_KEY(CPeer * pkPeer, TPacketGDLoginKey * p);
void AddGuildPriv(TPacketGiveGuildPriv* p);
@ -347,13 +343,7 @@ class CClientManager : public singleton<CClientManager>
void SetEventFlag(TPacketSetEventFlag* p);
void SendEventFlagsOnSetup(CPeer* peer);
void BillingExpire(TPacketBillingExpire * p);
void BillingCheck(const char * data);
void SendAllLoginToBilling();
void SendLoginToBilling(CLoginData * pkLD, bool bLogin);
// <20><>ȥ
// 결혼
void MarriageAdd(TPacketMarriageAdd * p);
void MarriageUpdate(TPacketMarriageUpdate * p);
void MarriageRemove(TPacketMarriageRemove * p);
@ -363,19 +353,19 @@ class CClientManager : public singleton<CClientManager>
void WeddingEnd(TPacketWeddingEnd * p);
// MYSHOP_PRICE_LIST
// <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 개인상점 가격정보
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><>Ŷ(HEADER_GD_MYSHOP_PRICELIST_UPDATE) ó<EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>
/// 아이템 가격정보 리스트 업데이트 패킷(HEADER_GD_MYSHOP_PRICELIST_UPDATE) 처리함수
/**
* @param [in] pPacket <EFBFBD><EFBFBD>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param [in] pPacket 패킷 데이터의 포인터
*/
void MyshopPricelistUpdate(const TPacketMyshopPricelistHeader* pPacket);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>û <20><>Ŷ(HEADER_GD_MYSHOP_PRICELIST_REQ) ó<EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>
/// 아이템 가격정보 리스트 요청 패킷(HEADER_GD_MYSHOP_PRICELIST_REQ) 처리함수
/**
* @param peer <EFBFBD><EFBFBD>Ŷ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Game server <EFBFBD><EFBFBD> peer <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param [in] dwHandle <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> peer <20><> <20>ڵ<EFBFBD>
* @param [in] dwPlayerID <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>û<EFBFBD><C3BB> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> ID
* @param peer 패킷을 보낸 Game server peer 객체의 포인터
* @param [in] dwHandle 가격정보를 요청한 peer 의 핸들
* @param [in] dwPlayerID 가격정보 리스트를 요청한 플레이어의 ID
*/
void MyshopPricelistRequest(CPeer* peer, DWORD dwHandle, DWORD dwPlayerID);
// END_OF_MYSHOP_PRICE_LIST
@ -385,10 +375,6 @@ class CClientManager : public singleton<CClientManager>
void DeleteObject(DWORD dwID);
void UpdateLand(DWORD * pdw);
// VCard
void VCard(TPacketGDVCard * p);
void VCardProcess();
// BLOCK_CHAT
void BlockChat(TPacketBlockChat * p);
// END_OF_BLOCK_CHAT
@ -413,7 +399,7 @@ class CClientManager : public singleton<CClientManager>
typedef std::unordered_map<DWORD, CLoginData *> TLoginDataByAID;
TLoginDataByAID m_map_pkLoginDataByAID;
// Login LoginData pair (<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>)
// Login LoginData pair (실제 로그인 되어있는 계정)
typedef std::unordered_map<std::string, CLoginData *> TLogonAccountMap;
TLogonAccountMap m_map_kLogonAccount;
@ -441,18 +427,16 @@ class CClientManager : public singleton<CClientManager>
std::vector<building::TObjectProto> m_vec_kObjectProto;
std::map<DWORD, building::TObject *> m_map_pkObjectTable;
std::queue<TPacketGDVCard> m_queue_vcard;
bool m_bShutdowned;
TPlayerTableCacheMap m_map_playerCache; // <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD> id<EFBFBD><EFBFBD> key
TPlayerTableCacheMap m_map_playerCache; // 플레이어 id key
TItemCacheMap m_map_itemCache; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> id<EFBFBD><EFBFBD> key
TItemCacheSetPtrMap m_map_pkItemCacheSetPtr; // <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD> id<EFBFBD><EFBFBD> key, <EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾ <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֳ<EFBFBD>?
TItemCacheMap m_map_itemCache; // 아이템 id key
TItemCacheSetPtrMap m_map_pkItemCacheSetPtr; // 플레이어 id key, 이 플레이어가 어떤 아이템 캐쉬를 가지고 있나?
// MYSHOP_PRICE_LIST
/// <EFBFBD>÷<EFBFBD><EFBFBD>̾ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ map. key: <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD> ID, value: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<><C4B3>
TItemPriceListCacheMap m_mapItemPriceListCache; ///< <EFBFBD>÷<EFBFBD><EFBFBD>̾ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
/// 플레이어별 아이템 가격정보 리스트 map. key: 플레이어 ID, value: 가격정보 리스트 캐시
TItemPriceListCacheMap m_mapItemPriceListCache; ///< 플레이어별 아이템 가격정보 리스트
// END_OF_MYSHOP_PRICE_LIST
TChannelStatusMap m_mChannelStatus;
@ -490,7 +474,7 @@ class CClientManager : public singleton<CClientManager>
//BOOT_LOCALIZATION
public:
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
/* 로컬 정보 초기화
**/
bool InitializeLocalization();
@ -545,7 +529,6 @@ class CClientManager : public singleton<CClientManager>
//END_MONARCH
void ChangeMonarchLord(CPeer* peer, DWORD dwHandle, TPacketChangeMonarchLord* info);
void BlockException(TPacketBlockException *data);
void SendSpareItemIDRange(CPeer* peer);

View File

@ -16,84 +16,84 @@ bool CClientManager::InitializeTables()
{
if (!InitializeMobTable())
{
sys_err("InitializeMobTable FAILED");
SPDLOG_ERROR("InitializeMobTable FAILED");
return false;
}
if (!MirrorMobTableIntoDB())
{
sys_err("MirrorMobTableIntoDB FAILED");
SPDLOG_ERROR("MirrorMobTableIntoDB FAILED");
return false;
}
if (!InitializeItemTable())
{
sys_err("InitializeItemTable FAILED");
SPDLOG_ERROR("InitializeItemTable FAILED");
return false;
}
if (!MirrorItemTableIntoDB())
{
sys_err("MirrorItemTableIntoDB FAILED");
SPDLOG_ERROR("MirrorItemTableIntoDB FAILED");
return false;
}
if (!InitializeShopTable())
{
sys_err("InitializeShopTable FAILED");
SPDLOG_ERROR("InitializeShopTable FAILED");
return false;
}
if (!InitializeSkillTable())
{
sys_err("InitializeSkillTable FAILED");
SPDLOG_ERROR("InitializeSkillTable FAILED");
return false;
}
if (!InitializeRefineTable())
{
sys_err("InitializeRefineTable FAILED");
SPDLOG_ERROR("InitializeRefineTable FAILED");
return false;
}
if (!InitializeItemAttrTable())
{
sys_err("InitializeItemAttrTable FAILED");
SPDLOG_ERROR("InitializeItemAttrTable FAILED");
return false;
}
if (!InitializeItemRareTable())
{
sys_err("InitializeItemRareTable FAILED");
SPDLOG_ERROR("InitializeItemRareTable FAILED");
return false;
}
if (!InitializeBanwordTable())
{
sys_err("InitializeBanwordTable FAILED");
SPDLOG_ERROR("InitializeBanwordTable FAILED");
return false;
}
if (!InitializeLandTable())
{
sys_err("InitializeLandTable FAILED");
SPDLOG_ERROR("InitializeLandTable FAILED");
return false;
}
if (!InitializeObjectProto())
{
sys_err("InitializeObjectProto FAILED");
SPDLOG_ERROR("InitializeObjectProto FAILED");
return false;
}
if (!InitializeObjectTable())
{
sys_err("InitializeObjectTable FAILED");
SPDLOG_ERROR("InitializeObjectTable FAILED");
return false;
}
if (!InitializeMonarch())
{
sys_err("InitializeMonarch FAILED");
SPDLOG_ERROR("InitializeMonarch FAILED");
return false;
}
@ -117,7 +117,7 @@ bool CClientManager::InitializeRefineTable()
if (m_pRefineTable)
{
sys_log(0, "RELOAD: refine_proto");
SPDLOG_DEBUG("RELOAD: refine_proto");
delete [] m_pRefineTable;
m_pRefineTable = NULL;
}
@ -153,7 +153,7 @@ bool CClientManager::InitializeRefineTable()
}
}
sys_log(0, "REFINE: id %ld cost %d prob %d mat1 %lu cnt1 %d", prt->id, prt->cost, prt->prob, prt->materials[0].vnum, prt->materials[0].count);
SPDLOG_TRACE("REFINE: id {} cost {} prob {} mat1 {} cnt1 {}", prt->id, prt->cost, prt->prob, prt->materials[0].vnum, prt->materials[0].count);
prt++;
}
@ -171,42 +171,42 @@ class FCompareVnum
bool CClientManager::InitializeMobTable()
{
//================== <EFBFBD>Լ<EFBFBD> <20><><EFBFBD><EFBFBD> ==================//
//1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : 'mob_proto.txt', 'mob_proto_test.txt', 'mob_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>а<EFBFBD>,
// (!)[mob_table] <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. (Ÿ<><C5B8> : TMobTable)
//2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 1) 'mob_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о (a)[localMap](vnum:name) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// 2) 'mob_proto_test.txt'<EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (b)[test_map_mobTableByVnum](vnum:TMobTable) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 3) 'mob_proto.txt' <EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (!)[mob_table] <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <<EFBFBD><EFBFBD><EFBFBD><EFBFBD>>
// <EFBFBD><EFBFBD> row <EFBFBD><EFBFBD> <20><>,
// (b)[test_map_mobTableByVnum],(!)[mob_table] <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <20>ִ<EFBFBD> row<EFBFBD><EFBFBD>
// (b)[test_map_mobTableByVnum]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 4) (b)[test_map_mobTableByVnum]<EFBFBD><EFBFBD> row<EFBFBD><EFBFBD>, (!)[mob_table]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
//3. <EFBFBD>׽<EFBFBD>Ʈ
// 1)'mob_proto.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mob_table<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>. -> <EFBFBD>Ϸ<EFBFBD>
// 2)'mob_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mob_table<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>.
// 3)'mob_proto_test.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD> [<5B><>ġ<EFBFBD><C4A1>] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mob_table <20><> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>.
// 4)'mob_proto_test.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD> [<5B><><EFBFBD>ο<EFBFBD>] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mob_table <20><> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>.
// 5) (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>۵<EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD>.
//================== 함수 설명 ==================//
//1. 요약 : 'mob_proto.txt', 'mob_proto_test.txt', 'mob_names.txt' 파일을 읽고,
// (!)[mob_table] 테이블 오브젝트를 생성한다. (타입 : TMobTable)
//2. 순서
// 1) 'mob_names.txt' 파일을 읽어서 (a)[localMap](vnum:name) 맵을 만든다.
// 2) 'mob_proto_test.txt'파일과 (a)[localMap] 맵으로
// (b)[test_map_mobTableByVnum](vnum:TMobTable) 맵을 생성한다.
// 3) 'mob_proto.txt' 파일과 (a)[localMap] 맵으로
// (!)[mob_table] 테이블을 만든다.
// <참고>
// row 들 중,
// (b)[test_map_mobTableByVnum],(!)[mob_table] 모두에 있는 row
// (b)[test_map_mobTableByVnum]의 것을 사용한다.
// 4) (b)[test_map_mobTableByVnum] row, (!)[mob_table]에 없는 것을 추가한다.
//3. 테스트
// 1)'mob_proto.txt' 정보가 mob_table에 잘 들어갔는지. -> 완료
// 2)'mob_names.txt' 정보가 mob_table에 잘 들어갔는지.
// 3)'mob_proto_test.txt' 에서 [겹치는] 정보가 mob_table 에 잘 들어갔는지.
// 4)'mob_proto_test.txt' 에서 [새로운] 정보가 mob_table 에 잘 들어갔는지.
// 5) (최종) 게임 클라이언트에서 제대로 작동 하는지.
//_______________________________________________//
//===============================================//
// 1) 'mob_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
//<(a)localMap <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>>
// 1) 'mob_names.txt' 파일을 읽어서 (a)[localMap] 맵을 만든다.
//<(a)localMap 맵 생성>
map<int,const char*> localMap;
bool isNameFile = true;
//<<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>б<EFBFBD>>
//<파일 읽기>
cCsvTable nameData;
if(!nameData.Load("mob_names.txt",'\t'))
{
fprintf(stderr, "mob_names.txt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("mob_names.txt Failed to read the file");
isNameFile = false;
} else {
nameData.Next(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>row <20><><EFBFBD><EFBFBD>.
nameData.Next(); //설명row 생략.
while(nameData.Next()) {
localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
}
@ -215,35 +215,35 @@ bool CClientManager::InitializeMobTable()
//===============================================//
// 2) 'mob_proto_test.txt'<EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)localMap <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (b)[test_map_mobTableByVnum](vnum:TMobTable) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 2) 'mob_proto_test.txt'파일과 (a)localMap 맵으로
// (b)[test_map_mobTableByVnum](vnum:TMobTable) 맵을 생성한다.
//0.
set<int> vnumSet; //<EFBFBD>׽<EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>űԿ<C5B1><D4BF><EFBFBD> Ȯ<>ο<EFBFBD> <20><><EFBFBD><EFBFBD>.
//1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD>
set<int> vnumSet; //테스트용 파일 데이터중, 신규여부 확인에 사용.
//1. 파일 읽어오기
bool isTestFile = true;
cCsvTable test_data;
if(!test_data.Load("mob_proto_test.txt",'\t'))
{
fprintf(stderr, "<EFBFBD>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.\n");
SPDLOG_ERROR("No test file exists, proceed as is.");
isTestFile = false;
}
//2. (c)[test_map_mobTableByVnum](vnum:TMobTable) <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
//2. (c)[test_map_mobTableByVnum](vnum:TMobTable) 맵 생성.
map<DWORD, TMobTable *> test_map_mobTableByVnum;
if (isTestFile) {
test_data.Next(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD> <20>Ѿ<D1BE><EEB0A1>.
test_data.Next(); //설명 로우 넘어가기.
//<EFBFBD><EFBFBD>. <20>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD>.
//ㄱ. 테스트 몬스터 테이블 생성.
TMobTable * test_mob_table = NULL;
int test_MobTableSize = test_data.m_File.GetRowCount()-1;
test_mob_table = new TMobTable[test_MobTableSize];
memset(test_mob_table, 0, sizeof(TMobTable) * test_MobTableSize);
//<EFBFBD><EFBFBD>. <20>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ְ<EFBFBD>, <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD> <20>ֱ<EFBFBD>.
//ㄴ. 테스트 몬스터 테이블에 값을 넣고, 맵에까지 넣기.
while(test_data.Next()) {
if (!Set_Proto_Mob_Table(test_mob_table, test_data, localMap))
{
fprintf(stderr, "<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.\n");
SPDLOG_ERROR("Mob proto table setup failed.");
}
test_map_mobTableByVnum.insert(std::map<DWORD, TMobTable *>::value_type(test_mob_table->dwVnum, test_mob_table));
@ -254,22 +254,22 @@ bool CClientManager::InitializeMobTable()
}
// 3) 'mob_proto.txt' <EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (!)[mob_table] <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <<EFBFBD><EFBFBD><EFBFBD><EFBFBD>>
// <EFBFBD><EFBFBD> row <EFBFBD><EFBFBD> <20><>,
// (b)[test_map_mobTableByVnum],(!)[mob_table] <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <20>ִ<EFBFBD> row<EFBFBD><EFBFBD>
// (b)[test_map_mobTableByVnum]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 3) 'mob_proto.txt' 파일과 (a)[localMap] 맵으로
// (!)[mob_table] 테이블을 만든다.
// <참고>
// row 들 중,
// (b)[test_map_mobTableByVnum],(!)[mob_table] 모두에 있는 row
// (b)[test_map_mobTableByVnum]의 것을 사용한다.
//1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>б<EFBFBD>.
//1. 파일 읽기.
cCsvTable data;
if(!data.Load("mob_proto.txt",'\t')) {
fprintf(stderr, "mob_proto.txt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("mob_proto.txt Failed to read the file");
return false;
}
data.Next(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> row <EFBFBD>Ѿ<EFBFBD><EFBFBD>
//2. (!)[mob_table] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
//2.1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ľ<EFBFBD>
data.Next(); //설명 row 넘어가기
//2. (!)[mob_table] 생성하기
//2.1 새로 추가되는 갯수를 파악
int addNumber = 0;
while(data.Next()) {
int vnum = atoi(data.AsStringByIndex(0));
@ -279,35 +279,35 @@ bool CClientManager::InitializeMobTable()
addNumber++;
}
}
//data<EFBFBD><EFBFBD> <20>ٽ<EFBFBD> ù<>ٷ<EFBFBD> <20>ű<EFBFBD><C5B1><EFBFBD>.(<28>ٽ<EFBFBD> <20>о<EFBFBD><D0BE>´<EFBFBD>;;)
//data를 다시 첫줄로 옮긴다.(다시 읽어온다;;)
data.Destroy();
if(!data.Load("mob_proto.txt",'\t'))
{
fprintf(stderr, "mob_proto.txt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("mob_proto.txt Failed to read the file");
return false;
}
data.Next(); //<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Į<><C4AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>κ<EFBFBD>)
//2.2 ũ<EFBFBD><20>°<EFBFBD> mob_table <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
data.Next(); //맨 윗줄 제외 (아이템 칼럼을 설명하는 부분)
//2.2 크기에 맞게 mob_table 생성
if (!m_vec_mobTable.empty())
{
sys_log(0, "RELOAD: mob_proto");
SPDLOG_DEBUG("RELOAD: mob_proto");
m_vec_mobTable.clear();
}
m_vec_mobTable.resize(data.m_File.GetRowCount()-1 + addNumber);
memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
TMobTable * mob_table = &m_vec_mobTable[0];
//2.3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD>
//2.3 데이터 채우기
while (data.Next())
{
int col = 0;
//(b)[test_map_mobTableByVnum]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> row<6F><77> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD>.
//(b)[test_map_mobTableByVnum]에 같은 row가 있는지 조사.
bool isSameRow = true;
std::map<DWORD, TMobTable *>::iterator it_map_mobTable;
it_map_mobTable = test_map_mobTableByVnum.find(atoi(data.AsStringByIndex(col)));
if(it_map_mobTable == test_map_mobTableByVnum.end()) {
isSameRow = false;
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> row <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (b)<29><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>´<EFBFBD>.
//같은 row 가 있으면 (b)에서 읽어온다.
if(isSameRow) {
TMobTable *tempTable = it_map_mobTable->second;
@ -378,39 +378,39 @@ bool CClientManager::InitializeMobTable()
if (!Set_Proto_Mob_Table(mob_table, data, localMap))
{
fprintf(stderr, "<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.\n");
SPDLOG_ERROR("Mob proto table setup failed.");
}
}
//<EFBFBD>¿<EFBFBD> vnum <EFBFBD>߰<EFBFBD>
//셋에 vnum 추가
vnumSet.insert(mob_table->dwVnum);
sys_log(1, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
SPDLOG_TRACE("MOB #{:<5} {:24} {:24} level: {:<3} rank: {} empire: {}", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
++mob_table;
}
//_____________________________________________________//
// 4) (b)[test_map_mobTableByVnum]<EFBFBD><EFBFBD> row<EFBFBD><EFBFBD>, (!)[mob_table]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD>.
// 4) (b)[test_map_mobTableByVnum] row, (!)[mob_table]에 없는 것을 추가한다.
//파일 다시 읽어오기.
test_data.Destroy();
isTestFile = true;
test_data;
if(!test_data.Load("mob_proto_test.txt",'\t'))
{
fprintf(stderr, "<EFBFBD>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.\n");
SPDLOG_ERROR("No test file exists, proceed as is.");
isTestFile = false;
}
if(isTestFile) {
test_data.Next(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD> <20>Ѿ<D1BE><EEB0A1>.
test_data.Next(); //설명 로우 넘어가기.
while (test_data.Next()) //<EFBFBD>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ⱦ<C8BE><EEB3AA><EFBFBD><EFBFBD>,<2C><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
while (test_data.Next()) //테스트 데이터 각각을 훑어나가며,새로운 것을 추가한다.
{
//<EFBFBD>ߺ<EFBFBD><EFBFBD>Ǵ<EFBFBD> <20>κ<EFBFBD><CEBA≯<EFBFBD> <20>Ѿ<D1BE><EEB0A3>.
//중복되는 부분이면 넘어간다.
set<int>::iterator itVnum;
itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
if (itVnum != vnumSet.end()) {
@ -419,10 +419,10 @@ bool CClientManager::InitializeMobTable()
if (!Set_Proto_Mob_Table(mob_table, test_data, localMap))
{
fprintf(stderr, "<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.\n");
SPDLOG_ERROR("Mob proto table setup failed.");
}
sys_log(0, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
SPDLOG_DEBUG("MOB #{:<5} {:24} {:24} level: {:<3} rank: {} empire: {}", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
++mob_table;
}
@ -447,13 +447,13 @@ bool CClientManager::InitializeShopTable()
std::unique_ptr<SQLMsg> pkMsg2(CDBManager::instance().DirectQuery(s_szQuery));
// shop<EFBFBD><EFBFBD> vnum<EFBFBD><EFBFBD> <20>ִµ<D6B4> shop_item <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>... <20><><EFBFBD>з<EFBFBD> ó<><C3B3><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <EFBFBD><EFBFBD>ó<EFBFBD><EFBFBD><EFBFBD>Һκ<EFBFBD>
// shop vnum은 있는데 shop_item 이 없을경우... 실패로 처리되니 주의 요망.
// 고처야할부분
SQLResult * pRes2 = pkMsg2->Get();
if (!pRes2->uiNumRows)
{
sys_err("InitializeShopTable : Table count is zero.");
SPDLOG_ERROR("InitializeShopTable : Table count is zero.");
return false;
}
@ -487,7 +487,7 @@ bool CClientManager::InitializeShopTable()
str_to_number(shop_table->dwNPCVnum, data[col++]);
if (!data[col]) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL<4C><4C> <20><><EFBFBD><EFBFBD> <20>ǹǷ<C7B9>..
if (!data[col]) // 아이템이 하나도 없으면 NULL이 리턴 되므로..
continue;
TShopItemTable * pItem = &shop_table->items[shop_table->byItemCount];
@ -508,7 +508,7 @@ bool CClientManager::InitializeShopTable()
while (it != map_shop.end())
{
memcpy((m_pShopTable + i), (it++)->second, sizeof(TShopTable));
sys_log(0, "SHOP: #%d items: %d", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
SPDLOG_DEBUG("SHOP: #{} items: {}", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
++i;
}
@ -529,7 +529,7 @@ bool CClientManager::InitializeQuestItemTable()
if (!pRes->uiNumRows)
{
sys_err("query error or no rows: %s", query);
SPDLOG_ERROR("query error or no rows: {}", query);
return false;
}
@ -556,11 +556,11 @@ bool CClientManager::InitializeQuestItemTable()
if (m_map_itemTableByVnum.find(tbl.dwVnum) != m_map_itemTableByVnum.end())
{
sys_err("QUEST_ITEM_ERROR! %lu vnum already exist! (name %s)", tbl.dwVnum, tbl.szLocaleName);
SPDLOG_ERROR("QUEST_ITEM_ERROR! {} vnum already exist! (name {})", tbl.dwVnum, tbl.szLocaleName);
continue;
}
tbl.bType = ITEM_QUEST; // quest_item_proto <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD> ITEM_QUEST <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tbl.bType = ITEM_QUEST; // quest_item_proto 테이블에 있는 것들은 모두 ITEM_QUEST 유형
tbl.bSize = 1;
m_vec_itemTable.push_back(tbl);
@ -571,39 +571,39 @@ bool CClientManager::InitializeQuestItemTable()
bool CClientManager::InitializeItemTable()
{
//================== <EFBFBD>Լ<EFBFBD> <20><><EFBFBD><EFBFBD> ==================//
//1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : 'item_proto.txt', 'item_proto_test.txt', 'item_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>а<EFBFBD>,
// <item_table>(TItemTable), <m_map_itemTableByVnum> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
//2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 1) 'item_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о (a)[localMap](vnum:name) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// 2) 'item_proto_text.txt'<EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (b)[test_map_itemTableByVnum](vnum:TItemTable) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 3) 'item_proto.txt' <EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (!)[item_table], <m_map_itemTableByVnum><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <<EFBFBD><EFBFBD><EFBFBD><EFBFBD>>
// <EFBFBD><EFBFBD> row <EFBFBD><EFBFBD> <20><>,
// (b)[test_map_itemTableByVnum],(!)[mob_table] <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <20>ִ<EFBFBD> row<EFBFBD><EFBFBD>
// (b)[test_map_itemTableByVnum]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 4) (b)[test_map_itemTableByVnum]<EFBFBD><EFBFBD> row<EFBFBD><EFBFBD>, (!)[item_table]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
//3. <EFBFBD>׽<EFBFBD>Ʈ
// 1)'item_proto.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> item_table<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>. -> <EFBFBD>Ϸ<EFBFBD>
// 2)'item_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> item_table<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>.
// 3)'item_proto_test.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD> [<5B><>ġ<EFBFBD><C4A1>] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> item_table <20><> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>.
// 4)'item_proto_test.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD> [<5B><><EFBFBD>ο<EFBFBD>] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> item_table <20><> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>.
// 5) (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>۵<EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD>.
//================== 함수 설명 ==================//
//1. 요약 : 'item_proto.txt', 'item_proto_test.txt', 'item_names.txt' 파일을 읽고,
// <item_table>(TItemTable), <m_map_itemTableByVnum> 오브젝트를 생성한다.
//2. 순서
// 1) 'item_names.txt' 파일을 읽어서 (a)[localMap](vnum:name) 맵을 만든다.
// 2) 'item_proto_text.txt'파일과 (a)[localMap] 맵으로
// (b)[test_map_itemTableByVnum](vnum:TItemTable) 맵을 생성한다.
// 3) 'item_proto.txt' 파일과 (a)[localMap] 맵으로
// (!)[item_table], <m_map_itemTableByVnum>을 만든다.
// <참고>
// row 들 중,
// (b)[test_map_itemTableByVnum],(!)[mob_table] 모두에 있는 row
// (b)[test_map_itemTableByVnum]의 것을 사용한다.
// 4) (b)[test_map_itemTableByVnum] row, (!)[item_table]에 없는 것을 추가한다.
//3. 테스트
// 1)'item_proto.txt' 정보가 item_table에 잘 들어갔는지. -> 완료
// 2)'item_names.txt' 정보가 item_table에 잘 들어갔는지.
// 3)'item_proto_test.txt' 에서 [겹치는] 정보가 item_table 에 잘 들어갔는지.
// 4)'item_proto_test.txt' 에서 [새로운] 정보가 item_table 에 잘 들어갔는지.
// 5) (최종) 게임 클라이언트에서 제대로 작동 하는지.
//_______________________________________________//
//=================================================================================//
// 1) 'item_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о (a)[localMap](vnum:name) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// 1) 'item_names.txt' 파일을 읽어서 (a)[localMap](vnum:name) 맵을 만든다.
//=================================================================================//
bool isNameFile = true;
map<int,const char*> localMap;
cCsvTable nameData;
if(!nameData.Load("item_names.txt",'\t'))
{
fprintf(stderr, "item_names.txt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("item_names.txt Failed to read the file");
isNameFile = false;
} else {
nameData.Next();
@ -614,32 +614,32 @@ bool CClientManager::InitializeItemTable()
//_________________________________________________________________//
//=================================================================//
// 2) 'item_proto_text.txt'<EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (b)[test_map_itemTableByVnum](vnum:TItemTable) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 2) 'item_proto_text.txt'파일과 (a)[localMap] 맵으로
// (b)[test_map_itemTableByVnum](vnum:TItemTable) 맵을 생성한다.
//=================================================================//
map<DWORD, TItemTable *> test_map_itemTableByVnum;
//1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD>.
//1. 파일 읽어오기.
cCsvTable test_data;
if(!test_data.Load("item_proto_test.txt",'\t'))
{
fprintf(stderr, "item_proto_test.txt <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("item_proto_test.txt Failed to read the file");
//return false;
} else {
test_data.Next(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD> <20>Ѿ<D1BE><EEB0A1>.
test_data.Next(); //설명 로우 넘어가기.
//2. <EFBFBD>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD>.
//2. 테스트 아이템 테이블 생성.
TItemTable * test_item_table = NULL;
int test_itemTableSize = test_data.m_File.GetRowCount()-1;
test_item_table = new TItemTable[test_itemTableSize];
memset(test_item_table, 0, sizeof(TItemTable) * test_itemTableSize);
//3. <EFBFBD>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ְ<EFBFBD>, <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD> <20>ֱ<EFBFBD>.
//3. 테스트 아이템 테이블에 값을 넣고, 맵에까지 넣기.
while(test_data.Next()) {
if (!Set_Proto_Item_Table(test_item_table, test_data, localMap))
{
fprintf(stderr, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.\n");
SPDLOG_ERROR("Item proto table setup failed.");
}
test_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(test_item_table->dwVnum, test_item_table));
@ -651,35 +651,35 @@ bool CClientManager::InitializeItemTable()
//========================================================================//
// 3) 'item_proto.txt' <EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (!)[item_table], <m_map_itemTableByVnum><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <<EFBFBD><EFBFBD><EFBFBD><EFBFBD>>
// <EFBFBD><EFBFBD> row <EFBFBD><EFBFBD> <20><>,
// (b)[test_map_itemTableByVnum],(!)[mob_table] <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <20>ִ<EFBFBD> row<EFBFBD><EFBFBD>
// (b)[test_map_itemTableByVnum]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 3) 'item_proto.txt' 파일과 (a)[localMap] 맵으로
// (!)[item_table], <m_map_itemTableByVnum>을 만든다.
// <참고>
// row 들 중,
// (b)[test_map_itemTableByVnum],(!)[mob_table] 모두에 있는 row
// (b)[test_map_itemTableByVnum]의 것을 사용한다.
//========================================================================//
//vnum<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>. <20><><EFBFBD>ο<EFBFBD> <20>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǻ<EFBFBD><C7BA>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
//vnum들을 저장할 셋. 새로운 테스트 아이템을 판별할때 사용된다.
set<int> vnumSet;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD>.
//파일 읽어오기.
cCsvTable data;
if(!data.Load("item_proto.txt",'\t'))
{
fprintf(stderr, "item_proto.txt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("item_proto.txt Failed to read the file");
return false;
}
data.Next(); //<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Į<><C4AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>κ<EFBFBD>)
data.Next(); //맨 윗줄 제외 (아이템 칼럼을 설명하는 부분)
if (!m_vec_itemTable.empty())
{
sys_log(0, "RELOAD: item_proto");
SPDLOG_DEBUG("RELOAD: item_proto");
m_vec_itemTable.clear();
m_map_itemTableByVnum.clear();
}
//===== <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> =====//
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ľ<EFBFBD><C4BE>Ѵ<EFBFBD>.
//===== 아이템 테이블 생성 =====//
//새로 추가되는 갯수를 파악한다.
int addNumber = 0;
while(data.Next()) {
int vnum = atoi(data.AsStringByIndex(0));
@ -689,14 +689,14 @@ bool CClientManager::InitializeItemTable()
addNumber++;
}
}
//data<EFBFBD><EFBFBD> <20>ٽ<EFBFBD> ù<>ٷ<EFBFBD> <20>ű<EFBFBD><C5B1><EFBFBD>.(<28>ٽ<EFBFBD> <20>о<EFBFBD><D0BE>´<EFBFBD>;;)
//data를 다시 첫줄로 옮긴다.(다시 읽어온다;;)
data.Destroy();
if(!data.Load("item_proto.txt",'\t'))
{
fprintf(stderr, "item_proto.txt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("item_proto.txt Failed to read the file");
return false;
}
data.Next(); //<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Į<><C4AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>κ<EFBFBD>)
data.Next(); //맨 윗줄 제외 (아이템 칼럼을 설명하는 부분)
m_vec_itemTable.resize(data.m_File.GetRowCount() - 1 + addNumber);
memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
@ -711,16 +711,16 @@ bool CClientManager::InitializeItemTable()
std::map<DWORD, TItemTable *>::iterator it_map_itemTable;
it_map_itemTable = test_map_itemTableByVnum.find(atoi(data.AsStringByIndex(col)));
if(it_map_itemTable == test_map_itemTableByVnum.end()) {
//<EFBFBD><EFBFBD> Į<><C4AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//각 칼럼 데이터 저장
if (!Set_Proto_Item_Table(item_table, data, localMap))
{
fprintf(stderr, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.\n");
SPDLOG_ERROR("Item proto table setup failed.");
}
} else { //$$$$$$$$$$$$$$$$$$$$$$$ <EFBFBD>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>!
} else { //$$$$$$$$$$$$$$$$$$$$$$$ 테스트 아이템 정보가 있다!
TItemTable *tempTable = it_map_itemTable->second;
item_table->dwVnum = tempTable->dwVnum;
@ -777,19 +777,19 @@ bool CClientManager::InitializeItemTable()
//_______________________________________________________________________//
//========================================================================//
// 4) (b)[test_map_itemTableByVnum]<EFBFBD><EFBFBD> row<EFBFBD><EFBFBD>, (!)[item_table]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
// 4) (b)[test_map_itemTableByVnum] row, (!)[item_table]에 없는 것을 추가한다.
//========================================================================//
test_data.Destroy();
if(!test_data.Load("item_proto_test.txt",'\t'))
{
fprintf(stderr, "item_proto_test.txt <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("item_proto_test.txt Failed to read the file");
//return false;
} else {
test_data.Next(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD> <20>Ѿ<D1BE><EEB0A1>.
test_data.Next(); //설명 로우 넘어가기.
while (test_data.Next()) //<EFBFBD>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ⱦ<C8BE><EEB3AA><EFBFBD><EFBFBD>,<2C><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
while (test_data.Next()) //테스트 데이터 각각을 훑어나가며,새로운 것을 추가한다.
{
//<EFBFBD>ߺ<EFBFBD><EFBFBD>Ǵ<EFBFBD> <20>κ<EFBFBD><CEBA≯<EFBFBD> <20>Ѿ<D1BE><EEB0A3>.
//중복되는 부분이면 넘어간다.
set<int>::iterator itVnum;
itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
if (itVnum != vnumSet.end()) {
@ -798,7 +798,7 @@ bool CClientManager::InitializeItemTable()
if (!Set_Proto_Item_Table(item_table, test_data, localMap))
{
fprintf(stderr, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.\n");
SPDLOG_ERROR("Item proto table setup failed.");
}
@ -823,7 +823,7 @@ bool CClientManager::InitializeItemTable()
{
TItemTable * item_table = &(*(it++));
sys_log(1, "ITEM: #%-5lu %-24s %-24s VAL: %ld %ld %ld %ld %ld %ld WEAR %lu ANTI %lu IMMUNE %lu REFINE %lu REFINE_SET %u MAGIC_PCT %u",
SPDLOG_TRACE("ITEM: #{:<5} {:24} {:24} VAL: {} {} {} {} {} {} WEAR {} ANTI {} IMMUNE {} REFINE {} REFINE_SET {} MAGIC_PCT {}",
item_table->dwVnum,
item_table->szName,
item_table->szLocaleName,
@ -865,13 +865,13 @@ bool CClientManager::InitializeSkillTable()
if (!pRes->uiNumRows)
{
sys_err("no result from skill_proto");
SPDLOG_ERROR("no result from skill_proto");
return false;
}
if (!m_vec_skillTable.empty())
{
sys_log(0, "RELOAD: skill_proto");
SPDLOG_DEBUG("RELOAD: skill_proto");
m_vec_skillTable.clear();
}
@ -929,7 +929,7 @@ bool CClientManager::InitializeSkillTable()
str_to_number(t.bSkillAttrType, data[col++]);
str_to_number(t.dwTargetRange, data[col++]);
sys_log(0, "SKILL: #%d %s flag %u point %s affect %u cooldown %s", t.dwVnum, t.szName, t.dwFlag, t.szPointOn, t.dwAffectFlag, t.szCooldownPoly);
SPDLOG_TRACE("SKILL: #{} {} flag {} point {} affect {} cooldown {}", t.dwVnum, t.szName, t.dwFlag, t.szPointOn, t.dwAffectFlag, t.szCooldownPoly);
m_vec_skillTable.push_back(t);
}
@ -961,7 +961,7 @@ bool CClientManager::InitializeBanwordTable()
}
}
sys_log(0, "BANWORD: total %d", m_vec_banwordTable.size());
SPDLOG_DEBUG("BANWORD: total {}", m_vec_banwordTable.size());
return true;
}
@ -977,13 +977,13 @@ bool CClientManager::InitializeItemAttrTable()
if (!pRes->uiNumRows)
{
sys_err("no result from item_attr");
SPDLOG_ERROR("no result from item_attr");
return false;
}
if (!m_vec_itemAttrTable.empty())
{
sys_log(0, "RELOAD: item_attr");
SPDLOG_DEBUG("RELOAD: item_attr");
m_vec_itemAttrTable.clear();
}
@ -1016,7 +1016,7 @@ bool CClientManager::InitializeItemAttrTable()
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
sys_log(0, "ITEM_ATTR: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
SPDLOG_TRACE("ITEM_ATTR: {:20} {:4} ( {:3} {:3} {:3} {:3} {:3} ) ( {} {} {} {} {} {} {} )",
t.szApply,
t.dwProb,
t.lValues[0],
@ -1051,13 +1051,13 @@ bool CClientManager::InitializeItemRareTable()
if (!pRes->uiNumRows)
{
sys_err("no result from item_attr_rare");
SPDLOG_ERROR("no result from item_attr_rare");
return false;
}
if (!m_vec_itemRareTable.empty())
{
sys_log(0, "RELOAD: item_attr_rare");
SPDLOG_DEBUG("RELOAD: item_attr_rare");
m_vec_itemRareTable.clear();
}
@ -1090,7 +1090,7 @@ bool CClientManager::InitializeItemRareTable()
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
sys_log(0, "ITEM_RARE: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
SPDLOG_TRACE("ITEM_RARE: {:20} {:4} ( {:3} {:3} {:3} {:3} {:3} ) ( {} {} {} {} {} {} {} )",
t.szApply,
t.dwProb,
t.lValues[0],
@ -1129,7 +1129,7 @@ bool CClientManager::InitializeLandTable()
if (!m_vec_kLandTable.empty())
{
sys_log(0, "RELOAD: land");
SPDLOG_DEBUG("RELOAD: land");
m_vec_kLandTable.clear();
}
@ -1156,7 +1156,7 @@ bool CClientManager::InitializeLandTable()
str_to_number(t.bGuildLevelLimit, data[col++]);
str_to_number(t.dwPrice, data[col++]);
sys_log(0, "LAND: %lu map %-4ld %7ldx%-7ld w %-4ld h %-4ld", t.dwID, t.lMapIndex, t.x, t.y, t.width, t.height);
SPDLOG_TRACE("LAND: {} map {:<4} {:7}x{:<7} w {:<4} h {:<4}", t.dwID, t.lMapIndex, t.x, t.y, t.width, t.height);
m_vec_kLandTable.push_back(t);
}
@ -1232,7 +1232,7 @@ bool CClientManager::InitializeObjectProto()
if (!m_vec_kObjectProto.empty())
{
sys_log(0, "RELOAD: object_proto");
SPDLOG_DEBUG("RELOAD: object_proto");
m_vec_kObjectProto.clear();
}
@ -1280,7 +1280,7 @@ bool CClientManager::InitializeObjectProto()
t.lNPCY = std::max(t.lRegion[1], t.lRegion[3])+300;
// END_OF_ADD_BUILDING_NPC
sys_log(0, "OBJ_PROTO: vnum %lu price %lu mat %lu %lu",
SPDLOG_TRACE("OBJ_PROTO: vnum {} price {} mat {} {}",
t.dwVnum, t.dwPrice, t.kMaterials[0].dwItemVnum, t.kMaterials[0].dwCount);
m_vec_kObjectProto.push_back(t);
@ -1301,7 +1301,7 @@ bool CClientManager::InitializeObjectTable()
if (!m_map_pkObjectTable.empty())
{
sys_log(0, "RELOAD: object");
SPDLOG_DEBUG("RELOAD: object");
m_map_pkObjectTable.clear();
}
@ -1327,7 +1327,7 @@ bool CClientManager::InitializeObjectTable()
str_to_number(k->zRot, data[col++]);
str_to_number(k->lLife, data[col++]);
sys_log(0, "OBJ: %lu vnum %lu map %-4ld %7ldx%-7ld life %ld",
SPDLOG_DEBUG("OBJ: {} vnum {} map {:<4} {:7}x{:<7} life {}",
k->dwID, k->dwVnum, k->lMapIndex, k->x, k->y, k->lLife);
m_map_pkObjectTable.insert(std::make_pair(k->dwID, k));

View File

@ -21,7 +21,7 @@ void CClientManager::LoadEventFlag()
TPacketSetEventFlag p;
strlcpy(p.szFlagName, row[0], sizeof(p.szFlagName));
str_to_number(p.lValue, row[1]);
sys_log(0, "EventFlag Load %s %d", p.szFlagName, p.lValue);
SPDLOG_DEBUG("EventFlag Load {} {}", p.szFlagName, p.lValue);
m_map_lEventFlag.insert(std::make_pair(std::string(p.szFlagName), p.lValue));
ForwardPacket(HEADER_DG_SET_EVENT_FLAG, &p, sizeof(TPacketSetEventFlag));
}
@ -56,10 +56,10 @@ void CClientManager::SetEventFlag(TPacketSetEventFlag* p)
//CDBManager::instance().ReturnQuery(szQuery, QID_QUEST_SAVE, 0, NULL);
CDBManager::instance().AsyncQuery(szQuery);
sys_log(0, "HEADER_GD_SET_EVENT_FLAG : Changed CClientmanager::SetEventFlag(%s %d) ", p->szFlagName, p->lValue);
SPDLOG_DEBUG("HEADER_GD_SET_EVENT_FLAG : Changed CClientmanager::SetEventFlag({} {}) ", p->szFlagName, p->lValue);
return;
}
sys_log(0, "HEADER_GD_SET_EVENT_FLAG : No Changed CClientmanager::SetEventFlag(%s %d) ", p->szFlagName, p->lValue);
SPDLOG_DEBUG("HEADER_GD_SET_EVENT_FLAG : No Changed CClientmanager::SetEventFlag({} {}) ", p->szFlagName, p->lValue);
}
void CClientManager::SendEventFlagsOnSetup(CPeer* peer)

View File

@ -10,7 +10,7 @@
void CClientManager::GuildCreate(CPeer * peer, DWORD dwGuildID)
{
sys_log(0, "GuildCreate %u", dwGuildID);
SPDLOG_DEBUG("GuildCreate {}", dwGuildID);
ForwardPacket(HEADER_DG_GUILD_LOAD, &dwGuildID, sizeof(DWORD));
CGuildManager::instance().Load(dwGuildID);
@ -18,14 +18,14 @@ void CClientManager::GuildCreate(CPeer * peer, DWORD dwGuildID)
void CClientManager::GuildChangeGrade(CPeer* peer, TPacketGuild* p)
{
sys_log(0, "GuildChangeGrade %u %u", p->dwGuild, p->dwInfo);
SPDLOG_DEBUG("GuildChangeGrade {} {}", p->dwGuild, p->dwInfo);
ForwardPacket(HEADER_DG_GUILD_CHANGE_GRADE, p, sizeof(TPacketGuild));
}
void CClientManager::GuildAddMember(CPeer* peer, TPacketGDGuildAddMember * p)
{
CGuildManager::instance().TouchGuild(p->dwGuild);
sys_log(0, "GuildAddMember %u %u", p->dwGuild, p->dwPID);
SPDLOG_DEBUG("GuildAddMember {} {}", p->dwGuild, p->dwPID);
char szQuery[512];
@ -42,7 +42,7 @@ void CClientManager::GuildAddMember(CPeer* peer, TPacketGDGuildAddMember * p)
if (pmsg->Get()->uiNumRows == 0)
{
sys_err("Query failed when getting guild member data %s", pmsg->stQuery.c_str());
SPDLOG_ERROR("Query failed when getting guild member data {}", pmsg->stQuery.c_str());
return;
}
@ -67,7 +67,7 @@ void CClientManager::GuildAddMember(CPeer* peer, TPacketGDGuildAddMember * p)
void CClientManager::GuildRemoveMember(CPeer* peer, TPacketGuild* p)
{
sys_log(0, "GuildRemoveMember %u %u", p->dwGuild, p->dwInfo);
SPDLOG_DEBUG("GuildRemoveMember {} {}", p->dwGuild, p->dwInfo);
char szQuery[512];
snprintf(szQuery, sizeof(szQuery), "DELETE FROM guild_member%s WHERE pid=%u and guild_id=%u", GetTablePostfix(), p->dwInfo, p->dwGuild);
@ -81,25 +81,25 @@ void CClientManager::GuildRemoveMember(CPeer* peer, TPacketGuild* p)
void CClientManager::GuildSkillUpdate(CPeer* peer, TPacketGuildSkillUpdate* p)
{
sys_log(0, "GuildSkillUpdate %d", p->amount);
SPDLOG_DEBUG("GuildSkillUpdate {}", p->amount);
ForwardPacket(HEADER_DG_GUILD_SKILL_UPDATE, p, sizeof(TPacketGuildSkillUpdate));
}
void CClientManager::GuildExpUpdate(CPeer* peer, TPacketGuildExpUpdate* p)
{
sys_log(0, "GuildExpUpdate %d", p->amount);
SPDLOG_DEBUG("GuildExpUpdate {}", p->amount);
ForwardPacket(HEADER_DG_GUILD_EXP_UPDATE, p, sizeof(TPacketGuildExpUpdate), 0, peer);
}
void CClientManager::GuildChangeMemberData(CPeer* peer, TPacketGuildChangeMemberData* p)
{
sys_log(0, "GuildChangeMemberData %u %u %d %d", p->pid, p->offer, p->level, p->grade);
SPDLOG_DEBUG("GuildChangeMemberData {} {} {} {}", p->pid, p->offer, p->level, p->grade);
ForwardPacket(HEADER_DG_GUILD_CHANGE_MEMBER_DATA, p, sizeof(TPacketGuildChangeMemberData), 0, peer);
}
void CClientManager::GuildDisband(CPeer* peer, TPacketGuild* p)
{
sys_log(0, "GuildDisband %u", p->dwGuild);
SPDLOG_DEBUG("GuildDisband {}", p->dwGuild);
char szQuery[512];
@ -126,13 +126,13 @@ const char* __GetWarType(int n)
switch (n)
{
case 0 :
return "<EFBFBD>п<EFBFBD>";
return "\xEF\xBF\xBD\xD0\xBF\xEF\xBF\xBD"; // 패왕
case 1 :
return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
return "\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD"; // 맹장
case 2 :
return "<EFBFBD><EFBFBD>ȣ";
return "\xEF\xBF\xBD\xEF\xBF\xBD\xC8\xA3"; // 수호
default :
return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ";
return "\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\x20\xEF\xBF\xBD\xEF\xBF\xBD\xC8\xA3"; // 없는 번호
}
}
@ -141,12 +141,12 @@ void CClientManager::GuildWar(CPeer* peer, TPacketGuildWar* p)
switch (p->bWar)
{
case GUILD_WAR_SEND_DECLARE:
sys_log(0, "GuildWar: GUILD_WAR_SEND_DECLARE type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
SPDLOG_DEBUG("GuildWar: GUILD_WAR_SEND_DECLARE type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().AddDeclare(p->bType, p->dwGuildFrom, p->dwGuildTo);
break;
case GUILD_WAR_REFUSE:
sys_log(0, "GuildWar: GUILD_WAR_REFUSE type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
SPDLOG_DEBUG("GuildWar: GUILD_WAR_REFUSE type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().RemoveDeclare(p->dwGuildFrom, p->dwGuildTo);
break;
/*
@ -160,10 +160,10 @@ void CClientManager::GuildWar(CPeer* peer, TPacketGuildWar* p)
*/
case GUILD_WAR_WAIT_START:
sys_log(0, "GuildWar: GUILD_WAR_WAIT_START type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
case GUILD_WAR_RESERVE: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SPDLOG_DEBUG("GuildWar: GUILD_WAR_WAIT_START type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
case GUILD_WAR_RESERVE: // 길드전 예약
if (p->bWar != GUILD_WAR_WAIT_START)
sys_log(0, "GuildWar: GUILD_WAR_RESERVE type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
SPDLOG_DEBUG("GuildWar: GUILD_WAR_RESERVE type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().RemoveDeclare(p->dwGuildFrom, p->dwGuildTo);
if (!CGuildManager::instance().ReserveWar(p))
@ -173,24 +173,24 @@ void CClientManager::GuildWar(CPeer* peer, TPacketGuildWar* p)
break;
case GUILD_WAR_ON_WAR: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ų<EFBFBD><C5B2>. (<28>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>)
sys_log(0, "GuildWar: GUILD_WAR_ON_WAR type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
case GUILD_WAR_ON_WAR: // 길드전을 시작 시킨다. (필드전은 바로 시작 됨)
SPDLOG_DEBUG("GuildWar: GUILD_WAR_ON_WAR type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().RemoveDeclare(p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().StartWar(p->bType, p->dwGuildFrom, p->dwGuildTo);
break;
case GUILD_WAR_OVER: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
sys_log(0, "GuildWar: GUILD_WAR_OVER type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
case GUILD_WAR_OVER: // 길드전 정상 종료
SPDLOG_DEBUG("GuildWar: GUILD_WAR_OVER type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().RecvWarOver(p->dwGuildFrom, p->dwGuildTo, p->bType, p->lWarPrice);
break;
case GUILD_WAR_END: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
sys_log(0, "GuildWar: GUILD_WAR_END type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
case GUILD_WAR_END: // 길드전 비정상 종료
SPDLOG_DEBUG("GuildWar: GUILD_WAR_END type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().RecvWarEnd(p->dwGuildFrom, p->dwGuildTo);
return; // NOTE: RecvWarEnd<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
return; // NOTE: RecvWarEnd에서 패킷을 보내므로 따로 브로드캐스팅 하지 않는다.
case GUILD_WAR_CANCEL :
sys_log(0, "GuildWar: GUILD_WAR_CANCEL type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
SPDLOG_DEBUG("GuildWar: GUILD_WAR_CANCEL type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().CancelWar(p->dwGuildFrom, p->dwGuildTo);
break;
}
@ -205,20 +205,20 @@ void CClientManager::GuildWarScore(CPeer* peer, TPacketGuildWarScore * p)
void CClientManager::GuildChangeLadderPoint(TPacketGuildLadderPoint* p)
{
sys_log(0, "GuildChangeLadderPoint Recv %u %d", p->dwGuild, p->lChange);
SPDLOG_DEBUG("GuildChangeLadderPoint Recv {} {}", p->dwGuild, p->lChange);
CGuildManager::instance().ChangeLadderPoint(p->dwGuild, p->lChange);
}
void CClientManager::GuildUseSkill(TPacketGuildUseSkill* p)
{
sys_log(0, "GuildUseSkill Recv %u %d", p->dwGuild, p->dwSkillVnum);
SPDLOG_DEBUG("GuildUseSkill Recv {} {}", p->dwGuild, p->dwSkillVnum);
CGuildManager::instance().UseSkill(p->dwGuild, p->dwSkillVnum, p->dwCooltime);
SendGuildSkillUsable(p->dwGuild, p->dwSkillVnum, false);
}
void CClientManager::SendGuildSkillUsable(DWORD guild_id, DWORD dwSkillVnum, bool bUsable)
{
sys_log(0, "SendGuildSkillUsable Send %u %d %s", guild_id, dwSkillVnum, bUsable?"true":"false");
SPDLOG_DEBUG("SendGuildSkillUsable Send {} {} {}", guild_id, dwSkillVnum, bUsable?"true":"false");
TPacketGuildSkillUsableChange p;

View File

@ -11,7 +11,6 @@
extern std::string g_stLocale;
extern bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab);
extern int g_test_server;
extern int g_log;
bool CClientManager::InsertLogonAccount(const char * c_pszLogin, DWORD dwHandle, const char * c_pszIP)
{
@ -49,14 +48,13 @@ bool CClientManager::DeleteLogonAccount(const char * c_pszLogin, DWORD dwHandle)
if (pkLD->GetConnectedPeerHandle() != dwHandle)
{
sys_err("%s tried to logout in other peer handle %lu, current handle %lu", szLogin, dwHandle, pkLD->GetConnectedPeerHandle());
SPDLOG_ERROR("{} tried to logout in other peer handle {}, current handle {}", szLogin, dwHandle, pkLD->GetConnectedPeerHandle());
return false;
}
if (pkLD->IsPlay())
{
pkLD->SetPlay(false);
SendLoginToBilling(pkLD, false);
}
if (pkLD->IsDeleted())
@ -87,7 +85,7 @@ void CClientManager::QUERY_LOGIN_BY_KEY(CPeer * pkPeer, DWORD dwHandle, TPacketG
if (!pkLoginData)
{
sys_log(0, "LOGIN_BY_KEY key not exist %s %lu", szLogin, p->dwLoginKey);
SPDLOG_DEBUG("LOGIN_BY_KEY key not exist {} {}", szLogin, p->dwLoginKey);
pkPeer->EncodeReturn(HEADER_DG_LOGIN_NOT_EXIST, dwHandle);
return;
}
@ -96,7 +94,7 @@ void CClientManager::QUERY_LOGIN_BY_KEY(CPeer * pkPeer, DWORD dwHandle, TPacketG
if (FindLogonAccount(r.login))
{
sys_log(0, "LOGIN_BY_KEY already login %s %lu", r.login, p->dwLoginKey);
SPDLOG_DEBUG("LOGIN_BY_KEY already login {} {}", r.login, p->dwLoginKey);
TPacketDGLoginAlready ptog;
strlcpy(ptog.szLogin, szLogin, sizeof(ptog.szLogin));
pkPeer->EncodeHeader(HEADER_DG_LOGIN_ALREADY, dwHandle, sizeof(TPacketDGLoginAlready));
@ -106,7 +104,7 @@ void CClientManager::QUERY_LOGIN_BY_KEY(CPeer * pkPeer, DWORD dwHandle, TPacketG
if (strcasecmp(r.login, szLogin))
{
sys_log(0, "LOGIN_BY_KEY login differ %s %lu input %s", r.login, p->dwLoginKey, szLogin);
SPDLOG_DEBUG("LOGIN_BY_KEY login differ {} {} input {}", r.login, p->dwLoginKey, szLogin);
pkPeer->EncodeReturn(HEADER_DG_LOGIN_NOT_EXIST, dwHandle);
return;
}
@ -115,7 +113,7 @@ void CClientManager::QUERY_LOGIN_BY_KEY(CPeer * pkPeer, DWORD dwHandle, TPacketG
{
const DWORD * pdwClientKey = pkLoginData->GetClientKey();
sys_log(0, "LOGIN_BY_KEY client key differ %s %lu %lu %lu %lu, %lu %lu %lu %lu",
SPDLOG_DEBUG("LOGIN_BY_KEY client key differ {} {} {} {} {}, {} {} {} {}",
r.login,
p->adwClientKey[0], p->adwClientKey[1], p->adwClientKey[2], p->adwClientKey[3],
pdwClientKey[0], pdwClientKey[1], pdwClientKey[2], pdwClientKey[3]);
@ -137,7 +135,7 @@ void CClientManager::QUERY_LOGIN_BY_KEY(CPeer * pkPeer, DWORD dwHandle, TPacketG
info->pAccountTable = pkTab;
strlcpy(info->ip, p->szIP, sizeof(info->ip));
sys_log(0, "LOGIN_BY_KEY success %s %lu %s", r.login, p->dwLoginKey, info->ip);
SPDLOG_DEBUG("LOGIN_BY_KEY success {} {} {}", r.login, p->dwLoginKey, info->ip);
char szQuery[QUERY_MAX_LEN];
snprintf(szQuery, sizeof(szQuery), "SELECT pid1, pid2, pid3, pid4, empire FROM player_index%s WHERE id=%u", GetTablePostfix(), r.id);
CDBManager::instance().ReturnQuery(szQuery, QID_LOGIN_BY_KEY, pkPeer->GetHandle(), info);
@ -164,11 +162,11 @@ void CClientManager::RESULT_LOGIN_BY_KEY(CPeer * peer, SQLMsg * msg)
snprintf(szQuery, sizeof(szQuery), "SELECT pid1, pid2, pid3, pid4, empire FROM player_index%s WHERE id=%u", GetTablePostfix(), account_id);
std::unique_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER));
sys_log(0, "RESULT_LOGIN_BY_KEY FAIL player_index's NULL : ID:%d", account_id);
SPDLOG_DEBUG("RESULT_LOGIN_BY_KEY FAIL player_index's NULL : ID:{}", account_id);
if (pMsg->Get()->uiNumRows == 0)
{
sys_log(0, "RESULT_LOGIN_BY_KEY FAIL player_index's NULL : ID:%d", account_id);
SPDLOG_DEBUG("RESULT_LOGIN_BY_KEY FAIL player_index's NULL : ID:{}", account_id);
// PLAYER_INDEX_CREATE_BUG_FIX
//snprintf(szQuery, sizeof(szQuery), "INSERT IGNORE INTO player_index%s (id) VALUES(%lu)", GetTablePostfix(), info->pAccountTable->id);
@ -231,7 +229,7 @@ TAccountTable * CreateAccountTableFromRes(MYSQL_RES * res)
TAccountTable * pkTab = new TAccountTable;
memset(pkTab, 0, sizeof(TAccountTable));
// ù<EFBFBD><EFBFBD>° <20>÷<EFBFBD> <20>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD> (JOIN QUERY<52><59> <20><><EFBFBD><EFBFBD> <20><> <20><>)
// 첫번째 컬럼 것만 참고 한다 (JOIN QUERY를 위한 것 임)
strlcpy(input_pwd, row[col++], sizeof(input_pwd));
str_to_number(pkTab->id, row[col++]);
strlcpy(pkTab->login, row[col++], sizeof(pkTab->login));
@ -332,14 +330,14 @@ void CreateAccountPlayerDataFromRes(MYSQL_RES * pRes, TAccountTable * pkTab)
str_to_number(pkTab->players[j].bChangeName, row[col++]);
}
sys_log(0, "%s %lu %lu hair %u",
SPDLOG_DEBUG("{} {} {} hair {}",
pkTab->players[j].szName, pkTab->players[j].x, pkTab->players[j].y, pkTab->players[j].wHairPart);
break;
}
}
/*
if (j == PLAYER_PER_ACCOUNT)
sys_err("cannot find player_id on this account (login: %s id %lu account %lu %lu %lu)",
SPDLOG_ERROR("cannot find player_id on this account (login: {} id {} account {} {} {})",
pkTab->login, player_id,
pkTab->players[0].dwID,
pkTab->players[1].dwID,
@ -355,10 +353,10 @@ void CClientManager::RESULT_LOGIN(CPeer * peer, SQLMsg * msg)
if (info->account_index == 0)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>?
// 계정이 없네?
if (msg->Get()->uiNumRows == 0)
{
sys_log(0, "RESULT_LOGIN: no account");
SPDLOG_DEBUG("RESULT_LOGIN: no account");
peer->EncodeHeader(HEADER_DG_LOGIN_NOT_EXIST, info->dwHandle, 0);
delete info;
return;
@ -368,7 +366,7 @@ void CClientManager::RESULT_LOGIN(CPeer * peer, SQLMsg * msg)
if (!info->pAccountTable)
{
sys_log(0, "RESULT_LOGIN: no account : WRONG_PASSWD");
SPDLOG_DEBUG("RESULT_LOGIN: no account : WRONG_PASSWD");
peer->EncodeReturn(HEADER_DG_LOGIN_WRONG_PASSWD, info->dwHandle);
delete info;
}
@ -397,17 +395,17 @@ void CClientManager::RESULT_LOGIN(CPeer * peer, SQLMsg * msg)
}
else
{
if (!info->pAccountTable) // <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;;
if (!info->pAccountTable) // 이럴리는 없겠지만;;
{
peer->EncodeReturn(HEADER_DG_LOGIN_WRONG_PASSWD, info->dwHandle);
delete info;
return;
}
// <EFBFBD>ٸ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> <20>̹<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20>ع<EFBFBD><D8B9>ȴٸ<C8B4>.. <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴٰ<DFB4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
// 다른 컨넥션이 이미 로그인 해버렸다면.. 이미 접속했다고 보내야 한다.
if (!InsertLogonAccount(info->pAccountTable->login, peer->GetHandle(), info->ip))
{
sys_log(0, "RESULT_LOGIN: already logon %s", info->pAccountTable->login);
SPDLOG_DEBUG("RESULT_LOGIN: already logon {}", info->pAccountTable->login);
TPacketDGLoginAlready p;
strlcpy(p.szLogin, info->pAccountTable->login, sizeof(p.szLogin));
@ -417,7 +415,7 @@ void CClientManager::RESULT_LOGIN(CPeer * peer, SQLMsg * msg)
}
else
{
sys_log(0, "RESULT_LOGIN: login success %s rows: %lu", info->pAccountTable->login, msg->Get()->uiNumRows);
SPDLOG_DEBUG("RESULT_LOGIN: login success {} rows: {}", info->pAccountTable->login, msg->Get()->uiNumRows);
if (msg->Get()->uiNumRows > 0)
CreateAccountPlayerDataFromRes(msg->Get()->pSQLResult, info->pAccountTable);
@ -456,23 +454,20 @@ void CClientManager::QUERY_LOGOUT(CPeer * peer, DWORD dwHandle,const char * data
{
if (pLoginData->GetAccountRef().players[n].dwID == 0)
{
if (g_test_server)
sys_log(0, "LOGOUT %s %d", packet->login, pLoginData->GetAccountRef().players[n].dwID);
SPDLOG_TRACE("LOGOUT {} {}", packet->login, pLoginData->GetAccountRef().players[n].dwID);
continue;
}
pid[n] = pLoginData->GetAccountRef().players[n].dwID;
if (g_log)
sys_log(0, "LOGOUT InsertLogoutPlayer %s %d", packet->login, pid[n]);
SPDLOG_TRACE("LOGOUT InsertLogoutPlayer {} {}", packet->login, pid[n]);
InsertLogoutPlayer(pid[n]);
}
if (DeleteLogonAccount(packet->login, peer->GetHandle()))
{
if (g_log)
sys_log(0, "LOGOUT %s ", packet->login);
SPDLOG_TRACE("LOGOUT {} ", packet->login);
}
}

View File

@ -13,11 +13,11 @@ void CClientManager::QUERY_PARTY_CREATE(CPeer* peer, TPacketPartyCreate* p)
{
pm.insert(make_pair(p->dwLeaderPID, TPartyMember()));
ForwardPacket(HEADER_DG_PARTY_CREATE, p, sizeof(TPacketPartyCreate), peer->GetChannel(), peer);
sys_log(0, "PARTY Create [%lu]", p->dwLeaderPID);
SPDLOG_DEBUG("PARTY Create [{}]", p->dwLeaderPID);
}
else
{
sys_err("PARTY Create - Already exists [%lu]", p->dwLeaderPID);
SPDLOG_ERROR("PARTY Create - Already exists [{}]", p->dwLeaderPID);
}
}
@ -28,13 +28,13 @@ void CClientManager::QUERY_PARTY_DELETE(CPeer* peer, TPacketPartyDelete* p)
if (it == pm.end())
{
sys_err("PARTY Delete - Non exists [%lu]", p->dwLeaderPID);
SPDLOG_ERROR("PARTY Delete - Non exists [{}]", p->dwLeaderPID);
return;
}
pm.erase(it);
ForwardPacket(HEADER_DG_PARTY_DELETE, p, sizeof(TPacketPartyDelete), peer->GetChannel(), peer);
sys_log(0, "PARTY Delete [%lu]", p->dwLeaderPID);
SPDLOG_DEBUG("PARTY Delete [{}]", p->dwLeaderPID);
}
void CClientManager::QUERY_PARTY_ADD(CPeer* peer, TPacketPartyAdd* p)
@ -44,7 +44,7 @@ void CClientManager::QUERY_PARTY_ADD(CPeer* peer, TPacketPartyAdd* p)
if (it == pm.end())
{
sys_err("PARTY Add - Non exists [%lu]", p->dwLeaderPID);
SPDLOG_ERROR("PARTY Add - Non exists [{}]", p->dwLeaderPID);
return;
}
@ -52,10 +52,10 @@ void CClientManager::QUERY_PARTY_ADD(CPeer* peer, TPacketPartyAdd* p)
{
it->second.insert(std::make_pair(p->dwPID, TPartyInfo()));
ForwardPacket(HEADER_DG_PARTY_ADD, p, sizeof(TPacketPartyAdd), peer->GetChannel(), peer);
sys_log(0, "PARTY Add [%lu] to [%lu]", p->dwPID, p->dwLeaderPID);
SPDLOG_DEBUG("PARTY Add [{}] to [{}]", p->dwPID, p->dwLeaderPID);
}
else
sys_err("PARTY Add - Already [%lu] in party [%lu]", p->dwPID, p->dwLeaderPID);
SPDLOG_ERROR("PARTY Add - Already [{}] in party [{}]", p->dwPID, p->dwLeaderPID);
}
void CClientManager::QUERY_PARTY_REMOVE(CPeer* peer, TPacketPartyRemove* p)
@ -65,7 +65,7 @@ void CClientManager::QUERY_PARTY_REMOVE(CPeer* peer, TPacketPartyRemove* p)
if (it == pm.end())
{
sys_err("PARTY Remove - Non exists [%lu] cannot remove [%lu]",p->dwLeaderPID, p->dwPID);
SPDLOG_ERROR("PARTY Remove - Non exists [{}] cannot remove [{}]",p->dwLeaderPID, p->dwPID);
return;
}
@ -75,10 +75,10 @@ void CClientManager::QUERY_PARTY_REMOVE(CPeer* peer, TPacketPartyRemove* p)
{
it->second.erase(pit);
ForwardPacket(HEADER_DG_PARTY_REMOVE, p, sizeof(TPacketPartyRemove), peer->GetChannel(), peer);
sys_log(0, "PARTY Remove [%lu] to [%lu]", p->dwPID, p->dwLeaderPID);
SPDLOG_DEBUG("PARTY Remove [{}] to [{}]", p->dwPID, p->dwLeaderPID);
}
else
sys_err("PARTY Remove - Cannot find [%lu] in party [%lu]", p->dwPID, p->dwLeaderPID);
SPDLOG_ERROR("PARTY Remove - Cannot find [{}] in party [{}]", p->dwPID, p->dwLeaderPID);
}
void CClientManager::QUERY_PARTY_STATE_CHANGE(CPeer* peer, TPacketPartyStateChange* p)
@ -88,7 +88,7 @@ void CClientManager::QUERY_PARTY_STATE_CHANGE(CPeer* peer, TPacketPartyStateChan
if (it == pm.end())
{
sys_err("PARTY StateChange - Non exists [%lu] cannot state change [%lu]",p->dwLeaderPID, p->dwPID);
SPDLOG_ERROR("PARTY StateChange - Non exists [{}] cannot state change [{}]",p->dwLeaderPID, p->dwPID);
return;
}
@ -96,7 +96,7 @@ void CClientManager::QUERY_PARTY_STATE_CHANGE(CPeer* peer, TPacketPartyStateChan
if (pit == it->second.end())
{
sys_err("PARTY StateChange - Cannot find [%lu] in party [%lu]", p->dwPID, p->dwLeaderPID);
SPDLOG_ERROR("PARTY StateChange - Cannot find [{}] in party [{}]", p->dwPID, p->dwLeaderPID);
return;
}
@ -106,7 +106,7 @@ void CClientManager::QUERY_PARTY_STATE_CHANGE(CPeer* peer, TPacketPartyStateChan
pit->second.bRole = 0;
ForwardPacket(HEADER_DG_PARTY_STATE_CHANGE, p, sizeof(TPacketPartyStateChange), peer->GetChannel(), peer);
sys_log(0, "PARTY StateChange [%lu] at [%lu] from %d %d",p->dwPID, p->dwLeaderPID, p->bRole, p->bFlag);
SPDLOG_DEBUG("PARTY StateChange [{}] at [{}] from {} {}",p->dwPID, p->dwLeaderPID, p->bRole, p->bFlag);
}
void CClientManager::QUERY_PARTY_SET_MEMBER_LEVEL(CPeer* peer, TPacketPartySetMemberLevel* p)
@ -116,7 +116,7 @@ void CClientManager::QUERY_PARTY_SET_MEMBER_LEVEL(CPeer* peer, TPacketPartySetMe
if (it == pm.end())
{
sys_err("PARTY SetMemberLevel - Non exists [%lu] cannot level change [%lu]",p->dwLeaderPID, p->dwPID);
SPDLOG_ERROR("PARTY SetMemberLevel - Non exists [{}] cannot level change [{}]",p->dwLeaderPID, p->dwPID);
return;
}
@ -124,12 +124,12 @@ void CClientManager::QUERY_PARTY_SET_MEMBER_LEVEL(CPeer* peer, TPacketPartySetMe
if (pit == it->second.end())
{
sys_err("PARTY SetMemberLevel - Cannot find [%lu] in party [%lu]", p->dwPID, p->dwLeaderPID);
SPDLOG_ERROR("PARTY SetMemberLevel - Cannot find [{}] in party [{}]", p->dwPID, p->dwLeaderPID);
return;
}
pit->second.bLevel = p->bLevel;
ForwardPacket(HEADER_DG_PARTY_SET_MEMBER_LEVEL, p, sizeof(TPacketPartySetMemberLevel), peer->GetChannel());
sys_log(0, "PARTY SetMemberLevel pid [%lu] level %d",p->dwPID, p->bLevel);
SPDLOG_DEBUG("PARTY SetMemberLevel pid [{}] level {}",p->dwPID, p->bLevel);
}

View File

@ -6,14 +6,10 @@
#include "Main.h"
#include "QID.h"
#include "ItemAwardManager.h"
#include "HB.h"
#include "Cache.h"
extern bool g_bHotBackup;
extern std::string g_stLocale;
extern int g_test_server;
extern int g_log;
//
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@ -32,7 +28,7 @@ bool CreateItemTableFromRes(MYSQL_RES * res, std::vector<TPlayerItem> * pVec, DW
int rows;
if ((rows = mysql_num_rows(res)) <= 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음
{
pVec->clear();
return true;
@ -159,7 +155,7 @@ size_t CreatePlayerSaveQuery(char * pszQuery, size_t querySize, TPlayerTable * p
pkTab->horse.sStamina,
pkTab->horse_skill_point);
// Binary <EFBFBD><EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD>
// Binary 로 바꾸기 위한 임시 공간
char text[8192 + 1];
CDBManager::instance().EscapeString(text, pkTab->skills, sizeof(pkTab->skills));
@ -196,9 +192,6 @@ void CClientManager::PutPlayerCache(TPlayerTable * pNew)
m_map_playerCache.insert(TPlayerTableCacheMap::value_type(pNew->id, c));
}
if (g_bHotBackup)
PlayerHB::instance().Put(pNew->id);
c->Put(pNew);
}
@ -211,7 +204,7 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
TPlayerTable * pTab;
//
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>͵<EFBFBD> ij<><C4B3>ó<EFBFBD><C3B3>
// 한 계정에 속한 모든 캐릭터들 캐쉬처리
//
CLoginData * pLoginData = GetLoginDataByAID(packet->account_id);
@ -223,12 +216,12 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
}
//----------------------------------------------------------------
// 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DBCache<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 1. 유저정보가 DBCache 에 존재 : DBCache에서
// 2. 유저정보가 DBCache 에 없음 : DB에서
// ---------------------------------------------------------------
//----------------------------------
// 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DBCache<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 1. 유저정보가 DBCache 에 존재 : DBCache에서
//----------------------------------
if ((c = GetPlayerCache(packet->player_id)))
{
@ -236,7 +229,7 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
if (!pkLD || pkLD->IsPlay())
{
sys_log(0, "PLAYER_LOAD_ERROR: LoginData %p IsPlay %d", pkLD, pkLD ? pkLD->IsPlay() : 0);
SPDLOG_DEBUG("PLAYER_LOAD_ERROR: LoginData {} IsPlay {}", (void*) pkLD, pkLD ? pkLD->IsPlay() : 0);
peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_FAILED, dwHandle, 0);
return;
}
@ -244,7 +237,6 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
pTab = c->Get();
pkLD->SetPlay(true);
SendLoginToBilling(pkLD, true);
memcpy(pTab->aiPremiumTimes, pkLD->GetPremiumPtr(), sizeof(pTab->aiPremiumTimes));
peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_SUCCESS, dwHandle, sizeof(TPlayerTable));
@ -265,16 +257,16 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
TItemCacheSet * pSet = GetItemCacheSet(pTab->id);
sys_log(0, "[PLAYER_LOAD] ID %s pid %d gold %d ", pTab->name, pTab->id, pTab->gold);
SPDLOG_DEBUG("[PLAYER_LOAD] ID {} pid {} gold {} ", pTab->name, pTab->id, pTab->gold);
//--------------------------------------------
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> & AFFECT & QUEST <EFBFBD>ε<EFBFBD> :
// 아이템 & AFFECT & QUEST 로딩 :
//--------------------------------------------
// 1) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DBCache <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DB <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 1) 아이템이 DBCache 에 존재 : DBCache 에서 가져옴
// 2) 아이템이 DBCache 에 없음 : DB 에서 가져옴
/////////////////////////////////////////////
// 1) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DBCache <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 1) 아이템이 DBCache 에 존재 : DBCache 에서 가져옴
/////////////////////////////////////////////
if (pSet)
{
@ -289,12 +281,11 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
CItemCache * c = *it++;
TPlayerItem * p = c->Get();
if (p->vnum) // vnum<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
if (p->vnum) // vnum이 없으면 삭제된 아이템이다.
memcpy(&s_items[dwCount++], p, sizeof(TPlayerItem));
}
if (g_test_server)
sys_log(0, "ITEM_CACHE: HIT! %s count: %u", pTab->name, dwCount);
SPDLOG_TRACE("ITEM_CACHE: HIT! {} count: {}", pTab->name, dwCount);
peer->EncodeHeader(HEADER_DG_ITEM_LOAD, dwHandle, sizeof(DWORD) + sizeof(TPlayerItem) * dwCount);
peer->EncodeDWORD(dwCount);
@ -316,7 +307,7 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
CDBManager::instance().ReturnQuery(szQuery, QID_AFFECT, peer->GetHandle(), new ClientHandleInfo(dwHandle));
}
/////////////////////////////////////////////
// 2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DB <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 2) 아이템이 DBCache 에 없음 : DB 에서 가져옴
/////////////////////////////////////////////
else
{
@ -350,23 +341,23 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
//return;
}
//----------------------------------
// 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 2. 유저정보가 DBCache 에 없음 : DB에서
//----------------------------------
else
{
sys_log(0, "[PLAYER_LOAD] Load from PlayerDB pid[%d]", packet->player_id);
SPDLOG_DEBUG("[PLAYER_LOAD] Load from PlayerDB pid[{}]", packet->player_id);
char queryStr[QUERY_MAX_LEN];
//--------------------------------------------------------------
// ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB<44><42><EFBFBD><EFBFBD>
// 캐릭터 정보 얻어오기 : 무조건 DB에서
//--------------------------------------------------------------
snprintf(queryStr, sizeof(queryStr),
"SELECT "
"id,name,job,voice,dir,x,y,z,map_index,exit_x,exit_y,exit_map_index,hp,mp,stamina,random_hp,random_sp,playtime,"
"gold,level,level_step,st,ht,dx,iq,exp,"
"stat_point,skill_point,sub_skill_point,stat_reset_count,part_base,part_hair,"
"skill_level,quickslot,skill_group,alignment,mobile,horse_level,horse_riding,horse_hp,horse_hp_droptime,horse_stamina,"
"skill_level,quickslot,skill_group,alignment,horse_level,horse_riding,horse_hp,horse_hp_droptime,horse_stamina,"
"UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(last_play),horse_skill_point FROM player%s WHERE id=%d",
GetTablePostfix(), packet->player_id);
@ -375,7 +366,7 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
CDBManager::instance().ReturnQuery(queryStr, QID_PLAYER, peer->GetHandle(), pkInfo);
//--------------------------------------------------------------
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 아이템 가져오기
//--------------------------------------------------------------
snprintf(queryStr, sizeof(queryStr),
"SELECT id,window+0,pos,count,vnum,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6 "
@ -384,15 +375,15 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
CDBManager::instance().ReturnQuery(queryStr, QID_ITEM, peer->GetHandle(), new ClientHandleInfo(dwHandle, packet->player_id));
//--------------------------------------------------------------
// QUEST <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// QUEST 가져오기
//--------------------------------------------------------------
snprintf(queryStr, sizeof(queryStr),
"SELECT dwPID,szName,szState,lValue FROM quest%s WHERE dwPID=%d",
GetTablePostfix(), packet->player_id);
CDBManager::instance().ReturnQuery(queryStr, QID_QUEST, peer->GetHandle(), new ClientHandleInfo(dwHandle, packet->player_id,packet->account_id));
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD> item_award<72><64><EFBFBD>̺<EFBFBD><CCBA><EFBFBD><EFBFBD><EFBFBD> login <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> account id<EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0>ش<EFBFBD>
//독일 선물 기능에서 item_award테이블에서 login 정보를 얻기위해 account id도 넘겨준다
//--------------------------------------------------------------
// AFFECT <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// AFFECT 가져오기
//--------------------------------------------------------------
snprintf(queryStr, sizeof(queryStr),
"SELECT dwPID,bType,bApplyOn,lApplyValue,dwFlag,lDuration,lSPCost FROM affect%s WHERE dwPID=%d",
@ -409,21 +400,21 @@ void CClientManager::ItemAward(CPeer * peer,char* login)
std::set<TItemAward *> * pSet = ItemAwardManager::instance().GetByLogin(login_t);
if(pSet == NULL)
return;
typeof(pSet->begin()) it = pSet->begin(); //taken_time<EFBFBD><EFBFBD> NULL<EFBFBD>ΰ͵<EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD>
typeof(pSet->begin()) it = pSet->begin(); //taken_time NULL인것들 읽어옴
while(it != pSet->end() )
{
TItemAward * pItemAward = *(it++);
char* whyStr = pItemAward->szWhy; //why <EFBFBD>ݷ<EFBFBD> <20>б<EFBFBD>
char cmdStr[100] = ""; //why<EFBFBD>ݷ뿡<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>
strcpy(cmdStr,whyStr); //<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ū<EFBFBD><C5AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ūȭ <20>DZ<EFBFBD> <20><><EFBFBD><EFBFBD>
char* whyStr = pItemAward->szWhy; //why 콜룸 읽기
char cmdStr[100] = ""; //why콜룸에서 읽은 값을 임시 문자열에 복사해둠
strcpy(cmdStr,whyStr); //명령어 얻는 과정에서 토큰쓰면 원본도 토큰화 되기 때문
char command[20] = "";
strcpy(command,GetCommand(cmdStr).c_str()); // command <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( !(strcmp(command,"GIFT") )) // command <EFBFBD><EFBFBD> GIFT<EFBFBD≯<EFBFBD>
strcpy(command,GetCommand(cmdStr).c_str()); // command 얻기
if( !(strcmp(command,"GIFT") )) // command GIFT이면
{
TPacketItemAwardInfromer giftData;
strcpy(giftData.login, pItemAward->szLogin); //<EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD> <20><><EFBFBD><EFBFBD>
strcpy(giftData.command, command); //<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD>
giftData.vnum = pItemAward->dwVnum; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vnum<75><6D> <20><><EFBFBD><EFBFBD>
strcpy(giftData.login, pItemAward->szLogin); //로그인 아이디 복사
strcpy(giftData.command, command); //명령어 복사
giftData.vnum = pItemAward->dwVnum; //아이템 vnum도 복사
ForwardPacket(HEADER_DG_ITEMAWARD_INFORMER,&giftData,sizeof(TPacketItemAwardInfromer));
}
}
@ -444,7 +435,7 @@ std::string CClientManager::GetCommand(char* str)
bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab)
{
if (mysql_num_rows(res) == 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (mysql_num_rows(res) == 0) // 데이터 없음
return false;
memset(pkTab, 0, sizeof(TPlayerTable));
@ -456,7 +447,7 @@ bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab)
// "id,name,job,voice,dir,x,y,z,map_index,exit_x,exit_y,exit_map_index,hp,mp,stamina,random_hp,random_sp,playtime,"
// "gold,level,level_step,st,ht,dx,iq,exp,"
// "stat_point,skill_point,sub_skill_point,stat_reset_count,part_base,part_hair,"
// "skill_level,quickslot,skill_group,alignment,mobile,horse_level,horse_riding,horse_hp,horse_stamina FROM player%s WHERE id=%d",
// "skill_level,quickslot,skill_group,alignment,horse_level,horse_riding,horse_hp,horse_stamina FROM player%s WHERE id=%d",
str_to_number(pkTab->id, row[col++]);
strlcpy(pkTab->name, row[col++], sizeof(pkTab->name));
str_to_number(pkTab->job, row[col++]);
@ -507,13 +498,6 @@ bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab)
str_to_number(pkTab->skill_group, row[col++]);
str_to_number(pkTab->lAlignment, row[col++]);
if (row[col])
{
strlcpy(pkTab->szMobile, row[col], sizeof(pkTab->szMobile));
}
col++;
str_to_number(pkTab->horse.bLevel, row[col++]);
str_to_number(pkTab->horse.bRiding, row[col++]);
str_to_number(pkTab->horse.sHealth, row[col++]);
@ -531,11 +515,11 @@ bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab)
int max_point = pkTab->level - 9;
int skill_point =
std::min<int>(20, pkTab->skills[121].bLevel) + // SKILL_LEADERSHIP <EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
std::min<int>(20, pkTab->skills[124].bLevel) + // SKILL_MINING ä<EFBFBD><EFBFBD>
std::min<int>(10, pkTab->skills[131].bLevel) + // SKILL_HORSE_SUMMON <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȯ
std::min<int>(20, pkTab->skills[141].bLevel) + // SKILL_ADD_HP HP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::min<int>(20, pkTab->skills[142].bLevel); // SKILL_RESIST_PENETRATE <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::min<int>(20, pkTab->skills[121].bLevel) + // SKILL_LEADERSHIP 통솔력
std::min<int>(20, pkTab->skills[124].bLevel) + // SKILL_MINING 채광
std::min<int>(10, pkTab->skills[131].bLevel) + // SKILL_HORSE_SUMMON 말소환
std::min<int>(20, pkTab->skills[141].bLevel) + // SKILL_ADD_HP HP보강
std::min<int>(20, pkTab->skills[142].bLevel); // SKILL_RESIST_PENETRATE 관통저항
pkTab->sub_skill_point = max_point - skill_point;
}
@ -554,74 +538,74 @@ void CClientManager::RESULT_COMPOSITE_PLAYER(CPeer * peer, SQLMsg * pMsg, DWORD
MYSQL_RES * pSQLResult = pMsg->Get()->pSQLResult;
if (!pSQLResult)
{
sys_err("null MYSQL_RES QID %u", dwQID);
SPDLOG_ERROR("null MYSQL_RES QID {}", dwQID);
return;
}
switch (dwQID)
{
case QID_PLAYER:
sys_log(0, "QID_PLAYER %u %u", info->dwHandle, info->player_id);
SPDLOG_DEBUG("QID_PLAYER {} {}", info->dwHandle, info->player_id);
RESULT_PLAYER_LOAD(peer, pSQLResult, info.get());
break;
case QID_ITEM:
sys_log(0, "QID_ITEM %u", info->dwHandle);
SPDLOG_DEBUG("QID_ITEM {}", info->dwHandle);
RESULT_ITEM_LOAD(peer, pSQLResult, info->dwHandle, info->player_id);
break;
case QID_QUEST:
{
sys_log(0, "QID_QUEST %u", info->dwHandle);
SPDLOG_DEBUG("QID_QUEST {}", info->dwHandle);
RESULT_QUEST_LOAD(peer, pSQLResult, info->dwHandle, info->player_id);
//aid<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//aid얻기
ClientHandleInfo* temp1 = info.get();
if (temp1 == NULL)
break;
CLoginData* pLoginData1 = GetLoginDataByAID(temp1->account_id); //
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//독일 선물 기능
if( pLoginData1->GetAccountRef().login == NULL)
break;
if( pLoginData1 == NULL )
break;
sys_log(0,"info of pLoginData1 before call ItemAwardfunction %d",pLoginData1);
SPDLOG_DEBUG("info of pLoginData1 before call ItemAwardfunction {}", (void*) pLoginData1);
ItemAward(peer,pLoginData1->GetAccountRef().login);
}
break;
case QID_AFFECT:
sys_log(0, "QID_AFFECT %u", info->dwHandle);
SPDLOG_DEBUG("QID_AFFECT {}", info->dwHandle);
RESULT_AFFECT_LOAD(peer, pSQLResult, info->dwHandle);
break;
/*
case QID_PLAYER_ITEM_QUEST_AFFECT:
sys_log(0, "QID_PLAYER_ITEM_QUEST_AFFECT %u", info->dwHandle);
SPDLOG_DEBUG("QID_PLAYER_ITEM_QUEST_AFFECT {}", info->dwHandle);
RESULT_PLAYER_LOAD(peer, pSQLResult, info->dwHandle);
if (!pMsg->Next())
{
sys_err("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: ITEM FAILED");
SPDLOG_ERROR("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: ITEM FAILED");
return;
}
case QID_ITEM_QUEST_AFFECT:
sys_log(0, "QID_ITEM_QUEST_AFFECT %u", info->dwHandle);
SPDLOG_DEBUG("QID_ITEM_QUEST_AFFECT {}", info->dwHandle);
RESULT_ITEM_LOAD(peer, pSQLResult, info->dwHandle, info->player_id);
if (!pMsg->Next())
{
sys_err("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: QUEST FAILED");
SPDLOG_ERROR("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: QUEST FAILED");
return;
}
case QID_QUEST_AFFECT:
sys_log(0, "QID_QUEST_AFFECT %u", info->dwHandle);
SPDLOG_DEBUG("QID_QUEST_AFFECT {}", info->dwHandle);
RESULT_QUEST_LOAD(peer, pSQLResult, info->dwHandle);
if (!pMsg->Next())
sys_err("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: AFFECT FAILED");
SPDLOG_ERROR("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: AFFECT FAILED");
else
RESULT_AFFECT_LOAD(peer, pSQLResult, info->dwHandle);
@ -645,13 +629,12 @@ void CClientManager::RESULT_PLAYER_LOAD(CPeer * peer, MYSQL_RES * pRes, ClientHa
if (!pkLD || pkLD->IsPlay())
{
sys_log(0, "PLAYER_LOAD_ERROR: LoginData %p IsPlay %d", pkLD, pkLD ? pkLD->IsPlay() : 0);
SPDLOG_DEBUG("PLAYER_LOAD_ERROR: LoginData {} IsPlay {}", (void*) pkLD, pkLD ? pkLD->IsPlay() : 0);
peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_FAILED, pkInfo->dwHandle, 0);
return;
}
pkLD->SetPlay(true);
SendLoginToBilling(pkLD, true);
memcpy(tab.aiPremiumTimes, pkLD->GetPremiumPtr(), sizeof(tab.aiPremiumTimes));
peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_SUCCESS, pkInfo->dwHandle, sizeof(TPlayerTable));
@ -672,18 +655,18 @@ void CClientManager::RESULT_PLAYER_LOAD(CPeer * peer, MYSQL_RES * pRes, ClientHa
void CClientManager::RESULT_ITEM_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dwHandle, DWORD dwPID)
{
static std::vector<TPlayerItem> s_items;
//DB<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>´<EFBFBD>.
//DB에서 아이템 정보를 읽어온다.
CreateItemTableFromRes(pRes, &s_items, dwPID);
DWORD dwCount = s_items.size();
peer->EncodeHeader(HEADER_DG_ITEM_LOAD, dwHandle, sizeof(DWORD) + sizeof(TPlayerItem) * dwCount);
peer->EncodeDWORD(dwCount);
//CacheSet<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//CacheSet을 만든다
CreateItemCacheSet(dwPID);
// ITEM_LOAD_LOG_ATTACH_PID
sys_log(0, "ITEM_LOAD: count %u pid %u", dwCount, dwPID);
SPDLOG_DEBUG("ITEM_LOAD: count {} pid {}", dwCount, dwPID);
// END_OF_ITEM_LOAD_LOG_ATTACH_PID
if (dwCount)
@ -691,7 +674,7 @@ void CClientManager::RESULT_ITEM_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dwHa
peer->Encode(&s_items[0], sizeof(TPlayerItem) * dwCount);
for (DWORD i = 0; i < dwCount; ++i)
PutItemCache(&s_items[i], true); // <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>, <20><><EFBFBD><EFBFBD> bSkipQuery<EFBFBD><EFBFBD> true<EFBFBD><EFBFBD> <20>ִ´<D6B4>.
PutItemCache(&s_items[i], true); // 로드한 것은 따로 저장할 필요 없으므로, 인자 bSkipQuery true를 넣는다.
}
}
@ -699,7 +682,7 @@ void CClientManager::RESULT_AFFECT_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dw
{
int iNumRows;
if ((iNumRows = mysql_num_rows(pRes)) == 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((iNumRows = mysql_num_rows(pRes)) == 0) // 데이터 없음
return;
static std::vector<TPacketAffectElement> s_elements;
@ -725,7 +708,7 @@ void CClientManager::RESULT_AFFECT_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dw
str_to_number(r.lSPCost, row[6]);
}
sys_log(0, "AFFECT_LOAD: count %d PID %u", s_elements.size(), dwPID);
SPDLOG_DEBUG("AFFECT_LOAD: count {} PID {}", s_elements.size(), dwPID);
DWORD dwCount = s_elements.size();
@ -764,7 +747,7 @@ void CClientManager::RESULT_QUEST_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dwH
str_to_number(r.lValue, row[3]);
}
sys_log(0, "QUEST_LOAD: count %d PID %u", s_table.size(), s_table[0].dwPID);
SPDLOG_DEBUG("QUEST_LOAD: count {} PID {}", s_table.size(), s_table[0].dwPID);
DWORD dwCount = s_table.size();
@ -778,8 +761,7 @@ void CClientManager::RESULT_QUEST_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dwH
*/
void CClientManager::QUERY_PLAYER_SAVE(CPeer * peer, DWORD dwHandle, TPlayerTable * pkTab)
{
if (g_test_server)
sys_log(0, "PLAYER_SAVE: %s", pkTab->name);
SPDLOG_TRACE("PLAYER_SAVE: {}", pkTab->name);
PutPlayerCache(pkTab);
}
@ -796,7 +778,7 @@ void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerC
int queryLen;
DWORD player_id;
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> X<><58> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD>.
// 한 계정에 X초 내로 캐릭터 생성을 할 수 없다.
auto it = s_createTimeByAccountID.find(packet->account_id);
if (it != s_createTimeByAccountID.end())
@ -829,7 +811,7 @@ void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerC
if (row[0] && dwPID > 0)
{
peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0);
sys_log(0, "ALREADY EXIST AccountChrIdx %d ID %d", packet->account_index, dwPID);
SPDLOG_DEBUG("ALREADY EXIST AccountChrIdx {} ID {}", packet->account_index, dwPID);
return;
}
}
@ -861,7 +843,7 @@ void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerC
if (*row[0] != '0')
{
sys_log(0, "ALREADY EXIST name %s, row[0] %s query %s", packet->player_table.name, row[0], queryStr);
SPDLOG_DEBUG("ALREADY EXIST name {}, row[0] {} query {}", packet->player_table.name, row[0], queryStr);
peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0);
return;
}
@ -886,7 +868,7 @@ void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerC
packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z,
packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold);
sys_log(0, "PlayerCreate accountid %d name %s level %d gold %d, st %d ht %d job %d",
SPDLOG_DEBUG("PlayerCreate accountid {} name {} level {} gold {}, st {} ht {} job {}",
packet->account_id,
packet->player_table.name,
packet->player_table.level,
@ -899,20 +881,18 @@ void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerC
CDBManager::instance().EscapeString(text, packet->player_table.skills, sizeof(packet->player_table.skills));
queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s', ", text);
if (g_test_server)
sys_log(0, "Create_Player queryLen[%d] TEXT[%s]", queryLen, text);
SPDLOG_TRACE("Create_Player queryLen[{}] TEXT[{}]", queryLen, text);
CDBManager::instance().EscapeString(text, packet->player_table.quickslot, sizeof(packet->player_table.quickslot));
queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s')", text);
std::unique_ptr<SQLMsg> pMsg2(CDBManager::instance().DirectQuery(queryStr));
if (g_test_server)
sys_log(0, "Create_Player queryLen[%d] TEXT[%s]", queryLen, text);
SPDLOG_TRACE("Create_Player queryLen[{}] TEXT[{}]", queryLen, text);
if (pMsg2->Get()->uiAffectedRows <= 0)
{
peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0);
sys_log(0, "ALREADY EXIST3 query: %s AffectedRows %lu", queryStr, pMsg2->Get()->uiAffectedRows);
SPDLOG_DEBUG("ALREADY EXIST3 query: {} AffectedRows {}", queryStr, pMsg2->Get()->uiAffectedRows);
return;
}
@ -924,7 +904,7 @@ void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerC
if (pMsg3->Get()->uiAffectedRows <= 0)
{
sys_err("QUERY_ERROR: %s", queryStr);
SPDLOG_ERROR("QUERY_ERROR: {}", queryStr);
snprintf(queryStr, sizeof(queryStr), "DELETE FROM player%s WHERE id=%d", GetTablePostfix(), player_id);
CDBManager::instance().DirectQuery(queryStr);
@ -954,7 +934,7 @@ void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerC
peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_SUCCESS, dwHandle, sizeof(TPacketDGCreateSuccess));
peer->Encode(&pack, sizeof(TPacketDGCreateSuccess));
sys_log(0, "7 name %s job %d", pack.player.szName, pack.player.byJob);
SPDLOG_DEBUG("7 name {} job {}", pack.player.szName, pack.player.byJob);
s_createTimeByAccountID[packet->account_id] = time(0);
}
@ -985,7 +965,7 @@ void CClientManager::__QUERY_PLAYER_DELETE(CPeer* peer, DWORD dwHandle, TPlayerD
{
if (strlen(r.social_id) < 7 || strncmp(packet->private_code, r.social_id + strlen(r.social_id) - 7, 7))
{
sys_log(0, "PLAYER_DELETE FAILED len(%d)", strlen(r.social_id));
SPDLOG_DEBUG("PLAYER_DELETE FAILED len({})", strlen(r.social_id));
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, dwHandle, 1);
peer->EncodeBYTE(packet->account_index);
return;
@ -998,7 +978,7 @@ void CClientManager::__QUERY_PLAYER_DELETE(CPeer* peer, DWORD dwHandle, TPlayerD
if (pTab->level >= m_iPlayerDeleteLevelLimit)
{
sys_log(0, "PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d", pTab->level, m_iPlayerDeleteLevelLimit);
SPDLOG_DEBUG("PLAYER_DELETE FAILED LEVEL {} >= DELETE LIMIT {}", pTab->level, m_iPlayerDeleteLevelLimit);
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, dwHandle, 1);
peer->EncodeBYTE(packet->account_index);
return;
@ -1006,7 +986,7 @@ void CClientManager::__QUERY_PLAYER_DELETE(CPeer* peer, DWORD dwHandle, TPlayerD
if (pTab->level < m_iPlayerDeleteLevelLimitLower)
{
sys_log(0, "PLAYER_DELETE FAILED LEVEL %u < DELETE LIMIT %d", pTab->level, m_iPlayerDeleteLevelLimitLower);
SPDLOG_DEBUG("PLAYER_DELETE FAILED LEVEL {} < DELETE LIMIT {}", pTab->level, m_iPlayerDeleteLevelLimitLower);
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, dwHandle, 1);
peer->EncodeBYTE(packet->account_index);
return;
@ -1022,12 +1002,12 @@ void CClientManager::__QUERY_PLAYER_DELETE(CPeer* peer, DWORD dwHandle, TPlayerD
ClientHandleInfo * pi = new ClientHandleInfo(dwHandle, packet->player_id);
pi->account_index = packet->account_index;
sys_log(0, "PLAYER_DELETE TRY: %s %d pid%d", packet->login, packet->player_id, packet->account_index + 1);
SPDLOG_DEBUG("PLAYER_DELETE TRY: {} {} pid{}", packet->login, packet->player_id, packet->account_index + 1);
CDBManager::instance().ReturnQuery(szQuery, QID_PLAYER_DELETE, peer->GetHandle(), pi);
}
//
// @version 05/06/10 Bang2ni - <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>.
// @version 05/06/10 Bang2ni - 플레이어 삭제시 가격정보 리스트 삭제 추가.
//
void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
{
@ -1049,7 +1029,7 @@ void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
if (deletedLevelLimit >= m_iPlayerDeleteLevelLimit && !IsChinaEventServer())
{
sys_log(0, "PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d", deletedLevelLimit, m_iPlayerDeleteLevelLimit);
SPDLOG_DEBUG("PLAYER_DELETE FAILED LEVEL {} >= DELETE LIMIT {}", deletedLevelLimit, m_iPlayerDeleteLevelLimit);
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
peer->EncodeBYTE(pi->account_index);
return;
@ -1057,7 +1037,7 @@ void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
if (deletedLevelLimit < m_iPlayerDeleteLevelLimitLower)
{
sys_log(0, "PLAYER_DELETE FAILED LEVEL %u < DELETE LIMIT %d", deletedLevelLimit, m_iPlayerDeleteLevelLimitLower);
SPDLOG_DEBUG("PLAYER_DELETE FAILED LEVEL {} < DELETE LIMIT {}", deletedLevelLimit, m_iPlayerDeleteLevelLimitLower);
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
peer->EncodeBYTE(pi->account_index);
return;
@ -1071,21 +1051,21 @@ void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
if (pIns->Get()->uiAffectedRows == 0 || pIns->Get()->uiAffectedRows == (uint32_t)-1)
{
sys_log(0, "PLAYER_DELETE FAILED %u CANNOT INSERT TO player%s_deleted", dwPID, GetTablePostfix());
SPDLOG_DEBUG("PLAYER_DELETE FAILED {} CANNOT INSERT TO player{}_deleted", dwPID, GetTablePostfix());
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
peer->EncodeBYTE(pi->account_index);
return;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
sys_log(0, "PLAYER_DELETE SUCCESS %u", dwPID);
// 삭제 성공
SPDLOG_DEBUG("PLAYER_DELETE SUCCESS {}", dwPID);
char account_index_string[16];
snprintf(account_index_string, sizeof(account_index_string), "player_id%d", m_iPlayerIDStart + pi->account_index);
// <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 플레이어 테이블을 캐쉬에서 삭제한다.
CPlayerTableCache * pkPlayerCache = GetPlayerCache(pi->player_id);
if (pkPlayerCache)
@ -1094,7 +1074,7 @@ void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
delete pkPlayerCache;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 아이템들을 캐쉬에서 삭제한다.
TItemCacheSet * pSet = GetItemCacheSet(pi->player_id);
if (pSet)
@ -1123,7 +1103,7 @@ void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
if (pMsg->Get()->uiAffectedRows == 0 || pMsg->Get()->uiAffectedRows == (uint32_t)-1)
{
sys_log(0, "PLAYER_DELETE FAIL WHEN UPDATE account table");
SPDLOG_DEBUG("PLAYER_DELETE FAIL WHEN UPDATE account table");
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
peer->EncodeBYTE(pi->account_index);
return;
@ -1157,8 +1137,8 @@ void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
}
else
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
sys_log(0, "PLAYER_DELETE FAIL NO ROW");
// 삭제 실패
SPDLOG_DEBUG("PLAYER_DELETE FAIL NO ROW");
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
peer->EncodeBYTE(pi->account_index);
}
@ -1211,86 +1191,15 @@ void CClientManager::QUERY_REMOVE_AFFECT(CPeer * peer, TPacketGDRemoveAffect * p
CDBManager::instance().AsyncQuery(queryStr);
}
void CClientManager::QUERY_HIGHSCORE_REGISTER(CPeer* peer, TPacketGDHighscore * data)
{
char szQuery[128];
snprintf(szQuery, sizeof(szQuery), "SELECT value FROM highscore%s WHERE board='%s' AND pid = %u", GetTablePostfix(), data->szBoard, data->dwPID);
sys_log(0, "HEADER_GD_HIGHSCORE_REGISTER: PID %u", data->dwPID);
ClientHandleInfo * pi = new ClientHandleInfo(0);
strlcpy(pi->login, data->szBoard, sizeof(pi->login));
pi->account_id = (DWORD)data->lValue;
pi->player_id = data->dwPID;
pi->account_index = (data->cDir > 0);
CDBManager::instance().ReturnQuery(szQuery, QID_HIGHSCORE_REGISTER, peer->GetHandle(), pi);
}
void CClientManager::RESULT_HIGHSCORE_REGISTER(CPeer * pkPeer, SQLMsg * msg)
{
CQueryInfo * qi = (CQueryInfo *) msg->pvUserData;
ClientHandleInfo * pi = (ClientHandleInfo *) qi->pvData;
//DWORD dwHandle = pi->dwHandle;
char szBoard[21];
strlcpy(szBoard, pi->login, sizeof(szBoard));
int value = (int)pi->account_id;
SQLResult * res = msg->Get();
if (res->uiNumRows == 0)
{
// <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD>̽<EFBFBD><CCBD>ھ<20><><EFBFBD><EFBFBD>
char buf[256];
snprintf(buf, sizeof(buf), "INSERT INTO highscore%s VALUES('%s', %u, %d)", GetTablePostfix(), szBoard, pi->player_id, value);
CDBManager::instance().AsyncQuery(buf);
}
else
{
if (!res->pSQLResult)
{
delete pi;
return;
}
MYSQL_ROW row = mysql_fetch_row(res->pSQLResult);
if (row && row[0])
{
int current_value = 0; str_to_number(current_value, row[0]);
if (pi->account_index && current_value >= value || !pi->account_index && current_value <= value)
{
value = current_value;
}
else
{
char buf[256];
snprintf(buf, sizeof(buf), "REPLACE INTO highscore%s VALUES('%s', %u, %d)", GetTablePostfix(), szBoard, pi->player_id, value);
CDBManager::instance().AsyncQuery(buf);
}
}
else
{
char buf[256];
snprintf(buf, sizeof(buf), "INSERT INTO highscore%s VALUES('%s', %u, %d)", GetTablePostfix(), szBoard, pi->player_id, value);
CDBManager::instance().AsyncQuery(buf);
}
}
// TODO: <20>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̽<EFBFBD><CCBD>ھ<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѷ<EFBFBD><D1B7><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
delete pi;
}
void CClientManager::InsertLogoutPlayer(DWORD pid)
{
TLogoutPlayerMap::iterator it = m_map_logout.find(pid);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>
// 존재하지 않을경우 추가
if (it != m_map_logout.end())
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ұ<EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>
if (g_log)
sys_log(0, "LOGOUT: Update player time pid(%d)", pid);
// 존재할경우 시간만 갱신
SPDLOG_TRACE("LOGOUT: Update player time pid({})", pid);
it->second->time = time(0);
return;
@ -1301,8 +1210,7 @@ void CClientManager::InsertLogoutPlayer(DWORD pid)
pLogout->time = time(0);
m_map_logout.insert(std::make_pair(pid, pLogout));
if (g_log)
sys_log(0, "LOGOUT: Insert player pid(%d)", pid);
SPDLOG_TRACE("LOGOUT: Insert player pid({})", pid);
}
void CClientManager::DeleteLogoutPlayer(DWORD pid)

View File

@ -67,7 +67,7 @@ bool CConfig::GetWord(FILE *fp, char *tar)
if ((c == ' ' || c == '\t' || c == '\n'))
{
// <EFBFBD><EFBFBD>.
// .
tar[i] = '\0';
return true;
}
@ -144,7 +144,7 @@ bool CConfig::LoadFile(const char* filename)
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݴ<EFBFBD> <20>κ<EFBFBD>.
// 파일 닫는 부분.
fclose(fp);
return true;
}
@ -171,7 +171,7 @@ bool CConfig::GetParam(const char*key, int index, DWORD *Param)
str_to_number(*Param, szParam[index]);
sys_log(0, "GetParam %d", *Param);
SPDLOG_DEBUG("GetParam {}", *Param);
return true;
}
const char * CConfig::Get(const char* key)

View File

@ -11,14 +11,14 @@
namespace
{
/// <EFBFBD>Ľ̿<EFBFBD> state <EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD>
/// 파싱용 state 열거값
enum ParseState
{
STATE_NORMAL = 0, ///< <EFBFBD>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD>
STATE_QUOTE ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
STATE_NORMAL = 0, ///< 일반 상태
STATE_QUOTE ///< 따옴표 뒤의 상태
};
/// <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// 문자열 좌우의 공백을 제거해서 반환한다.
std::string Trim(std::string str)
{
str = str.erase(str.find_last_not_of(" \t\r\n") + 1);
@ -26,7 +26,7 @@ namespace
return str;
}
/// \brief <EFBFBD>־<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>ִ<EFBFBD> <20><><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҹ<EFBFBD><D2B9>ڷ<EFBFBD> <20>ٲ۴<D9B2>.
/// \brief 주어진 문장에 있는 알파벳을 모두 소문자로 바꾼다.
std::string Lower(std::string original)
{
std::transform(original.begin(), original.end(), original.begin(), tolower);
@ -35,9 +35,9 @@ namespace
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \param name <EFBFBD><EFBFBD> <20≯<EFBFBD>
/// \param index <EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
/// \brief 셀을 액세스할 때, 숫자 대신 사용할 이름을 등록한다.
/// \param name 셀 이름
/// \param index 셀 인덱스
////////////////////////////////////////////////////////////////////////////////
void cCsvAlias::AddAlias(const char* name, size_t index)
{
@ -51,7 +51,7 @@ void cCsvAlias::AddAlias(const char* name, size_t index)
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief 모든 데이터를 삭제한다.
////////////////////////////////////////////////////////////////////////////////
void cCsvAlias::Destroy()
{
@ -60,9 +60,9 @@ void cCsvAlias::Destroy()
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \param index <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
/// \return const char* <EFBFBD≯<EFBFBD>
/// \brief 숫자 인덱스를 이름으로 변환한다.
/// \param index 숫자 인덱스
/// \return const char* 이름
////////////////////////////////////////////////////////////////////////////////
const char* cCsvAlias::operator [] (size_t index) const
{
@ -78,9 +78,9 @@ const char* cCsvAlias::operator [] (size_t index) const
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \param name <EFBFBD≯<EFBFBD>
/// \return size_t <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
/// \brief 이름을 숫자 인덱스로 변환한다.
/// \param name 이름
/// \return size_t 숫자 인덱스
////////////////////////////////////////////////////////////////////////////////
size_t cCsvAlias::operator [] (const char* name) const
{
@ -96,11 +96,11 @@ size_t cCsvAlias::operator [] (const char* name) const
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> CSV <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>Ѵ<EFBFBD>.
/// \param fileName CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
/// \param seperator <EFBFBD>ʵ<EFBFBD> <20>и<EFBFBD><D0B8>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> ','<EFBFBD>̴<EFBFBD>.
/// \param quote <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> '"'<EFBFBD>̴<EFBFBD>.
/// \return bool <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>ߴٸ<DFB4> true, <EFBFBD>ƴ϶<EFBFBD><EFBFBD><EFBFBD> false
/// \brief 지정된 이름의 CSV 파일을 로드한다.
/// \param fileName CSV 파일 이름
/// \param seperator 필드 분리자로 사용할 글자. 기본값은 ','이다.
/// \param quote 따옴표로 사용할 글자. 기본값은 '"'이다.
/// \return bool 무사히 로드했다면 true, 아니라면 false
////////////////////////////////////////////////////////////////////////////////
bool cCsvFile::Load(const char* fileName, const char seperator, const char quote)
{
@ -109,7 +109,7 @@ bool cCsvFile::Load(const char* fileName, const char seperator, const char quote
std::ifstream file(fileName, std::ios::in);
if (!file) return false;
Destroy(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD>
Destroy(); // 기존의 데이터를 삭제
cCsvRow* row = NULL;
ParseState state = STATE_NORMAL;
@ -124,33 +124,33 @@ bool cCsvFile::Load(const char* fileName, const char seperator, const char quote
std::string line(Trim(buf));
if (line.empty() || (state == STATE_NORMAL && line[0] == '#')) continue;
std::string text = std::string(line) + " "; // <EFBFBD>Ľ<EFBFBD> lookahead <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF>ش<EFBFBD>.
std::string text = std::string(line) + " "; // 파싱 lookahead 때문에 붙여준다.
size_t cur = 0;
while (cur < text.size())
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>尡 QUOTE <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>,
// 현재 모드가 QUOTE 모드일 때,
if (state == STATE_QUOTE)
{
// '"' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
// 1. <EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> Ư<><C6AF> <20><><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD> <20><> <20>¿<EFBFBD><C2BF><EFBFBD> <20><>
// 2. <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '"' <20><><EFBFBD>ڰ<EFBFBD> '"' 2<><32><EFBFBD><EFBFBD> ġȯ<C4A1><C8AF> <20><>
// <EFBFBD><EFBFBD> <20><> ù<><C3B9>° <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> CSV <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD>,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> STATE_NORMAL<EFBFBD><EFBFBD> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ִ<EFBFBD>.
// <EFBFBD>׷<EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><20>ɸ<EFBFBD><C9B8><EFBFBD> <20><><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>쳪, 2<><32> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
// 2<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '"' <20><><EFBFBD>ڰ<EFBFBD> 2<><32><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20>ƴϴ<C6B4>. <20≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؼ<EFBFBD> <20>ڵ带 ¥<><C2A5>...
// '"' 문자의 종류는 두 가지이다.
// 1. 셀 내부에 특수 문자가 있을 경우 이를 알리는 셀 좌우의 것
// 2. 셀 내부의 '"' 문자가 '"' 2개로 치환된 것
// 이 중 첫번째 경우의 좌측에 있는 것은 CSV 파일이 정상적이라면,
// 무조건 STATE_NORMAL에 걸리게 되어있다.
// 그러므로 여기서 걸리는 것은 1번의 우측 경우나, 2번 경우 뿐이다.
// 2번의 경우에는 무조건 '"' 문자가 2개씩 나타난다. 하지만 1번의
// 우측 경우에는 아니다. 이를 바탕으로 해서 코드를 짜면...
if (text[cur] == quote)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> '"' <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>, <20><> <20><><EFBFBD>ӵ<EFBFBD> '"' <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>
// <EFBFBD>̴<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '"' <20><><EFBFBD>ڰ<EFBFBD> ġȯ<C4A1><C8AF> <20><><EFBFBD>̴<EFBFBD>.
// 다음 문자가 '"' 문자라면, 즉 연속된 '"' 문자라면
// 이는 셀 내부의 '"' 문자가 치환된 것이다.
if (text[cur+1] == quote)
{
token += quote;
++cur;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> '"' <20><><EFBFBD>ڰ<EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '"'<27><><EFBFBD>ڴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD> <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD> <20><> <20><> <20>ִ<EFBFBD>.
// 다음 문자가 '"' 문자가 아니라면
// 현재의 '"'문자는 셀의 끝을 알리는 문자라고 할 수 있다.
else
{
state = STATE_NORMAL;
@ -161,25 +161,25 @@ bool cCsvFile::Load(const char* fileName, const char seperator, const char quote
token += text[cur];
}
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>尡 NORMAL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>,
// 현재 모드가 NORMAL 모드일 때,
else if (state == STATE_NORMAL)
{
if (row == NULL)
row = new cCsvRow();
// ',' <EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ǹ<EFBFBD><C7B9>Ѵ<EFBFBD>.
// <EFBFBD><EFBFBD>ū<EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD>ٰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD>, <20><>ū<EFBFBD><C5AB> <20>ʱ<EFBFBD>ȭ<EFBFBD>Ѵ<EFBFBD>.
// ',' 문자를 만났다면 셀의 끝의 의미한다.
// 토큰으로서 셀 리스트에다가 집어넣고, 토큰을 초기화한다.
if (text[cur] == seperator)
{
row->push_back(token);
token.clear();
}
// '"' <EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD>, QUOTE <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
// '"' 문자를 만났다면, QUOTE 모드로 전환한다.
else if (text[cur] == quote)
{
state = STATE_QUOTE;
}
// <EFBFBD>ٸ<EFBFBD> <20>Ϲ<EFBFBD> <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ū<EFBFBD><C5AB><EFBFBD>ٰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD>.
// 다른 일반 문자라면 현재 토큰에다가 덧붙인다.
else
{
token += text[cur];
@ -189,8 +189,8 @@ bool cCsvFile::Load(const char* fileName, const char seperator, const char quote
++cur;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ',' <20><><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// <EFBFBD><EFBFBD>, ó<><C3B3><EFBFBD><EFBFBD> <20>Ľ<EFBFBD> lookahead <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// 마지막 셀은 끝에 ',' 문자가 없기 때문에 여기서 추가해줘야한다.
// 단, 처음에 파싱 lookahead 때문에 붙인 스페이스 문자 두 개를 뗀다.
if (state == STATE_NORMAL)
{
Assert(row != NULL);
@ -209,49 +209,49 @@ bool cCsvFile::Load(const char* fileName, const char seperator, const char quote
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CSV <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \param fileName CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
/// \param append true<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD>. false<73><65> <20><><EFBFBD><EFBFBD><ECBFA1>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
/// \param seperator <EFBFBD>ʵ<EFBFBD> <20>и<EFBFBD><D0B8>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> ','<EFBFBD>̴<EFBFBD>.
/// \param quote <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> '"'<EFBFBD>̴<EFBFBD>.
/// \return bool <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴٸ<DFB4> true, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> false
/// \brief 가지고 있는 내용을 CSV 파일에다 저장한다.
/// \param fileName CSV 파일 이름
/// \param append true일 경우, 기존의 파일에다 덧붙인다. false인 경우에는
/// 기존의 파일 내용을 삭제하고, 새로 쓴다.
/// \param seperator 필드 분리자로 사용할 글자. 기본값은 ','이다.
/// \param quote 따옴표로 사용할 글자. 기본값은 '"'이다.
/// \return bool 무사히 저장했다면 true, 에러가 생긴 경우에는 false
////////////////////////////////////////////////////////////////////////////////
bool cCsvFile::Save(const char* fileName, bool append, char seperator, char quote) const
{
Assert(seperator != quote);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>׷<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 출력 모드에 따라 파일을 적당한 플래그로 생성한다.
std::ofstream file;
if (append) { file.open(fileName, std::ios::out | std::ios::app); }
else { file.open(fileName, std::ios::out | std::ios::trunc); }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ߴٸ<DFB4>, false<73><65> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 파일을 열지 못했다면, false를 리턴한다.
if (!file) return false;
char special_chars[5] = { seperator, quote, '\r', '\n', 0 };
char quote_escape_string[3] = { quote, quote, 0 };
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ⱦ<><C8BE><EFBFBD>ϸ鼭...
// 모든 행을 횡단하면서...
for (size_t i=0; i<m_Rows.size(); i++)
{
const cCsvRow& row = *((*this)[i]);
std::string line;
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ū<EFBFBD><C5AB> Ⱦ<><C8BE><EFBFBD>ϸ鼭...
// 행 안의 모든 토큰을 횡단하면서...
for (size_t j=0; j<row.size(); j++)
{
const std::string& token = row[j];
// <EFBFBD>Ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>('"' <EFBFBD>Ǵ<EFBFBD> ','<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
// <EFBFBD><EFBFBD>ū<EFBFBD>̶<EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȴ<EFBFBD>.
// 일반적인('"' 또는 ','를 포함하지 않은)
// 토큰이라면 그냥 저장하면 된다.
if (token.find_first_of(special_chars) == std::string::npos)
{
line += token;
}
// Ư<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ū<EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD> <20>¿쿡 '"'<27><> <20>ٿ<EFBFBD><D9BF>ְ<EFBFBD>,
// <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '"'<27><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 특수문자를 포함한 토큰이라면 문자열 좌우에 '"'를 붙여주고,
// 문자열 내부의 '"'를 두 개로 만들어줘야한다.
else
{
line += quote;
@ -265,11 +265,11 @@ bool cCsvFile::Save(const char* fileName, bool append, char seperator, char quot
line += quote;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD> ','<27><> <20><>ū<EFBFBD><C5AB> <20>ڿ<EFBFBD><DABF><EFBFBD> <20>ٿ<EFBFBD><D9BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 마지막 셀이 아니라면 ','를 토큰의 뒤에다 붙여줘야한다.
if (j != row.size() - 1) { line += seperator; }
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 라인을 출력한다.
file << line << std::endl;
}
@ -277,7 +277,7 @@ bool cCsvFile::Save(const char* fileName, bool append, char seperator, char quot
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>޸𸮿<DEB8><F0B8AEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief 모든 데이터를 메모리에서 삭제한다.
////////////////////////////////////////////////////////////////////////////////
void cCsvFile::Destroy()
{
@ -288,9 +288,9 @@ void cCsvFile::Destroy()
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \param index <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD>
/// \return cCsvRow* <EFBFBD>ش<EFBFBD> <20><>
/// \brief 해당하는 인덱스의 행을 반환한다.
/// \param index 인덱스
/// \return cCsvRow* 해당 행
////////////////////////////////////////////////////////////////////////////////
cCsvRow* cCsvFile::operator [] (size_t index)
{
@ -299,9 +299,9 @@ cCsvRow* cCsvFile::operator [] (size_t index)
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \param index <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD>
/// \return const cCsvRow* <EFBFBD>ش<EFBFBD> <20><>
/// \brief 해당하는 인덱스의 행을 반환한다.
/// \param index 인덱스
/// \return const cCsvRow* 해당 행
////////////////////////////////////////////////////////////////////////////////
const cCsvRow* cCsvFile::operator [] (size_t index) const
{
@ -310,7 +310,7 @@ const cCsvRow* cCsvFile::operator [] (size_t index) const
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// \brief 생성자
////////////////////////////////////////////////////////////////////////////////
cCsvTable::cCsvTable()
: m_CurRow(-1)
@ -318,18 +318,18 @@ cCsvTable::cCsvTable()
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD>
/// \brief 소멸자
////////////////////////////////////////////////////////////////////////////////
cCsvTable::~cCsvTable()
{
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> CSV <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>Ѵ<EFBFBD>.
/// \param fileName CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
/// \param seperator <EFBFBD>ʵ<EFBFBD> <20>и<EFBFBD><D0B8>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> ','<EFBFBD>̴<EFBFBD>.
/// \param quote <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> '"'<EFBFBD>̴<EFBFBD>.
/// \return bool <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>ߴٸ<DFB4> true, <EFBFBD>ƴ϶<EFBFBD><EFBFBD><EFBFBD> false
/// \brief 지정된 이름의 CSV 파일을 로드한다.
/// \param fileName CSV 파일 이름
/// \param seperator 필드 분리자로 사용할 글자. 기본값은 ','이다.
/// \param quote 따옴표로 사용할 글자. 기본값은 '"'이다.
/// \return bool 무사히 로드했다면 true, 아니라면 false
////////////////////////////////////////////////////////////////////////////////
bool cCsvTable::Load(const char* fileName, const char seperator, const char quote)
{
@ -338,19 +338,19 @@ bool cCsvTable::Load(const char* fileName, const char seperator, const char quot
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A3>.
/// \return bool <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ <20><><EFBFBD><EFBFBD> true<75><65> <20><>ȯ<EFBFBD>ϰ<EFBFBD>, <20><> <20>̻<EFBFBD>
/// <EFBFBD>Ѿ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> false<73><65> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 다음 행으로 넘어간다.
/// \return bool 다음 행으로 무사히 넘어간 경우 true를 반환하고, 더 이상
/// 넘어갈 행이 존재하지 않는 경우에는 false를 반환한다.
////////////////////////////////////////////////////////////////////////////////
bool cCsvTable::Next()
{
// 20<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>÷ΰ<C3B7> <20>Ͼ<CFBE>ٵ<EFBFBD>...<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
// 20억번 정도 호출하면 오버플로가 일어날텐데...괜찮겠지?
return ++m_CurRow < (int)m_File.GetRowCount() ? true : false;
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ڸ<EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \return size_t <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
/// \brief 현재 행의 셀 숫자를 반환한다.
/// \return size_t 현재 행의 셀 숫자
////////////////////////////////////////////////////////////////////////////////
size_t cCsvTable::ColCount() const
{
@ -358,9 +358,9 @@ size_t cCsvTable::ColCount() const
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \param index <EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
/// \return int <EFBFBD><EFBFBD> <20><>
/// \brief 인덱스를 이용해 int 형으로 셀 값을 반환한다.
/// \param index 셀 인덱스
/// \return int 셀 값
////////////////////////////////////////////////////////////////////////////////
int cCsvTable::AsInt(size_t index) const
{
@ -371,9 +371,9 @@ int cCsvTable::AsInt(size_t index) const
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \param index <EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
/// \return double <EFBFBD><EFBFBD> <20><>
/// \brief 인덱스를 이용해 double 형으로 셀 값을 반환한다.
/// \param index 셀 인덱스
/// \return double 셀 값
////////////////////////////////////////////////////////////////////////////////
double cCsvTable::AsDouble(size_t index) const
{
@ -384,9 +384,9 @@ double cCsvTable::AsDouble(size_t index) const
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> std::string <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \param index <EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
/// \return const char* <EFBFBD><EFBFBD> <20><>
/// \brief 인덱스를 이용해 std::string 형으로 셀 값을 반환한다.
/// \param index 셀 인덱스
/// \return const char* 셀 값
////////////////////////////////////////////////////////////////////////////////
const char* cCsvTable::AsStringByIndex(size_t index) const
{
@ -397,7 +397,7 @@ const char* cCsvTable::AsStringByIndex(size_t index) const
}
////////////////////////////////////////////////////////////////////////////////
/// \brief alias<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief alias를 포함해 모든 데이터를 삭제한다.
////////////////////////////////////////////////////////////////////////////////
void cCsvTable::Destroy()
{
@ -407,10 +407,10 @@ void cCsvTable::Destroy()
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \return const cCsvRow* <EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><> <20><><EFBFBD><EFBFBD>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><>ȯ<EFBFBD>ϰ<EFBFBD>, <20><> <20>̻<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> NULL<EFBFBD><EFBFBD>
/// <EFBFBD><EFBFBD>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 현재 행을 반환한다.
/// \return const cCsvRow* 액세스가 가능한 현재 행이 존재하는 경우에는 그 행의
/// 포인터를 반환하고, 더 이상 액세스 가능한 행이 없는 경우에는 NULL
/// 반환한다.
////////////////////////////////////////////////////////////////////////////////
const cCsvRow* const cCsvTable::CurRow() const
{

View File

@ -12,28 +12,28 @@
////////////////////////////////////////////////////////////////////////////////
/// \class cCsvAlias
/// \brief CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>߻<EFBFBD><DFBB>ϴ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü.
/// \brief CSV 파일을 수정했을 때 발생하는 인덱스 문제를 줄이기 위한
/// 별명 객체.
///
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 0<><30> <20>÷<EFBFBD><C3B7><EFBFBD> A<><41> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, 1<><31> <20>÷<EFBFBD><C3B7><EFBFBD> B<><42> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>־<EFBFBD><D6BE>µ<EFBFBD>...
/// 예를 들어 0번 컬럼이 A에 관한 내용을 포함하고, 1번 컬럼이 B에 관한 내용을
/// 포함하고 있었는데...
///
/// <pre>
/// int a = row.AsInt(0);
/// int b = row.AsInt(1);
/// </pre>
///
/// <EFBFBD><EFBFBD> <20><><EFBFBD>̿<EFBFBD> C<><43> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ϵ<EFBFBD><CFB5>ڵ<EFBFBD><DAB5>Ǿ<EFBFBD> <20>ִ<EFBFBD>
/// 1<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>Ƽ<EFBFBD> <20><><EFBFBD>ľ<EFBFBD> <20>ϴµ<CFB4>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE>̴<EFBFBD>.
/// 그 사이에 C에 관한 내용을 포함하는 컬럼이 끼어든 경우, 하드코딩되어 있는
/// 1번을 찾아서 고쳐야 하는데, 상당히 에러가 발생하기 쉬운 작업이다.
///
/// <pre>
/// int a = row.AsInt(0);
/// int c = row.AsInt(1);
/// int b = row.AsInt(2); <-- <EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
/// int b = row.AsInt(2); <-- 이 부분을 일일이 신경써야 한다.
/// </pre>
///
/// <EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> ó<><C3B3><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB0A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>̳<EFBFBD><CCB3><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
/// <EFBFBD>ִ<EFBFBD>.
/// 이 부분을 문자열로 처리하면 유지보수에 들어가는 수고를 약간이나마 줄일 수
/// 있다.
////////////////////////////////////////////////////////////////////////////////
class cCsvAlias
@ -47,51 +47,51 @@ private:
typedef std::map<size_t, std::string> INDEX2NAME_MAP;
#endif
NAME2INDEX_MAP m_Name2Index; ///< <EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD>
INDEX2NAME_MAP m_Index2Name; ///< <EFBFBD>߸<EFBFBD><EFBFBD><EFBFBD> alias<EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD> <20><>
NAME2INDEX_MAP m_Name2Index; ///< 셀 인덱스 대신으로 사용하기 위한 이름들
INDEX2NAME_MAP m_Index2Name; ///< 잘못된 alias를 검사하기 위한 추가적인 맵
public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// \brief 생성자
cCsvAlias() {}
/// \brief <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD>
/// \brief 소멸자
virtual ~cCsvAlias() {}
public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief 셀을 액세스할 때, 숫자 대신 사용할 이름을 등록한다.
void AddAlias(const char* name, size_t index);
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief 모든 데이터를 삭제한다.
void Destroy();
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 숫자 인덱스를 이름으로 변환한다.
const char* operator [] (size_t index) const;
/// \brief <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 이름을 숫자 인덱스로 변환한다.
size_t operator [] (const char* name) const;
private:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 복사 생성자 금지
cCsvAlias(const cCsvAlias&) {}
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 대입 연산자 금지
const cCsvAlias& operator = (const cCsvAlias&) { return *this; }
};
////////////////////////////////////////////////////////////////////////////////
/// \class cCsvRow
/// \brief CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> ĸ<><C4B8>ȭ<EFBFBD><C8AD> Ŭ<><C5AC><EFBFBD><EFBFBD>
/// \brief CSV 파일의 한 행을 캡슐화한 클래스
///
/// CSV<EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD> ',' <20><><EFBFBD>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20>ȿ<EFBFBD> Ư<><C6AF> <20><><EFBFBD>ڷ<EFBFBD> <20><><EFBFBD>̴<EFBFBD> ',' <20><><EFBFBD>ڳ<EFBFBD> '"' <20><><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>,
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20>̻<EFBFBD><CCBB>ϰ<EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD>̴<EFBFBD>.
/// CSV의 기본 포맷은 엑셀에서 보이는 하나의 셀을 ',' 문자로 구분한 것이다.
/// 하지만, 셀 안에 특수 문자로 쓰이는 ',' 문자나 '"' 문자가 들어갈 경우,
/// 모양이 약간 이상하게 변한다. 다음은 그 변화의 예이다.
///
/// <pre>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD> <20><><EFBFBD><EFBFBD> | <20><><EFBFBD><EFBFBD> CSV <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
/// 엑셀에서 보이는 모양 | 실제 CSV 파일에 들어가있는 모양
/// ---------------------+----------------------------------------------------
/// ItemPrice | ItemPrice
/// Item,Price | "Item,Price"
@ -101,9 +101,9 @@ private:
/// Item",Price | "Item"",Price"
/// </pre>
///
/// <EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20>ִ<EFBFBD>.
/// - <EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> ',' <EFBFBD>Ǵ<EFBFBD> '"' <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>, <20><> <20>¿쿡 '"' <20><><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
/// - <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '"' <20><><EFBFBD>ڴ<EFBFBD> 2<><32><EFBFBD><EFBFBD> ġȯ<C4A1>ȴ<EFBFBD>.
/// 이 예로서 다음과 같은 사항을 알 수 있다.
/// - 셀 내부에 ',' 또는 '"' 문자가 들어갈 경우, 셀 좌우에 '"' 문자가 생긴다.
/// - 셀 내부의 '"' 문자는 2개로 치환된다.
///
/// \sa cCsvFile
////////////////////////////////////////////////////////////////////////////////
@ -111,51 +111,51 @@ private:
class cCsvRow : public std::vector<std::string>
{
public:
/// \brief <EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// \brief 기본 생성자
cCsvRow() {}
/// \brief <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD>
/// \brief 소멸자
~cCsvRow() {}
public:
/// \brief <EFBFBD>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당 셀의 데이터를 int 형으로 반환한다.
int AsInt(size_t index) const { return atoi(at(index).c_str()); }
/// \brief <EFBFBD>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당 셀의 데이터를 double 형으로 반환한다.
double AsDouble(size_t index) const { return atof(at(index).c_str()); }
/// \brief <EFBFBD>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당 셀의 데이터를 문자열로 반환한다.
const char* AsString(size_t index) const { return at(index).c_str(); }
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당하는 이름의 셀 데이터를 int 형으로 반환한다.
int AsInt(const char* name, const cCsvAlias& alias) const {
return atoi( at(alias[name]).c_str() );
}
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당하는 이름의 셀 데이터를 int 형으로 반환한다.
double AsDouble(const char* name, const cCsvAlias& alias) const {
return atof( at(alias[name]).c_str() );
}
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당하는 이름의 셀 데이터를 문자열로 반환한다.
const char* AsString(const char* name, const cCsvAlias& alias) const {
return at(alias[name]).c_str();
}
private:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 복사 생성자 금지
cCsvRow(const cCsvRow&) {}
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 대입 연산자 금지
const cCsvRow& operator = (const cCsvRow&) { return *this; }
};
////////////////////////////////////////////////////////////////////////////////
/// \class cCsvFile
/// \brief CSV(Comma Seperated Values) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> read/write<EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
/// \brief CSV(Comma Seperated Values) 파일을 read/write하기 위한 클래스
///
/// <b>sample</b>
/// <pre>
@ -179,8 +179,8 @@ private:
/// file.save("test.csv", false);
/// </pre>
///
/// \todo <EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴ϶<C6B4>, <20>޸<EFBFBD><DEB8><EFBFBD> <20>ҽ<EFBFBD><D2BD>κ<EFBFBD><CEBA><EFBFBD> <20>д<EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD>
/// <EFBFBD>־<EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20>ϴ<EFBFBD>.
/// \todo 파일에서만 읽어들일 것이 아니라, 메모리 소스로부터 읽는 함수도
/// 있어야 할 듯 하다.
////////////////////////////////////////////////////////////////////////////////
class cCsvFile
@ -188,55 +188,55 @@ class cCsvFile
private:
typedef std::vector<cCsvRow*> ROWS;
ROWS m_Rows; ///< <EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>
ROWS m_Rows; ///< 행 컬렉션
public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// \brief 생성자
cCsvFile() {}
/// \brief <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD>
/// \brief 소멸자
virtual ~cCsvFile() { Destroy(); }
public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> CSV <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>Ѵ<EFBFBD>.
/// \brief 지정된 이름의 CSV 파일을 로드한다.
bool Load(const char* fileName, const char seperator=',', const char quote='"');
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CSV <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief 가지고 있는 내용을 CSV 파일에다 저장한다.
bool Save(const char* fileName, bool append=false, char seperator=',', char quote='"') const;
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>޸𸮿<DEB8><F0B8AEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief 모든 데이터를 메모리에서 삭제한다.
void Destroy();
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당하는 인덱스의 행을 반환한다.
cCsvRow* operator [] (size_t index);
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당하는 인덱스의 행을 반환한다.
const cCsvRow* operator [] (size_t index) const;
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 행의 갯수를 반환한다.
size_t GetRowCount() const { return m_Rows.size(); }
private:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 복사 생성자 금지
cCsvFile(const cCsvFile&) {}
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 대입 연산자 금지
const cCsvFile& operator = (const cCsvFile&) { return *this; }
};
////////////////////////////////////////////////////////////////////////////////
/// \class cCsvTable
/// \brief CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>ε<EFBFBD><CEB5>ϴ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// <EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ƿ<EFBFBD><C6BF>Ƽ Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
/// \brief CSV 파일을 이용해 테이블 데이터를 로드하는 경우가 많은데, 이 클래스는
/// 그 작업을 좀 더 쉽게 하기 위해 만든 유틸리티 클래스다.
///
/// CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>ڸ<EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>ϴµ<CFB4>, CSV
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><> <20>۾<EFBFBD><DBBE><EFBFBD> <20><>
/// <EFBFBD>Ű<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>ٰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20>׷<EFBFBD><D7B7>Ƿ<EFBFBD> <20><><EFBFBD>ڷ<EFBFBD>
/// <EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>ٴ<EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٰ<EFBFBD> <20><> <20><> <20>ִ<EFBFBD>.
/// CSV 파일을 로드하는 경우, 숫자를 이용해 셀을 액세스해야 하는데, CSV
/// 파일의 포맷이 바뀌는 경우, 이 숫자들을 변경해줘야한다. 이 작업이 꽤
/// 신경 집중을 요구하는 데다가, 에러가 발생하기 쉽다. 그러므로 숫자로
/// 액세스하기보다는 문자열로 액세스하는 것이 약간 느리지만 낫다고 할 수 있다.
///
/// <b>sample</b>
/// <pre>
@ -259,63 +259,63 @@ private:
class cCsvTable
{
public :
cCsvFile m_File; ///< CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü
cCsvFile m_File; ///< CSV 파일 객체
private:
cCsvAlias m_Alias; ///< <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD> <20><> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü
int m_CurRow; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ⱦ<><C8BE> <20><><EFBFBD><EFBFBD> <20><> <20><>ȣ
cCsvAlias m_Alias; ///< 문자열을 셀 인덱스로 변환하기 위한 객체
int m_CurRow; ///< 현재 횡단 중인 행 번호
public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// \brief 생성자
cCsvTable();
/// \brief <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD>
/// \brief 소멸자
virtual ~cCsvTable();
public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> CSV <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>Ѵ<EFBFBD>.
/// \brief 지정된 이름의 CSV 파일을 로드한다.
bool Load(const char* fileName, const char seperator=',', const char quote='"');
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief 셀을 액세스할 때, 숫자 대신 사용할 이름을 등록한다.
void AddAlias(const char* name, size_t index) { m_Alias.AddAlias(name, index); }
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A3>.
/// \brief 다음 행으로 넘어간다.
bool Next();
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ڸ<EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 현재 행의 셀 숫자를 반환한다.
size_t ColCount() const;
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 인덱스를 이용해 int 형으로 셀값을 반환한다.
int AsInt(size_t index) const;
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 인덱스를 이용해 double 형으로 셀값을 반환한다.
double AsDouble(size_t index) const;
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> std::string <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 인덱스를 이용해 std::string 형으로 셀값을 반환한다.
const char* AsStringByIndex(size_t index) const;
/// \brief <EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 셀 이름을 이용해 int 형으로 셀값을 반환한다.
int AsInt(const char* name) const { return AsInt(m_Alias[name]); }
/// \brief <EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 셀 이름을 이용해 double 형으로 셀값을 반환한다.
double AsDouble(const char* name) const { return AsDouble(m_Alias[name]); }
/// \brief <EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> std::string <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 셀 이름을 이용해 std::string 형으로 셀값을 반환한다.
const char* AsString(const char* name) const { return AsStringByIndex(m_Alias[name]); }
/// \brief alias<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief alias를 포함해 모든 데이터를 삭제한다.
void Destroy();
private:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 현재 행을 반환한다.
const cCsvRow* const CurRow() const;
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 복사 생성자 금지
cCsvTable(const cCsvTable&) {}
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 대입 연산자 금지
const cCsvTable& operator = (const cCsvTable&) { return *this; }
};

View File

@ -98,7 +98,7 @@ int CDBManager::Connect(int iSlot, const char * db_address, const int db_port, c
if (iSlot < 0 || iSlot >= SQL_MAX_NUM)
return false;
sys_log(0, "CREATING DIRECT_SQL");
SPDLOG_INFO("CREATING DIRECT_SQL");
m_directSQL[iSlot] = new CAsyncSQL2;
if (!m_directSQL[iSlot]->Setup(db_address, user, pwd, db_name, g_stLocale.c_str(), true, db_port))
{
@ -107,7 +107,7 @@ int CDBManager::Connect(int iSlot, const char * db_address, const int db_port, c
}
sys_log(0, "CREATING MAIN_SQL");
SPDLOG_INFO("CREATING MAIN_SQL");
m_mainSQL[iSlot] = new CAsyncSQL2;
if (!m_mainSQL[iSlot]->Setup(db_address, user, pwd, db_name, g_stLocale.c_str(), false, db_port))
{
@ -115,7 +115,7 @@ int CDBManager::Connect(int iSlot, const char * db_address, const int db_port, c
return false;
}
sys_log(0, "CREATING ASYNC_SQL");
SPDLOG_INFO("CREATING ASYNC_SQL");
m_asyncSQL[iSlot] = new CAsyncSQL2;
if (!m_asyncSQL[iSlot]->Setup(db_address, user, pwd, db_name, g_stLocale.c_str(), false, db_port))
{
@ -137,7 +137,7 @@ extern int g_query_count[2];
void CDBManager::ReturnQuery(const char * c_pszQuery, int iType, IDENT dwIdent, void * udata, int iSlot)
{
assert(iSlot < SQL_MAX_NUM);
//sys_log(0, "ReturnQuery %s", c_pszQuery);
//SPDLOG_DEBUG("ReturnQuery {}", c_pszQuery);
CQueryInfo * p = new CQueryInfo;
p->iType = iType;
@ -166,14 +166,14 @@ unsigned int CDBManager::EscapeString(void *to, const void *from, unsigned int l
void CDBManager::SetLocale(const char * szLocale)
{
const std::string stLocale(szLocale);
sys_log(0, "SetLocale start" );
SPDLOG_DEBUG("SetLocale start");
for (int n = 0; n < SQL_MAX_NUM; ++n)
{
m_mainSQL[n]->SetLocale(stLocale);
m_directSQL[n]->SetLocale(stLocale);
m_asyncSQL[n]->SetLocale(stLocale);
}
sys_log(0, "End setlocale %s", szLocale);
SPDLOG_DEBUG("End setlocale {}", szLocale);
}
void CDBManager::QueryLocaleSet()

View File

@ -2,9 +2,9 @@
#ifndef __INC_METIN2_DB_DBMANAGER_H__
#define __INC_METIN2_DB_DBMANAGER_H__
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŀ<>ؼ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>... <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>޾ƿ<DEBE><C6BF><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
// <EFBFBD>ڵ<EFBFBD> by <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ķα׷<CEB1><D7B7><EFBFBD> <20>Ƴ<EFBFBD><C6B3><EFBFBD>~ = _=)b
// 디비 커넥션 클래스의 목적은... 디비에 접속해서 쿼리보내고 결과 받아오는
// 모든 일들을 처리한다.
// 코드 by 꼬붕 후로그래머 아노아~ = _=)b
#include <libsql/include/CAsyncSQL.h>
#define SQL_SAFE_LENGTH(size) (size * 2 + 1)
@ -23,7 +23,6 @@ enum eSQL_SLOT
SQL_PLAYER,
SQL_ACCOUNT,
SQL_COMMON,
SQL_HOTBACKUP,
SQL_MAX_NUM,
};

View File

@ -145,8 +145,8 @@ void CGuildManager::ParseResult(SQLResult * pRes)
str_to_number(r_info.gold, row[6]);
str_to_number(r_info.level, row[7]);
sys_log(0,
"GuildWar: %-24s ladder %-5d win %-3d draw %-3d loss %-3d",
SPDLOG_DEBUG(
"GuildWar: {:24} ladder {:<5} win {:<3} draw {:<3} loss {:<3}",
r_info.szName,
r_info.ladder_point,
r_info.win,
@ -170,17 +170,17 @@ void CGuildManager::Initialize()
*str = '\0';
if (!polyPower.Analyze(str))
sys_err("cannot set power poly: %s", str);
SPDLOG_ERROR("cannot set power poly: {}", str);
else
sys_log(0, "POWER_POLY: %s", str);
SPDLOG_DEBUG("POWER_POLY: {}", str);
if (!CConfig::instance().GetValue("POLY_HANDICAP", str, sizeof(str)))
*str = '\0';
if (!polyHandicap.Analyze(str))
sys_err("cannot set handicap poly: %s", str);
SPDLOG_ERROR("cannot set handicap poly: {}", str);
else
sys_log(0, "HANDICAP_POLY: %s", str);
SPDLOG_DEBUG("HANDICAP_POLY: {}", str);
QueryRanking();
}
@ -234,7 +234,7 @@ void CGuildManager::ResultRanking(MYSQL_RES * pRes)
if (iLadderPoint != iLastLadderPoint)
++iRank;
sys_log(0, "GUILD_RANK: %-24s %2d %d", row[1], iRank, iLadderPoint);
SPDLOG_DEBUG("GUILD_RANK: {:24} {:2} {}", row[1], iRank, iLadderPoint);
map_kLadderPointRankingByGID.insert(std::make_pair(dwGID, iRank));
}
@ -242,7 +242,7 @@ void CGuildManager::ResultRanking(MYSQL_RES * pRes)
void CGuildManager::Update()
{
ProcessReserveWar(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>
ProcessReserveWar(); // 예약 전쟁 처리
time_t now = CClientManager::instance().GetCurrentTime();
@ -250,7 +250,7 @@ void CGuildManager::Update()
{
// UNKNOWN_GUILD_MANAGE_UPDATE_LOG
/*
sys_log(0, "GuildManager::Update size %d now %d top %d, %s(%u) vs %s(%u)",
SPDLOG_DEBUG("GuildManager::Update size {} now {} top {}, {}({}) vs {}({})",
m_WarMap.size(),
now,
m_pqOnWar.top().first,
@ -307,7 +307,7 @@ void CGuildManager::Update()
p.dwGuildTo = ws.GID[1];
CClientManager::instance().ForwardPacket(HEADER_DG_GUILD_WAR, &p, sizeof(p));
sys_log(0, "GuildWar: GUILD sending start of wait start war %d %d", ws.GID[0], ws.GID[1]);
SPDLOG_DEBUG("GuildWar: GUILD sending start of wait start war {} {}", ws.GID[0], ws.GID[1]);
}
}
@ -402,7 +402,7 @@ bool CGuildManager::IsHalfWinLadderPoint(DWORD dwGuildWinner, DWORD dwGuildLoser
void CGuildManager::ProcessDraw(DWORD dwGuildID1, DWORD dwGuildID2)
{
sys_log(0, "GuildWar: \tThe war between %d and %d is ended in draw", dwGuildID1, dwGuildID2);
SPDLOG_DEBUG("GuildWar: \tThe war between {} and {} is ended in draw", dwGuildID1, dwGuildID2);
GuildWarDraw(dwGuildID1);
GuildWarDraw(dwGuildID2);
@ -416,7 +416,7 @@ void CGuildManager::ProcessWinLose(DWORD dwGuildWinner, DWORD dwGuildLoser)
{
GuildWarWin(dwGuildWinner);
GuildWarLose(dwGuildLoser);
sys_log(0, "GuildWar: \tWinner : %d Loser : %d", dwGuildWinner, dwGuildLoser);
SPDLOG_DEBUG("GuildWar: \tWinner : {} Loser : {}", dwGuildWinner, dwGuildLoser);
int iPoint = GetLadderPoint(dwGuildLoser);
int gain = (int)(iPoint * 0.05);
@ -425,7 +425,7 @@ void CGuildManager::ProcessWinLose(DWORD dwGuildWinner, DWORD dwGuildLoser)
if (IsHalfWinLadderPoint(dwGuildWinner, dwGuildLoser))
gain /= 2;
sys_log(0, "GuildWar: \tgain : %d loss : %d", gain, loss);
SPDLOG_DEBUG("GuildWar: \tgain : {} loss : {}", gain, loss);
ChangeLadderPoint(dwGuildWinner, gain);
ChangeLadderPoint(dwGuildLoser, -loss);
@ -435,7 +435,7 @@ void CGuildManager::ProcessWinLose(DWORD dwGuildWinner, DWORD dwGuildLoser)
void CGuildManager::RemoveWar(DWORD GID1, DWORD GID2)
{
sys_log(0, "GuildWar: RemoveWar(%d, %d)", GID1, GID2);
SPDLOG_DEBUG("GuildWar: RemoveWar({}, {})", GID1, GID2);
if (GID1 > GID2)
std::swap(GID2, GID1);
@ -462,20 +462,20 @@ void CGuildManager::RemoveWar(DWORD GID1, DWORD GID2)
}
//
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD><EFBFBD>
// 길드전 비정상 종료 및 필드전 종료
//
void CGuildManager::WarEnd(DWORD GID1, DWORD GID2, bool bForceDraw)
{
if (GID1 > GID2)
std::swap(GID2, GID1);
sys_log(0, "GuildWar: WarEnd %d %d", GID1, GID2);
SPDLOG_DEBUG("GuildWar: WarEnd {} {}", GID1, GID2);
itertype(m_WarMap[GID1]) itWarMap = m_WarMap[GID1].find(GID2);
if (itWarMap == m_WarMap[GID1].end())
{
sys_err("GuildWar: war not exist or already ended. [1]");
SPDLOG_ERROR("GuildWar: war not exist or already ended. [1]");
return;
}
@ -484,7 +484,7 @@ void CGuildManager::WarEnd(DWORD GID1, DWORD GID2, bool bForceDraw)
if (!pData || pData->bEnd)
{
sys_err("GuildWar: war not exist or already ended. [2]");
SPDLOG_ERROR("GuildWar: war not exist or already ended. [2]");
return;
}
@ -493,7 +493,7 @@ void CGuildManager::WarEnd(DWORD GID1, DWORD GID2, bool bForceDraw)
bool bDraw = false;
if (!bForceDraw) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ºΰ<C2BA> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>Ѵ<EFBFBD>.
if (!bForceDraw) // 강제 무승부가 아닐 경우에는 점수를 체크한다.
{
if (pData->iScore[0] > pData->iScore[1])
{
@ -508,7 +508,7 @@ void CGuildManager::WarEnd(DWORD GID1, DWORD GID2, bool bForceDraw)
else
bDraw = true;
}
else // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>º<EFBFBD><C2BA><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>º<EFBFBD>
else // 강제 무승부일 경우에는 무조건 무승부
bDraw = true;
if (bDraw)
@ -516,18 +516,18 @@ void CGuildManager::WarEnd(DWORD GID1, DWORD GID2, bool bForceDraw)
else
ProcessWinLose(win_guild, lose_guild);
// DB <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
// DB 서버에서 자체적으로 끝낼 때도 있기 때문에 따로 패킷을 보내줘야 한다.
CClientManager::instance().for_each_peer(FSendPeerWar(0, GUILD_WAR_END, GID1, GID2));
RemoveWar(GID1, GID2);
}
//
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// 길드전 정상 종료
//
void CGuildManager::RecvWarOver(DWORD dwGuildWinner, DWORD dwGuildLoser, bool bDraw, int lWarPrice)
{
sys_log(0, "GuildWar: RecvWarOver : winner %u vs %u draw? %d war_price %d", dwGuildWinner, dwGuildLoser, bDraw ? 1 : 0, lWarPrice);
SPDLOG_DEBUG("GuildWar: RecvWarOver : winner {} vs {} draw? {} war_price {}", dwGuildWinner, dwGuildLoser, bDraw ? 1 : 0, lWarPrice);
DWORD GID1 = dwGuildWinner;
DWORD GID2 = dwGuildLoser;
@ -570,13 +570,13 @@ void CGuildManager::RecvWarOver(DWORD dwGuildWinner, DWORD dwGuildLoser, bool bD
void CGuildManager::RecvWarEnd(DWORD GID1, DWORD GID2)
{
sys_log(0, "GuildWar: RecvWarEnded : %u vs %u", GID1, GID2);
WarEnd(GID1, GID2, true); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѿ<EFBFBD> <20>Ѵ<EFBFBD>.
SPDLOG_DEBUG("GuildWar: RecvWarEnded : {} vs {}", GID1, GID2);
WarEnd(GID1, GID2, true); // 무조건 비정상 종료 시켜야 한다.
}
void CGuildManager::StartWar(BYTE bType, DWORD GID1, DWORD GID2, CGuildWarReserve * pkReserve)
{
sys_log(0, "GuildWar: StartWar(%d,%d,%d)", bType, GID1, GID2);
SPDLOG_DEBUG("GuildWar: StartWar({},{},{})", bType, GID1, GID2);
if (GID1 > GID2)
std::swap(GID1, GID2);
@ -610,7 +610,7 @@ void CGuildManager::UpdateScore(DWORD dwGainGID, DWORD dwOppGID, int iScoreDelta
if (!p || p->bEnd)
{
sys_err("GuildWar: war not exist or already ended.");
SPDLOG_ERROR("GuildWar: war not exist or already ended.");
return;
}
@ -634,7 +634,7 @@ void CGuildManager::UpdateScore(DWORD dwGainGID, DWORD dwOppGID, int iScoreDelta
iNewBetScore = p->iBetScore[1];
}
sys_log(0, "GuildWar: SendGuildWarScore guild %u wartype %u score_delta %d betscore_delta %d result %u, %u",
SPDLOG_DEBUG("GuildWar: SendGuildWarScore guild {} wartype {} score_delta {} betscore_delta {} result {}, {}",
dwGainGID, p->bType, iScoreDelta, iBetScoreDelta, iNewScore, iNewBetScore);
CClientManager::instance().for_each_peer(FSendGuildWarScore(dwGainGID, dwOppGID, iNewScore, iNewBetScore));
@ -648,7 +648,7 @@ void CGuildManager::AddDeclare(BYTE bType, DWORD guild_from, DWORD guild_to)
if (m_DeclareMap.find(di) == m_DeclareMap.end())
m_DeclareMap.insert(di);
sys_log(0, "GuildWar: AddDeclare(Type:%d,from:%d,to:%d)", bType, guild_from, guild_to);
SPDLOG_DEBUG("GuildWar: AddDeclare(Type:{},from:{},to:{})", bType, guild_from, guild_to);
}
void CGuildManager::RemoveDeclare(DWORD guild_from, DWORD guild_to)
@ -663,7 +663,7 @@ void CGuildManager::RemoveDeclare(DWORD guild_from, DWORD guild_to)
if (it != m_DeclareMap.end())
m_DeclareMap.erase(it);
sys_log(0, "GuildWar: RemoveDeclare(from:%d,to:%d)", guild_from, guild_to);
SPDLOG_DEBUG("GuildWar: RemoveDeclare(from:{},to:{})", guild_from, guild_to);
}
bool CGuildManager::TakeBetPrice(DWORD dwGuildTo, DWORD dwGuildFrom, int lWarPrice)
@ -673,14 +673,14 @@ bool CGuildManager::TakeBetPrice(DWORD dwGuildTo, DWORD dwGuildFrom, int lWarPri
if (it_from == m_map_kGuild.end() || it_to == m_map_kGuild.end())
{
sys_log(0, "TakeBetPrice: guild not exist %u %u",
SPDLOG_DEBUG("TakeBetPrice: guild not exist {} {}",
dwGuildFrom, dwGuildTo);
return false;
}
if (it_from->second.gold < lWarPrice || it_to->second.gold < lWarPrice)
{
sys_log(0, "TakeBetPrice: not enough gold %u %d to %u %d",
SPDLOG_DEBUG("TakeBetPrice: not enough gold {} {} to {} {}",
dwGuildFrom, it_from->second.gold, dwGuildTo, it_to->second.gold);
return false;
}
@ -704,8 +704,8 @@ bool CGuildManager::WaitStart(TPacketGuildWar * p)
TGuildWaitStartInfo info(p->bType, p->dwGuildFrom, p->dwGuildTo, p->lWarPrice, p->lInitialScore, NULL);
m_pqWaitStart.push(std::make_pair(dwCurTime + GetGuildWarWaitStartDuration(), info));
sys_log(0,
"GuildWar: WaitStart g1 %d g2 %d price %d start at %u",
SPDLOG_DEBUG(
"GuildWar: WaitStart g1 {} g2 {} price {} start at {}",
p->dwGuildFrom,
p->dwGuildTo,
p->lWarPrice,
@ -742,10 +742,10 @@ void CGuildManager::ChangeLadderPoint(DWORD GID, int change)
snprintf(buf, sizeof(buf), "UPDATE guild%s SET ladder_point=%d WHERE id=%u", GetTablePostfix(), r.ladder_point, GID);
CDBManager::instance().AsyncQuery(buf);
sys_log(0, "GuildManager::ChangeLadderPoint %u %d", GID, r.ladder_point);
sys_log(0, "%s", buf);
SPDLOG_DEBUG("GuildManager::ChangeLadderPoint {} {}", GID, r.ladder_point);
SPDLOG_DEBUG("{}", buf);
// Packet <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Packet 보내기
TPacketGuildLadder p;
p.dwGuild = GID;
@ -760,14 +760,14 @@ void CGuildManager::ChangeLadderPoint(DWORD GID, int change)
void CGuildManager::UseSkill(DWORD GID, DWORD dwSkillVnum, DWORD dwCooltime)
{
// GUILD_SKILL_COOLTIME_BUG_FIX
sys_log(0, "UseSkill(gid=%d, skill=%d) CoolTime(%d:%d)", GID, dwSkillVnum, dwCooltime, CClientManager::instance().GetCurrentTime() + dwCooltime);
SPDLOG_DEBUG("UseSkill(gid={}, skill={}) CoolTime({}:{})", GID, dwSkillVnum, dwCooltime, CClientManager::instance().GetCurrentTime() + dwCooltime);
m_pqSkill.push(std::make_pair(CClientManager::instance().GetCurrentTime() + dwCooltime, TGuildSkillUsed(GID, dwSkillVnum)));
// END_OF_GUILD_SKILL_COOLTIME_BUG_FIX
}
void CGuildManager::MoneyChange(DWORD dwGuild, DWORD dwGold)
{
sys_log(0, "GuildManager::MoneyChange %d %d", dwGuild, dwGold);
SPDLOG_DEBUG("GuildManager::MoneyChange {} {}", dwGuild, dwGold);
TPacketDGGuildMoneyChange p;
p.dwGuild = dwGuild;
@ -788,12 +788,12 @@ void CGuildManager::DepositMoney(DWORD dwGuild, INT iGold)
if (it == m_map_kGuild.end())
{
sys_err("No guild by id %u", dwGuild);
SPDLOG_ERROR("No guild by id {}", dwGuild);
return;
}
it->second.gold += iGold;
sys_log(0, "GUILD: %u Deposit %u Total %d", dwGuild, iGold, it->second.gold);
SPDLOG_DEBUG("GUILD: {} Deposit {} Total {}", dwGuild, iGold, it->second.gold);
MoneyChange(dwGuild, it->second.gold);
}
@ -804,15 +804,15 @@ void CGuildManager::WithdrawMoney(CPeer* peer, DWORD dwGuild, INT iGold)
if (it == m_map_kGuild.end())
{
sys_err("No guild by id %u", dwGuild);
SPDLOG_ERROR("No guild by id {}", dwGuild);
return;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>÷<EFBFBD><C3B7>ش<EFBFBD>
// 돈이있으니 출금하고 올려준다
if (it->second.gold >= iGold)
{
it->second.gold -= iGold;
sys_log(0, "GUILD: %u Withdraw %d Total %d", dwGuild, iGold, it->second.gold);
SPDLOG_DEBUG("GUILD: {} Withdraw {} Total {}", dwGuild, iGold, it->second.gold);
TPacketDGGuildMoneyWithdraw p;
p.dwGuild = dwGuild;
@ -830,7 +830,7 @@ void CGuildManager::WithdrawMoneyReply(DWORD dwGuild, BYTE bGiveSuccess, INT iGo
if (it == m_map_kGuild.end())
return;
sys_log(0, "GuildManager::WithdrawMoneyReply : guild %u success %d gold %d", dwGuild, bGiveSuccess, iGold);
SPDLOG_DEBUG("GuildManager::WithdrawMoneyReply : guild {} success {} gold {}", dwGuild, bGiveSuccess, iGold);
if (!bGiveSuccess)
it->second.gold += iGold;
@ -839,7 +839,7 @@ void CGuildManager::WithdrawMoneyReply(DWORD dwGuild, BYTE bGiveSuccess, INT iGo
}
//
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>)
// 예약 길드전(관전자가 배팅할 수 있다)
//
const int c_aiScoreByLevel[GUILD_MAX_LEVEL+1] =
{
@ -869,7 +869,7 @@ const int c_aiScoreByLevel[GUILD_MAX_LEVEL+1] =
const int c_aiScoreByRanking[GUILD_RANK_MAX_NUM+1] =
{
0,
55000, // 1<EFBFBD><EFBFBD>
55000, // 1
50000,
45000,
40000,
@ -878,7 +878,7 @@ const int c_aiScoreByRanking[GUILD_RANK_MAX_NUM+1] =
28000,
24000,
21000,
18000, // 10<EFBFBD><EFBFBD>
18000, // 10
15000,
12000,
10000,
@ -888,7 +888,7 @@ const int c_aiScoreByRanking[GUILD_RANK_MAX_NUM+1] =
3000,
2000,
1000,
500 // 20<EFBFBD><EFBFBD>
500 // 20
};
void CGuildManager::BootReserveWar()
@ -932,22 +932,22 @@ void CGuildManager::BootReserveWar()
char buf[512];
snprintf(buf, sizeof(buf), "GuildWar: BootReserveWar : step %d id %u GID1 %u GID2 %u", i, t.dwID, t.dwGuildFrom, t.dwGuildTo);
// i == 0 <EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DB<44><42> ƨ<><C6A8> <20><><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD>º<EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
// <EFBFBD>Ǵ<EFBFBD>, 5<><35> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>º<EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>þ<EFBFBD><C3BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>)
// i == 0 이면 길드전 도중 DB가 튕긴 것이므로 무승부 처리한다.
// 또는, 5분 이하 남은 예약 길드전도 무승부 처리한다. (각자의 배팅액을 돌려준다)
//if (i == 0 || (int) t.dwTime - CClientManager::instance().GetCurrentTime() < 60 * 5)
if (i == 0 || (int) t.dwTime - CClientManager::instance().GetCurrentTime() < 0)
{
if (i == 0)
sys_log(0, "%s : DB was shutdowned while war is being.", buf);
SPDLOG_DEBUG("{} : DB was shutdowned while war is being.", buf);
else
sys_log(0, "%s : left time lower than 5 minutes, will be canceled", buf);
SPDLOG_DEBUG("{} : left time lower than 5 minutes, will be canceled", buf);
pkReserve->Draw();
delete pkReserve;
}
else
{
sys_log(0, "%s : OK", buf);
SPDLOG_DEBUG("{} : OK", buf);
m_map_kWarReserve.insert(std::make_pair(t.dwID, pkReserve));
}
}
@ -1010,7 +1010,7 @@ bool CGuildManager::ReserveWar(TPacketGuildWar * p)
int lvp, rkp, alv, mc;
// <EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD>
// 파워 계산
TGuild & k1 = TouchGuild(GID1);
lvp = c_aiScoreByLevel[std::min<size_t>(GUILD_MAX_LEVEL, k1.level)];
@ -1024,9 +1024,9 @@ bool CGuildManager::ReserveWar(TPacketGuildWar * p)
polyPower.SetVar("mc", mc);
t.lPowerFrom = (int) polyPower.Eval();
sys_log(0, "GuildWar: %u lvp %d rkp %d alv %d mc %d power %d", GID1, lvp, rkp, alv, mc, t.lPowerFrom);
SPDLOG_DEBUG("GuildWar: {} lvp {} rkp {} alv {} mc {} power {}", GID1, lvp, rkp, alv, mc, t.lPowerFrom);
// <EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD>
// 파워 계산
TGuild & k2 = TouchGuild(GID2);
lvp = c_aiScoreByLevel[std::min<size_t>(GUILD_MAX_LEVEL, k2.level)];
@ -1040,9 +1040,9 @@ bool CGuildManager::ReserveWar(TPacketGuildWar * p)
polyPower.SetVar("mc", mc);
t.lPowerTo = (int) polyPower.Eval();
sys_log(0, "GuildWar: %u lvp %d rkp %d alv %d mc %d power %d", GID2, lvp, rkp, alv, mc, t.lPowerTo);
SPDLOG_DEBUG("GuildWar: {} lvp {} rkp {} alv {} mc {} power {}", GID2, lvp, rkp, alv, mc, t.lPowerTo);
// <EFBFBD>ڵ<EFBFBD>ĸ <20><><EFBFBD><EFBFBD>
// 핸디캡 계산
if (t.lPowerTo > t.lPowerFrom)
{
polyHandicap.SetVar("pA", t.lPowerTo);
@ -1055,9 +1055,9 @@ bool CGuildManager::ReserveWar(TPacketGuildWar * p)
}
t.lHandicap = (int) polyHandicap.Eval();
sys_log(0, "GuildWar: handicap %d", t.lHandicap);
SPDLOG_DEBUG("GuildWar: handicap {}", t.lHandicap);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 쿼리
char szQuery[512];
snprintf(szQuery, sizeof(szQuery),
@ -1069,7 +1069,7 @@ bool CGuildManager::ReserveWar(TPacketGuildWar * p)
if (pmsg->Get()->uiAffectedRows == 0 || pmsg->Get()->uiInsertID == 0 || pmsg->Get()->uiAffectedRows == (uint32_t)-1)
{
sys_err("GuildWar: Cannot insert row");
SPDLOG_ERROR("GuildWar: Cannot insert row");
return false;
}
@ -1094,14 +1094,14 @@ void CGuildManager::ProcessReserveWar()
CGuildWarReserve * pk = it2->second;
TGuildWarReserve & r = pk->GetDataRef();
if (!r.bStarted && r.dwTime - 1800 <= dwCurTime) // 30<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>.
if (!r.bStarted && r.dwTime - 1800 <= dwCurTime) // 30분 전부터 알린다.
{
int iMin = (int) ceil((int)(r.dwTime - dwCurTime) / 60.0);
TGuild & r_1 = m_map_kGuild[r.dwGuildFrom];
TGuild & r_2 = m_map_kGuild[r.dwGuildTo];
sys_log(0, "GuildWar: started GID1 %u GID2 %u %d time %d min %d", r.dwGuildFrom, r.dwGuildTo, r.bStarted, dwCurTime - r.dwTime, iMin);
SPDLOG_DEBUG("GuildWar: started GID1 {} GID2 {} {} time {} min {}", r.dwGuildFrom, r.dwGuildTo, r.bStarted, dwCurTime - r.dwTime, iMin);
if (iMin <= 0)
{
@ -1135,9 +1135,9 @@ void CGuildManager::ProcessReserveWar()
pk->SetLastNoticeMin(iMin);
if (!g_stLocale.compare("euckr"))
CClientManager::instance().SendNotice("%s <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> %d<><64> <20><> <20><><EFBFBD><EFBFBD> <20>˴ϴ<CBB4>!", r_1.szName, r_2.szName, iMin);
CClientManager::instance().SendNotice("The war between guild %s and guild %s will begin in approximately %d minutes!", r_1.szName, r_2.szName, iMin);
else if (!g_stLocale.compare("gb2312"))
CClientManager::instance().SendNotice("%s <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s <20><><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD><C4B0><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d<><64><EFBFBD>Ӻ<EFBFBD><D3BA><EFBFBD>ʼ!", r_1.szName, r_2.szName, iMin);
CClientManager::instance().SendNotice("The war between guild %s and guild %s will begin in approximately %d minutes!", r_1.szName, r_2.szName, iMin);
}
}
}
@ -1152,7 +1152,7 @@ bool CGuildManager::Bet(DWORD dwID, const char * c_pszLogin, DWORD dwGold, DWORD
if (it == m_map_kWarReserve.end())
{
sys_log(0, "WAR_RESERVE: Bet: cannot find reserve war by id %u", dwID);
SPDLOG_DEBUG("WAR_RESERVE: Bet: cannot find reserve war by id {}", dwID);
snprintf(szQuery, sizeof(szQuery), "INSERT INTO item_award (login, vnum, socket0, given_time) VALUES('%s', %d, %u, NOW())",
c_pszLogin, ITEM_ELK_VNUM, dwGold);
CDBManager::instance().AsyncQuery(szQuery);
@ -1161,7 +1161,7 @@ bool CGuildManager::Bet(DWORD dwID, const char * c_pszLogin, DWORD dwGold, DWORD
if (!it->second->Bet(c_pszLogin, dwGold, dwGuild))
{
sys_log(0, "WAR_RESERVE: Bet: cannot bet id %u, login %s, gold %u, guild %u", dwID, c_pszLogin, dwGold, dwGuild);
SPDLOG_DEBUG("WAR_RESERVE: Bet: cannot bet id {}, login {}, gold {}, guild {}", dwID, c_pszLogin, dwGold, dwGuild);
snprintf(szQuery, sizeof(szQuery), "INSERT INTO item_award (login, vnum, socket0, given_time) VALUES('%s', %d, %u, NOW())",
c_pszLogin, ITEM_ELK_VNUM, dwGold);
CDBManager::instance().AsyncQuery(szQuery);
@ -1239,7 +1239,7 @@ void CGuildWarReserve::Initialize()
void CGuildWarReserve::OnSetup(CPeer * peer)
{
if (m_data.bStarted) // <EFBFBD>̹<EFBFBD> <20><><EFBFBD>۵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if (m_data.bStarted) // 이미 시작된 것은 보내지 않는다.
return;
FSendPeerWar(m_data.bType, GUILD_WAR_RESERVE, m_data.dwGuildFrom, m_data.dwGuildTo) (peer);
@ -1271,19 +1271,19 @@ bool CGuildWarReserve::Bet(const char * pszLogin, DWORD dwGold, DWORD dwGuild)
if (m_data.dwGuildFrom != dwGuild && m_data.dwGuildTo != dwGuild)
{
sys_log(0, "GuildWarReserve::Bet: invalid guild id");
SPDLOG_DEBUG("GuildWarReserve::Bet: invalid guild id");
return false;
}
if (m_data.bStarted)
{
sys_log(0, "GuildWarReserve::Bet: war is already started");
SPDLOG_DEBUG("GuildWarReserve::Bet: war is already started");
return false;
}
if (mapBet.find(pszLogin) != mapBet.end())
{
sys_log(0, "GuildWarReserve::Bet: failed. already bet");
SPDLOG_DEBUG("GuildWarReserve::Bet: failed. already bet");
return false;
}
@ -1295,7 +1295,7 @@ bool CGuildWarReserve::Bet(const char * pszLogin, DWORD dwGold, DWORD dwGuild)
if (pmsg->Get()->uiAffectedRows == 0 || pmsg->Get()->uiAffectedRows == (uint32_t)-1)
{
sys_log(0, "GuildWarReserve::Bet: failed. cannot insert row to guild_war_bet table");
SPDLOG_DEBUG("GuildWarReserve::Bet: failed. cannot insert row to guild_war_bet table");
return false;
}
@ -1311,7 +1311,7 @@ bool CGuildWarReserve::Bet(const char * pszLogin, DWORD dwGold, DWORD dwGuild)
CDBManager::instance().AsyncQuery(szQuery);
sys_log(0, "GuildWarReserve::Bet: success. %s %u war_id %u bet %u : %u", pszLogin, dwGuild, m_data.dwID, m_data.dwBetFrom, m_data.dwBetTo);
SPDLOG_DEBUG("GuildWarReserve::Bet: success. {} {} war_id {} bet {} : {}", pszLogin, dwGuild, m_data.dwID, m_data.dwBetFrom, m_data.dwBetTo);
mapBet.insert(std::make_pair(pszLogin, std::make_pair(dwGuild, dwGold)));
TPacketGDGuildWarBet pckBet;
@ -1325,8 +1325,8 @@ bool CGuildWarReserve::Bet(const char * pszLogin, DWORD dwGold, DWORD dwGuild)
}
//
// <EFBFBD><EFBFBD><EFBFBD>º<EFBFBD> ó<><C3B3>: <20><><EFBFBD>κ<EFBFBD> <20>ºΰ<C2BA> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> Ư<><C6AF> <20><>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD><ECBFA1>
// <EFBFBD><EFBFBD><EFBFBD>º<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20>Ѵ<EFBFBD>.
// 무승부 처리: 대부분 승부가 나야 정상이지만, 서버 문제 등 특정 상황일 경우에는
// 무승부 처리가 있어야 한다.
//
void CGuildWarReserve::Draw()
{
@ -1338,7 +1338,7 @@ void CGuildWarReserve::Draw()
if (mapBet.empty())
return;
sys_log(0, "WAR_REWARD: Draw. war_id %u", m_data.dwID);
SPDLOG_DEBUG("WAR_REWARD: Draw. war_id {}", m_data.dwID);
itertype(mapBet) it = mapBet.begin();
@ -1368,7 +1368,7 @@ void CGuildWarReserve::Draw()
if (iRow > 0)
{
sys_log(0, "WAR_REWARD: QUERY: %s", szQuery);
SPDLOG_DEBUG("WAR_REWARD: QUERY: {}", szQuery);
CDBManager::instance().AsyncQuery(szQuery);
}
@ -1381,18 +1381,18 @@ void CGuildWarReserve::End(int iScoreFrom, int iScoreTo)
{
DWORD dwWinner;
sys_log(0, "WAR_REWARD: End: From %u %d To %u %d", m_data.dwGuildFrom, iScoreFrom, m_data.dwGuildTo, iScoreTo);
SPDLOG_DEBUG("WAR_REWARD: End: From {} {} To {} {}", m_data.dwGuildFrom, iScoreFrom, m_data.dwGuildTo, iScoreTo);
if (m_data.lPowerFrom > m_data.lPowerTo)
{
if (m_data.lHandicap > iScoreFrom - iScoreTo)
{
sys_log(0, "WAR_REWARD: End: failed to overcome handicap, From is strong but To won");
SPDLOG_DEBUG("WAR_REWARD: End: failed to overcome handicap, From is strong but To won");
dwWinner = m_data.dwGuildTo;
}
else
{
sys_log(0, "WAR_REWARD: End: success to overcome handicap, From win!");
SPDLOG_DEBUG("WAR_REWARD: End: success to overcome handicap, From win!");
dwWinner = m_data.dwGuildFrom;
}
}
@ -1400,12 +1400,12 @@ void CGuildWarReserve::End(int iScoreFrom, int iScoreTo)
{
if (m_data.lHandicap > iScoreTo - iScoreFrom)
{
sys_log(0, "WAR_REWARD: End: failed to overcome handicap, To is strong but From won");
SPDLOG_DEBUG("WAR_REWARD: End: failed to overcome handicap, To is strong but From won");
dwWinner = m_data.dwGuildFrom;
}
else
{
sys_log(0, "WAR_REWARD: End: success to overcome handicap, To win!");
SPDLOG_DEBUG("WAR_REWARD: End: success to overcome handicap, To win!");
dwWinner = m_data.dwGuildTo;
}
}
@ -1427,17 +1427,17 @@ void CGuildWarReserve::End(int iScoreFrom, int iScoreTo)
dwWinnerBet = m_data.dwBetTo;
else
{
sys_err("WAR_REWARD: fatal error, winner does not exist!");
SPDLOG_ERROR("WAR_REWARD: fatal error, winner does not exist!");
return;
}
if (dwWinnerBet == 0)
{
sys_err("WAR_REWARD: total bet money on winner is zero");
SPDLOG_ERROR("WAR_REWARD: total bet money on winner is zero");
return;
}
sys_log(0, "WAR_REWARD: End: Total bet: %u, Winner bet: %u", dwTotalBet, dwWinnerBet);
SPDLOG_DEBUG("WAR_REWARD: End: Total bet: {}, Winner bet: {}", dwTotalBet, dwWinnerBet);
itertype(mapBet) it = mapBet.begin();
@ -1458,8 +1458,8 @@ void CGuildWarReserve::End(int iScoreFrom, int iScoreTo)
double ratio = (double) it->second.second / dwWinnerBet;
// 10% <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>й<EFBFBD>
sys_log(0, "WAR_REWARD: %s %u ratio %f", it->first.c_str(), it->second.second, ratio);
// 10% 세금 공제 후 분배
SPDLOG_DEBUG("WAR_REWARD: {} {} ratio {}", it->first.c_str(), it->second.second, ratio);
DWORD dwGold = (DWORD) (dwTotalBet * ratio * 0.9);
@ -1480,7 +1480,7 @@ void CGuildWarReserve::End(int iScoreFrom, int iScoreTo)
if (iRow > 0)
{
sys_log(0, "WAR_REWARD: query: %s", szQuery);
SPDLOG_DEBUG("WAR_REWARD: query: {}", szQuery);
CDBManager::instance().AsyncQuery(szQuery);
}

View File

@ -150,7 +150,7 @@ class CGuildWarReserve
void SetLastNoticeMin(int iMin) { m_iLastNoticeMin = iMin; }
private:
CGuildWarReserve(); // <EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CGuildWarReserve(); // 기본 생성자를 사용하지 못하도록 의도적으로 구현하지 않음
TGuildWarReserve m_data;
// <login, <guild, gold>>
@ -235,7 +235,7 @@ class CGuildManager : public singleton<CGuildManager>
std::map<DWORD, TGuild> m_map_kGuild;
std::map<DWORD, std::map<DWORD, time_t> > m_mapGuildWarEndTime;
std::set<TGuildDeclareInfo> m_DeclareMap; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD>
std::set<TGuildDeclareInfo> m_DeclareMap; // 선전 포고 상태를 저장
std::map<DWORD, std::map<DWORD, TGuildWarInfo> > m_WarMap;
typedef std::pair<time_t, TGuildWarPQElement *> stPairGuildWar;

View File

@ -1,86 +0,0 @@
#include "stdafx.h"
#include "HB.h"
#include "Main.h"
#include "DBManager.h"
#include <memory>
PlayerHB::PlayerHB()
{
m_iExpireTime = 3600; // 1 hour hotbackup default.
}
PlayerHB::~PlayerHB()
{
}
bool PlayerHB::Initialize()
{
char szQuery[128];
snprintf(szQuery, sizeof(szQuery), "SHOW CREATE TABLE player%s", GetTablePostfix());
std::unique_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery(szQuery));
if (pMsg->Get()->uiNumRows == 0)
return false;
MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult);
m_stCreateTableQuery = row[1];
return true;
}
//
// @version 05/07/05 Bang2ni - id <20><> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> data <20><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> data <20><> insert <20>ϴ<EFBFBD><CFB4>ڵ<EFBFBD> <20>߰<EFBFBD>.
//
void PlayerHB::Put(DWORD id)
{
itertype(m_map_data) it = m_map_data.find(id);
if (it == m_map_data.end())
{
Query(id);
m_map_data.insert(std::pair< DWORD, time_t >(id, get_dword_time()));
return;
}
if (time(0) - it->second > m_iExpireTime)
Query(id);
}
//
// @version 05/07/05 Bang2ni - Query string <20><><EFBFBD>۰<EFBFBD> <20>۾Ƽ<DBBE> <20>÷<EFBFBD><C3B7><EFBFBD>.
//
bool PlayerHB::Query(DWORD id)
{
time_t ct = time(0);
struct tm curr_tm = *localtime(&ct);
char szTableName[64];
snprintf(szTableName, sizeof(szTableName), "hb_%02d%02d%02d%02d_player%s",
curr_tm.tm_year - 100, curr_tm.tm_mon + 1, curr_tm.tm_mday, curr_tm.tm_hour, GetTablePostfix());
char szQuery[4096];
if (m_stTableName.compare(szTableName))
{
char szFind[32];
snprintf(szFind, sizeof(szFind), "CREATE TABLE `player%s`", GetTablePostfix());
int pos = m_stCreateTableQuery.find(szFind);
if (pos < 0)
{
sys_err("cannot find %s ", szFind);
// sys_err("cannot find %s in %s", szFind, m_stCreateTableQuery.c_str());
return false;
}
snprintf(szQuery, sizeof(szQuery), "CREATE TABLE IF NOT EXISTS %s%s", szTableName, m_stCreateTableQuery.c_str() + strlen(szFind));
// sys_log(0, "%s", szQuery);
std::unique_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery(szQuery, SQL_HOTBACKUP));
m_stTableName = szTableName;
}
snprintf(szQuery, sizeof(szQuery), "REPLACE INTO %s SELECT * FROM %splayer%s WHERE id=%u", m_stTableName.c_str(), GetPlayerDBName(), GetTablePostfix(), id);
CDBManager::instance().AsyncQuery(szQuery, SQL_HOTBACKUP);
return true;
}

View File

@ -1,24 +0,0 @@
// vim:ts=8 sw=4
#ifndef __INC_METIN_II_PLAYERHB_H__
#define __INC_METIN_II_PLAYERHB_H__
class PlayerHB : public singleton<PlayerHB>
{
public:
PlayerHB();
virtual ~PlayerHB();
bool Initialize();
void Put(DWORD id);
private:
bool Query(DWORD id);
std::map<DWORD, time_t> m_map_data;
std::string m_stCreateTableQuery;
std::string m_stTableName;
int m_iExpireTime;
};
#endif

View File

@ -54,19 +54,19 @@ void ItemAwardManager::Load(SQLMsg * pMsg)
if (row[col])
{
strlcpy(kData->szWhy, row[col], sizeof(kData->szWhy));
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߿<EFBFBD> why<68>ݷ뿡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char* whyStr = kData->szWhy; //why <EFBFBD>ݷ<EFBFBD> <20>б<EFBFBD>
char cmdStr[100] = ""; //why<EFBFBD>ݷ뿡<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>
strcpy(cmdStr,whyStr); //<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ū<EFBFBD><C5AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ūȭ <20>DZ<EFBFBD> <20><><EFBFBD><EFBFBD>
//게임 중에 why콜룸에 변동이 생기면
char* whyStr = kData->szWhy; //why 콜룸 읽기
char cmdStr[100] = ""; //why콜룸에서 읽은 값을 임시 문자열에 복사해둠
strcpy(cmdStr,whyStr); //명령어 얻는 과정에서 토큰쓰면 원본도 토큰화 되기 때문
char command[20] = "";
strcpy(command,CClientManager::instance().GetCommand(cmdStr).c_str()); // command <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//sys_err("%d, %s",pItemAward->dwID,command);
if( !(strcmp(command,"GIFT") )) // command <EFBFBD><EFBFBD> GIFT<EFBFBD≯<EFBFBD>
strcpy(command,CClientManager::instance().GetCommand(cmdStr).c_str()); // command 얻기
//SPDLOG_ERROR("{}, {}",pItemAward->dwID,command);
if( !(strcmp(command,"GIFT") )) // command GIFT이면
{
TPacketItemAwardInfromer giftData;
strcpy(giftData.login, kData->szLogin); //<EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD> <20><><EFBFBD><EFBFBD>
strcpy(giftData.command, command); //<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD>
giftData.vnum = kData->dwVnum; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vnum<75><6D> <20><><EFBFBD><EFBFBD>
strcpy(giftData.login, kData->szLogin); //로그인 아이디 복사
strcpy(giftData.command, command); //명령어 복사
giftData.vnum = kData->dwVnum; //아이템 vnum도 복사
CClientManager::instance().ForwardPacket(HEADER_DG_ITEMAWARD_INFORMER,&giftData,sizeof(TPacketItemAwardInfromer));
}
}
@ -74,7 +74,7 @@ void ItemAwardManager::Load(SQLMsg * pMsg)
m_map_award.insert(std::make_pair(dwID, kData));
printf("ITEM_AWARD load id %u bMall %d \n", kData->dwID, kData->bMall);
sys_log(0, "ITEM_AWARD: load id %lu login %s vnum %lu count %u socket %lu", kData->dwID, kData->szLogin, kData->dwVnum, kData->dwCount, kData->dwSocket0);
SPDLOG_DEBUG("ITEM_AWARD: load id {} login {} vnum {} count {} socket {}", kData->dwID, kData->szLogin, kData->dwVnum, kData->dwCount, kData->dwSocket0);
std::set<TItemAward *> & kSet = m_map_kSetAwardByLogin[kData->szLogin];
kSet.insert(kData);
@ -99,7 +99,7 @@ void ItemAwardManager::Taken(DWORD dwAwardID, DWORD dwItemID)
if (it == m_map_award.end())
{
sys_log(0, "ITEM_AWARD: Taken ID not exist %lu", dwAwardID);
SPDLOG_DEBUG("ITEM_AWARD: Taken ID not exist {}", dwAwardID);
return;
}

View File

@ -79,7 +79,7 @@ TItemIDRangeTable CItemIDRangeManager::GetRange()
}
for (int i = 0; i < 10; ++i)
sys_err("ItemIDRange: NO MORE ITEM ID RANGE");
SPDLOG_ERROR("ItemIDRange: NO MORE ITEM ID RANGE");
return ret;
}
@ -112,7 +112,7 @@ bool CItemIDRangeManager::BuildRange(DWORD dwMin, DWORD dwMax, TItemIDRangeTable
if ((dwMax < dwItemMaxID) || (dwMax - dwItemMaxID < cs_dwMinimumRemainCount))
{
sys_log(0, "ItemIDRange: Build %u ~ %u start: %u\tNOT USE remain count is below %u",
SPDLOG_DEBUG("ItemIDRange: Build {} ~ {} start: {}\tNOT USE remain count is below {}",
dwMin, dwMax, dwItemMaxID, cs_dwMinimumRemainCount);
}
else
@ -136,12 +136,12 @@ bool CItemIDRangeManager::BuildRange(DWORD dwMin, DWORD dwMax, TItemIDRangeTable
if (count > 0)
{
sys_err("ItemIDRange: Build: %u ~ %u\thave a item", range.dwUsableItemIDMin, range.dwMax);
SPDLOG_ERROR("ItemIDRange: Build: {} ~ {}\thave a item", range.dwUsableItemIDMin, range.dwMax);
return false;
}
else
{
sys_log(0, "ItemIDRange: Build: %u ~ %u start:%u", range.dwMin, range.dwMax, range.dwUsableItemIDMin);
SPDLOG_TRACE("ItemIDRange: Build: {} ~ {} start:{}", range.dwMin, range.dwMax, range.dwUsableItemIDMin);
return true;
}
}

View File

@ -2,16 +2,18 @@
#ifndef __INC_METIN_II_ITEM_ID_RANGE_MANAGER_H__
#define __INC_METIN_II_ITEM_ID_RANGE_MANAGER_H__
namespace {
static const uint32_t cs_dwMaxItemID = 4290000000UL;
static const uint32_t cs_dwMinimumRange = 10000000UL;
static const uint32_t cs_dwMinimumRemainCount = 10000UL;
}
class CItemIDRangeManager : public singleton<CItemIDRangeManager>
{
private :
const static DWORD cs_dwMaxItemID = 4290000000UL;
const static DWORD cs_dwMinimumRange = 10000000UL;
const static DWORD cs_dwMinimumRemainCount = 10000UL;
private:
std::list<TItemIDRangeTable> m_listData;
public :
public:
CItemIDRangeManager();
void Build();

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