diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt
index 4d429e693..bf5867327 100644
--- a/code/CMakeLists.txt
+++ b/code/CMakeLists.txt
@@ -91,6 +91,7 @@ NL_CONFIGURE_CHECKS()
#Platform specifics
SETUP_EXTERNAL()
+NL_GEN_REVISION_H()
IF(WIN32)
SET(WINSOCK2_LIB ws2_32.lib)
diff --git a/code/CMakeModules/FindFreeType.cmake b/code/CMakeModules/FindFreeType.cmake
index b9d00d96a..4f3c84cbe 100644
--- a/code/CMakeModules/FindFreeType.cmake
+++ b/code/CMakeModules/FindFreeType.cmake
@@ -57,6 +57,13 @@ FIND_LIBRARY(FREETYPE_LIBRARY
IF(FREETYPE_LIBRARY AND FREETYPE_INCLUDE_DIRS)
SET(FREETYPE_FOUND "YES")
+ IF(WITH_STATIC_EXTERNAL AND APPLE)
+ FIND_PACKAGE(BZip2)
+ IF(BZIP2_FOUND)
+ SET(FREETYPE_INCLUDE_DIRS ${FREETYPE_INCLUDE_DIRS} ${BZIP2_INCLUDE_DIR})
+ SET(FREETYPE_LIBRARY ${FREETYPE_LIBRARY} ${BZIP2_LIBRARIES})
+ ENDIF(BZIP2_FOUND)
+ ENDIF(WITH_STATIC_EXTERNAL AND APPLE)
IF(NOT FREETYPE_FIND_QUIETLY)
MESSAGE(STATUS "Found FreeType: ${FREETYPE_LIBRARY}")
ENDIF(NOT FREETYPE_FIND_QUIETLY)
diff --git a/code/CMakeModules/FindMercurial.cmake b/code/CMakeModules/FindMercurial.cmake
new file mode 100644
index 000000000..9c252ad17
--- /dev/null
+++ b/code/CMakeModules/FindMercurial.cmake
@@ -0,0 +1,108 @@
+# - Extract information from a subversion working copy
+# The module defines the following variables:
+# Mercurial_HG_EXECUTABLE - path to hg command line client
+# Mercurial_VERSION_HG - version of hg command line client
+# Mercurial_FOUND - true if the command line client was found
+# MERCURIAL_FOUND - same as Mercurial_FOUND, set for compatiblity reasons
+#
+# The minimum required version of Mercurial can be specified using the
+# standard syntax, e.g. FIND_PACKAGE(Mercurial 1.4)
+#
+# If the command line client executable is found two macros are defined:
+# Mercurial_WC_INFO(
)
+# Mercurial_WC_LOG( )
+# Mercurial_WC_INFO extracts information of a subversion working copy at
+# a given location. This macro defines the following variables:
+# _WC_URL - url of the repository (at )
+# _WC_ROOT - root url of the repository
+# _WC_REVISION - current revision
+# _WC_LAST_CHANGED_AUTHOR - author of last commit
+# _WC_LAST_CHANGED_DATE - date of last commit
+# _WC_LAST_CHANGED_REV - revision of last commit
+# _WC_INFO - output of command `hg info '
+# Mercurial_WC_LOG retrieves the log message of the base revision of a
+# subversion working copy at a given location. This macro defines the
+# variable:
+# _LAST_CHANGED_LOG - last log of base revision
+# Example usage:
+# FIND_PACKAGE(Mercurial)
+# IF(MERCURIAL_FOUND)
+# Mercurial_WC_INFO(${PROJECT_SOURCE_DIR} Project)
+# MESSAGE("Current revision is ${Project_WC_REVISION}")
+# Mercurial_WC_LOG(${PROJECT_SOURCE_DIR} Project)
+# MESSAGE("Last changed log is ${Project_LAST_CHANGED_LOG}")
+# ENDIF(MERCURIAL_FOUND)
+
+#=============================================================================
+# Copyright 2006-2009 Kitware, Inc.
+# Copyright 2006 Tristan Carel
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+FIND_PROGRAM(Mercurial_HG_EXECUTABLE hg
+ DOC "mercurial command line client")
+MARK_AS_ADVANCED(Mercurial_HG_EXECUTABLE)
+
+IF(Mercurial_HG_EXECUTABLE)
+ EXECUTE_PROCESS(COMMAND ${Mercurial_HG_EXECUTABLE} --version
+ OUTPUT_VARIABLE Mercurial_VERSION_HG
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ STRING(REGEX REPLACE ".*version ([\\.0-9]+).*"
+ "\\1" Mercurial_VERSION_HG "${Mercurial_VERSION_HG}")
+
+ MACRO(Mercurial_WC_INFO dir prefix)
+ EXECUTE_PROCESS(COMMAND ${Mercurial_HG_EXECUTABLE} tip
+ WORKING_DIRECTORY ${dir}
+ OUTPUT_VARIABLE ${prefix}_WC_INFO
+ ERROR_VARIABLE Mercurial_hg_info_error
+ RESULT_VARIABLE Mercurial_hg_info_result
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ IF(NOT ${Mercurial_hg_info_result} EQUAL 0)
+ MESSAGE(SEND_ERROR "Command \"${Mercurial_HG_EXECUTABLE} tip\" failed with output:\n${Mercurial_hg_info_error}")
+ ELSE(NOT ${Mercurial_hg_info_result} EQUAL 0)
+
+ STRING(REGEX REPLACE "^(.*\n)?Repository Root: ([^\n]+).*"
+ "\\2" ${prefix}_WC_ROOT "${${prefix}_WC_INFO}")
+ STRING(REGEX REPLACE "^(.*\n)?changeset: *([0-9]+).*"
+ "\\2" ${prefix}_WC_REVISION "${${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(NOT ${Mercurial_hg_info_result} EQUAL 0)
+
+ ENDMACRO(Mercurial_WC_INFO)
+
+ MACRO(Mercurial_WC_LOG dir prefix)
+ # This macro can block if the certificate is not signed:
+ # hg ask you to accept the certificate and wait for your answer
+ # This macro requires a hg server network access (Internet most of the time)
+ # and can also be slow since it access the hg server
+ EXECUTE_PROCESS(COMMAND
+ ${Mercurial_HG_EXECUTABLE} --non-interactive log -r BASE ${dir}
+ OUTPUT_VARIABLE ${prefix}_LAST_CHANGED_LOG
+ ERROR_VARIABLE Mercurial_hg_log_error
+ RESULT_VARIABLE Mercurial_hg_log_result
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ IF(NOT ${Mercurial_hg_log_result} EQUAL 0)
+ MESSAGE(SEND_ERROR "Command \"${Mercurial_HG_EXECUTABLE} log -r BASE ${dir}\" failed with output:\n${Mercurial_hg_log_error}")
+ ENDIF(NOT ${Mercurial_hg_log_result} EQUAL 0)
+ ENDMACRO(Mercurial_WC_LOG)
+ENDIF(Mercurial_HG_EXECUTABLE)
+
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Mercurial DEFAULT_MSG Mercurial_HG_EXECUTABLE)
diff --git a/code/CMakeModules/GetRevision.cmake b/code/CMakeModules/GetRevision.cmake
new file mode 100644
index 000000000..ee3fa2e90
--- /dev/null
+++ b/code/CMakeModules/GetRevision.cmake
@@ -0,0 +1,59 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6.3)
+
+# ROOT_DIR should be set to root of the repository (where to find the .svn or .hg directory)
+# SOURCE_DIR should be set to root of your code (where to find CMakeLists.txt)
+
+# Replace spaces by semi-columns
+IF(CMAKE_MODULE_PATH)
+ STRING(REPLACE " " ";" CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH})
+ENDIF(CMAKE_MODULE_PATH)
+
+SET(CMAKE_MODULE_PATH ${SOURCE_DIR}/CMakeModules ${CMAKE_MODULE_PATH})
+
+IF(NOT ROOT_DIR AND SOURCE_DIR)
+ SET(ROOT_DIR ${SOURCE_DIR})
+ENDIF(NOT ROOT_DIR AND SOURCE_DIR)
+
+IF(NOT SOURCE_DIR AND ROOT_DIR)
+ SET(SOURCE_DIR ${ROOT_DIR})
+ENDIF(NOT SOURCE_DIR AND ROOT_DIR)
+
+MACRO(NOW RESULT)
+ IF (WIN32)
+ EXECUTE_PROCESS(COMMAND "wmic" "os" "get" "localdatetime" OUTPUT_VARIABLE DATETIME)
+ IF(NOT DATETIME MATCHES "ERROR")
+ STRING(REGEX REPLACE ".*\n([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9]).*" "\\1-\\2-\\3 \\4:\\5:\\6" ${RESULT} "${DATETIME}")
+ ENDIF(NOT DATETIME MATCHES "ERROR")
+ ELSEIF(UNIX)
+ EXECUTE_PROCESS(COMMAND "date" "+'%Y-%m-%d %H:%M:%S'" OUTPUT_VARIABLE ${RESULT})
+ ELSE (WIN32)
+ MESSAGE(SEND_ERROR "date not implemented")
+ SET(${RESULT} "0000-00-00 00:00:00")
+ ENDIF (WIN32)
+ENDMACRO(NOW)
+
+IF(EXISTS "${ROOT_DIR}/.svn/")
+ FIND_PACKAGE(Subversion)
+
+ IF(SUBVERSION_FOUND)
+ Subversion_WC_INFO(${ROOT_DIR} ER)
+ SET(REVISION ${ER_WC_REVISION})
+ ENDIF(SUBVERSION_FOUND)
+ENDIF(EXISTS "${ROOT_DIR}/.svn/")
+
+IF(EXISTS "${ROOT_DIR}/.hg/")
+ FIND_PACKAGE(Mercurial)
+
+ IF(MERCURIAL_FOUND)
+ Mercurial_WC_INFO(${ROOT_DIR} ER)
+ SET(REVISION ${ER_WC_REVISION})
+ ENDIF(MERCURIAL_FOUND)
+ENDIF(EXISTS "${ROOT_DIR}/.hg/")
+
+IF(REVISION)
+ IF(EXISTS ${SOURCE_DIR}/revision.h.in)
+ NOW(BUILD_DATE)
+ CONFIGURE_FILE(${SOURCE_DIR}/revision.h.in revision.h.txt)
+ EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy revision.h.txt revision.h) # copy_if_different
+ ENDIF(EXISTS ${SOURCE_DIR}/revision.h.in)
+ENDIF(REVISION)
diff --git a/code/CMakeModules/PCHSupport.cmake b/code/CMakeModules/PCHSupport.cmake
index bb34aebfe..ae5b30ee2 100644
--- a/code/CMakeModules/PCHSupport.cmake
+++ b/code/CMakeModules/PCHSupport.cmake
@@ -8,44 +8,40 @@
# ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use
# ADD_NATIVE_PRECOMPILED_HEADER _targetName _inputh _inputcpp
-IF(CMAKE_COMPILER_IS_GNUCXX)
+IF(MSVC)
+ SET(PCHSupport_FOUND TRUE)
+ SET(_PCH_include_prefix "/I")
+ELSE(MSVC)
+ IF(CMAKE_COMPILER_IS_GNUCXX)
+ EXEC_PROGRAM(${CMAKE_CXX_COMPILER}
+ ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion
+ OUTPUT_VARIABLE gcc_compiler_version)
- EXEC_PROGRAM(
- ${CMAKE_CXX_COMPILER}
- ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion
- OUTPUT_VARIABLE gcc_compiler_version)
-
- IF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
- SET(PCHSupport_FOUND TRUE)
- ELSE(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
- IF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]")
+ IF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
SET(PCHSupport_FOUND TRUE)
- ENDIF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]")
- ENDIF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
+ ELSE(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
+ IF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]")
+ SET(PCHSupport_FOUND TRUE)
+ ENDIF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]")
+ ENDIF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
+ ELSE(CMAKE_COMPILER_IS_GNUCXX)
+ # TODO: make tests for other compilers than GCC
+ SET(PCHSupport_FOUND TRUE)
+ ENDIF(CMAKE_COMPILER_IS_GNUCXX)
SET(_PCH_include_prefix "-I")
-
-ELSE(CMAKE_COMPILER_IS_GNUCXX)
-
- IF(WIN32)
- SET(PCHSupport_FOUND TRUE) # for experimental msvc support
- SET(_PCH_include_prefix "/I")
- ELSE(WIN32)
- SET(PCHSupport_FOUND FALSE)
- ENDIF(WIN32)
-
-ENDIF(CMAKE_COMPILER_IS_GNUCXX)
+ENDIF(MSVC)
MACRO(_PCH_GET_COMPILE_FLAGS _out_compile_flags)
STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name)
SET(${_out_compile_flags} ${${_flags_var_name}} )
- IF(CMAKE_COMPILER_IS_GNUCXX)
+ IF(NOT MSVC)
GET_TARGET_PROPERTY(_targetType ${_PCH_current_target} TYPE)
IF(${_targetType} STREQUAL SHARED_LIBRARY OR ${_targetType} STREQUAL MODULE_LIBRARY)
LIST(APPEND ${_out_compile_flags} "-fPIC")
ENDIF(${_targetType} STREQUAL SHARED_LIBRARY OR ${_targetType} STREQUAL MODULE_LIBRARY)
- ENDIF(CMAKE_COMPILER_IS_GNUCXX)
+ ENDIF(NOT MSVC)
GET_DIRECTORY_PROPERTY(DIRINC INCLUDE_DIRECTORIES )
FOREACH(item ${DIRINC})
@@ -100,17 +96,13 @@ MACRO(_PCH_GET_COMPILE_COMMAND out_command _input _inputcpp _output)
SET(pchsupport_compiler_cxx_arg1 "")
ENDIF(CMAKE_CXX_COMPILER_ARG1)
- IF(CMAKE_COMPILER_IS_GNUCXX)
- SET(${out_command}
- ${CMAKE_CXX_COMPILER} ${pchsupport_compiler_cxx_arg1} ${_compile_FLAGS} -x c++-header -o ${_output} -c ${_input}
- )
- ELSE(CMAKE_COMPILER_IS_GNUCXX)
+ IF(MSVC)
_PCH_GET_PDB_FILENAME(PDB_FILE ${_PCH_current_target})
- SET(${out_command}
- ${CMAKE_CXX_COMPILER} ${pchsupport_compiler_cxx_arg1} ${_compile_FLAGS} /Yc /Fp\"${_output}\" ${_inputcpp} /c /Fd\"${PDB_FILE}\"
- )
- ENDIF(CMAKE_COMPILER_IS_GNUCXX)
-ENDMACRO(_PCH_GET_COMPILE_COMMAND )
+ SET(${out_command} ${CMAKE_CXX_COMPILER} ${pchsupport_compiler_cxx_arg1} ${_compile_FLAGS} /Yc /Fp\"${_output}\" ${_inputcpp} /c /Fd\"${PDB_FILE}\")
+ ELSE(MSVC)
+ SET(${out_command} ${CMAKE_CXX_COMPILER} ${pchsupport_compiler_cxx_arg1} ${_compile_FLAGS} -x c++-header -o ${_output} -c ${_input})
+ ENDIF(MSVC)
+ENDMACRO(_PCH_GET_COMPILE_COMMAND)
MACRO(GET_PRECOMPILED_HEADER_OUTPUT _targetName _input _output)
IF(MSVC)
@@ -128,7 +120,9 @@ MACRO(ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use )
SET(oldProps "")
ENDIF(${oldProps} MATCHES NOTFOUND)
- IF(CMAKE_COMPILER_IS_GNUCXX)
+ IF(MSVC)
+ SET(_target_cflags "${oldProps} /Yu\"${_input}\" /FI\"${_input}\" /Fp\"${_pch_output_to_use}\"")
+ ELSE(MSVC)
# to do: test whether compiler flags match between target _targetName
# and _pch_output_to_use
FILE(TO_NATIVE_PATH ${_pch_output_to_use} _native_pch_path)
@@ -137,11 +131,7 @@ MACRO(ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use )
# on all remote machines set
# PCH_ADDITIONAL_COMPILER_FLAGS to -fpch-preprocess
SET(_target_cflags "${oldProps} ${PCH_ADDITIONAL_COMPILER_FLAGS}-include ${_input} -Winvalid-pch")
- ELSE(CMAKE_COMPILER_IS_GNUCXX)
- IF(MSVC)
- SET(_target_cflags "${oldProps} /Yu\"${_input}\" /FI\"${_input}\" /Fp\"${_pch_output_to_use}\"")
- ENDIF(MSVC)
- ENDIF(CMAKE_COMPILER_IS_GNUCXX)
+ ENDIF(MSVC)
SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS ${_target_cflags})
IF(oldProps)
@@ -184,8 +174,31 @@ MACRO(ADD_PRECOMPILED_HEADER _targetName _inputh _inputcpp)
ADD_PRECOMPILED_HEADER_TO_TARGET(${_targetName} ${_inputh} ${_output})
ENDMACRO(ADD_PRECOMPILED_HEADER)
+# Macro to move PCH creation file to the front of files list
+MACRO(FIX_PRECOMPILED_HEADER _files _pch)
+ # Remove .cpp creating PCH from the list
+ LIST(REMOVE_ITEM ${_files} ${_pch})
+ # Prepend .cpp creating PCH to the list
+ LIST(INSERT ${_files} 0 ${_pch})
+ENDMACRO(FIX_PRECOMPILED_HEADER)
+
MACRO(ADD_NATIVE_PRECOMPILED_HEADER _targetName _inputh _inputcpp)
- IF(CMAKE_GENERATOR MATCHES Visual*)
+ SET(PCH_METHOD 0)
+
+ # 0 => creating a new target for PCH, works for all makefiles
+ # 1 => setting PCH for VC++ project, works for VC++ projects
+ # 2 => setting PCH for XCode project, works for XCode projects
+ IF(CMAKE_GENERATOR MATCHES "Visual Studio")
+ SET(PCH_METHOD 1)
+ ELSEIF(CMAKE_GENERATOR MATCHES "NMake Makefiles" AND MFC_FOUND AND CMAKE_MFC_FLAG)
+ # To fix a bug with MFC
+ # Don't forget to use FIX_PRECOMPILED_HEADER before creating the target
+# SET(PCH_METHOD 1)
+ ELSEIF(CMAKE_GENERATOR MATCHES "Xcode")
+ SET(PCH_METHOD 2)
+ ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio")
+
+ IF(PCH_METHOD EQUAL 1)
# Auto include the precompile (useful for moc processing, since the use of
# precompiled is specified at the target level
# and I don't want to specifiy /F- for each moc/res/ui generated files (using Qt)
@@ -200,26 +213,24 @@ MACRO(ADD_NATIVE_PRECOMPILED_HEADER _targetName _inputh _inputcpp)
#also inlude ${oldProps} to have the same compile options
SET_SOURCE_FILES_PROPERTIES(${_inputcpp} PROPERTIES COMPILE_FLAGS "${oldProps} /Yc\"${_inputh}\"")
- ELSE(CMAKE_GENERATOR MATCHES Visual*)
- IF(CMAKE_GENERATOR MATCHES Xcode)
- # For Xcode, cmake needs my patch to process
- # GCC_PREFIX_HEADER and GCC_PRECOMPILE_PREFIX_HEADER as target properties
+ ELSEIF(PCH_METHOD EQUAL 2)
+ # For Xcode, cmake needs my patch to process
+ # GCC_PREFIX_HEADER and GCC_PRECOMPILE_PREFIX_HEADER as target properties
- GET_TARGET_PROPERTY(oldProps ${_targetName} COMPILE_FLAGS)
- IF(${oldProps} MATCHES NOTFOUND)
- SET(oldProps "")
- ENDIF(${oldProps} MATCHES NOTFOUND)
+ GET_TARGET_PROPERTY(oldProps ${_targetName} COMPILE_FLAGS)
+ IF(${oldProps} MATCHES NOTFOUND)
+ SET(oldProps "")
+ ENDIF(${oldProps} MATCHES NOTFOUND)
- # When buiding out of the tree, precompiled may not be located
- # Use full path instead.
- GET_FILENAME_COMPONENT(fullPath ${_inputh} ABSOLUTE)
+ # When buiding out of the tree, precompiled may not be located
+ # Use full path instead.
+ GET_FILENAME_COMPONENT(fullPath ${_inputh} ABSOLUTE)
- SET_TARGET_PROPERTIES(${_targetName} PROPERTIES XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${fullPath}")
- SET_TARGET_PROPERTIES(${_targetName} PROPERTIES XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER "YES")
- ELSE(CMAKE_GENERATOR MATCHES Xcode)
- #Fallback to the "old" precompiled suppport
- ADD_PRECOMPILED_HEADER(${_targetName} ${_inputh} ${_inputcpp})
- ENDIF(CMAKE_GENERATOR MATCHES Xcode)
- ENDIF(CMAKE_GENERATOR MATCHES Visual*)
+ SET_TARGET_PROPERTIES(${_targetName} PROPERTIES XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${fullPath}")
+ SET_TARGET_PROPERTIES(${_targetName} PROPERTIES XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER "YES")
+ ELSE(PCH_METHOD EQUAL 1)
+ #Fallback to the "old" precompiled suppport
+ ADD_PRECOMPILED_HEADER(${_targetName} ${_inputh} ${_inputcpp})
+ ENDIF(PCH_METHOD EQUAL 1)
ENDMACRO(ADD_NATIVE_PRECOMPILED_HEADER)
diff --git a/code/CMakeModules/nel.cmake b/code/CMakeModules/nel.cmake
index 7dd43e8b4..bd92e743e 100644
--- a/code/CMakeModules/nel.cmake
+++ b/code/CMakeModules/nel.cmake
@@ -9,6 +9,33 @@ MACRO(NL_GEN_PC name)
ENDIF(NOT WIN32 AND WITH_INSTALL_LIBRARIES)
ENDMACRO(NL_GEN_PC)
+###
+# Helper macro that generates revision.h from revision.h.in
+###
+MACRO(NL_GEN_REVISION_H)
+ IF(EXISTS ${CMAKE_SOURCE_DIR}/revision.h.in)
+ INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR})
+ ADD_DEFINITIONS(-DHAVE_REVISION_H)
+ SET(HAVE_REVISION_H ON)
+
+ # a custom target that is always built
+ ADD_CUSTOM_TARGET(revision ALL
+ DEPENDS ${CMAKE_BINARY_DIR}/revision.h)
+
+ # creates revision.h using cmake script
+ ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/revision.h
+ COMMAND ${CMAKE_COMMAND}
+ -DSOURCE_DIR=${CMAKE_SOURCE_DIR}
+ -DROOT_DIR=${CMAKE_SOURCE_DIR}/..
+ -P ${CMAKE_SOURCE_DIR}/CMakeModules/GetRevision.cmake)
+
+ # revision.h is a generated file
+ SET_SOURCE_FILES_PROPERTIES(${CMAKE_BINARY_DIR}/revision.h
+ PROPERTIES GENERATED TRUE
+ HEADER_FILE_ONLY TRUE)
+ ENDIF(EXISTS ${CMAKE_SOURCE_DIR}/revision.h.in)
+ENDMACRO(NL_GEN_REVISION_H)
+
###
#
###
@@ -613,13 +640,19 @@ MACRO(SETUP_EXTERNAL)
ENDIF(${CMAKE_MAKE_PROGRAM} MATCHES "Common7")
ENDIF(MSVC10)
ELSE(WIN32)
- IF(CMAKE_FIND_LIBRARY_SUFFIXES AND NOT APPLE)
+ IF(APPLE)
IF(WITH_STATIC_EXTERNAL)
- SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
+ SET(CMAKE_FIND_LIBRARY_SUFFIXES .a .dylib .so)
ELSE(WITH_STATIC_EXTERNAL)
- SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so")
+ SET(CMAKE_FIND_LIBRARY_SUFFIXES .dylib .so .a)
ENDIF(WITH_STATIC_EXTERNAL)
- ENDIF(CMAKE_FIND_LIBRARY_SUFFIXES AND NOT APPLE)
+ ELSE(APPLE)
+ IF(WITH_STATIC_EXTERNAL)
+ SET(CMAKE_FIND_LIBRARY_SUFFIXES .a .so)
+ ELSE(WITH_STATIC_EXTERNAL)
+ SET(CMAKE_FIND_LIBRARY_SUFFIXES .so .a)
+ ENDIF(WITH_STATIC_EXTERNAL)
+ ENDIF(APPLE)
ENDIF(WIN32)
IF(WITH_STLPORT)
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.cpp
index 68e28429d..d82cdb63b 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.cpp
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.cpp
@@ -78,6 +78,18 @@ Core::IContext *ContextManager::context(const QString &id) const
return 0;
}
+void ContextManager::registerUndoStack(QUndoStack *stack)
+{
+ nlassert(stack);
+ d->m_mainWindow->undoGroup()->addStack(stack);
+}
+
+void ContextManager::unregisterUndoStack(QUndoStack *stack)
+{
+ nlassert(stack);
+ d->m_mainWindow->undoGroup()->removeStack(stack);
+}
+
void ContextManager::activateContext(const QString &id)
{
const int index = indexOf(id);
@@ -85,6 +97,11 @@ void ContextManager::activateContext(const QString &id)
d->m_tabWidget->setCurrentIndex(index);
}
+void ContextManager::updateCurrentContext()
+{
+ d->m_mainWindow->updateContext(currentContext());
+}
+
void ContextManager::objectAdded(QObject *obj)
{
IContext *context = qobject_cast(obj);
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.h
index 7a3658fff..8151648e7 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.h
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.h
@@ -26,6 +26,7 @@
QT_BEGIN_NAMESPACE
class QTabWidget;
+class QUndoStack;
QT_END_NAMESPACE
namespace Core
@@ -45,12 +46,17 @@ public:
Core::IContext *currentContext() const;
Core::IContext *context(const QString &id) const;
+ // temporary solution for multiple undo stacks per context
+ void registerUndoStack(QUndoStack *stack);
+ void unregisterUndoStack(QUndoStack *stack);
+
Q_SIGNALS:
// the default argument '=0' is important for connects without the oldContext argument.
void currentContextChanged(Core::IContext *context, Core::IContext *oldContext = 0);
public Q_SLOTS:
void activateContext(const QString &id);
+ void updateCurrentContext();
private Q_SLOTS:
void objectAdded(QObject *obj);
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_constants.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_constants.h
index 6eb7d41f4..18f3690a0 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_constants.h
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_constants.h
@@ -92,7 +92,7 @@ const char *const SEARCH_PATHS = "SearchPaths";
const char *const RECURSIVE_SEARCH_PATHS = "RecursiveSearchPathes";
const char *const LEVELDESIGN_PATH = "LevelDesignPath";
const char *const PRIMITIVES_PATH = "PrimitivesPath";
-const char * const ASSETS_PATH = "AssetsPath";
+const char *const ASSETS_PATH = "AssetsPath";
const char *const LIGOCONFIG_FILE = "LigoConfigFile";
const char *const REMAP_EXTENSIONS = "RemapExtensions";
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.cpp
index f00075b21..6e409e75d 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.cpp
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.cpp
@@ -128,6 +128,11 @@ QSettings *MainWindow::settings() const
return m_settings;
}
+QUndoGroup *MainWindow::undoGroup() const
+{
+ return m_undoGroup;
+}
+
ExtensionSystem::IPluginManager *MainWindow::pluginManager() const
{
return m_pluginManager;
@@ -135,12 +140,16 @@ ExtensionSystem::IPluginManager *MainWindow::pluginManager() const
void MainWindow::addContextObject(IContext *context)
{
- m_undoGroup->addStack(context->undoStack());
+ QUndoStack *stack = context->undoStack();
+ if (stack)
+ m_undoGroup->addStack(stack);
}
void MainWindow::removeContextObject(IContext *context)
{
- m_undoGroup->removeStack(context->undoStack());
+ QUndoStack *stack = context->undoStack();
+ if (stack)
+ m_undoGroup->removeStack(stack);
}
void MainWindow::open()
diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.h
index ae0d0522c..a75126823 100644
--- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.h
+++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.h
@@ -52,6 +52,7 @@ public:
MenuManager *menuManager() const;
ContextManager *contextManager() const;
QSettings *settings() const;
+ QUndoGroup *undoGroup() const;
ExtensionSystem::IPluginManager *pluginManager() const;
@@ -62,6 +63,7 @@ public Q_SLOTS:
bool showOptionsDialog(const QString &group = QString(),
const QString &page = QString(),
QWidget *parent = 0);
+ void updateContext(Core::IContext *context);
private Q_SLOTS:
void open();
@@ -77,7 +79,6 @@ private Q_SLOTS:
void gotoPos();
void setFullScreen(bool enabled);
void about();
- void updateContext(Core::IContext *context);
protected:
virtual void closeEvent(QCloseEvent *event);
diff --git a/code/revision.h.in b/code/revision.h.in
new file mode 100644
index 000000000..6c5e9b8b1
--- /dev/null
+++ b/code/revision.h.in
@@ -0,0 +1,7 @@
+#ifndef REVISION_H
+#define REVISION_H
+
+#cmakedefine REVISION "${REVISION}"
+#cmakedefine BUILD_DATE "${BUILD_DATE}"
+
+#endif
diff --git a/code/ryzom/client/data/gamedev/adds/sfx/marauder_teleporter.ps b/code/ryzom/client/data/gamedev/adds/sfx/marauder_teleporter.ps
new file mode 100644
index 000000000..cf6a508a9
Binary files /dev/null and b/code/ryzom/client/data/gamedev/adds/sfx/marauder_teleporter.ps differ
diff --git a/code/ryzom/client/data/gamedev/adds/shapes/GE_HOF_caster_pvp_pantabottes.shape b/code/ryzom/client/data/gamedev/adds/shapes/GE_HOF_caster_pvp_pantabottes.shape
new file mode 100644
index 000000000..713018df8
Binary files /dev/null and b/code/ryzom/client/data/gamedev/adds/shapes/GE_HOF_caster_pvp_pantabottes.shape differ
diff --git a/code/ryzom/client/data/gamedev/adds/shapes/GE_HOM_caster_pvp_pantabottes.shape b/code/ryzom/client/data/gamedev/adds/shapes/GE_HOM_caster_pvp_pantabottes.shape
new file mode 100644
index 000000000..b3fb8f6ca
Binary files /dev/null and b/code/ryzom/client/data/gamedev/adds/shapes/GE_HOM_caster_pvp_pantabottes.shape differ
diff --git a/code/ryzom/client/data/gamedev/adds/shapes/GE_pvp_big_shield.shape b/code/ryzom/client/data/gamedev/adds/shapes/GE_pvp_big_shield.shape
new file mode 100644
index 000000000..c72f5304e
Binary files /dev/null and b/code/ryzom/client/data/gamedev/adds/shapes/GE_pvp_big_shield.shape differ
diff --git a/code/ryzom/client/data/gamedev/adds/shapes/tp_diamand.shape b/code/ryzom/client/data/gamedev/adds/shapes/tp_diamand.shape
new file mode 100644
index 000000000..147ff3abb
Binary files /dev/null and b/code/ryzom/client/data/gamedev/adds/shapes/tp_diamand.shape differ
diff --git a/code/ryzom/client/data/gamedev/adds/shapes/tp_socle.shape b/code/ryzom/client/data/gamedev/adds/shapes/tp_socle.shape
new file mode 100644
index 000000000..4a3eea639
Binary files /dev/null and b/code/ryzom/client/data/gamedev/adds/shapes/tp_socle.shape differ
diff --git a/code/ryzom/client/data/gamedev/adds/textures/event_refday_yber.tga b/code/ryzom/client/data/gamedev/adds/textures/event_refday_yber.tga
new file mode 100644
index 000000000..b8e05a831
Binary files /dev/null and b/code/ryzom/client/data/gamedev/adds/textures/event_refday_yber.tga differ
diff --git a/code/ryzom/client/data/gamedev/adds/textures/gn_pvp_dress.tga b/code/ryzom/client/data/gamedev/adds/textures/gn_pvp_dress.tga
new file mode 100644
index 000000000..026711a84
Binary files /dev/null and b/code/ryzom/client/data/gamedev/adds/textures/gn_pvp_dress.tga differ
diff --git a/code/ryzom/client/data/gamedev/adds/textures/gn_pvp_dress_hof.tga b/code/ryzom/client/data/gamedev/adds/textures/gn_pvp_dress_hof.tga
new file mode 100644
index 000000000..83f18a9b3
Binary files /dev/null and b/code/ryzom/client/data/gamedev/adds/textures/gn_pvp_dress_hof.tga differ
diff --git a/code/ryzom/client/data/gamedev/adds/textures/ul_mission_hall_of_fame.dds b/code/ryzom/client/data/gamedev/adds/textures/ul_mission_hall_of_fame.dds
new file mode 100644
index 000000000..03f9e0442
Binary files /dev/null and b/code/ryzom/client/data/gamedev/adds/textures/ul_mission_hall_of_fame.dds differ
diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/texture_interfaces_v3.txt b/code/ryzom/client/data/gamedev/interfaces_v3/texture_interfaces_v3.txt
new file mode 100644
index 000000000..11fb51519
--- /dev/null
+++ b/code/ryzom/client/data/gamedev/interfaces_v3/texture_interfaces_v3.txt
@@ -0,0 +1,1145 @@
+r2ed_create_location.tga 0.000000000000 0.000000000000 0.195312500000 0.195312500000
+w_radar.tga 0.195312500000 0.000000000000 0.320312500000 0.125000000000
+skin_blank.tga 0.320312500000 0.000000000000 0.445312500000 0.125000000000
+skin_l1_blank.tga 0.195312500000 0.125000000000 0.320312500000 0.250000000000
+skin_header_m.tga 0.000000000000 0.250000000000 0.250000000000 0.281250000000
+r2ed_spring.tga 0.320312500000 0.125000000000 0.398437500000 0.203125000000
+r2ed_fall.tga 0.398437500000 0.125000000000 0.476562500000 0.203125000000
+r2ed_summer.tga 0.320312500000 0.203125000000 0.398437500000 0.281250000000
+r2ed_winter.tga 0.398437500000 0.203125000000 0.476562500000 0.281250000000
+r2_forest_back.tga 0.250000000000 0.250000000000 0.312500000000 0.312500000000
+r2_lakes_back.tga 0.000000000000 0.281250000000 0.062500000000 0.343750000000
+r2ed_previousLocations.tga 0.062500000000 0.281250000000 0.125000000000 0.343750000000
+r2ed_newLocation.tga 0.125000000000 0.281250000000 0.187500000000 0.343750000000
+r2ed_strictRules.tga 0.187500000000 0.281250000000 0.250000000000 0.343750000000
+r2ed_liberalRules.tga 0.312500000000 0.281250000000 0.375000000000 0.343750000000
+r2_jungle_back.tga 0.375000000000 0.281250000000 0.437500000000 0.343750000000
+r2_roots_back.tga 0.437500000000 0.281250000000 0.500000000000 0.343750000000
+r2_desert_back.tga 0.250000000000 0.312500000000 0.312500000000 0.375000000000
+r2_map_edge_arrow.tga 0.000000000000 0.375000000000 0.500000000000 0.381835937500
+W_slot_jauge_3.tga 0.000000000000 0.195312500000 0.123046875000 0.220703125000
+bulle_ia.tga 0.125000000000 0.195312500000 0.187500000000 0.242187500000
+jauge.tga 0.000000000000 0.343750000000 0.152343750000 0.359375000000
+slot_jauge.tga 0.312500000000 0.343750000000 0.464843750000 0.359375000000
+w_slot_categorie.tga 0.445312500000 0.000000000000 0.492187500000 0.046875000000
+w_slot_icon.tga 0.445312500000 0.046875000000 0.492187500000 0.093750000000
+r2_main_menu_full.tga 0.152343750000 0.343750000000 0.218750000000 0.375000000000
+r2_main_menu_full_over.tga 0.000000000000 0.382812500000 0.066406250000 0.414062500000
+r2_main_menu_full_pushed.tga 0.066406250000 0.382812500000 0.132812500000 0.414062500000
+item_selection.tga 0.132812500000 0.382812500000 0.177734375000 0.427734375000
+skin_m_open.tga 0.476562500000 0.093750000000 0.492187500000 0.218750000000
+jauge_action.tga 0.000000000000 0.222656250000 0.089843750000 0.242187500000
+slot_jauge_action.tga 0.179687500000 0.382812500000 0.269531250000 0.402343750000
+W_slot_item_selected.tga 0.269531250000 0.382812500000 0.310546875000 0.423828125000
+W_slot_item.tga 0.312500000000 0.382812500000 0.353515625000 0.423828125000
+r2ed_tool_draw_road_pushed.tga 0.355468750000 0.382812500000 0.398437500000 0.420898437500
+r2ed_tool_freeze_object.tga 0.398437500000 0.382812500000 0.441406250000 0.420898437500
+r2ed_tool_freeze_object_over.tga 0.441406250000 0.382812500000 0.484375000000 0.420898437500
+r2ed_tool_freeze_object_pushed.tga 0.179687500000 0.402343750000 0.222656250000 0.440429687500
+r2ed_tool_go_test.tga 0.222656250000 0.402343750000 0.265625000000 0.440429687500
+r2ed_tool_go_test_over.tga 0.000000000000 0.414062500000 0.042968750000 0.452148437500
+r2ed_tool_go_test_pushed.tga 0.042968750000 0.414062500000 0.085937500000 0.452148437500
+r2ed_tool_map_window.tga 0.085937500000 0.414062500000 0.128906250000 0.452148437500
+r2ed_tool_map_window_over.tga 0.355468750000 0.421875000000 0.398437500000 0.459960937500
+r2ed_tool_map_window_pushed.tga 0.398437500000 0.421875000000 0.441406250000 0.459960937500
+r2ed_tool_palette_window_over.tga 0.441406250000 0.421875000000 0.484375000000 0.459960937500
+r2ed_tool_palette_window_pushed.tga 0.265625000000 0.425781250000 0.308593750000 0.463867187500
+r2ed_tool_paste.tga 0.308593750000 0.425781250000 0.351562500000 0.463867187500
+r2ed_tool_paste_over.tga 0.128906250000 0.429687500000 0.171875000000 0.467773437500
+r2ed_tool_paste_pushed.tga 0.171875000000 0.441406250000 0.214843750000 0.479492187500
+r2ed_tool_pick.tga 0.214843750000 0.441406250000 0.257812500000 0.479492187500
+r2ed_tool_prim_display_mode.tga 0.000000000000 0.453125000000 0.042968750000 0.491210937500
+r2ed_tool_prim_display_mode_over.tga 0.042968750000 0.453125000000 0.085937500000 0.491210937500
+r2ed_tool_prim_display_mode_pushed.tga 0.085937500000 0.453125000000 0.128906250000 0.491210937500
+r2ed_tool_redo.tga 0.351562500000 0.460937500000 0.394531250000 0.499023437500
+r2ed_tool_redo_disabled.tga 0.394531250000 0.460937500000 0.437500000000 0.499023437500
+r2ed_tool_redo_over.tga 0.437500000000 0.460937500000 0.480468750000 0.499023437500
+r2ed_tool_redo_pushed.tga 0.492187500000 0.000000000000 0.535156250000 0.038085937500
+r2ed_tool_rotate.tga 0.535156250000 0.000000000000 0.578125000000 0.038085937500
+r2ed_tool_rotate_pushed.tga 0.578125000000 0.000000000000 0.621093750000 0.038085937500
+r2ed_tool_rotating.tga 0.621093750000 0.000000000000 0.664062500000 0.038085937500
+r2ed_tool_scenario_window.tga 0.664062500000 0.000000000000 0.707031250000 0.038085937500
+r2ed_tool_scenario_window_over.tga 0.707031250000 0.000000000000 0.750000000000 0.038085937500
+r2ed_tool_scenario_window_pushed.tga 0.750000000000 0.000000000000 0.792968750000 0.038085937500
+r2ed_tool_select.tga 0.792968750000 0.000000000000 0.835937500000 0.038085937500
+r2ed_tool_select_move.tga 0.835937500000 0.000000000000 0.878906250000 0.038085937500
+r2ed_tool_select_move_over.tga 0.878906250000 0.000000000000 0.921875000000 0.038085937500
+r2ed_tool_select_move_pushed.tga 0.921875000000 0.000000000000 0.964843750000 0.038085937500
+r2ed_tool_select_over.tga 0.492187500000 0.039062500000 0.535156250000 0.077148437500
+r2ed_tool_select_pushed.tga 0.535156250000 0.039062500000 0.578125000000 0.077148437500
+r2ed_tool_start.tga 0.578125000000 0.039062500000 0.621093750000 0.077148437500
+r2ed_tool_start_over.tga 0.621093750000 0.039062500000 0.664062500000 0.077148437500
+r2ed_tool_start_pushed.tga 0.664062500000 0.039062500000 0.707031250000 0.077148437500
+r2ed_tool_stop_over.tga 0.707031250000 0.039062500000 0.750000000000 0.077148437500
+r2ed_tool_stop_pushed.tga 0.750000000000 0.039062500000 0.792968750000 0.077148437500
+r2ed_tool_teleport.tga 0.792968750000 0.039062500000 0.835937500000 0.077148437500
+r2ed_tool_teleport_over.tga 0.835937500000 0.039062500000 0.878906250000 0.077148437500
+r2ed_tool_teleport_pushed.tga 0.878906250000 0.039062500000 0.921875000000 0.077148437500
+r2ed_tool_undo.tga 0.921875000000 0.039062500000 0.964843750000 0.077148437500
+r2ed_tool_undo_disabled.tga 0.492187500000 0.078125000000 0.535156250000 0.116210937500
+r2ed_tool_undo_over.tga 0.535156250000 0.078125000000 0.578125000000 0.116210937500
+r2ed_tool_undo_pushed.tga 0.578125000000 0.078125000000 0.621093750000 0.116210937500
+r2ed_tool_unfreeze_object.tga 0.621093750000 0.078125000000 0.664062500000 0.116210937500
+r2ed_tool_unfreeze_object_over.tga 0.664062500000 0.078125000000 0.707031250000 0.116210937500
+r2ed_tool_unfreeze_object_pushed.tga 0.707031250000 0.078125000000 0.750000000000 0.116210937500
+curs_scale.tga 0.750000000000 0.078125000000 0.792968750000 0.116210937500
+curs_stop.tga 0.792968750000 0.078125000000 0.835937500000 0.116210937500
+r2ed_feature_kitins_lair.tga 0.835937500000 0.078125000000 0.878906250000 0.116210937500
+r2ed_feature_kitins_lair_over.tga 0.878906250000 0.078125000000 0.921875000000 0.116210937500
+r2ed_tool_can_pick.tga 0.921875000000 0.078125000000 0.964843750000 0.116210937500
+r2ed_tool_can_rotate.tga 0.492187500000 0.117187500000 0.535156250000 0.155273437500
+r2ed_tool_can_rotate_over.tga 0.535156250000 0.117187500000 0.578125000000 0.155273437500
+r2ed_tool_can_rotate_pushed.tga 0.578125000000 0.117187500000 0.621093750000 0.155273437500
+r2ed_tool_copy.tga 0.621093750000 0.117187500000 0.664062500000 0.155273437500
+r2ed_tool_copy_over.tga 0.664062500000 0.117187500000 0.707031250000 0.155273437500
+r2ed_tool_copy_pushed.tga 0.707031250000 0.117187500000 0.750000000000 0.155273437500
+r2ed_tool_display_mode.tga 0.750000000000 0.117187500000 0.792968750000 0.155273437500
+r2ed_tool_display_mode_over.tga 0.792968750000 0.117187500000 0.835937500000 0.155273437500
+r2ed_tool_display_mode_pushed.tga 0.835937500000 0.117187500000 0.878906250000 0.155273437500
+r2_hand_can_pan.tga 0.878906250000 0.117187500000 0.921875000000 0.155273437500
+r2_hand_pan.tga 0.921875000000 0.117187500000 0.964843750000 0.155273437500
+r2_icon_dm_mode.tga 0.492187500000 0.156250000000 0.535156250000 0.194335937500
+r2_icon_dm_mode_over.tga 0.535156250000 0.156250000000 0.578125000000 0.194335937500
+r2ed_feature_kitins_lair_pushed.tga 0.578125000000 0.156250000000 0.621093750000 0.194335937500
+r2_stop_live_pushed.tga 0.621093750000 0.156250000000 0.664062500000 0.194335937500
+curs_create.tga 0.664062500000 0.156250000000 0.707031250000 0.194335937500
+curs_create_multi.tga 0.707031250000 0.156250000000 0.750000000000 0.194335937500
+curs_create_vertex_invalid.tga 0.750000000000 0.156250000000 0.792968750000 0.194335937500
+curs_default.tga 0.792968750000 0.156250000000 0.835937500000 0.194335937500
+curs_dup.tga 0.835937500000 0.156250000000 0.878906250000 0.194335937500
+curs_pan.tga 0.878906250000 0.156250000000 0.921875000000 0.194335937500
+curs_pan_dup.tga 0.921875000000 0.156250000000 0.964843750000 0.194335937500
+curs_pick.tga 0.492187500000 0.195312500000 0.535156250000 0.233398437500
+curs_pick_dup.tga 0.535156250000 0.195312500000 0.578125000000 0.233398437500
+curs_resize_bl_tr.tga 0.578125000000 0.195312500000 0.621093750000 0.233398437500
+curs_resize_br_tl.tga 0.621093750000 0.195312500000 0.664062500000 0.233398437500
+curs_resize_lr.tga 0.664062500000 0.195312500000 0.707031250000 0.233398437500
+curs_resize_tb.tga 0.707031250000 0.195312500000 0.750000000000 0.233398437500
+r2_player_admin.tga 0.750000000000 0.195312500000 0.792968750000 0.233398437500
+r2_player_admin_over.tga 0.792968750000 0.195312500000 0.835937500000 0.233398437500
+r2_player_admin_pushed.tga 0.835937500000 0.195312500000 0.878906250000 0.233398437500
+r2ed_feature_loot_spawner.tga 0.878906250000 0.195312500000 0.921875000000 0.233398437500
+r2_scenario_admin.tga 0.921875000000 0.195312500000 0.964843750000 0.233398437500
+r2_scenario_admin_over.tga 0.476562500000 0.234375000000 0.519531250000 0.272460937500
+r2_scenario_admin_pushed.tga 0.519531250000 0.234375000000 0.562500000000 0.272460937500
+r2ed_feature_loot_spawner_over.tga 0.562500000000 0.234375000000 0.605468750000 0.272460937500
+r2ed_feature_loot_spawner_pushed.tga 0.605468750000 0.234375000000 0.648437500000 0.272460937500
+r2ed_feature_timer.tga 0.648437500000 0.234375000000 0.691406250000 0.272460937500
+r2ed_feature_timer_over.tga 0.691406250000 0.234375000000 0.734375000000 0.272460937500
+r2ed_feature_timer_pushed.tga 0.734375000000 0.234375000000 0.777343750000 0.272460937500
+r2ed_tool_stop.tga 0.777343750000 0.234375000000 0.820312500000 0.272460937500
+r2ed_feature_fauna_pushed.tga 0.820312500000 0.234375000000 0.863281250000 0.272460937500
+r2ed_feature_fauna_system.tga 0.863281250000 0.234375000000 0.906250000000 0.272460937500
+curs_can_pan.tga 0.906250000000 0.234375000000 0.949218750000 0.272460937500
+r2ed_feature_fauna_system_over.tga 0.949218750000 0.234375000000 0.992187500000 0.272460937500
+r2_icon_dm_mode_pushed.tga 0.500000000000 0.273437500000 0.542968750000 0.311523437500
+curs_can_pan_dup.tga 0.542968750000 0.273437500000 0.585937500000 0.311523437500
+r2_stop_live_over.tga 0.585937500000 0.273437500000 0.628906250000 0.311523437500
+curs_rotate.tga 0.628906250000 0.273437500000 0.671875000000 0.311523437500
+r2ed_feature_fauna_over.tga 0.671875000000 0.273437500000 0.714843750000 0.311523437500
+r2ed_feature_fauna_system_pushed.tga 0.714843750000 0.273437500000 0.757812500000 0.311523437500
+r2ed_feature_bandit_camp.tga 0.757812500000 0.273437500000 0.800781250000 0.311523437500
+r2ed_feature_bandit_camp_over.tga 0.800781250000 0.273437500000 0.843750000000 0.311523437500
+r2ed_feature_bandit_camp_pushed.tga 0.843750000000 0.273437500000 0.886718750000 0.311523437500
+r2ed_feature_fauna.tga 0.886718750000 0.273437500000 0.929687500000 0.311523437500
+r2ed_tool_draw_region.tga 0.929687500000 0.273437500000 0.972656250000 0.311523437500
+r2_stop_live.tga 0.500000000000 0.312500000000 0.542968750000 0.350585937500
+r2ed_create_dialog.tga 0.542968750000 0.312500000000 0.585937500000 0.350585937500
+r2ed_create_dialog_over.tga 0.585937500000 0.312500000000 0.628906250000 0.350585937500
+r2ed_create_dialog_pushed.tga 0.628906250000 0.312500000000 0.671875000000 0.350585937500
+r2ed_tool_palette_window.tga 0.671875000000 0.312500000000 0.714843750000 0.350585937500
+r2ed_tool_rotate_over.tga 0.714843750000 0.312500000000 0.757812500000 0.350585937500
+r2ed_tool_draw_region_over.tga 0.757812500000 0.312500000000 0.800781250000 0.350585937500
+r2ed_tool_draw_region_pushed.tga 0.800781250000 0.312500000000 0.843750000000 0.350585937500
+r2ed_tool_draw_road.tga 0.843750000000 0.312500000000 0.886718750000 0.350585937500
+r2ed_tool_draw_road_over.tga 0.886718750000 0.312500000000 0.929687500000 0.350585937500
+w_ar_gilet.tga 0.929687500000 0.312500000000 0.968750000000 0.351562500000
+w_ar_hand.tga 0.500000000000 0.351562500000 0.539062500000 0.390625000000
+w_ar_helmet.tga 0.539062500000 0.351562500000 0.578125000000 0.390625000000
+hand_left.tga 0.578125000000 0.351562500000 0.617187500000 0.390625000000
+hand_right.tga 0.617187500000 0.351562500000 0.656250000000 0.390625000000
+sapload.tga 0.656250000000 0.351562500000 0.695312500000 0.390625000000
+w_ar_pantabotte.tga 0.695312500000 0.351562500000 0.734375000000 0.390625000000
+w_ar_armpad.tga 0.734375000000 0.351562500000 0.773437500000 0.390625000000
+w_ar_botte.tga 0.773437500000 0.351562500000 0.812500000000 0.390625000000
+skin_l2.tga 0.992187500000 0.000000000000 0.998046875000 0.250000000000
+r2_map_edge_stipple.tga 0.484375000000 0.390625000000 0.984375000000 0.393554687500
+r2_main_bl.tga 0.812500000000 0.351562500000 0.851562500000 0.383789062500
+W_slot_jauge_1.tga 0.851562500000 0.351562500000 0.974609375000 0.361328125000
+w_slot_blason.tga 0.484375000000 0.394531250000 0.517578125000 0.427734375000
+w_slot_blason_over.tga 0.519531250000 0.394531250000 0.552734375000 0.427734375000
+w_header_l.tga 0.851562500000 0.363281250000 0.898437500000 0.386718750000
+bg_source_mid.tga 0.000000000000 0.242187500000 0.148437500000 0.249023437500
+r2_icon_weather_pushed.tga 0.445312500000 0.093750000000 0.476562500000 0.125000000000
+Skin_scroll_H.tga 0.000000000000 0.359375000000 0.125000000000 0.367187500000
+skin_scroll_m.tga 0.964843750000 0.000000000000 0.972656250000 0.125000000000
+r2_toolbar_customize_look.tga 0.968750000000 0.312500000000 1.000000000000 0.343750000000
+r2_toolbar_customize_look_over.tga 0.218750000000 0.343750000000 0.250000000000 0.375000000000
+r2_toolbar_kill.tga 0.464843750000 0.343750000000 0.496093750000 0.375000000000
+r2_toolbar_kill_over.tga 0.554687500000 0.394531250000 0.585937500000 0.425781250000
+r2_toolbar_kill_pushed.tga 0.585937500000 0.394531250000 0.617187500000 0.425781250000
+r2_toolbar_patrol_road.tga 0.617187500000 0.394531250000 0.648437500000 0.425781250000
+r2_toolbar_patrol_road_over.tga 0.648437500000 0.394531250000 0.679687500000 0.425781250000
+r2_toolbar_patrol_road_pushed.tga 0.679687500000 0.394531250000 0.710937500000 0.425781250000
+r2_toolbar_properties.tga 0.710937500000 0.394531250000 0.742187500000 0.425781250000
+r2_toolbar_properties_over.tga 0.742187500000 0.394531250000 0.773437500000 0.425781250000
+r2_toolbar_properties_pushed.tga 0.773437500000 0.394531250000 0.804687500000 0.425781250000
+r2_toolbar_repeat_road.tga 0.804687500000 0.394531250000 0.835937500000 0.425781250000
+r2_toolbar_repeat_road_over.tga 0.835937500000 0.394531250000 0.867187500000 0.425781250000
+r2_toolbar_repeat_road_pushed.tga 0.867187500000 0.394531250000 0.898437500000 0.425781250000
+r2_toolbar_set_as_leader.tga 0.898437500000 0.394531250000 0.929687500000 0.425781250000
+r2_toolbar_set_as_leader_over.tga 0.929687500000 0.394531250000 0.960937500000 0.425781250000
+r2_toolbar_stand_still.tga 0.960937500000 0.394531250000 0.992187500000 0.425781250000
+r2_toolbar_stand_still_over.tga 0.554687500000 0.425781250000 0.585937500000 0.457031250000
+r2_toolbar_stand_still_pushed.tga 0.585937500000 0.425781250000 0.617187500000 0.457031250000
+r2_toolbar_ungroup.tga 0.617187500000 0.425781250000 0.648437500000 0.457031250000
+r2_toolbar_ungroup_over.tga 0.648437500000 0.425781250000 0.679687500000 0.457031250000
+r2_toolbar_ungroup_pushed.tga 0.679687500000 0.425781250000 0.710937500000 0.457031250000
+r2_toolbar_wander_zone.tga 0.710937500000 0.425781250000 0.742187500000 0.457031250000
+r2_toolbar_wander_zone_over.tga 0.742187500000 0.425781250000 0.773437500000 0.457031250000
+r2_toolbar_wander_zone_pushed.tga 0.773437500000 0.425781250000 0.804687500000 0.457031250000
+r2ed_toolbar_hunt_zone.tga 0.804687500000 0.425781250000 0.835937500000 0.457031250000
+r2ed_toolbar_hunt_zone_over.tga 0.835937500000 0.425781250000 0.867187500000 0.457031250000
+r2ed_toolbar_hunt_zone_pushed.tga 0.867187500000 0.425781250000 0.898437500000 0.457031250000
+r2ed_toolbar_lock.tga 0.898437500000 0.425781250000 0.929687500000 0.457031250000
+r2ed_toolbar_lock_over.tga 0.929687500000 0.425781250000 0.960937500000 0.457031250000
+curs_l.tga 0.960937500000 0.425781250000 0.992187500000 0.457031250000
+curs_L_no_mouse.tga 0.484375000000 0.429687500000 0.515625000000 0.460937500000
+r2ed_toolbar_lock_pushed.tga 0.515625000000 0.429687500000 0.546875000000 0.460937500000
+r2ed_toolbar_rest_zone.tga 0.546875000000 0.457031250000 0.578125000000 0.488281250000
+r2ed_toolbar_rest_zone_over.tga 0.578125000000 0.457031250000 0.609375000000 0.488281250000
+r2ed_toolbar_rest_zone_pushed.tga 0.609375000000 0.457031250000 0.640625000000 0.488281250000
+curs_r.tga 0.640625000000 0.457031250000 0.671875000000 0.488281250000
+r2ed_toolbar_show.tga 0.671875000000 0.457031250000 0.703125000000 0.488281250000
+r2ed_toolbar_show_over.tga 0.703125000000 0.457031250000 0.734375000000 0.488281250000
+r2ed_toolbar_show_pushed.tga 0.734375000000 0.457031250000 0.765625000000 0.488281250000
+r2ed_toolbar_unfreeze.tga 0.765625000000 0.457031250000 0.796875000000 0.488281250000
+r2ed_current_act_content_over.tga 0.796875000000 0.457031250000 0.828125000000 0.488281250000
+r2ed_current_act_content_pushed.tga 0.828125000000 0.457031250000 0.859375000000 0.488281250000
+r2ed_edit_dialog.tga 0.859375000000 0.457031250000 0.890625000000 0.488281250000
+r2ed_edit_dialog_over.tga 0.890625000000 0.457031250000 0.921875000000 0.488281250000
+r2ed_edit_dialog_pushed.tga 0.921875000000 0.457031250000 0.953125000000 0.488281250000
+r2_icon_possess.tga 0.953125000000 0.457031250000 0.984375000000 0.488281250000
+r2_icon_possess_over.tga 0.480468750000 0.460937500000 0.511718750000 0.492187500000
+r2_icon_possess_pushed.tga 0.511718750000 0.460937500000 0.542968750000 0.492187500000
+r2_icon_speak_as.tga 0.257812500000 0.464843750000 0.289062500000 0.496093750000
+r2_icon_speak_as_over.tga 0.289062500000 0.464843750000 0.320312500000 0.496093750000
+r2_icon_speak_as_pushed.tga 0.320312500000 0.464843750000 0.351562500000 0.496093750000
+r2ed_toolbar_unfreeze_over.tga 0.128906250000 0.468750000000 0.160156250000 0.500000000000
+r2ed_toolbar_unlock.tga 0.160156250000 0.480468750000 0.191406250000 0.511718750000
+r2ed_toolbar_unlock_over.tga 0.191406250000 0.480468750000 0.222656250000 0.511718750000
+r2ed_toolbar_unlock_pushed.tga 0.222656250000 0.480468750000 0.253906250000 0.511718750000
+r2_scenario.tga 0.542968750000 0.488281250000 0.574218750000 0.519531250000
+r2ed_toolbar_work_zone.tga 0.574218750000 0.488281250000 0.605468750000 0.519531250000
+r2ed_toolbar_work_zone_over.tga 0.605468750000 0.488281250000 0.636718750000 0.519531250000
+r2ed_toolbar_work_zone_pushed.tga 0.636718750000 0.488281250000 0.667968750000 0.519531250000
+r2ed_tool_new_vertex.tga 0.667968750000 0.488281250000 0.699218750000 0.519531250000
+r2ed_tool_new_vertex_over.tga 0.699218750000 0.488281250000 0.730468750000 0.519531250000
+ia_surpris.tga 0.730468750000 0.488281250000 0.761718750000 0.519531250000
+r2ed_tool_new_vertex_pushed.tga 0.761718750000 0.488281250000 0.792968750000 0.519531250000
+r2ed_permanent_content.tga 0.792968750000 0.488281250000 0.824218750000 0.519531250000
+r2ed_permanent_content_over.tga 0.824218750000 0.488281250000 0.855468750000 0.519531250000
+r2ed_toolbar_hide_pushed.tga 0.855468750000 0.488281250000 0.886718750000 0.519531250000
+r2ed_toolbar_unfreeze_pushed.tga 0.886718750000 0.488281250000 0.917968750000 0.519531250000
+r2ed_permanent_content_pushed.tga 0.917968750000 0.488281250000 0.949218750000 0.519531250000
+r2ed_current_act_content.tga 0.949218750000 0.488281250000 0.980468750000 0.519531250000
+skin_l.tga 0.972656250000 0.000000000000 0.980468750000 0.125000000000
+r2_frustum.tga 0.000000000000 0.492187500000 0.031250000000 0.523437500000
+r2ed_toolbar_feed_zone.tga 0.031250000000 0.492187500000 0.062500000000 0.523437500000
+r2ed_toolbar_feed_zone_over.tga 0.062500000000 0.492187500000 0.093750000000 0.523437500000
+r2ed_toolbar_feed_zone_pushed.tga 0.093750000000 0.492187500000 0.125000000000 0.523437500000
+r2ed_toolbar_freeze.tga 0.480468750000 0.492187500000 0.511718750000 0.523437500000
+r2ed_toolbar_freeze_over.tga 0.511718750000 0.492187500000 0.542968750000 0.523437500000
+r2ed_toolbar_freeze_pushed.tga 0.253906250000 0.496093750000 0.285156250000 0.527343750000
+r2ed_toolbar_guard_zone.tga 0.285156250000 0.496093750000 0.316406250000 0.527343750000
+r2ed_toolbar_guard_zone_over.tga 0.316406250000 0.496093750000 0.347656250000 0.527343750000
+r2ed_toolbar_guard_zone_pushed.tga 0.125000000000 0.500000000000 0.156250000000 0.531250000000
+r2ed_toolbar_hide.tga 0.347656250000 0.500000000000 0.378906250000 0.531250000000
+r2ed_toolbar_hide_over.tga 0.378906250000 0.500000000000 0.410156250000 0.531250000000
+r2ed_tool_extend_prim.tga 0.410156250000 0.500000000000 0.441406250000 0.531250000000
+r2ed_tool_extend_prim_over.tga 0.441406250000 0.500000000000 0.472656250000 0.531250000000
+r2_icon_acts.tga 0.156250000000 0.511718750000 0.187500000000 0.542968750000
+r2_icon_animation_triggers.tga 0.187500000000 0.511718750000 0.218750000000 0.542968750000
+r2_icon_acts_over.tga 0.218750000000 0.511718750000 0.250000000000 0.542968750000
+r2_icon_stop_acts.tga 0.542968750000 0.519531250000 0.574218750000 0.550781250000
+r2_icon_acts_pushed.tga 0.574218750000 0.519531250000 0.605468750000 0.550781250000
+r2_icon_add_hp.tga 0.605468750000 0.519531250000 0.636718750000 0.550781250000
+r2_toolbar_customize_look_pushed.tga 0.636718750000 0.519531250000 0.667968750000 0.550781250000
+r2_toolbar_group_pushed.tga 0.667968750000 0.519531250000 0.699218750000 0.550781250000
+r2_toolbar_set_as_leader_pushed.tga 0.699218750000 0.519531250000 0.730468750000 0.550781250000
+r2_icon_add_hp_over.tga 0.730468750000 0.519531250000 0.761718750000 0.550781250000
+r2_icon_add_hp_pushed.tga 0.761718750000 0.519531250000 0.792968750000 0.550781250000
+skin_b.tga 0.312500000000 0.359375000000 0.437500000000 0.367187500000
+r2_icon_animation_give.tga 0.792968750000 0.519531250000 0.824218750000 0.550781250000
+skin_b_open.tga 0.000000000000 0.367187500000 0.125000000000 0.375000000000
+skin_em_open.tga 0.312500000000 0.367187500000 0.437500000000 0.375000000000
+r2ed_edit_events.tga 0.824218750000 0.519531250000 0.855468750000 0.550781250000
+r2ed_edit_events_over.tga 0.855468750000 0.519531250000 0.886718750000 0.550781250000
+r2ed_edit_events_pushed.tga 0.886718750000 0.519531250000 0.917968750000 0.550781250000
+r2_icon_animation_give_over.tga 0.917968750000 0.519531250000 0.949218750000 0.550781250000
+r2_icon_animation_give_pushed.tga 0.949218750000 0.519531250000 0.980468750000 0.550781250000
+r2_icon_animation_target.tga 0.000000000000 0.523437500000 0.031250000000 0.554687500000
+r2_icon_animation_target_over.tga 0.031250000000 0.523437500000 0.062500000000 0.554687500000
+r2_icon_animation_target_pushed.tga 0.062500000000 0.523437500000 0.093750000000 0.554687500000
+r2ed_icon_stop.tga 0.093750000000 0.523437500000 0.125000000000 0.554687500000
+r2_icon_animation_triggers_over.tga 0.472656250000 0.523437500000 0.503906250000 0.554687500000
+r2_icon_animation_triggers_pushed.tga 0.503906250000 0.523437500000 0.535156250000 0.554687500000
+r2_icon_despawn.tga 0.250000000000 0.527343750000 0.281250000000 0.558593750000
+r2_icon_despawn_over.tga 0.281250000000 0.527343750000 0.312500000000 0.558593750000
+r2_icon_despawn_pushed.tga 0.312500000000 0.527343750000 0.343750000000 0.558593750000
+r2ed_tool_extend_prim_pushed.tga 0.125000000000 0.531250000000 0.156250000000 0.562500000000
+r2_toolbar_customize_over.tga 0.343750000000 0.531250000000 0.375000000000 0.562500000000
+r2_toolbar_customize_pushed.tga 0.375000000000 0.531250000000 0.406250000000 0.562500000000
+r2_toolbar_delete.tga 0.406250000000 0.531250000000 0.437500000000 0.562500000000
+r2_toolbar_delete_over.tga 0.437500000000 0.531250000000 0.468750000000 0.562500000000
+r2_toolbar_delete_pushed.tga 0.156250000000 0.542968750000 0.187500000000 0.574218750000
+r2_toolbar_follow_road.tga 0.187500000000 0.542968750000 0.218750000000 0.574218750000
+r2_toolbar_follow_road_over.tga 0.218750000000 0.542968750000 0.250000000000 0.574218750000
+r2_toolbar_follow_road_pushed.tga 0.535156250000 0.550781250000 0.566406250000 0.582031250000
+r2_toolbar_group.tga 0.566406250000 0.550781250000 0.597656250000 0.582031250000
+r2_toolbar_group_over.tga 0.597656250000 0.550781250000 0.628906250000 0.582031250000
+skin_r.tga 0.980468750000 0.000000000000 0.988281250000 0.125000000000
+r2_icon_stop_acts_over.tga 0.628906250000 0.550781250000 0.660156250000 0.582031250000
+r2_icon_stop_acts_pushed.tga 0.660156250000 0.550781250000 0.691406250000 0.582031250000
+r2_icon_stop_possess.tga 0.691406250000 0.550781250000 0.722656250000 0.582031250000
+r2_icon_stop_possess_over.tga 0.722656250000 0.550781250000 0.753906250000 0.582031250000
+r2_icon_stop_possess_pushed.tga 0.753906250000 0.550781250000 0.785156250000 0.582031250000
+r2_icon_stop_speak.tga 0.785156250000 0.550781250000 0.816406250000 0.582031250000
+r2_icon_stop_speak_over.tga 0.816406250000 0.550781250000 0.847656250000 0.582031250000
+building_state1.tga 0.847656250000 0.550781250000 0.878906250000 0.582031250000
+building_state2.tga 0.878906250000 0.550781250000 0.910156250000 0.582031250000
+r2_icon_stop_speak_pushed.tga 0.910156250000 0.550781250000 0.941406250000 0.582031250000
+skin_t.tga 0.000000000000 0.554687500000 0.125000000000 0.562500000000
+r2_icon_test_mode.tga 0.941406250000 0.550781250000 0.972656250000 0.582031250000
+r2_icon_test_mode_over.tga 0.468750000000 0.554687500000 0.500000000000 0.585937500000
+r2_icon_test_mode_pushed.tga 0.500000000000 0.554687500000 0.531250000000 0.585937500000
+r2_icon_weather.tga 0.250000000000 0.558593750000 0.281250000000 0.589843750000
+r2_allow.tga 0.281250000000 0.558593750000 0.312500000000 0.589843750000
+r2_icon_weather_over.tga 0.312500000000 0.558593750000 0.343750000000 0.589843750000
+r2ed_storm.tga 0.898437500000 0.363281250000 0.937500000000 0.386718750000
+r2ed_clouds.tga 0.937500000000 0.363281250000 0.976562500000 0.386718750000
+bg_jauge_mid.tga 0.000000000000 0.562500000000 0.125000000000 0.569335937500
+r2ed_lakes_l.tga 0.964843750000 0.125000000000 0.992187500000 0.156250000000
+r2ed_lakes_pushed_l.tga 0.964843750000 0.156250000000 0.992187500000 0.187500000000
+r2ed_jungle_l.tga 0.964843750000 0.187500000000 0.991210937500 0.218750000000
+r2ed_jungle_pushed_l.tga 0.972656250000 0.273437500000 0.999023437500 0.304687500000
+skin_header_r.tga 0.972656250000 0.550781250000 0.998046875000 0.582031250000
+r2ed_prime_roots_l.tga 0.125000000000 0.562500000000 0.150390625000 0.593750000000
+r2ed_desert_l.tga 0.343750000000 0.562500000000 0.369140625000 0.593750000000
+r2ed_desert_pushed_l.tga 0.371093750000 0.562500000000 0.396484375000 0.593750000000
+r2ed_prime_roots_pushed_l.tga 0.398437500000 0.562500000000 0.423828125000 0.593750000000
+W_trade_not_ready.tga 0.425781250000 0.562500000000 0.464843750000 0.582031250000
+slot_brick.tga 0.000000000000 0.570312500000 0.027343750000 0.597656250000
+disconnect.tga 0.027343750000 0.570312500000 0.054687500000 0.597656250000
+W_button_28_over.tga 0.054687500000 0.570312500000 0.082031250000 0.597656250000
+w_button_mode_over2.tga 0.082031250000 0.570312500000 0.109375000000 0.597656250000
+r2_tab_sequence_pushed_l.tga 0.152343750000 0.574218750000 0.179687500000 0.601562500000
+r2_tab_wide_normal_l.tga 0.179687500000 0.574218750000 0.207031250000 0.601562500000
+r2_tab_wide_pushed_l.tga 0.207031250000 0.574218750000 0.234375000000 0.601562500000
+action_balance_cred.tga 0.425781250000 0.582031250000 0.457031250000 0.605468750000
+bulle_say_l.tga 0.531250000000 0.582031250000 0.562500000000 0.605468750000
+bulle_say_r.tga 0.562500000000 0.582031250000 0.593750000000 0.605468750000
+bulle_say_tl.tga 0.593750000000 0.582031250000 0.625000000000 0.605468750000
+bulle_say_tr.tga 0.625000000000 0.582031250000 0.656250000000 0.605468750000
+bulle_think_l.tga 0.656250000000 0.582031250000 0.687500000000 0.605468750000
+bulle_think_r.tga 0.687500000000 0.582031250000 0.718750000000 0.605468750000
+W_slot_jauge_3_mini.tga 0.718750000000 0.582031250000 0.781250000000 0.593750000000
+action_balance_equal.tga 0.781250000000 0.582031250000 0.812500000000 0.605468750000
+action_balance_cost.tga 0.812500000000 0.582031250000 0.843750000000 0.605468750000
+skill_arbo_x_extend.tga 0.976562500000 0.343750000000 1.000000000000 0.375000000000
+bg_source_bot.tga 0.843750000000 0.582031250000 0.992187500000 0.586914062500
+w_slot_jauge_1_tmin.tga 0.457031250000 0.585937500000 0.515625000000 0.597656250000
+r2_main_menu_normal_l.tga 0.234375000000 0.589843750000 0.255859375000 0.621093750000
+r2_main_menu_normal_r.tga 0.257812500000 0.589843750000 0.279296875000 0.621093750000
+r2_main_menu_over_l.tga 0.281250000000 0.589843750000 0.302734375000 0.621093750000
+r2_main_menu_over_r.tga 0.304687500000 0.589843750000 0.326171875000 0.621093750000
+r2_main_menu_pushed_l.tga 0.843750000000 0.589843750000 0.865234375000 0.621093750000
+r2_main_menu_pushed_r.tga 0.867187500000 0.589843750000 0.888671875000 0.621093750000
+action_next.tga 0.890625000000 0.589843750000 0.916015625000 0.615234375000
+W_slot_spell_selected.tga 0.917968750000 0.589843750000 0.943359375000 0.615234375000
+w_slot_win_menu.tga 0.945312500000 0.589843750000 0.970703125000 0.615234375000
+W_slot_brick_selected.tga 0.972656250000 0.589843750000 0.998046875000 0.615234375000
+W_slot_spell_over.tga 0.109375000000 0.593750000000 0.134765625000 0.619140625000
+W_slot_brick.tga 0.328125000000 0.593750000000 0.353515625000 0.619140625000
+action_cycle.tga 0.355468750000 0.593750000000 0.380859375000 0.619140625000
+W_slot_spell.tga 0.382812500000 0.593750000000 0.408203125000 0.619140625000
+r2ed_forest_pushed_l.tga 0.718750000000 0.593750000000 0.739257812500 0.625000000000
+r2ed_forest_l.tga 0.742187500000 0.593750000000 0.762695312500 0.625000000000
+bg_jauge_bot.tga 0.410156250000 0.605468750000 0.535156250000 0.610351562500
+bg_source_top.tga 0.812500000000 0.386718750000 0.960937500000 0.390625000000
+TB_quit.tga 0.000000000000 0.597656250000 0.023437500000 0.621093750000
+TB_spellbook.tga 0.023437500000 0.597656250000 0.046875000000 0.621093750000
+TB_System.tga 0.046875000000 0.597656250000 0.070312500000 0.621093750000
+teammate_map.tga 0.070312500000 0.597656250000 0.093750000000 0.621093750000
+teammate_map_over.tga 0.136718750000 0.601562500000 0.160156250000 0.625000000000
+r2_palette_act.tga 0.160156250000 0.601562500000 0.183593750000 0.625000000000
+r2_palette_components.tga 0.183593750000 0.601562500000 0.207031250000 0.625000000000
+r2_palette_entities.tga 0.207031250000 0.601562500000 0.230468750000 0.625000000000
+r2_icon_stop_live_small.tga 0.535156250000 0.605468750000 0.558593750000 0.628906250000
+r2ed_down_element.tga 0.558593750000 0.605468750000 0.582031250000 0.628906250000
+r2ed_toolbar_lock_small.tga 0.582031250000 0.605468750000 0.605468750000 0.628906250000
+ency_rite_slot.tga 0.605468750000 0.605468750000 0.628906250000 0.628906250000
+r2ed_edit_dialog_over_small.tga 0.628906250000 0.605468750000 0.652343750000 0.628906250000
+r2_toolbar_repeat_road_small.tga 0.652343750000 0.605468750000 0.675781250000 0.628906250000
+r2ed_edit_dialog_pushed_small.tga 0.675781250000 0.605468750000 0.699218750000 0.628906250000
+r2_icon_new_scenario_small.tga 0.765625000000 0.605468750000 0.789062500000 0.628906250000
+r2_icon_palette_small.tga 0.789062500000 0.605468750000 0.812500000000 0.628906250000
+r2_icon_player_admin_small.tga 0.812500000000 0.605468750000 0.835937500000 0.628906250000
+forage_content.tga 0.410156250000 0.613281250000 0.433593750000 0.636718750000
+r2_icon_map_small.tga 0.433593750000 0.613281250000 0.457031250000 0.636718750000
+forage_danger.tga 0.457031250000 0.613281250000 0.480468750000 0.636718750000
+r2_toolbar_set_as_leader_small.tga 0.480468750000 0.613281250000 0.503906250000 0.636718750000
+r2_palette_objets.tga 0.503906250000 0.613281250000 0.527343750000 0.636718750000
+r2_icon_preferences.tga 0.890625000000 0.617187500000 0.914062500000 0.640625000000
+r2_icon_r2_small.tga 0.914062500000 0.617187500000 0.937500000000 0.640625000000
+r2_icon_resetwindows.tga 0.937500000000 0.617187500000 0.960937500000 0.640625000000
+r2_icon_save_small.tga 0.960937500000 0.617187500000 0.984375000000 0.640625000000
+rap_not_invited_dm.tga 0.000000000000 0.621093750000 0.023437500000 0.644531250000
+r2ed_icon_move.tga 0.023437500000 0.621093750000 0.046875000000 0.644531250000
+r2ed_icon_newactivity.tga 0.046875000000 0.621093750000 0.070312500000 0.644531250000
+r2_icon_scenario_prop.tga 0.070312500000 0.621093750000 0.093750000000 0.644531250000
+r2_icon_scenario_small.tga 0.093750000000 0.621093750000 0.117187500000 0.644531250000
+m_back.tga 0.230468750000 0.621093750000 0.253906250000 0.644531250000
+pvp_green.tga 0.253906250000 0.621093750000 0.277343750000 0.644531250000
+pvp_orange.tga 0.277343750000 0.621093750000 0.300781250000 0.644531250000
+pvp_red.tga 0.300781250000 0.621093750000 0.324218750000 0.644531250000
+r2ed_toolbar_rest_zone_small.tga 0.324218750000 0.621093750000 0.347656250000 0.644531250000
+forage_life.tga 0.347656250000 0.621093750000 0.371093750000 0.644531250000
+r2_icon_stop_test_small.tga 0.371093750000 0.621093750000 0.394531250000 0.644531250000
+lm_target.tga 0.835937500000 0.621093750000 0.859375000000 0.644531250000
+lm_target_over.tga 0.859375000000 0.621093750000 0.882812500000 0.644531250000
+lm_target_pushed.tga 0.117187500000 0.625000000000 0.140625000000 0.648437500000
+lm_user.tga 0.140625000000 0.625000000000 0.164062500000 0.648437500000
+lm_user_pushed.tga 0.164062500000 0.625000000000 0.187500000000 0.648437500000
+mektoub_map.tga 0.187500000000 0.625000000000 0.210937500000 0.648437500000
+r2ed_edit_events_over_small.tga 0.699218750000 0.625000000000 0.722656250000 0.648437500000
+mektoub_map_over.tga 0.722656250000 0.625000000000 0.746093750000 0.648437500000
+r2ed_edit_events_pushed_small.tga 0.527343750000 0.628906250000 0.550781250000 0.652343750000
+r2ed_edit_events_small.tga 0.550781250000 0.628906250000 0.574218750000 0.652343750000
+r2ed_entry_point.tga 0.574218750000 0.628906250000 0.597656250000 0.652343750000
+r2ed_entry_point_over.tga 0.597656250000 0.628906250000 0.621093750000 0.652343750000
+r2ed_entry_point_pushed.tga 0.621093750000 0.628906250000 0.644531250000 0.652343750000
+r2_palette_scenario.tga 0.644531250000 0.628906250000 0.667968750000 0.652343750000
+r2_palette_zones.tga 0.667968750000 0.628906250000 0.691406250000 0.652343750000
+r2_toolbar_stand_still_small.tga 0.746093750000 0.628906250000 0.769531250000 0.652343750000
+r2_icon_support.tga 0.769531250000 0.628906250000 0.792968750000 0.652343750000
+forage_spawn.tga 0.792968750000 0.628906250000 0.816406250000 0.652343750000
+r2ed_icon_rotate.tga 0.394531250000 0.636718750000 0.417968750000 0.660156250000
+r2ed_tool_extend_prim_small.tga 0.417968750000 0.636718750000 0.441406250000 0.660156250000
+r2ed_invalid_event_small.tga 0.441406250000 0.636718750000 0.464843750000 0.660156250000
+r2_toolbar_ungroup_small.tga 0.464843750000 0.636718750000 0.488281250000 0.660156250000
+r2ed_toolbar_show_small.tga 0.488281250000 0.636718750000 0.511718750000 0.660156250000
+r2ed_kicked_char.tga 0.882812500000 0.640625000000 0.906250000000 0.664062500000
+r2ed_edit_dialog_small.tga 0.906250000000 0.640625000000 0.929687500000 0.664062500000
+arbo_level_24.tga 0.929687500000 0.640625000000 0.953125000000 0.664062500000
+r2ed_left_sequence.tga 0.953125000000 0.640625000000 0.976562500000 0.664062500000
+r2_scenario_small.tga 0.976562500000 0.640625000000 1.000000000000 0.664062500000
+r2_toolbar_wander_zone_small.tga 0.000000000000 0.644531250000 0.023437500000 0.667968750000
+rap_invited_dm.tga 0.023437500000 0.644531250000 0.046875000000 0.667968750000
+r2ed_connected_char.tga 0.046875000000 0.644531250000 0.070312500000 0.667968750000
+rap_invited_no_dm.tga 0.070312500000 0.644531250000 0.093750000000 0.667968750000
+r2ed_toolbar_unfreeze_small.tga 0.093750000000 0.644531250000 0.117187500000 0.667968750000
+r2ed_tool_new_vertex_small.tga 0.210937500000 0.644531250000 0.234375000000 0.667968750000
+r2ed_not_current_act.tga 0.234375000000 0.644531250000 0.257812500000 0.667968750000
+r2_toolbar_customize_look_small.tga 0.257812500000 0.644531250000 0.281250000000 0.667968750000
+lm_continent.tga 0.281250000000 0.644531250000 0.304687500000 0.667968750000
+lm_continent_pushed.tga 0.304687500000 0.644531250000 0.328125000000 0.667968750000
+lm_home.tga 0.328125000000 0.644531250000 0.351562500000 0.667968750000
+lm_home_over.tga 0.351562500000 0.644531250000 0.375000000000 0.667968750000
+lm_home_pushed.tga 0.816406250000 0.644531250000 0.839843750000 0.667968750000
+r2_toolbar_delete_small.tga 0.839843750000 0.644531250000 0.863281250000 0.667968750000
+lm_mission.tga 0.117187500000 0.648437500000 0.140625000000 0.671875000000
+lm_mission_pushed.tga 0.140625000000 0.648437500000 0.164062500000 0.671875000000
+lm_over.tga 0.164062500000 0.648437500000 0.187500000000 0.671875000000
+r2_toolbar_follow_road_small.tga 0.187500000000 0.648437500000 0.210937500000 0.671875000000
+lm_respawn.tga 0.691406250000 0.648437500000 0.714843750000 0.671875000000
+lm_respawn_over.tga 0.714843750000 0.648437500000 0.738281250000 0.671875000000
+r2ed_tool_select_move_small.tga 0.511718750000 0.652343750000 0.535156250000 0.675781250000
+r2_icon_go_test_small.tga 0.535156250000 0.652343750000 0.558593750000 0.675781250000
+r2_icon_keys_small.tga 0.558593750000 0.652343750000 0.582031250000 0.675781250000
+r2_icon_light_off_small.tga 0.582031250000 0.652343750000 0.605468750000 0.675781250000
+r2_icon_light_on_small.tga 0.605468750000 0.652343750000 0.628906250000 0.675781250000
+r2_icon_load_small.tga 0.628906250000 0.652343750000 0.652343750000 0.675781250000
+r2_icon_mail_box_small.tga 0.652343750000 0.652343750000 0.675781250000 0.675781250000
+r2ed_toolbar_unlock_small.tga 0.738281250000 0.652343750000 0.761718750000 0.675781250000
+r2ed_right_sequence.tga 0.761718750000 0.652343750000 0.785156250000 0.675781250000
+r2ed_sun.tga 0.785156250000 0.652343750000 0.808593750000 0.675781250000
+r2ed_toolbar_hide_small.tga 0.375000000000 0.660156250000 0.398437500000 0.683593750000
+r2_toolbar_group_small.tga 0.398437500000 0.660156250000 0.421875000000 0.683593750000
+r2ed_toolbar_work_zone_small.tga 0.421875000000 0.660156250000 0.445312500000 0.683593750000
+r2_icon_chat_small.tga 0.445312500000 0.660156250000 0.468750000000 0.683593750000
+r2ed_permanent_content_small.tga 0.468750000000 0.660156250000 0.492187500000 0.683593750000
+W_slot_brick_disabled.tga 0.863281250000 0.664062500000 0.886718750000 0.687500000000
+r2_toolbar_kill_small.tga 0.886718750000 0.664062500000 0.910156250000 0.687500000000
+r2ed_tool_rotate_small.tga 0.910156250000 0.664062500000 0.933593750000 0.687500000000
+forage_time.tga 0.933593750000 0.664062500000 0.957031250000 0.687500000000
+r2ed_toolbar_feed_zone_small.tga 0.957031250000 0.664062500000 0.980468750000 0.687500000000
+r2ed_toolbar_hunt_zone_small.tga 0.000000000000 0.667968750000 0.023437500000 0.691406250000
+W_button_24_over.tga 0.023437500000 0.667968750000 0.046875000000 0.691406250000
+r2_toolbar_patrol_road_small.tga 0.046875000000 0.667968750000 0.070312500000 0.691406250000
+r2ed_toolbar_freeze_small.tga 0.070312500000 0.667968750000 0.093750000000 0.691406250000
+lm_respawn_pushed.tga 0.093750000000 0.667968750000 0.117187500000 0.691406250000
+arbo_close_just_one_24.tga 0.210937500000 0.667968750000 0.234375000000 0.691406250000
+ency_rite_done.tga 0.234375000000 0.667968750000 0.257812500000 0.691406250000
+r2ed_toolbar_guard_zone_small.tga 0.257812500000 0.667968750000 0.281250000000 0.691406250000
+TB_Forum_ring.tga 0.281250000000 0.667968750000 0.304687500000 0.691406250000
+TB_help.tga 0.304687500000 0.667968750000 0.328125000000 0.691406250000
+TB_identity.tga 0.328125000000 0.667968750000 0.351562500000 0.691406250000
+r2ed_current_act_content_small.tga 0.351562500000 0.667968750000 0.375000000000 0.691406250000
+r2_toolbar_properties_small.tga 0.808593750000 0.667968750000 0.832031250000 0.691406250000
+TB_interaction.tga 0.832031250000 0.667968750000 0.855468750000 0.691406250000
+r2ed_up_element.tga 0.117187500000 0.671875000000 0.140625000000 0.695312500000
+TB_inventory.tga 0.140625000000 0.671875000000 0.164062500000 0.695312500000
+TB_map.tga 0.164062500000 0.671875000000 0.187500000000 0.695312500000
+r2_allow_small.tga 0.187500000000 0.671875000000 0.210937500000 0.695312500000
+TB_missions.tga 0.675781250000 0.671875000000 0.699218750000 0.695312500000
+fame_blank.tga 0.699218750000 0.671875000000 0.738281250000 0.685546875000
+fame_arrow_down.tga 0.492187500000 0.675781250000 0.531250000000 0.689453125000
+fame_arrow_up.tga 0.531250000000 0.675781250000 0.570312500000 0.689453125000
+fame_arrow_updown.tga 0.570312500000 0.675781250000 0.609375000000 0.689453125000
+bg_jauge_top.tga 0.855468750000 0.687500000000 0.980468750000 0.691406250000
+w_slot_consider.tga 0.089843750000 0.222656250000 0.121093750000 0.238281250000
+r2_gradient.tga 0.210937500000 0.691406250000 0.335937500000 0.695312500000
+consider_1.tga 0.609375000000 0.675781250000 0.640625000000 0.691406250000
+consider_2.tga 0.640625000000 0.675781250000 0.671875000000 0.691406250000
+consider_3.tga 0.738281250000 0.675781250000 0.769531250000 0.691406250000
+consider_4.tga 0.769531250000 0.675781250000 0.800781250000 0.691406250000
+consider_5.tga 0.375000000000 0.683593750000 0.406250000000 0.699218750000
+consider_6.tga 0.406250000000 0.683593750000 0.437500000000 0.699218750000
+consider_7.tga 0.437500000000 0.683593750000 0.468750000000 0.699218750000
+w_button_32_over.tga 0.699218750000 0.687500000000 0.730468750000 0.703125000000
+r2ed_triggers_select.tga 0.468750000000 0.683593750000 0.490234375000 0.706054687500
+r2_select_menu_over_l.tga 0.984375000000 0.457031250000 0.998046875000 0.488281250000
+r2_select_menu_pushed_l.tga 0.980468750000 0.488281250000 0.994140625000 0.519531250000
+skill_arbo_son_without_son.tga 0.980468750000 0.519531250000 0.994140625000 0.550781250000
+skill_arbo_close_just_one.tga 0.980468750000 0.664062500000 0.994140625000 0.695312500000
+skill_arbo_level.tga 0.000000000000 0.691406250000 0.013671875000 0.722656250000
+skill_arbo_open_first.tga 0.015625000000 0.691406250000 0.029296875000 0.722656250000
+skill_arbo_son.tga 0.031250000000 0.691406250000 0.044921875000 0.722656250000
+skill_arbo_son_last.tga 0.046875000000 0.691406250000 0.060546875000 0.722656250000
+r2_select_menu_l.tga 0.062500000000 0.691406250000 0.076171875000 0.722656250000
+r2_icon_dialog_mini_over.tga 0.699218750000 0.605468750000 0.718750000000 0.625000000000
+r2_icon_dialog_mini_pushed.tga 0.210937500000 0.625000000000 0.230468750000 0.644531250000
+r2_icon_action_mini_over.tga 0.863281250000 0.644531250000 0.882812500000 0.664062500000
+r2_icon_reaction_mini.tga 0.078125000000 0.691406250000 0.097656250000 0.710937500000
+r2_icon_reaction_mini_over.tga 0.097656250000 0.691406250000 0.117187500000 0.710937500000
+r2_icon_reaction_mini_pushed.tga 0.335937500000 0.691406250000 0.355468750000 0.710937500000
+r2_icon_action_mini_pushed.tga 0.355468750000 0.691406250000 0.375000000000 0.710937500000
+r2ed_open_activities.tga 0.492187500000 0.691406250000 0.511718750000 0.710937500000
+r2_icon_action_mini.tga 0.511718750000 0.691406250000 0.531250000000 0.710937500000
+r2_icon_event_trigger_mini.tga 0.531250000000 0.691406250000 0.550781250000 0.710937500000
+r2_icon_event_trigger_mini_over.tga 0.550781250000 0.691406250000 0.570312500000 0.710937500000
+r2_icon_event_trigger_mini_pushed.tga 0.570312500000 0.691406250000 0.589843750000 0.710937500000
+r2_icon_dialog_mini.tga 0.589843750000 0.691406250000 0.609375000000 0.710937500000
+mp3_button_slot.tga 0.609375000000 0.691406250000 0.630859375000 0.708984375000
+w_button_mode_over.tga 0.632812500000 0.691406250000 0.646484375000 0.718750000000
+w_mode_choice.tga 0.648437500000 0.691406250000 0.662109375000 0.718750000000
+details_on.tga 0.964843750000 0.218750000000 0.988281250000 0.234375000000
+qh_on_l.tga 0.109375000000 0.570312500000 0.125000000000 0.593750000000
+qh_on_r.tga 0.093750000000 0.597656250000 0.109375000000 0.621093750000
+r2_select_bar_start_normal_l.tga 0.664062500000 0.691406250000 0.675781250000 0.722656250000
+r2_select_bar_start_normal_r.tga 0.730468750000 0.691406250000 0.742187500000 0.722656250000
+qh_off_r.tga 0.984375000000 0.617187500000 1.000000000000 0.640625000000
+mp3_vol_jauge.tga 0.148437500000 0.242187500000 0.195312500000 0.250000000000
+details_off.tga 0.125000000000 0.359375000000 0.148437500000 0.375000000000
+skin_header_l.tga 0.742187500000 0.691406250000 0.753906250000 0.722656250000
+w_button_filter_off.tga 0.437500000000 0.359375000000 0.460937500000 0.375000000000
+w_button_filter_on.tga 0.976562500000 0.375000000000 1.000000000000 0.390625000000
+qh_off_l.tga 0.753906250000 0.691406250000 0.769531250000 0.714843750000
+filter_armor.tga 0.769531250000 0.691406250000 0.792968750000 0.707031250000
+r2_select_bar_start_over_l.tga 0.792968750000 0.691406250000 0.804687500000 0.722656250000
+filter_mission.tga 0.804687500000 0.691406250000 0.828125000000 0.707031250000
+filter_mps.tga 0.828125000000 0.691406250000 0.851562500000 0.707031250000
+r2_select_bar_start_over_r.tga 0.851562500000 0.691406250000 0.863281250000 0.722656250000
+r2_select_bar_start_pushed_l.tga 0.863281250000 0.691406250000 0.875000000000 0.722656250000
+r2_select_bar_start_pushed_r.tga 0.875000000000 0.691406250000 0.886718750000 0.722656250000
+w_l0_tl_title.tga 0.886718750000 0.691406250000 0.902343750000 0.714843750000
+filter_tools.tga 0.902343750000 0.691406250000 0.925781250000 0.707031250000
+W_slot_jauge_1_mini.tga 0.457031250000 0.597656250000 0.519531250000 0.603515625000
+filter_weapon.tga 0.925781250000 0.691406250000 0.949218750000 0.707031250000
+w_button_18_over.tga 0.949218750000 0.691406250000 0.966796875000 0.708984375000
+mp3_button_pause.tga 0.816406250000 0.628906250000 0.835937500000 0.644531250000
+mp3_button_play.tga 0.375000000000 0.644531250000 0.394531250000 0.660156250000
+mp3_button_previous.tga 0.492187500000 0.660156250000 0.511718750000 0.675781250000
+Switch_Ratio.tga 0.117187500000 0.695312500000 0.136718750000 0.710937500000
+Switch_Text_Icon.tga 0.136718750000 0.695312500000 0.156250000000 0.710937500000
+mp3_button_list.tga 0.156250000000 0.695312500000 0.175781250000 0.710937500000
+mp3_button_next.tga 0.175781250000 0.695312500000 0.195312500000 0.710937500000
+mp3_button_open.tga 0.195312500000 0.695312500000 0.214843750000 0.710937500000
+mp3_button_over.tga 0.214843750000 0.695312500000 0.234375000000 0.710937500000
+w_tab_down_pushed_r.tga 0.968750000000 0.691406250000 0.980468750000 0.714843750000
+W_warning.tga 0.234375000000 0.695312500000 0.251953125000 0.710937500000
+w_expand_off.tga 0.253906250000 0.695312500000 0.265625000000 0.718750000000
+w_expand_on.tga 0.265625000000 0.695312500000 0.277343750000 0.718750000000
+w_tab_down_normal_r.tga 0.277343750000 0.695312500000 0.289062500000 0.718750000000
+w_tab_up_normal_r.tga 0.289062500000 0.695312500000 0.300781250000 0.718750000000
+w_tab_up_pushed_r.tga 0.300781250000 0.695312500000 0.312500000000 0.718750000000
+ency_step_slot.tga 0.476562500000 0.218750000000 0.492187500000 0.234375000000
+W_slot_number.tga 0.234375000000 0.574218750000 0.250000000000 0.589843750000
+W_slot_number_selected.tga 0.394531250000 0.621093750000 0.410156250000 0.636718750000
+W_slot_number_unselected.tga 0.511718750000 0.636718750000 0.527343750000 0.652343750000
+r2_icon_select.tga 0.675781250000 0.652343750000 0.691406250000 0.667968750000
+r2_glow_star.tga 0.312500000000 0.695312500000 0.328125000000 0.710937500000
+W_user_info.tga 0.675781250000 0.695312500000 0.691406250000 0.710937500000
+r2_suspension.tga 0.980468750000 0.695312500000 0.996093750000 0.710937500000
+w_zoom_in.tga 0.375000000000 0.699218750000 0.390625000000 0.714843750000
+w_zoom_out.tga 0.390625000000 0.699218750000 0.406250000000 0.714843750000
+r2ed_ring_rating_1.tga 0.406250000000 0.699218750000 0.421875000000 0.714843750000
+r2_icon_speak_as_small.tga 0.421875000000 0.699218750000 0.437500000000 0.714843750000
+r2_icon_speak_as_small_over.tga 0.437500000000 0.699218750000 0.453125000000 0.714843750000
+r2_icon_speak_as_small_pushed.tga 0.453125000000 0.699218750000 0.468750000000 0.714843750000
+w_center_map.tga 0.691406250000 0.703125000000 0.707031250000 0.718750000000
+W_close_0.tga 0.707031250000 0.703125000000 0.722656250000 0.718750000000
+r2ed_ring_rating_10.tga 0.468750000000 0.707031250000 0.484375000000 0.722656250000
+bulle_next.tga 0.769531250000 0.707031250000 0.785156250000 0.722656250000
+r2ed_ring_rating_2.tga 0.804687500000 0.707031250000 0.820312500000 0.722656250000
+r2_icon_map_invalid.tga 0.820312500000 0.707031250000 0.835937500000 0.722656250000
+w_arrow_left_0.tga 0.835937500000 0.707031250000 0.851562500000 0.722656250000
+W_arrow_right_0.tga 0.902343750000 0.707031250000 0.917968750000 0.722656250000
+W_arrow_up_0.tga 0.917968750000 0.707031250000 0.933593750000 0.722656250000
+w_back_map.tga 0.933593750000 0.707031250000 0.949218750000 0.722656250000
+W_button_16_over.tga 0.078125000000 0.710937500000 0.093750000000 0.726562500000
+r2ed_ring_rating_3.tga 0.093750000000 0.710937500000 0.109375000000 0.726562500000
+r2ed_ring_rating_4.tga 0.109375000000 0.710937500000 0.125000000000 0.726562500000
+money_seve.tga 0.125000000000 0.710937500000 0.140625000000 0.726562500000
+w_add.tga 0.140625000000 0.710937500000 0.156250000000 0.726562500000
+W_answer_16_cancel.tga 0.156250000000 0.710937500000 0.171875000000 0.726562500000
+W_answer_16_valid.tga 0.171875000000 0.710937500000 0.187500000000 0.726562500000
+W_arrow_down_0.tga 0.187500000000 0.710937500000 0.203125000000 0.726562500000
+r2ed_ring_rating_5.tga 0.203125000000 0.710937500000 0.218750000000 0.726562500000
+r2_mini_activity_chat.tga 0.218750000000 0.710937500000 0.234375000000 0.726562500000
+r2ed_ring_rating_6.tga 0.234375000000 0.710937500000 0.250000000000 0.726562500000
+W_button_default.tga 0.312500000000 0.710937500000 0.328125000000 0.726562500000
+W_button_edit.tga 0.328125000000 0.710937500000 0.343750000000 0.726562500000
+bgd_pause.tga 0.343750000000 0.710937500000 0.359375000000 0.726562500000
+r2_icon_possess_small.tga 0.359375000000 0.710937500000 0.375000000000 0.726562500000
+r2_icon_possess_small_over.tga 0.484375000000 0.710937500000 0.500000000000 0.726562500000
+r2_icon_possess_small_pushed.tga 0.500000000000 0.710937500000 0.515625000000 0.726562500000
+r2ed_ring_rating_7.tga 0.515625000000 0.710937500000 0.531250000000 0.726562500000
+r2ed_ring_rating_8.tga 0.531250000000 0.710937500000 0.546875000000 0.726562500000
+r2_mini_activity_empty_chat.tga 0.546875000000 0.710937500000 0.562500000000 0.726562500000
+r2_mini_activity_feed_zone.tga 0.562500000000 0.710937500000 0.578125000000 0.726562500000
+r2_mini_activity_follow_road.tga 0.578125000000 0.710937500000 0.593750000000 0.726562500000
+r2_mini_activity_guard_zone.tga 0.593750000000 0.710937500000 0.609375000000 0.726562500000
+r2_mini_activity_hunt_zone.tga 0.609375000000 0.710937500000 0.625000000000 0.726562500000
+r2_mini_activity_inactive.tga 0.675781250000 0.710937500000 0.691406250000 0.726562500000
+pin_off.tga 0.949218750000 0.710937500000 0.964843750000 0.726562500000
+pin_on.tga 0.980468750000 0.710937500000 0.996093750000 0.726562500000
+r2_mini_activity_patrol_road.tga 0.375000000000 0.714843750000 0.390625000000 0.730468750000
+r2_mini_activity_repeat_road.tga 0.390625000000 0.714843750000 0.406250000000 0.730468750000
+target_mission.tga 0.406250000000 0.714843750000 0.421875000000 0.730468750000
+r2_mini_activity_rest_zone.tga 0.421875000000 0.714843750000 0.437500000000 0.730468750000
+r2_mini_activity_stand_still.tga 0.437500000000 0.714843750000 0.453125000000 0.730468750000
+r2_mini_activity_wander_zone.tga 0.453125000000 0.714843750000 0.468750000000 0.730468750000
+W_rename_16.tga 0.753906250000 0.714843750000 0.769531250000 0.730468750000
+w_restore.tga 0.886718750000 0.714843750000 0.902343750000 0.730468750000
+r2_mini_activity_work_zone.tga 0.964843750000 0.714843750000 0.980468750000 0.730468750000
+r2ed_ring_rating_9.tga 0.250000000000 0.718750000000 0.265625000000 0.734375000000
+r2ed_triggers_more.tga 0.265625000000 0.718750000000 0.281250000000 0.734375000000
+r2_map_edge_test.tga 0.281250000000 0.718750000000 0.296875000000 0.734375000000
+r2ed_triggers_trash.tga 0.296875000000 0.718750000000 0.312500000000 0.734375000000
+w_button_radar_plus.tga 0.625000000000 0.718750000000 0.640625000000 0.734375000000
+bulle_quit.tga 0.640625000000 0.718750000000 0.656250000000 0.734375000000
+W_button_reset.tga 0.691406250000 0.718750000000 0.707031250000 0.734375000000
+r2_map_foot_steps.tga 0.000000000000 0.722656250000 0.031250000000 0.730468750000
+ency_step_done.tga 0.707031250000 0.718750000000 0.722656250000 0.734375000000
+w_button_10x24_over.tga 0.031250000000 0.722656250000 0.041015625000 0.746093750000
+w_button_spellock_over.tga 0.042968750000 0.722656250000 0.066406250000 0.731445312500
+w_button_spellock_on.tga 0.722656250000 0.722656250000 0.746093750000 0.731445312500
+w_button_spellock_off.tga 0.769531250000 0.722656250000 0.792968750000 0.731445312500
+r2ed_icon_permanent_group.tga 0.468750000000 0.722656250000 0.482421875000 0.736328125000
+r2ed_icon_permanent_group_creatures.tga 0.656250000000 0.722656250000 0.669921875000 0.736328125000
+r2ed_icon_permanent_macro_components.tga 0.792968750000 0.722656250000 0.806640625000 0.736328125000
+w_affected.tga 0.808593750000 0.722656250000 0.822265625000 0.736328125000
+r2ed_icon_region.tga 0.824218750000 0.722656250000 0.837890625000 0.736328125000
+W_slot_mood.tga 0.839843750000 0.722656250000 0.853515625000 0.736328125000
+r2ed_permanent_pins.tga 0.855468750000 0.722656250000 0.869140625000 0.736328125000
+w_sound_off.tga 0.871093750000 0.722656250000 0.884765625000 0.736328125000
+w_sound_on.tga 0.902343750000 0.722656250000 0.916015625000 0.736328125000
+w_button_radar_moins.tga 0.917968750000 0.722656250000 0.931640625000 0.736328125000
+w_button_14_over.tga 0.933593750000 0.722656250000 0.947265625000 0.736328125000
+w_slot_on.tga 0.066406250000 0.726562500000 0.080078125000 0.740234375000
+arbo_son_last.tga 0.082031250000 0.726562500000 0.095703125000 0.740234375000
+arbo_son_without_son.tga 0.097656250000 0.726562500000 0.111328125000 0.740234375000
+r2_icon_components_tasks.tga 0.113281250000 0.726562500000 0.126953125000 0.740234375000
+r2_icon_components_trigger.tga 0.128906250000 0.726562500000 0.142578125000 0.740234375000
+r2_icon_create.tga 0.144531250000 0.726562500000 0.158203125000 0.740234375000
+arbo_son.tga 0.160156250000 0.726562500000 0.173828125000 0.740234375000
+arbo_close_just_one.tga 0.175781250000 0.726562500000 0.189453125000 0.740234375000
+contact_chat.tga 0.191406250000 0.726562500000 0.205078125000 0.740234375000
+W_offline.tga 0.207031250000 0.726562500000 0.220703125000 0.740234375000
+w_on.tga 0.222656250000 0.726562500000 0.236328125000 0.740234375000
+W_online.tga 0.312500000000 0.726562500000 0.326171875000 0.740234375000
+w_win_close.tga 0.328125000000 0.726562500000 0.341796875000 0.740234375000
+w_win_lock.tga 0.343750000000 0.726562500000 0.357421875000 0.740234375000
+w_win_popin.tga 0.359375000000 0.726562500000 0.373046875000 0.740234375000
+w_win_popup.tga 0.484375000000 0.726562500000 0.498046875000 0.740234375000
+w_online_abroad.tga 0.500000000000 0.726562500000 0.513671875000 0.740234375000
+w_opacity_on.tga 0.515625000000 0.726562500000 0.529296875000 0.740234375000
+w_help_1.tga 0.531250000000 0.726562500000 0.544921875000 0.740234375000
+w_pad_close.tga 0.546875000000 0.726562500000 0.560546875000 0.740234375000
+arbo_open_first.tga 0.562500000000 0.726562500000 0.576171875000 0.740234375000
+animal_inventory.tga 0.578125000000 0.726562500000 0.591796875000 0.740234375000
+r2_icon_far.tga 0.593750000000 0.726562500000 0.607421875000 0.740234375000
+arbo_level.tga 0.609375000000 0.726562500000 0.623046875000 0.740234375000
+r2ed_icon_road.tga 0.671875000000 0.726562500000 0.685546875000 0.740234375000
+r2ed_icon_act.tga 0.949218750000 0.726562500000 0.962890625000 0.740234375000
+r2ed_icon_botobject.tga 0.980468750000 0.726562500000 0.994140625000 0.740234375000
+r2ed_icon_creatures.tga 0.000000000000 0.730468750000 0.013671875000 0.744140625000
+r2ed_icon_default_feature.tga 0.015625000000 0.730468750000 0.029296875000 0.744140625000
+r2ed_icon_group.tga 0.375000000000 0.730468750000 0.388671875000 0.744140625000
+r2ed_icon_group_creatures.tga 0.390625000000 0.730468750000 0.404296875000 0.744140625000
+r2ed_icon_macro_components.tga 0.406250000000 0.730468750000 0.419921875000 0.744140625000
+r2ed_permanent_node.tga 0.421875000000 0.730468750000 0.435546875000 0.744140625000
+r2_icon_properties.tga 0.437500000000 0.730468750000 0.451171875000 0.744140625000
+r2ed_icon_npc.tga 0.453125000000 0.730468750000 0.466796875000 0.744140625000
+r2ed_icon_permanent_creatures.tga 0.746093750000 0.730468750000 0.759765625000 0.744140625000
+quit_button_normal_r.tga 0.187500000000 0.195312500000 0.195312500000 0.218750000000
+quit_button_over_l.tga 0.187500000000 0.218750000000 0.195312500000 0.242187500000
+quit_button_over_r.tga 0.312500000000 0.250000000000 0.320312500000 0.273437500000
+quit_button_pushed_l.tga 0.992187500000 0.250000000000 1.000000000000 0.273437500000
+quit_button_pushed_r.tga 0.992187500000 0.390625000000 1.000000000000 0.414062500000
+r2_select_menu_r.tga 0.992187500000 0.414062500000 0.998046875000 0.445312500000
+r2_select_menu_over_r.tga 0.238281250000 0.726562500000 0.244140625000 0.757812500000
+w_slot_jauge_1_umin.tga 0.246093750000 0.734375000000 0.277343750000 0.740234375000
+r2_select_menu_pushed_r.tga 0.761718750000 0.730468750000 0.767578125000 0.761718750000
+quit_button_normal_l.tga 0.546875000000 0.429687500000 0.554687500000 0.453125000000
+target.tga 0.042968750000 0.734375000000 0.059570312500 0.745117187500
+flag-en.tga 0.515625000000 0.585937500000 0.530273437500 0.597656250000
+flag-fr.tga 0.410156250000 0.593750000000 0.424804687500 0.605468750000
+flag-de.tga 0.765625000000 0.593750000000 0.780273437500 0.605468750000
+w_trade_player_ready.tga 0.886718750000 0.730468750000 0.898437500000 0.744140625000
+num_6.tga 0.964843750000 0.730468750000 0.976562500000 0.744140625000
+num_7.tga 0.277343750000 0.734375000000 0.289062500000 0.748046875000
+W_warning_2.tga 0.289062500000 0.734375000000 0.302734375000 0.746093750000
+num_8.tga 0.625000000000 0.734375000000 0.636718750000 0.748046875000
+num_9.tga 0.636718750000 0.734375000000 0.648437500000 0.748046875000
+w_defense_normal_m.tga 0.988281250000 0.000000000000 0.992187500000 0.041015625000
+w_defense_normal_r.tga 0.988281250000 0.042968750000 0.992187500000 0.083984375000
+w_defense_r.tga 0.996093750000 0.488281250000 1.000000000000 0.529296875000
+w_defense_l.tga 0.996093750000 0.664062500000 1.000000000000 0.705078125000
+w_defense_m.tga 0.996093750000 0.707031250000 1.000000000000 0.748046875000
+w_defense_normal_l.tga 0.687500000000 0.726562500000 0.691406250000 0.767578125000
+num_0.tga 0.691406250000 0.734375000000 0.703125000000 0.748046875000
+num_1.tga 0.703125000000 0.734375000000 0.714843750000 0.748046875000
+num_2.tga 0.714843750000 0.734375000000 0.726562500000 0.748046875000
+num_3.tga 0.726562500000 0.734375000000 0.738281250000 0.748046875000
+num_4.tga 0.769531250000 0.734375000000 0.781250000000 0.748046875000
+num_5.tga 0.781250000000 0.734375000000 0.792968750000 0.748046875000
+w_trade_other_ready.tga 0.468750000000 0.738281250000 0.480468750000 0.751953125000
+W_button_12_over.tga 0.160156250000 0.468750000000 0.171875000000 0.480468750000
+W_arrow_down_1.tga 0.648437500000 0.738281250000 0.660156250000 0.750000000000
+W_mood_pow1.tga 0.660156250000 0.738281250000 0.671875000000 0.750000000000
+W_weight.tga 0.792968750000 0.738281250000 0.804687500000 0.750000000000
+W_mood_pow0.tga 0.804687500000 0.738281250000 0.816406250000 0.750000000000
+W_mood_pow2.tga 0.816406250000 0.738281250000 0.828125000000 0.750000000000
+W_mood_pow3.tga 0.828125000000 0.738281250000 0.839843750000 0.750000000000
+r2ed_triggers_little_chat.tga 0.839843750000 0.738281250000 0.851562500000 0.750000000000
+r2ed_triggers_little_less.tga 0.851562500000 0.738281250000 0.863281250000 0.750000000000
+r2ed_triggers_little_more.tga 0.863281250000 0.738281250000 0.875000000000 0.750000000000
+r2ed_triggers_little_trash.tga 0.875000000000 0.738281250000 0.886718750000 0.750000000000
+r2ed_triggers_maximize.tga 0.898437500000 0.738281250000 0.910156250000 0.750000000000
+r2ed_triggers_minimize.tga 0.910156250000 0.738281250000 0.921875000000 0.750000000000
+W_arrow_right_1.tga 0.921875000000 0.738281250000 0.933593750000 0.750000000000
+W_mood_pow5.tga 0.933593750000 0.738281250000 0.945312500000 0.750000000000
+W_scale_more_1.tga 0.062500000000 0.742187500000 0.074218750000 0.753906250000
+target_info.tga 0.074218750000 0.742187500000 0.085937500000 0.753906250000
+W_arrow_up_1.tga 0.085937500000 0.742187500000 0.097656250000 0.753906250000
+W_close_1.tga 0.097656250000 0.742187500000 0.109375000000 0.753906250000
+w_copy.tga 0.109375000000 0.742187500000 0.121093750000 0.753906250000
+W_scale_less_1.tga 0.121093750000 0.742187500000 0.132812500000 0.753906250000
+rollout_opened.tga 0.132812500000 0.742187500000 0.143554687500 0.753906250000
+rollout_closed.tga 0.144531250000 0.742187500000 0.155273437500 0.753906250000
+W_magic_sep1.tga 0.535156250000 0.523437500000 0.540039062500 0.548828125000
+W_magic_sep2.tga 0.304687500000 0.734375000000 0.309570312500 0.759765625000
+w_death.tga 0.156250000000 0.742187500000 0.168945312500 0.751953125000
+r2ed_desert_m.tga 0.988281250000 0.085937500000 0.992187500000 0.117187500000
+r2ed_prime_roots_m.tga 0.496093750000 0.343750000000 0.500000000000 0.375000000000
+r2_select_menu_pushed_m.tga 0.351562500000 0.425781250000 0.355468750000 0.457031250000
+r2ed_desert_pushed_m.tga 0.976562500000 0.730468750000 0.980468750000 0.761718750000
+r2ed_desert_pushed_r.tga 0.738281250000 0.734375000000 0.742187500000 0.765625000000
+skin_bl_open.tga 0.476562500000 0.273437500000 0.492187500000 0.281250000000
+r2ed_desert_r.tga 0.742187500000 0.734375000000 0.746093750000 0.765625000000
+skin_el_open.tga 0.972656250000 0.304687500000 0.988281250000 0.312500000000
+r2ed_forest_pushed_m.tga 0.480468750000 0.738281250000 0.484375000000 0.769531250000
+r2ed_jungle_m.tga 0.945312500000 0.738281250000 0.949218750000 0.769531250000
+r2ed_forest_pushed_r.tga 0.171875000000 0.742187500000 0.175781250000 0.773437500000
+r2ed_jungle_pushed_m.tga 0.175781250000 0.742187500000 0.179687500000 0.773437500000
+r2ed_jungle_pushed_r.tga 0.179687500000 0.742187500000 0.183593750000 0.773437500000
+r2ed_jungle_r.tga 0.183593750000 0.742187500000 0.187500000000 0.773437500000
+r2ed_forest_r.tga 0.187500000000 0.742187500000 0.191406250000 0.773437500000
+r2_main_menu_normal_m.tga 0.191406250000 0.742187500000 0.195312500000 0.773437500000
+r2ed_lakes_m.tga 0.195312500000 0.742187500000 0.199218750000 0.773437500000
+r2ed_prime_roots_pushed_m.tga 0.199218750000 0.742187500000 0.203125000000 0.773437500000
+r2ed_lakes_pushed_m.tga 0.203125000000 0.742187500000 0.207031250000 0.773437500000
+r2ed_lakes_pushed_r.tga 0.207031250000 0.742187500000 0.210937500000 0.773437500000
+r2ed_lakes_r.tga 0.210937500000 0.742187500000 0.214843750000 0.773437500000
+curs_m.tga 0.214843750000 0.742187500000 0.218750000000 0.773437500000
+r2ed_prime_roots_pushed_r.tga 0.218750000000 0.742187500000 0.222656250000 0.773437500000
+r2_select_bar_start_over_m.tga 0.222656250000 0.742187500000 0.226562500000 0.773437500000
+r2ed_prime_roots_r.tga 0.226562500000 0.742187500000 0.230468750000 0.773437500000
+r2ed_forest_m.tga 0.230468750000 0.742187500000 0.234375000000 0.773437500000
+r2_select_bar_start_pushed_m.tga 0.234375000000 0.742187500000 0.238281250000 0.773437500000
+r2_main_menu_over_m.tga 0.246093750000 0.742187500000 0.250000000000 0.773437500000
+r2_main_menu_pushed_m.tga 0.250000000000 0.742187500000 0.253906250000 0.773437500000
+r2_select_menu_m.tga 0.253906250000 0.742187500000 0.257812500000 0.773437500000
+r2_select_bar_start_normal_m.tga 0.257812500000 0.742187500000 0.261718750000 0.773437500000
+r2_select_menu_over_m.tga 0.261718750000 0.742187500000 0.265625000000 0.773437500000
+W_L0_EL_open.tga 0.484375000000 0.382812500000 0.500000000000 0.390625000000
+r2_tab_sequence_pushed_r.tga 0.542968750000 0.460937500000 0.546875000000 0.488281250000
+r2_tab_wide_pushed_m.tga 0.531250000000 0.554687500000 0.535156250000 0.582031250000
+r2_tab_wide_pushed_r.tga 0.265625000000 0.742187500000 0.269531250000 0.769531250000
+r2_tab_sequence_pushed_m.tga 0.269531250000 0.742187500000 0.273437500000 0.769531250000
+r2_tab_wide_normal_m.tga 0.273437500000 0.742187500000 0.277343750000 0.769531250000
+r2_tab_wide_normal_r.tga 0.312500000000 0.742187500000 0.316406250000 0.769531250000
+W_arrow_down_2.tga 0.316406250000 0.742187500000 0.326171875000 0.751953125000
+W_close_2.tga 0.328125000000 0.742187500000 0.337890625000 0.751953125000
+W_scale_more_2.tga 0.339843750000 0.742187500000 0.349609375000 0.751953125000
+W_arrow_up_2.tga 0.351562500000 0.742187500000 0.361328125000 0.751953125000
+W_scale_less_2.tga 0.363281250000 0.742187500000 0.373046875000 0.751953125000
+W_button_10_over.tga 0.484375000000 0.742187500000 0.494140625000 0.751953125000
+W_arrow_right_2.tga 0.496093750000 0.742187500000 0.505859375000 0.751953125000
+r2_icon_map_entity_orient.tga 0.507812500000 0.742187500000 0.516601562500 0.752929687500
+quit_button_over_m.tga 0.265625000000 0.402343750000 0.269531250000 0.425781250000
+w_header_r.tga 0.257812500000 0.441406250000 0.261718750000 0.464843750000
+w_tab_pushed_m.tga 0.261718750000 0.441406250000 0.265625000000 0.464843750000
+w_tab_pushed_r.tga 0.472656250000 0.500000000000 0.476562500000 0.523437500000
+quit_button_pushed_m.tga 0.476562500000 0.500000000000 0.480468750000 0.523437500000
+w_header_m.tga 0.468750000000 0.531250000000 0.472656250000 0.554687500000
+r2_tab_wide_over_l.tga 0.464843750000 0.562500000000 0.468750000000 0.585937500000
+w_tab_up_normal_m.tga 0.519531250000 0.742187500000 0.523437500000 0.765625000000
+w_tab_down_normal_l.tga 0.523437500000 0.742187500000 0.527343750000 0.765625000000
+w_tab_up_normal_l.tga 0.527343750000 0.742187500000 0.531250000000 0.765625000000
+w_tab_down_normal_m.tga 0.531250000000 0.742187500000 0.535156250000 0.765625000000
+qh_off_m.tga 0.535156250000 0.742187500000 0.539062500000 0.765625000000
+r2_tab_wide_over_m.tga 0.539062500000 0.742187500000 0.542968750000 0.765625000000
+r2_tab_wide_over_r.tga 0.542968750000 0.742187500000 0.546875000000 0.765625000000
+w_tab_normal_l.tga 0.546875000000 0.742187500000 0.550781250000 0.765625000000
+w_tab_normal_m.tga 0.550781250000 0.742187500000 0.554687500000 0.765625000000
+w_tab_normal_r.tga 0.554687500000 0.742187500000 0.558593750000 0.765625000000
+qh_on_m.tga 0.558593750000 0.742187500000 0.562500000000 0.765625000000
+w_tab_over_l.tga 0.562500000000 0.742187500000 0.566406250000 0.765625000000
+w_tab_over_m.tga 0.566406250000 0.742187500000 0.570312500000 0.765625000000
+quit_button_normal_m.tga 0.570312500000 0.742187500000 0.574218750000 0.765625000000
+w_l0_tr_title.tga 0.574218750000 0.742187500000 0.578125000000 0.765625000000
+w_l0_t_title.tga 0.578125000000 0.742187500000 0.582031250000 0.765625000000
+w_tab_over_r.tga 0.582031250000 0.742187500000 0.585937500000 0.765625000000
+w_tab_pushed_l.tga 0.585937500000 0.742187500000 0.589843750000 0.765625000000
+W_ico_affected_fill.tga 0.171875000000 0.429687500000 0.177734375000 0.441406250000
+W_ico_affected.tga 0.992187500000 0.445312500000 0.998046875000 0.457031250000
+w_text_button_over_l.tga 0.988281250000 0.218750000000 0.992187500000 0.234375000000
+w_text_button_over_m.tga 0.121093750000 0.222656250000 0.125000000000 0.238281250000
+w_text_button_over_r.tga 0.148437500000 0.359375000000 0.152343750000 0.375000000000
+w_text_button_pushed_l.tga 0.460937500000 0.359375000000 0.464843750000 0.375000000000
+W_scale_more_3.tga 0.312500000000 0.273437500000 0.320312500000 0.281250000000
+w_text_button_pushed_m.tga 0.128906250000 0.414062500000 0.132812500000 0.429687500000
+w_text_button_pushed_r.tga 0.253906250000 0.480468750000 0.257812500000 0.496093750000
+r2ed_triggers_corner.tga 0.492187500000 0.273437500000 0.500000000000 0.281250000000
+r2ed_tool_border.tga 0.988281250000 0.304687500000 0.996093750000 0.312500000000
+W_L0_M_open.tga 0.089843750000 0.238281250000 0.105468750000 0.242187500000
+r2ed_tool_corner.tga 0.968750000000 0.343750000000 0.976562500000 0.351562500000
+r2ed_tool_corner_select.tga 0.992187500000 0.582031250000 1.000000000000 0.589843750000
+r2ed_tool_corner_select_g.tga 0.136718750000 0.593750000000 0.144531250000 0.601562500000
+W_L1_BL.tga 0.105468750000 0.238281250000 0.121093750000 0.242187500000
+W_L1_BL_open.tga 0.960937500000 0.386718750000 0.976562500000 0.390625000000
+W_L1_E_open.tga 0.328125000000 0.589843750000 0.343750000000 0.593750000000
+W_L2_BL.tga 0.117187500000 0.621093750000 0.132812500000 0.625000000000
+W_L2_BL_open.tga 0.746093750000 0.625000000000 0.761718750000 0.628906250000
+W_L2_E_open.tga 0.675781250000 0.667968750000 0.691406250000 0.671875000000
+W_L2_M_open.tga 0.589843750000 0.742187500000 0.605468750000 0.746093750000
+r2ed_tool_border_select.tga 0.144531250000 0.593750000000 0.152343750000 0.601562500000
+r2ed_tool_border_select_g.tga 0.519531250000 0.597656250000 0.527343750000 0.605468750000
+skin_l1_bl_open.tga 0.605468750000 0.742187500000 0.621093750000 0.746093750000
+W_point.tga 0.835937500000 0.605468750000 0.843750000000 0.613281250000
+W_button_08_over.tga 0.527343750000 0.613281250000 0.535156250000 0.621093750000
+skin_l1_e_open.tga 0.671875000000 0.742187500000 0.687500000000 0.746093750000
+W_close_3.tga 0.835937500000 0.613281250000 0.843750000000 0.621093750000
+cm_b.tga 0.527343750000 0.621093750000 0.535156250000 0.628906250000
+cm_bl.tga 0.882812500000 0.621093750000 0.890625000000 0.628906250000
+r2ed_island_border.tga 0.691406250000 0.628906250000 0.699218750000 0.636718750000
+W_hl_b.tga 0.882812500000 0.628906250000 0.890625000000 0.636718750000
+W_hl_bl.tga 0.691406250000 0.636718750000 0.699218750000 0.644531250000
+skin_sep_l.tga 0.808593750000 0.652343750000 0.816406250000 0.660156250000
+skin_sep_r.tga 0.808593750000 0.660156250000 0.816406250000 0.667968750000
+W_hl_br.tga 0.855468750000 0.667968750000 0.863281250000 0.675781250000
+skin_tl.tga 0.800781250000 0.675781250000 0.808593750000 0.683593750000
+skin_tr.tga 0.855468750000 0.675781250000 0.863281250000 0.683593750000
+W_hl_l.tga 0.800781250000 0.683593750000 0.808593750000 0.691406250000
+W_hl_r.tga 0.328125000000 0.695312500000 0.335937500000 0.703125000000
+W_hl_t.tga 0.691406250000 0.695312500000 0.699218750000 0.703125000000
+W_hl_tl.tga 0.328125000000 0.703125000000 0.335937500000 0.710937500000
+W_hl_tr.tga 0.722656250000 0.703125000000 0.730468750000 0.710937500000
+r2ed_island_corner.tga 0.785156250000 0.707031250000 0.792968750000 0.714843750000
+cm_br.tga 0.625000000000 0.710937500000 0.632812500000 0.718750000000
+cm_l.tga 0.722656250000 0.710937500000 0.730468750000 0.718750000000
+cm_link_hor.tga 0.785156250000 0.714843750000 0.792968750000 0.722656250000
+cm_link_vert.tga 0.746093750000 0.722656250000 0.753906250000 0.730468750000
+cm_m.tga 0.949218750000 0.742187500000 0.957031250000 0.750000000000
+cm_r.tga 0.957031250000 0.742187500000 0.964843750000 0.750000000000
+cm_t.tga 0.980468750000 0.742187500000 0.988281250000 0.750000000000
+cm_tl.tga 0.988281250000 0.742187500000 0.996093750000 0.750000000000
+cm_tr.tga 0.000000000000 0.746093750000 0.007812500000 0.753906250000
+compas_l.tga 0.250000000000 0.511718750000 0.253906250000 0.527343750000
+r2_icon_map_entity_small.tga 0.007812500000 0.746093750000 0.015625000000 0.753906250000
+r2_icon_map_entity_small_highlight.tga 0.015625000000 0.746093750000 0.023437500000 0.753906250000
+w_l0_lock.tga 0.023437500000 0.746093750000 0.031250000000 0.753906250000
+W_L1_M_open.tga 0.031250000000 0.746093750000 0.046875000000 0.750000000000
+compas_m.tga 0.996093750000 0.531250000000 1.000000000000 0.546875000000
+W_scale_less_3.tga 0.046875000000 0.746093750000 0.054687500000 0.753906250000
+r2_icon_map_invalid_small.tga 0.054687500000 0.746093750000 0.062500000000 0.753906250000
+skin_bl.tga 0.289062500000 0.746093750000 0.296875000000 0.753906250000
+W_arrow_down_3.tga 0.296875000000 0.746093750000 0.304687500000 0.753906250000
+compas_r.tga 0.230468750000 0.601562500000 0.234375000000 0.617187500000
+W_button_10_choice.tga 0.375000000000 0.746093750000 0.382812500000 0.753906250000
+skin_br.tga 0.382812500000 0.746093750000 0.390625000000 0.753906250000
+skin_br_open.tga 0.390625000000 0.746093750000 0.398437500000 0.753906250000
+W_arrow_right_3.tga 0.398437500000 0.746093750000 0.406250000000 0.753906250000
+skin_l1_m_open.tga 0.406250000000 0.746093750000 0.421875000000 0.750000000000
+r2ed_triggers_border.tga 0.421875000000 0.746093750000 0.429687500000 0.753906250000
+skin_l1_bl.tga 0.429687500000 0.746093750000 0.445312500000 0.750000000000
+W_arrow_up_3.tga 0.445312500000 0.746093750000 0.453125000000 0.753906250000
+skin_er_open.tga 0.453125000000 0.746093750000 0.460937500000 0.753906250000
+w_special_bl.tga 0.460937500000 0.746093750000 0.468750000000 0.753906250000
+w_special_blank.tga 0.589843750000 0.746093750000 0.597656250000 0.753906250000
+w_special_br.tga 0.597656250000 0.746093750000 0.605468750000 0.753906250000
+w_special_tr.tga 0.605468750000 0.746093750000 0.613281250000 0.753906250000
+w_text_button_normal_l.tga 0.671875000000 0.675781250000 0.675781250000 0.691406250000
+w_text_button_normal_m.tga 0.621093750000 0.742187500000 0.625000000000 0.757812500000
+W_L0_BL.tga 0.671875000000 0.746093750000 0.687500000000 0.750000000000
+W_L0_BL_open.tga 0.746093750000 0.746093750000 0.761718750000 0.750000000000
+w_text_button_normal_r.tga 0.613281250000 0.746093750000 0.617187500000 0.761718750000
+W_quantity.tga 0.886718750000 0.746093750000 0.892578125000 0.753906250000
+Numbers_sep.tga 0.964843750000 0.746093750000 0.969726562500 0.753906250000
+Numbers_0.tga 0.031250000000 0.750000000000 0.036132812500 0.757812500000
+Numbers_1.tga 0.039062500000 0.750000000000 0.043945312500 0.757812500000
+Numbers_2.tga 0.277343750000 0.750000000000 0.282226562500 0.757812500000
+Numbers_3.tga 0.406250000000 0.750000000000 0.411132812500 0.757812500000
+Numbers_4.tga 0.414062500000 0.750000000000 0.418945312500 0.757812500000
+Numbers_5.tga 0.429687500000 0.750000000000 0.434570312500 0.757812500000
+Numbers_6.tga 0.437500000000 0.750000000000 0.442382812500 0.757812500000
+Numbers_7.tga 0.625000000000 0.750000000000 0.629882812500 0.757812500000
+Numbers_8.tga 0.632812500000 0.750000000000 0.637695312500 0.757812500000
+Numbers_9.tga 0.640625000000 0.750000000000 0.645507812500 0.757812500000
+r2ed_island_corner_select.tga 0.648437500000 0.750000000000 0.654296875000 0.755859375000
+r2ed_island_border_select.tga 0.656250000000 0.750000000000 0.662109375000 0.755859375000
+typo_m.tga 0.664062500000 0.750000000000 0.669921875000 0.755859375000
+typo_q.tga 0.671875000000 0.750000000000 0.677734375000 0.755859375000
+typo_v.tga 0.679687500000 0.750000000000 0.685546875000 0.755859375000
+typo_w.tga 0.691406250000 0.750000000000 0.697265625000 0.755859375000
+typo_y.tga 0.699218750000 0.750000000000 0.705078125000 0.755859375000
+W_scroll_L123_M.tga 0.984375000000 0.390625000000 0.992187500000 0.394531250000
+skin_scroll_t.tga 0.546875000000 0.453125000000 0.554687500000 0.457031250000
+W_scroll_L123_T.tga 0.457031250000 0.582031250000 0.464843750000 0.585937500000
+skin_sep_m.tga 0.882812500000 0.636718750000 0.890625000000 0.640625000000
+Skin_scroll_R.tga 0.988281250000 0.117187500000 0.992187500000 0.125000000000
+w_scroll_m.tga 0.996093750000 0.304687500000 1.000000000000 0.312500000000
+w_scroll_r.tga 0.125000000000 0.492187500000 0.128906250000 0.500000000000
+w_special_b.tga 0.156250000000 0.500000000000 0.160156250000 0.507812500000
+w_special_l.tga 0.691406250000 0.644531250000 0.699218750000 0.648437500000
+w_special_r.tga 0.738281250000 0.648437500000 0.746093750000 0.652343750000
+w_special_t.tga 0.152343750000 0.562500000000 0.156250000000 0.570312500000
+Skin_scroll_L.tga 0.527343750000 0.597656250000 0.531250000000 0.605468750000
+skin_scroll_b.tga 0.855468750000 0.683593750000 0.863281250000 0.687500000000
+w_scroll_l.tga 0.250000000000 0.710937500000 0.253906250000 0.718750000000
+W_scroll_L0_B.tga 0.730468750000 0.687500000000 0.738281250000 0.691406250000
+W_scroll_L0_M.tga 0.484375000000 0.707031250000 0.492187500000 0.710937500000
+W_scroll_L0_T.tga 0.656250000000 0.718750000000 0.664062500000 0.722656250000
+W_scroll_L123_B.tga 0.722656250000 0.718750000000 0.730468750000 0.722656250000
+W_L0_EM_open.tga 0.246093750000 0.726562500000 0.250000000000 0.734375000000
+W_L0_ER_open.tga 0.898437500000 0.730468750000 0.902343750000 0.738281250000
+typo_6.tga 0.707031250000 0.750000000000 0.711914062500 0.755859375000
+typo_question.tga 0.714843750000 0.750000000000 0.719726562500 0.755859375000
+typo_r.tga 0.722656250000 0.750000000000 0.727539062500 0.755859375000
+typo_u.tga 0.730468750000 0.750000000000 0.735351562500 0.755859375000
+typo_7.tga 0.746093750000 0.750000000000 0.750976562500 0.755859375000
+typo_8.tga 0.753906250000 0.750000000000 0.758789062500 0.755859375000
+typo_x.tga 0.769531250000 0.750000000000 0.774414062500 0.755859375000
+typo_9.tga 0.777343750000 0.750000000000 0.782226562500 0.755859375000
+typo_a.tga 0.785156250000 0.750000000000 0.790039062500 0.755859375000
+typo_0.tga 0.792968750000 0.750000000000 0.797851562500 0.755859375000
+typo_2.tga 0.800781250000 0.750000000000 0.805664062500 0.755859375000
+typo_b.tga 0.808593750000 0.750000000000 0.813476562500 0.755859375000
+typo_3.tga 0.816406250000 0.750000000000 0.821289062500 0.755859375000
+typo_4.tga 0.824218750000 0.750000000000 0.829101562500 0.755859375000
+typo_d.tga 0.832031250000 0.750000000000 0.836914062500 0.755859375000
+typo_g.tga 0.839843750000 0.750000000000 0.844726562500 0.755859375000
+typo_h.tga 0.847656250000 0.750000000000 0.852539062500 0.755859375000
+typo_k.tga 0.855468750000 0.750000000000 0.860351562500 0.755859375000
+typo_5.tga 0.863281250000 0.750000000000 0.868164062500 0.755859375000
+typo_n.tga 0.871093750000 0.750000000000 0.875976562500 0.755859375000
+typo_o.tga 0.878906250000 0.750000000000 0.883789062500 0.755859375000
+typo_p.tga 0.894531250000 0.750000000000 0.899414062500 0.755859375000
+infos_top.tga 0.066406250000 0.722656250000 0.073242187500 0.726562500000
+infos_bot.tga 0.648437500000 0.734375000000 0.655273437500 0.738281250000
+infos_mid.tga 0.902343750000 0.750000000000 0.909179687500 0.753906250000
+w_radar_point.tga 0.910156250000 0.750000000000 0.915039062500 0.754882812500
+bulle_tr.tga 0.917968750000 0.750000000000 0.922851562500 0.754882812500
+bulle_bl.tga 0.925781250000 0.750000000000 0.930664062500 0.754882812500
+bulle_br.tga 0.933593750000 0.750000000000 0.938476562500 0.754882812500
+bulle_tl.tga 0.949218750000 0.750000000000 0.954101562500 0.754882812500
+typo_l.tga 0.062500000000 0.734375000000 0.066406250000 0.740234375000
+typo_s.tga 0.617187500000 0.746093750000 0.621093750000 0.751953125000
+typo_t.tga 0.972656250000 0.746093750000 0.976562500000 0.751953125000
+typo_f.tga 0.285156250000 0.750000000000 0.289062500000 0.755859375000
+typo_c.tga 0.941406250000 0.750000000000 0.945312500000 0.755859375000
+typo_1.tga 0.957031250000 0.750000000000 0.960937500000 0.755859375000
+typo_i.tga 0.960937500000 0.750000000000 0.964843750000 0.755859375000
+typo_j.tga 0.980468750000 0.750000000000 0.984375000000 0.755859375000
+typo_z.tga 0.984375000000 0.750000000000 0.988281250000 0.755859375000
+typo_e.tga 0.988281250000 0.750000000000 0.992187500000 0.755859375000
+W_L1_L.tga 0.121093750000 0.238281250000 0.125000000000 0.242187500000
+W_L1_R.tga 0.351562500000 0.457031250000 0.355468750000 0.460937500000
+W_L1_T.tga 0.347656250000 0.496093750000 0.351562500000 0.500000000000
+W_L1_TL.tga 0.156250000000 0.507812500000 0.160156250000 0.511718750000
+W_L1_TR.tga 0.343750000000 0.527343750000 0.347656250000 0.531250000000
+W_L2_B.tga 0.996093750000 0.546875000000 1.000000000000 0.550781250000
+W_box_bot.tga 0.152343750000 0.570312500000 0.156250000000 0.574218750000
+w_l2_blank.tga 0.230468750000 0.617187500000 0.234375000000 0.621093750000
+W_box_bot_left.tga 0.132812500000 0.621093750000 0.136718750000 0.625000000000
+W_L2_BR.tga 0.761718750000 0.625000000000 0.765625000000 0.628906250000
+W_L2_BR_open.tga 0.964843750000 0.710937500000 0.968750000000 0.714843750000
+W_L2_B_open.tga 0.074218750000 0.722656250000 0.078125000000 0.726562500000
+r2ed_dismatch_filter.tga 0.671875000000 0.722656250000 0.675781250000 0.726562500000
+W_L2_L.tga 0.894531250000 0.746093750000 0.898437500000 0.750000000000
+W_box_bot_right.tga 0.992187500000 0.750000000000 0.996093750000 0.753906250000
+W_L2_R.tga 0.996093750000 0.750000000000 1.000000000000 0.753906250000
+W_L2_T.tga 0.000000000000 0.753906250000 0.003906250000 0.757812500000
+W_L2_TL.tga 0.003906250000 0.753906250000 0.007812500000 0.757812500000
+W_L2_TR.tga 0.007812500000 0.753906250000 0.011718750000 0.757812500000
+W_box_left.tga 0.011718750000 0.753906250000 0.015625000000 0.757812500000
+W_box_right.tga 0.015625000000 0.753906250000 0.019531250000 0.757812500000
+W_box_top.tga 0.019531250000 0.753906250000 0.023437500000 0.757812500000
+W_box_top_left.tga 0.023437500000 0.753906250000 0.027343750000 0.757812500000
+W_box_top_right.tga 0.027343750000 0.753906250000 0.031250000000 0.757812500000
+alpha_50.tga 0.046875000000 0.753906250000 0.050781250000 0.757812500000
+skin_l1_l.tga 0.050781250000 0.753906250000 0.054687500000 0.757812500000
+fame_bar_3d.tga 0.054687500000 0.753906250000 0.055664062500 0.769531250000
+skin_l1_r.tga 0.058593750000 0.753906250000 0.062500000000 0.757812500000
+blank.tga 0.062500000000 0.753906250000 0.066406250000 0.757812500000
+blank2.tga 0.066406250000 0.753906250000 0.070312500000 0.757812500000
+skin_l1_t.tga 0.070312500000 0.753906250000 0.074218750000 0.757812500000
+skin_l1_tl.tga 0.074218750000 0.753906250000 0.078125000000 0.757812500000
+alpha_60.tga 0.078125000000 0.753906250000 0.082031250000 0.757812500000
+skin_l2_r.tga 0.082031250000 0.753906250000 0.085937500000 0.757812500000
+skin_l3_r.tga 0.085937500000 0.753906250000 0.089843750000 0.757812500000
+skin_modal_b.tga 0.089843750000 0.753906250000 0.093750000000 0.757812500000
+w_hl_bl_l123.tga 0.093750000000 0.753906250000 0.097656250000 0.757812500000
+skin_modal_bl.tga 0.097656250000 0.753906250000 0.101562500000 0.757812500000
+w_hl_br_l123.tga 0.101562500000 0.753906250000 0.105468750000 0.757812500000
+w_hl_b_l123.tga 0.105468750000 0.753906250000 0.109375000000 0.757812500000
+skin_modal_br.tga 0.109375000000 0.753906250000 0.113281250000 0.757812500000
+w_hl_l_l123.tga 0.113281250000 0.753906250000 0.117187500000 0.757812500000
+skin_modal_l.tga 0.117187500000 0.753906250000 0.121093750000 0.757812500000
+w_hl_r_l123.tga 0.121093750000 0.753906250000 0.125000000000 0.757812500000
+skin_modal_r.tga 0.125000000000 0.753906250000 0.128906250000 0.757812500000
+skin_modal_t.tga 0.128906250000 0.753906250000 0.132812500000 0.757812500000
+w_hl_tl_l123.tga 0.132812500000 0.753906250000 0.136718750000 0.757812500000
+skin_modal_tl.tga 0.136718750000 0.753906250000 0.140625000000 0.757812500000
+w_hl_tr_l123.tga 0.140625000000 0.753906250000 0.144531250000 0.757812500000
+skin_modal_tr.tga 0.144531250000 0.753906250000 0.148437500000 0.757812500000
+alpha_70.tga 0.148437500000 0.753906250000 0.152343750000 0.757812500000
+alpha_80.tga 0.152343750000 0.753906250000 0.156250000000 0.757812500000
+W_L3_BL.tga 0.156250000000 0.753906250000 0.160156250000 0.757812500000
+w_l3_blank.tga 0.160156250000 0.753906250000 0.164062500000 0.757812500000
+W_L3_BR.tga 0.164062500000 0.753906250000 0.167968750000 0.757812500000
+W_L3_L.tga 0.167968750000 0.753906250000 0.171875000000 0.757812500000
+W_L3_R.tga 0.289062500000 0.753906250000 0.292968750000 0.757812500000
+W_L3_T.tga 0.292968750000 0.753906250000 0.296875000000 0.757812500000
+W_L3_TL.tga 0.296875000000 0.753906250000 0.300781250000 0.757812500000
+W_L3_TR.tga 0.300781250000 0.753906250000 0.304687500000 0.757812500000
+grey_0.tga 0.316406250000 0.753906250000 0.320312500000 0.757812500000
+r2ed_triggers_gray.tga 0.320312500000 0.753906250000 0.324218750000 0.757812500000
+W_modal_B.tga 0.324218750000 0.753906250000 0.328125000000 0.757812500000
+W_modal_BL.tga 0.328125000000 0.753906250000 0.332031250000 0.757812500000
+W_modal_blank.tga 0.332031250000 0.753906250000 0.335937500000 0.757812500000
+W_modal_BR.tga 0.335937500000 0.753906250000 0.339843750000 0.757812500000
+W_modal_L.tga 0.339843750000 0.753906250000 0.343750000000 0.757812500000
+W_modal_R.tga 0.343750000000 0.753906250000 0.347656250000 0.757812500000
+W_modal_T.tga 0.347656250000 0.753906250000 0.351562500000 0.757812500000
+W_modal_TL.tga 0.351562500000 0.753906250000 0.355468750000 0.757812500000
+W_modal_TR.tga 0.355468750000 0.753906250000 0.359375000000 0.757812500000
+grey_10.tga 0.359375000000 0.753906250000 0.363281250000 0.757812500000
+grey_100.tga 0.363281250000 0.753906250000 0.367187500000 0.757812500000
+grey_20.tga 0.367187500000 0.753906250000 0.371093750000 0.757812500000
+grey_30.tga 0.371093750000 0.753906250000 0.375000000000 0.757812500000
+grey_40.tga 0.375000000000 0.753906250000 0.378906250000 0.757812500000
+grey_50.tga 0.378906250000 0.753906250000 0.382812500000 0.757812500000
+grey_60.tga 0.382812500000 0.753906250000 0.386718750000 0.757812500000
+grey_70.tga 0.386718750000 0.753906250000 0.390625000000 0.757812500000
+w_hl_t_l123.tga 0.390625000000 0.753906250000 0.394531250000 0.757812500000
+grey_80.tga 0.394531250000 0.753906250000 0.398437500000 0.757812500000
+grey_90.tga 0.398437500000 0.753906250000 0.402343750000 0.757812500000
+W_L3_B.tga 0.402343750000 0.753906250000 0.406250000000 0.757812500000
+r2ed_triggers_blank.tga 0.421875000000 0.753906250000 0.425781250000 0.757812500000
+alpha_10.tga 0.425781250000 0.753906250000 0.429687500000 0.757812500000
+skin_l1_b.tga 0.445312500000 0.753906250000 0.449218750000 0.757812500000
+alpha_20.tga 0.449218750000 0.753906250000 0.453125000000 0.757812500000
+w_l0_l_over.tga 0.453125000000 0.753906250000 0.457031250000 0.757812500000
+r2ed_triggers_little_border.tga 0.457031250000 0.753906250000 0.460937500000 0.757812500000
+r2ed_little_island_border_select.tga 0.460937500000 0.753906250000 0.464843750000 0.757812500000
+r2ed_triggers_little_corner.tga 0.464843750000 0.753906250000 0.468750000000 0.757812500000
+W_L0_R.tga 0.468750000000 0.753906250000 0.472656250000 0.757812500000
+w_l0_r_over.tga 0.472656250000 0.753906250000 0.476562500000 0.757812500000
+W_L0_T.tga 0.476562500000 0.753906250000 0.480468750000 0.757812500000
+W_L0_TL.tga 0.484375000000 0.753906250000 0.488281250000 0.757812500000
+w_l0_tl_over.tga 0.488281250000 0.753906250000 0.492187500000 0.757812500000
+r2ed_little_island_corner_select.tga 0.492187500000 0.753906250000 0.496093750000 0.757812500000
+W_L0_TR.tga 0.496093750000 0.753906250000 0.500000000000 0.757812500000
+w_l0_tr_over.tga 0.500000000000 0.753906250000 0.503906250000 0.757812500000
+alpha_30.tga 0.503906250000 0.753906250000 0.507812500000 0.757812500000
+w_l0_t_over.tga 0.507812500000 0.753906250000 0.511718750000 0.757812500000
+alpha_40.tga 0.511718750000 0.753906250000 0.515625000000 0.757812500000
+W_L123_blank.tga 0.515625000000 0.753906250000 0.519531250000 0.757812500000
+W_L1_B.tga 0.589843750000 0.753906250000 0.593750000000 0.757812500000
+r2ed_tool_bg.tga 0.593750000000 0.753906250000 0.597656250000 0.757812500000
+w_l1_blank.tga 0.597656250000 0.753906250000 0.601562500000 0.757812500000
+W_L0_B.tga 0.601562500000 0.753906250000 0.605468750000 0.757812500000
+skin_l1_b_open.tga 0.605468750000 0.753906250000 0.609375000000 0.757812500000
+W_L0_blank.tga 0.609375000000 0.753906250000 0.613281250000 0.757812500000
+W_L1_BR.tga 0.617187500000 0.753906250000 0.621093750000 0.757812500000
+w_l0_bl_over.tga 0.886718750000 0.753906250000 0.890625000000 0.757812500000
+W_L0_BR.tga 0.890625000000 0.753906250000 0.894531250000 0.757812500000
+W_L0_BR_open.tga 0.902343750000 0.753906250000 0.906250000000 0.757812500000
+w_l0_br_over.tga 0.906250000000 0.753906250000 0.910156250000 0.757812500000
+W_L0_B_open.tga 0.964843750000 0.753906250000 0.968750000000 0.757812500000
+w_l0_b_over.tga 0.968750000000 0.753906250000 0.972656250000 0.757812500000
+W_L1_BR_open.tga 0.972656250000 0.753906250000 0.976562500000 0.757812500000
+W_L1_B_open.tga 0.992187500000 0.753906250000 0.996093750000 0.757812500000
+W_box_blank.tga 0.996093750000 0.753906250000 1.000000000000 0.757812500000
+W_L0_L.tga 0.000000000000 0.757812500000 0.003906250000 0.761718750000
+w_jauge_fill_tmin.tga 0.003906250000 0.757812500000 0.004882812500 0.767578125000
+bulle_l.tga 0.007812500000 0.757812500000 0.012695312500 0.759765625000
+bulle_t.tga 0.015625000000 0.757812500000 0.017578125000 0.762695312500
+bulle_r.tga 0.019531250000 0.757812500000 0.024414062500 0.759765625000
+bulle_b.tga 0.027343750000 0.757812500000 0.029296875000 0.762695312500
+w_line_hor3.tga 0.031250000000 0.757812500000 0.033203125000 0.761718750000
+r2_map_zone_edge.tga 0.035156250000 0.757812500000 0.037109375000 0.760742187500
+w_l1_r_spe.tga 0.039062500000 0.757812500000 0.042968750000 0.758789062500
+bulle_m.tga 0.042968750000 0.757812500000 0.044921875000 0.759765625000
+w_l1_spe_blank.tga 0.046875000000 0.757812500000 0.050781250000 0.758789062500
+skin_l1_spe_blank.tga 0.050781250000 0.757812500000 0.054687500000 0.758789062500
+text_cursor.tga 0.058593750000 0.757812500000 0.060546875000 0.759765625000
+jauge_fill.tga 0.062500000000 0.757812500000 0.063476562500 0.761718750000
+W_jauge_fill.tga 0.066406250000 0.757812500000 0.067382812500 0.761718750000
+W_line_hor.tga 0.070312500000 0.757812500000 0.072265625000 0.759765625000
+w_line_hor2.tga 0.074218750000 0.757812500000 0.076171875000 0.759765625000
+skin_l1_r_spe.tga 0.078125000000 0.757812500000 0.082031250000 0.758789062500
+W_line_ver.tga 0.082031250000 0.757812500000 0.083984375000 0.759765625000
+W_jauge_fill_mini.tga 0.085937500000 0.757812500000 0.086914062500 0.759765625000
+w_jauge_fill_umin.tga 0.089843750000 0.757812500000 0.090820312500 0.759765625000
+no_bord.tga 0.093750000000 0.757812500000 0.094726562500 0.758789062500
+r2ed_tool_draw_road_base.psd 0.000000000000 0.000000000000 0.000000000000 0.000000000000
+r2_icon_components_chest.tga 0.000000000000 0.000000000000 0.000000000000 0.000000000000
+r2_instance_link.shape 0.000000000000 0.000000000000 0.000000000000 0.000000000000
+instance_link.shape 0.000000000000 0.000000000000 0.000000000000 0.000000000000
+r2ed_tool_draw_region.psd 0.000000000000 0.000000000000 0.000000000000 0.000000000000
+r2ed_tool_draw_road_over.psd 0.000000000000 0.000000000000 0.000000000000 0.000000000000
+r2_region_vertex.shape 0.000000000000 0.000000000000 0.000000000000 0.000000000000
+r2_road_flag.shape 0.000000000000 0.000000000000 0.000000000000 0.000000000000
+r2_entity_count_too_high.shape 0.000000000000 0.000000000000 0.000000000000 0.000000000000
+r2_entity_place_holder.shape 0.000000000000 0.000000000000 0.000000000000 0.000000000000
+r2ed_tool_draw_road.psd 0.000000000000 0.000000000000 0.000000000000 0.000000000000
+r2ed_tool_draw_region_over.psd 0.000000000000 0.000000000000 0.000000000000 0.000000000000
+r2ed_tool_split_road_over.psd 0.000000000000 0.000000000000 0.000000000000 0.000000000000
+road_flag.max 0.000000000000 0.000000000000 0.000000000000 0.000000000000
+road_flag.shape 0.000000000000 0.000000000000 0.000000000000 0.000000000000
diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/webig.lua b/code/ryzom/client/data/gamedev/interfaces_v3/webig.lua
new file mode 100644
index 000000000..9b88c02f7
--- /dev/null
+++ b/code/ryzom/client/data/gamedev/interfaces_v3/webig.lua
@@ -0,0 +1,190 @@
+
+-- create the webig namespace without reseting if already created in an other file.
+if (webig==nil) then
+ webig= {}
+end
+
+if (webig.sheetLists==nil) then
+ webig.sheetLists = {}
+end
+
+
+function webig:addSheet(dst, sheet, quality, quantity, worned, user_color, rm_class_type, rm_faber_stat_type)
+ if quality == nil then quality=0 end
+ if quantity == nil then quantity=0 end
+ if worned == nil then worned=0 end
+ if user_color == nil then user_color=0 end
+ if rm_class_type == nil then rm_class_type=0 end
+ if rm_faber_stat_type == nil then rm_faber_stat_type=0 end
+ addDbProp(dst..":SHEET", sheet)
+ addDbProp(dst..":WORNED", worned)
+ addDbProp(dst..":QUALITY", quality)
+ addDbProp(dst..":QUANTITY", quantity)
+ addDbProp(dst..":USER_COLOR", user_color)
+ addDbProp(dst..":RM_CLASS_TYPE", rm_class_type)
+ addDbProp(dst..":RM_FABER_STAT_TYPE", rm_faber_stat_type)
+end
+
+function webig:cleanSheets(db)
+ delDbProp(db)
+end
+
+function webig:addSheetList(name, ctrl, db, size)
+ webig.sheetLists[name] = {}
+ webig.sheetLists[name].ctrl = ctrl
+ webig.sheetLists[name].db = db
+ webig.sheetLists[name].selection = ""
+ webig.sheetLists[name].size = size
+end
+
+function webig:copyItems(src, dst)
+ addDbProp(dst..":SHEET", getDbProp(src..":SHEET"))
+ addDbProp(dst..":WORNED", getDbProp(src..":WORNED"))
+ addDbProp(dst..":QUALITY", getDbProp(src..":QUALITY"))
+ addDbProp(dst..":QUANTITY", getDbProp(src..":QUANTITY"))
+ addDbProp(dst..":USER_COLOR", getDbProp(src..":USER_COLOR"))
+ addDbProp(dst..":RM_CLASS_TYPE", getDbProp(src..":RM_CLASS_TYPE"))
+ addDbProp(dst..":RM_FABER_STAT_TYPE", getDbProp(src..":RM_FABER_STAT_TYPE"))
+end
+
+function webig:swapItems(src, dst)
+ local sheet = getDbProp(dst..":SHEET")
+ local worned = getDbProp(dst..":WORNED")
+ local quality = getDbProp(dst..":QUALITY")
+ local quantity = getDbProp(dst..":QUANTITY")
+ local user_color = getDbProp(dst..":USER_COLOR")
+ local rm_class_type = getDbProp(dst..":RM_CLASS_TYPE")
+ local rm_faber_stat_type = getDbProp(dst..":RM_FABER_STAT_TYPE")
+
+ addDbProp(dst..":SHEET", getDbProp(src..":SHEET"))
+ addDbProp(dst..":WORNED", getDbProp(src..":WORNED"))
+ addDbProp(dst..":QUALITY", getDbProp(src..":QUALITY"))
+ addDbProp(dst..":QUANTITY", getDbProp(src..":QUANTITY"))
+ addDbProp(dst..":USER_COLOR", getDbProp(src..":USER_COLOR"))
+ addDbProp(dst..":RM_CLASS_TYPE", getDbProp(src..":RM_CLASS_TYPE"))
+ addDbProp(dst..":RM_FABER_STAT_TYPE", getDbProp(src..":RM_FABER_STAT_TYPE"))
+
+ addDbProp(src..":SHEET", sheet)
+ addDbProp(src..":WORNED", worned)
+ addDbProp(src..":QUALITY", quality)
+ addDbProp(src..":QUANTITY", quantity)
+ addDbProp(src..":USER_COLOR", user_color)
+ addDbProp(src..":RM_CLASS_TYPE", rm_class_type)
+ addDbProp(src..":RM_FABER_STAT_TYPE", rm_faber_stat_type)
+end
+
+function webig:deleteItem(src)
+ addDbProp(src..":SHEET", 0)
+ addDbProp(src..":WORNED", 0)
+ addDbProp(src..":QUALITY", 0)
+ addDbProp(src..":QUANTITY", 0)
+ addDbProp(src..":USER_COLOR", 0)
+ addDbProp(src..":RM_CLASS_TYPE", 0)
+ addDbProp(src..":RM_FABER_STAT_TYPE", 0)
+end
+
+function webig:paramDbSheetSlot(sheet_list, ctrl)
+ local ctrlSheet = webig.sheetLists[sheet_list].ctrl:find("list:"..ctrl)
+ if ctrlSheet ~= nil then
+ ctrlSheet.left_click="lua"
+ ctrlSheet.left_click_params="webig:addOrRemoveDbSheet(\'"..sheet_list.."\', \'"..ctrl.."\')"
+ ctrlSheet.dragable=true
+ ctrlSheet.can_drop=true
+ ctrlSheet.on_drop="lua"
+ ctrlSheet.on_drop_params="webig:dropDbSheet(\'"..sheet_list.."\', \'"..ctrl.."\', \'%src\')"
+ ctrlSheet.on_can_drop="lua"
+ ctrlSheet.on_can_drop_params="webig:canDropDbSheet(\'"..sheet_list.."\', \'"..ctrl.."\', \'%src\')"
+ end
+end
+
+function webig:paramDbSheetSelect(sheet_list, ctrl, lua_function)
+ local ctrlSheet = webig.sheetLists[sheet_list].ctrl:find("list:"..ctrl)
+ if ctrlSheet ~= nil then
+ ctrlSheet.left_click="lua"
+ ctrlSheet.left_click_params=lua_function.."(\'"..sheet_list.."\', \'"..ctrl.."\')"
+ ctrlSheet.dragable=false
+ ctrlSheet.can_drop=false
+ end
+end
+
+function webig:canDropDbSheet(sheet_list, ctrl, src)
+ webig.sheetLists[sheet_list].ctrl:find("list:"..ctrl).can_drop=true
+end
+
+function webig:dropDbSheet(sheet_list, ctrl, src)
+ local db = webig.sheetLists[sheet_list].db
+ local sl_id = webig.sheetLists[sheet_list].ctrl.id
+ if (string.sub(src, 1, string.len(sl_id)) == sl_id) then -- copy from same list sheet
+ local pos=nil
+ for i=1, string.len(src) do
+ if string.sub(src, i, i) == ":" then
+ pos = i+1
+ end
+ end
+ id = string.sub(src, pos, string.len(src))
+ webig:swapItems(db..":"..id, db..":"..ctrl)
+ else
+ slot = getUI(src)
+ if slot ~= nil then
+ id = findReplaceAll(src, slot.parent.id..":", "")
+ webig:copyItems("LOCAL:INVENTORY:BAG:"..id, db..":"..ctrl)
+ end
+ end
+end
+
+
+function webig:addOrRemoveDbSheet(sheet_list, ctrl)
+ local db = webig.sheetLists[sheet_list].db
+ if getDbProp(db..":"..ctrl..":SHEET") == 0 then -- Add item
+ webig:AddDbSheet(sheet_list, ctrl)
+ else
+ webig:removeDbSheetQuantity(sheet_list, ctrl)
+ end
+end
+
+function webig:AddDbSheet(sheet_list, ctrl)
+ runAH(nil, "enter_modal", "group=ui:interface:webig_html_modal")
+ local whm = getUI("ui:interface:webig_html_modal")
+ whm.child_resize_h=false
+ whm.h = 44*webig.sheetLists[sheet_list].size
+ whm.w = 224
+ whm = getUI("ui:interface:webig_html_modal:html")
+ if whm ~= nil then
+ whm:refresh() -- url need be setted before
+ end
+ webig.sheetLists[sheet_list].selection = ctrl
+end
+
+function webig:removeDbSheetQuantity(sheet_list, ctrl)
+ local db = webig.sheetLists[sheet_list].db
+ webig:copyItems(db..":"..ctrl, "UI:DROP_DESTROY_ITEM:ITEM")
+ runAH(nil, "set_keyboard_focus", "select_all=true|target=ui:interface:webig_drop_destroy_item_quantity_modal:edit:eb")
+ getUI("ui:interface:webig_drop_destroy_item_quantity_modal:ok_cancel:ok").onclick_l="lua"
+ getUI("ui:interface:webig_drop_destroy_item_quantity_modal:ok_cancel:ok").params_l="webig:doRemoveDbSheetQuantity(\'"..sheet_list.."\', \'"..ctrl.."\')"
+ getUI("ui:interface:webig_drop_destroy_item_quantity_modal:edit:eb").on_enter="lua"
+ getUI("ui:interface:webig_drop_destroy_item_quantity_modal:edit:eb").on_enter_params="webig:doRemoveDbSheetQuantity(\'"..sheet_list.."\', \'"..ctrl.."\')"
+ runAH(nil, "enter_modal", "group=ui:interface:webig_drop_destroy_item_quantity_modal")
+ setDbProp("UI:DROP_DESTROY_ITEM:ITEM:QUANTITY", getDbProp(db..":"..ctrl..":QUANTITY"))
+ getUI("ui:interface:webig_drop_destroy_item_quantity_modal:edit:eb").input_string=tostring(getDbProp(db..":"..ctrl..":QUANTITY"))
+end
+
+function webig:doRemoveDbSheetQuantity(sheet_list, ctrl)
+ local db = webig.sheetLists[sheet_list].db
+ runAH(nil, "leave_modal", "group=ui:interface:webig_drop_destroy_item_quantity_modal")
+ local new_quantity = tonumber(getUI("ui:interface:webig_drop_destroy_item_quantity_modal:edit:eb").input_string)
+ local current_quantity = getDbProp(db..":"..ctrl..":QUANTITY")
+ if new_quantity >= current_quantity then
+ webig:deleteItem(db..":"..ctrl)
+ else
+ addDbProp(db..":"..ctrl..":QUANTITY", current_quantity-new_quantity)
+ end
+end
+
+--assert(nil, "RELOADABLE SCRIPT");
+
+
+
+
+
+
+
diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml b/code/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml
new file mode 100644
index 000000000..3c1470485
--- /dev/null
+++ b/code/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/ryzom/client/src/character_cl.cpp b/code/ryzom/client/src/character_cl.cpp
index c0e6d1104..2d5076b90 100644
--- a/code/ryzom/client/src/character_cl.cpp
+++ b/code/ryzom/client/src/character_cl.cpp
@@ -1878,6 +1878,8 @@ void CCharacterCL::updateVisualPropertyPvpClan(const NLMISC::TGameCycle &/* game
{
_LeagueId = uint32(prop);
+ buildInSceneInterface();
+
if (isUser())
{
uint i;
diff --git a/code/ryzom/client/src/client_cfg.cpp b/code/ryzom/client/src/client_cfg.cpp
index 54a3d9b45..e0ed33abe 100644
--- a/code/ryzom/client/src/client_cfg.cpp
+++ b/code/ryzom/client/src/client_cfg.cpp
@@ -1347,6 +1347,7 @@ void CClientConfig::setValues()
if (stricmp(mode, "over") == 0) p.Mode = SSysInfoParam::Over;
else if (stricmp(mode, "overonly") == 0) p.Mode = SSysInfoParam::OverOnly;
else if (stricmp(mode, "center") == 0) p.Mode = SSysInfoParam::Center;
+ else if (stricmp(mode, "centeraround") == 0) p.Mode = SSysInfoParam::CenterAround;
else if (stricmp(mode, "around") == 0) p.Mode = SSysInfoParam::Around;
ClientCfg.SystemInfoParams[toLower(sic->asString(2 * k))] = p;
diff --git a/code/ryzom/client/src/client_cfg.h b/code/ryzom/client/src/client_cfg.h
index 86e70c1b8..3925aaf2d 100644
--- a/code/ryzom/client/src/client_cfg.h
+++ b/code/ryzom/client/src/client_cfg.h
@@ -635,12 +635,15 @@ struct CClientConfig
// Mode is the display settings :
// Normal : just display in the system info window
// Over : must be displayed at bottom of the screen and in system info window
+ // OverOnly : must be displayed at bottom of the screen
// Center ; must be displayed at the center of the screen and in system info window
+ // Around ; must be displayed in the around chat window
+ // CenterAround ; must be displayed at the center of the screen and in around chat window
struct SSysInfoParam
{
CRGBA Color;
std::string SysInfoFxName;
- enum TMode { Normal, Over, OverOnly, Center, Around };
+ enum TMode { Normal, Over, OverOnly, Center, Around, CenterAround };
TMode Mode;
SSysInfoParam()
{
diff --git a/code/ryzom/client/src/interface_v3/action_handler_game.cpp b/code/ryzom/client/src/interface_v3/action_handler_game.cpp
index 22d65d138..5f3314cb2 100644
--- a/code/ryzom/client/src/interface_v3/action_handler_game.cpp
+++ b/code/ryzom/client/src/interface_v3/action_handler_game.cpp
@@ -2571,7 +2571,9 @@ class CAHAddShape : public IActionHandler
skel.setPos(CVector((float)x, (float)y, (float)z));
skel.setRotQuat(dir.getRot());
}
- } else {
+ }
+ else
+ {
instance.setScale(instance.getScale()*s);
instance.setPos(CVector((float)x, (float)y, (float)z));
instance.setRotQuat(dir.getRot());
@@ -3168,7 +3170,6 @@ class CHandlerGameConfigFullscreen : public IActionHandler
// hide frequencies combo
pCB= dynamic_cast(pIM->getElementFromId( GAME_CONFIG_VIDEO_FREQS_COMBO ));
if (pCB) pCB->setActive(false);
-
}
// **** dirt the apply button of the DDX
diff --git a/code/ryzom/client/src/interface_v3/action_handler_help.cpp b/code/ryzom/client/src/interface_v3/action_handler_help.cpp
index ddcb324d7..3774764b4 100644
--- a/code/ryzom/client/src/interface_v3/action_handler_help.cpp
+++ b/code/ryzom/client/src/interface_v3/action_handler_help.cpp
@@ -244,6 +244,7 @@ CInterfaceGroup *CInterfaceHelp::activateNextWindow(CDBCtrlSheet *elt, sint forc
i++;
}
+ bool showSlotAndCreator = false;
// If an active window get the same object, abort, but make it top.
for(i=0;i<_ActiveWindows.size();i++)
{
@@ -261,6 +262,8 @@ CInterfaceGroup *CInterfaceHelp::activateNextWindow(CDBCtrlSheet *elt, sint forc
// for items, must also test if they have the same itemSlotId, cause relies also on "ItemInfo system"
if(elt->getType() == CCtrlSheetInfo::SheetType_Item)
{
+ showSlotAndCreator = true;
+
CDBCtrlSheet *realCtrlDst= _InfoWindows[_ActiveWindows[i]].CtrlSheet;
if(!realCtrlDst)
ok= false;
@@ -344,6 +347,13 @@ CInterfaceGroup *CInterfaceHelp::activateNextWindow(CDBCtrlSheet *elt, sint forc
CInterfaceGroup *group= _InfoWindows[newIndexWindow].Window;
nlassert(group);
+ CInterfaceElement *ctrl = group->getElement(group->getId()+":content:ctrl_slot");
+ if (ctrl) ctrl->setActive(showSlotAndCreator);
+ ctrl = group->getElement(group->getId()+":content:creator");
+ if (ctrl) ctrl->setActive(showSlotAndCreator);
+ ctrl = group->getElement(group->getId()+":content:creator_header");
+ if (ctrl) ctrl->setActive(showSlotAndCreator);
+
// activate it, set top, copy item watched
group->setActive(true);
pIM->setTopWindow(group);
@@ -1217,6 +1227,7 @@ static void setupSkillToTradeHelp(CSheetHelpSetup &setup)
if(setup.DestSheet)
{
setup.SrcSheet->copyAspect(setup.DestSheet);
+ setup.DestSheet->setActive(true);
}
ucstring skillText;
@@ -2278,6 +2289,7 @@ static void setupItemHelp(CSheetHelpSetup &setup)
if(setup.DestSheet)
{
setup.SrcSheet->copyAspect(setup.DestSheet);
+ setup.DestSheet->setActive(true);
}
// NB: for raw materials only, must do each once only, must not do it at refresh, cause combo reseted
@@ -2566,6 +2578,7 @@ static void setupPactHelp(CSheetHelpSetup &setup)
if(setup.DestSheet)
{
setup.SrcSheet->copyAspect(setup.DestSheet);
+ setup.DestSheet->setActive(true);
}
@@ -2603,6 +2616,7 @@ static void setupMissionHelp(CSheetHelpSetup &setup)
if(setup.DestSheet)
{
setup.SrcSheet->copyAspect(setup.DestSheet);
+ setup.DestSheet->setActive(true);
}
// get detail text id from db
@@ -2840,6 +2854,7 @@ void setupOutpostBuildingHelp(CSheetHelpSetup &setup)
if(setup.DestSheet)
{
setup.SrcSheet->copyAspect(setup.DestSheet);
+ setup.DestSheet->setActive(true);
}
const COutpostBuildingSheet *pOBS = setup.SrcSheet->asOutpostBuildingSheet();
@@ -3164,6 +3179,7 @@ void setupSabrinaPhraseHelp(CSheetHelpSetup &setup, const CSPhraseCom &phrase, u
if(setup.DestSheet)
{
setup.SrcSheet->copyAspect(setup.DestSheet);
+ setup.DestSheet->setActive(true);
}
// **** setup the phrase Text info
@@ -3233,6 +3249,7 @@ static void setupSabrinaBrickHelp(CSheetHelpSetup &setup, bool auraDisabled)
if(setup.DestSheet)
{
setup.SrcSheet->copyAspect(setup.DestSheet);
+ setup.DestSheet->setActive(true);
}
diff --git a/code/ryzom/client/src/interface_v3/bot_chat_page_trade.cpp b/code/ryzom/client/src/interface_v3/bot_chat_page_trade.cpp
index 1cd5644d4..bde03fa4b 100644
--- a/code/ryzom/client/src/interface_v3/bot_chat_page_trade.cpp
+++ b/code/ryzom/client/src/interface_v3/bot_chat_page_trade.cpp
@@ -997,7 +997,7 @@ void CBotChatPageTrade::startSellDialog(CDBCtrlSheet *sheet, CCtrlBase * /* pCal
CCtrlTextButton *confirmButton = dynamic_cast(ig->getCtrl("ok"));
if (confirmButton)
{
- confirmButton->setActive( sheet->getLockedByOwner() );
+ confirmButton->setActive( !sheet->getLockedByOwner() );
confirmButton->setText(CI18N::get("uiSellImmediately"));
confirmButton->setDefaultContextHelp(CI18N::get("uittDirectSellButton"));
}
diff --git a/code/ryzom/client/src/interface_v3/group_html.cpp b/code/ryzom/client/src/interface_v3/group_html.cpp
index 388064131..e17426a79 100644
--- a/code/ryzom/client/src/interface_v3/group_html.cpp
+++ b/code/ryzom/client/src/interface_v3/group_html.cpp
@@ -238,7 +238,7 @@ bool CGroupHTML::addBnpDownload(const string &url, const string &action, const s
}
else
{
- return true;
+ return true;
}
}
if (action != "delete")
@@ -361,7 +361,6 @@ void CGroupHTML::checkDownloads()
CFile::moveFile(file.c_str(), (file+".tmp").c_str());
if (lookupLocalFile (finalUrl, file.c_str(), false))
{
-
CInterfaceManager *pIM = CInterfaceManager::getInstance();
pIM->executeLuaScript(it->luaScript, true);
}
@@ -469,10 +468,10 @@ void CGroupHTML::beginBuild ()
TStyle CGroupHTML::parseStyle (const string &str_styles)
{
- TStyle styles;
+ TStyle styles;
vector elements;
NLMISC::splitString(str_styles, ";", elements);
-
+
for(uint i = 0; i < elements.size(); ++i)
{
vector style;
@@ -485,7 +484,7 @@ TStyle CGroupHTML::parseStyle (const string &str_styles)
styles[trim(style[0])] = fullstyle;
}
}
-
+
return styles;
}
@@ -584,7 +583,7 @@ void CGroupHTML::addLink (uint element_number, uint /* attribute_number */, HTCh
else if (_TrustedDomain && suri[0] == '#')
{
// Direct url (hack for lua beginElement)
- _Link.push_back (suri.substr(1));
+ _Link.push_back (suri.substr(1));
}
else
{
@@ -615,7 +614,7 @@ void CGroupHTML::addLink (uint element_number, uint /* attribute_number */, HTCh
_LinkTitle.push_back(title);
}
else
- _LinkTitle.push_back("");
+ _LinkTitle.push_back("");
}
else
{
@@ -964,8 +963,8 @@ void CGroupHTML::beginElement (uint element_number, const BOOL *present, const c
}
}
- if (!templateName.empty())
- {
+ if (!templateName.empty())
+ {
string parentId;
bool haveParentDiv = getDiv() != NULL;
if (haveParentDiv)
@@ -1175,7 +1174,7 @@ void CGroupHTML::beginElement (uint element_number, const BOOL *present, const c
// Get the option to reload (class==reload)
bool reloadImg = false;
- string style;
+ string style;
if (present[MY_HTML_IMG_STYLE] && value[MY_HTML_IMG_STYLE])
style = value[MY_HTML_IMG_STYLE];
@@ -1189,7 +1188,7 @@ void CGroupHTML::beginElement (uint element_number, const BOOL *present, const c
reloadImg = true;
}
- addImage (value[MY_HTML_IMG_SRC], globalColor, reloadImg);
+ addImage (value[MY_HTML_IMG_SRC], globalColor, reloadImg);
}
}
}
@@ -1835,7 +1834,7 @@ CGroupHTML::CGroupHTML(const TCtorParam ¶m)
_TimeoutValue(DEFAULT_RYZOM_CONNECTION_TIMEOUT)
{
// add it to map of group html created
- _GroupHtmlUID= ++_GroupHtmlUIDPool; // valid assigned Id begin to 1!
+ _GroupHtmlUID= ++_GroupHtmlUIDPool; // valid assigned Id begin to 1!
_GroupHtmlByUID[_GroupHtmlUID]= this;
// init
@@ -3114,7 +3113,7 @@ struct CButtonFreezer : public CInterfaceElementVisitor
static int timer_called = 0;
-static int
+static int
timer_callback(HTTimer * const timer ,
void * const user_data ,
HTEventType const event )
@@ -3125,7 +3124,7 @@ timer_callback(HTTimer * const timer ,
nlassert(event == HTEvent_TIMEOUT);
timer_called = 1;
HTEventList_stopLoop();
-
+
/* XXX - The meaning of this return value is undocumented, but close
** inspection of libwww's source suggests that we want to return HT_OK. */
return HT_OK;
diff --git a/code/ryzom/client/src/interface_v3/guild_manager.cpp b/code/ryzom/client/src/interface_v3/guild_manager.cpp
index 8d0066816..209e85ab2 100644
--- a/code/ryzom/client/src/interface_v3/guild_manager.cpp
+++ b/code/ryzom/client/src/interface_v3/guild_manager.cpp
@@ -370,8 +370,14 @@ void CGuildManager::update()
{
for (uint j = 0; j < CachedGuildMembers.size(); ++j)
{
- if ((CachedGuildMembers[j].Name == _GuildMembers[i].Name) &&
- (CachedGuildMembers[j].Online != _GuildMembers[i].Online))
+ // Status change is from offline to online/abroad online or vice versa.
+ TCharConnectionState prevState = CachedGuildMembers[j].Online;
+ TCharConnectionState curState = _GuildMembers[i].Online;
+ bool showMsg = (prevState != curState) &&
+ (CachedGuildMembers[j].Name == _GuildMembers[i].Name) &&
+ (prevState == ccs_offline || curState == ccs_offline);
+
+ if (showMsg)
{
ucstring msg = (_GuildMembers[i].Online != ccs_offline) ? onlineMessage : offlineMessage;
strFindReplace(msg, "%s", _GuildMembers[i].Name);
diff --git a/code/ryzom/client/src/interface_v3/interface_manager.cpp b/code/ryzom/client/src/interface_v3/interface_manager.cpp
index 8e0851cf6..cfae646d2 100644
--- a/code/ryzom/client/src/interface_v3/interface_manager.cpp
+++ b/code/ryzom/client/src/interface_v3/interface_manager.cpp
@@ -4404,12 +4404,14 @@ void CInterfaceManager::displaySystemInfo(const ucstring &str, const string &cat
}
}
+ if (mode == CClientConfig::SSysInfoParam::Center || mode == CClientConfig::SSysInfoParam::CenterAround)
+ InSceneBubbleManager.addMessagePopupCenter(str, color);
+
// If over popup a string at the bottom of the screen
if ((mode == CClientConfig::SSysInfoParam::Over) || (mode == CClientConfig::SSysInfoParam::OverOnly))
InSceneBubbleManager.addMessagePopup(str, color);
- else if (mode == CClientConfig::SSysInfoParam::Center)
- InSceneBubbleManager.addMessagePopupCenter(str, color);
- else if (mode == CClientConfig::SSysInfoParam::Around && PeopleInterraction.AroundMe.Window)
+ else if ( (mode == CClientConfig::SSysInfoParam::Around || mode == CClientConfig::SSysInfoParam::CenterAround)
+ && PeopleInterraction.AroundMe.Window)
PeopleInterraction.ChatInput.AroundMe.displayMessage(str, color, 2);
}
diff --git a/code/ryzom/client/src/interface_v3/people_interraction.cpp b/code/ryzom/client/src/interface_v3/people_interraction.cpp
index a92d73ce3..ba67661bf 100644
--- a/code/ryzom/client/src/interface_v3/people_interraction.cpp
+++ b/code/ryzom/client/src/interface_v3/people_interraction.cpp
@@ -1420,11 +1420,9 @@ void CPeopleInterraction::updateContactInList(uint32 contactId, TCharConnectionS
sint index = FriendList.getIndexFromContactId(contactId);
if (index != -1)
{
+ // Only do work if online status has changed
if (FriendList.getOnline(index) != online)
{
- // Only do work if online status has changed
- FriendList.setOnline(index, online);
-
CCDBNodeLeaf* node = CInterfaceManager::getInstance()->getDbProp("UI:SAVE:CHAT:SHOW_ONLINE_OFFLINE_NOTIFICATIONS_CB", false);
if (node && node->getValueBool())
{
@@ -1441,8 +1439,11 @@ void CPeopleInterraction::updateContactInList(uint32 contactId, TCharConnectionS
}
}
- // Player is not in my guild
- if (bOnlyFriend)
+ TCharConnectionState prevState = FriendList.getOnline(index);
+ bool showMsg = bOnlyFriend && (prevState == ccs_offline || online == ccs_offline);
+
+ // Player is not in my guild, and the status change is from offline to online/abroad online or vice versa.
+ if (showMsg)
{
ucstring msg = (online != ccs_offline) ? CI18N::get("uiPlayerOnline") : CI18N::get("uiPlayerOffline");
strFindReplace(msg, "%s", FriendList.getName(index));
@@ -1458,6 +1459,8 @@ void CPeopleInterraction::updateContactInList(uint32 contactId, TCharConnectionS
PeopleInterraction.ChatInput.AroundMe.displayMessage(msg, col, 2, &dummy);
}
}
+
+ FriendList.setOnline(index, online);
}
}
}
@@ -2088,7 +2091,7 @@ public:
if(GenericMsgHeaderMngr.pushNameToStream(msgName, out))
{
uint8 teamMember = (uint8) peopleIndex;
- out.serialEnum(teamMember);
+ out.serial(teamMember);
NetMngr.push(out);
//nlinfo("impulseCallBack : %s %d sent", msgName.c_str(), teamMember);
}
diff --git a/code/ryzom/client/src/login.cpp b/code/ryzom/client/src/login.cpp
index e43d6c8f5..157a97f8a 100644
--- a/code/ryzom/client/src/login.cpp
+++ b/code/ryzom/client/src/login.cpp
@@ -1794,6 +1794,7 @@ class CAHOpenURL : public IActionHandler
}
else
{
+ DWORD ret = 0;
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
diff --git a/code/ryzom/client/src/r2/editor.cpp b/code/ryzom/client/src/r2/editor.cpp
index 0de8bc626..d7a17c20f 100644
--- a/code/ryzom/client/src/r2/editor.cpp
+++ b/code/ryzom/client/src/r2/editor.cpp
@@ -4392,7 +4392,7 @@ bool CEditor::doLuaScript(const char *filename, const char *fileDescText)
return false;
}
- if( 0 && FINAL_VERSION == 1) // deactivated for the moment because there are lua file that must be loaded from example
+ if( 0 && FINAL_VERSION == 1) // disabled for the moment because there are lua file that must be loaded from example
{
const static std::string path = "data_common.bnp@";
const static std::string::size_type len= path.size();
diff --git a/code/ryzom/client/src/string_manager_client.cpp b/code/ryzom/client/src/string_manager_client.cpp
index dd79da45e..5dfead832 100644
--- a/code/ryzom/client/src/string_manager_client.cpp
+++ b/code/ryzom/client/src/string_manager_client.cpp
@@ -1605,29 +1605,38 @@ const ucchar *CStringManagerClient::getSPhraseLocalizedDescription(NLMISC::CShee
// ***************************************************************************
const ucchar *CStringManagerClient::getTitleLocalizedName(const std::string &titleId, bool women)
{
- const ucchar * infos = getSpecialWord(titleId, women);
- ucstring infosUC(infos);
+ vector listInfos = getTitleInfos(titleId, women);
- vector listInfos;
- splitUCString(infosUC, ucstring("#"), listInfos);
- if (listInfos.empty())
- return infos;
-
- _TitleWords.push_back(listInfos[0]);
- return _TitleWords.back().c_str();
+ if (listInfos.size() > 0)
+ {
+ _TitleWords.push_back(listInfos[0]);
+ return _TitleWords.back().c_str();
+ }
+
+ ucstring ucId;
+ ucId.fromUtf8(titleId);
+ return ucId.c_str();
}
+// ***************************************************************************
vector CStringManagerClient::getTitleInfos(const std::string &titleId, bool women)
{
- const ucchar * infos = getSpecialWord(titleId, women);
- ucstring infosUC(infos);
-
+ ucstring infosUC;
+ infosUC.fromUtf8(titleId);
vector listInfos;
splitUCString(infosUC, ucstring("#"), listInfos);
+
+ if (listInfos.size() > 0)
+ {
+ if (titleId[0] != '#')
+ {
+ listInfos[0] = getSpecialWord(listInfos[0].toUtf8(), women);
+ }
+ }
+
return listInfos;
}
-
// ***************************************************************************
const ucchar *CStringManagerClient::getClassificationTypeLocalizedName(EGSPD::CClassificationType::TClassificationType type)
{
diff --git a/code/ryzom/client/src/string_manager_client.h b/code/ryzom/client/src/string_manager_client.h
index 13f8188bb..0f34e24ac 100644
--- a/code/ryzom/client/src/string_manager_client.h
+++ b/code/ryzom/client/src/string_manager_client.h
@@ -108,6 +108,7 @@ public:
// Get the Localized Title name
static const ucchar *getTitleLocalizedName(const std::string &titleId, bool women);
static std::vector getTitleInfos(const std::string &titleId, bool women);
+
// Get the Localized name of a classification type
static const ucchar *getClassificationTypeLocalizedName(EGSPD::CClassificationType::TClassificationType type);
diff --git a/code/ryzom/common/src/game_share/CMakeLists.txt b/code/ryzom/common/src/game_share/CMakeLists.txt
index 6342f468d..61292431c 100644
--- a/code/ryzom/common/src/game_share/CMakeLists.txt
+++ b/code/ryzom/common/src/game_share/CMakeLists.txt
@@ -1,13 +1,32 @@
FILE(GLOB SRC *.cpp time_weather_season/*.cpp)
FILE(GLOB PRIV_H *.h time_weather_season/*.h)
-SOURCE_GROUP(headers FILES ${PRIV_H})
+FILE(GLOB R2
+ dms.h dms.cpp
+ scenario.h scenario.cpp
+ user_connection_mgr.h user_connection_mgr.cpp
+ object.h object.cpp
+ server_animation_module.h server_animation_module.cpp
+ server_admin_module.h server_admin_module.cpp
+ server_edition_module.h server_edition_module.cpp
+ string_mgr_module.h string_mgr_module.cpp
+ scenario_entry_points.h scenario_entry_points.cpp
+ small_string_manager.h small_string_manager.cpp
+ ai_wrapper.h ai_wrapper.cpp
+ r2_*.h r2_*.cpp
+ ring_*.h ring_*.cpp)
+
+LIST(REMOVE_ITEM SRC R2)
+LIST(REMOVE_ITEM PRIV_H R2)
+
+SOURCE_GROUP("" FILES ${SRC} ${PRIV_H})
+SOURCE_GROUP("R2" FILES ${R2})
# Filter out the source files not actually compiled.
LIST(REMOVE_ITEM SRC ${CMAKE_CURRENT_SOURCE_DIR}/enum_template.cpp)
LIST(REMOVE_ITEM PRIV_H ${CMAKE_CURRENT_SOURCE_DIR}/enum_template.h)
-NL_TARGET_LIB(ryzom_gameshare ${PRIV_H} ${SRC})
+NL_TARGET_LIB(ryzom_gameshare ${PRIV_H} ${SRC} ${R2})
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${NEL_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
diff --git a/code/ryzom/common/src/game_share/character_sync_itf.h b/code/ryzom/common/src/game_share/character_sync_itf.h
index 459659732..5481045ed 100644
--- a/code/ryzom/common/src/game_share/character_sync_itf.h
+++ b/code/ryzom/common/src/game_share/character_sync_itf.h
@@ -1108,9 +1108,7 @@ namespace CHARSYNC
void setResult(TCharacterNameResult value)
{
-
_Result = value;
-
}
//
uint32 getUserId() const
@@ -1120,9 +1118,7 @@ namespace CHARSYNC
void setUserId(uint32 value)
{
-
_UserId = value;
-
}
//
uint8 getCharIndex() const
@@ -1132,9 +1128,7 @@ namespace CHARSYNC
void setCharIndex(uint8 value)
{
-
_CharIndex = value;
-
}
//
const ucstring& getFullName() const
@@ -1144,9 +1138,7 @@ namespace CHARSYNC
void setFullName(const ucstring &value)
{
-
_FullName = value;
-
}
bool operator == (const CValidateNameResult &other) const
@@ -1161,7 +1153,6 @@ namespace CHARSYNC
// constructor
CValidateNameResult()
{
-
}
void serial(NLMISC::IStream &s)
@@ -1170,7 +1161,6 @@ namespace CHARSYNC
s.serial(_UserId);
s.serial(_CharIndex);
s.serial(_FullName);
-
}
diff --git a/code/ryzom/common/src/game_share/deployment_configuration.cpp b/code/ryzom/common/src/game_share/deployment_configuration.cpp
index b5f0b94e9..86059fc7e 100644
--- a/code/ryzom/common/src/game_share/deployment_configuration.cpp
+++ b/code/ryzom/common/src/game_share/deployment_configuration.cpp
@@ -1,6 +1,18 @@
-/** \file deployment_configuration.cpp
- *
- */
+// Ryzom - MMORPG Framework
+// Copyright (C) 2010 Winch Gate Property Limited
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
//-----------------------------------------------------------------------------
// include
diff --git a/code/ryzom/common/src/game_share/deployment_configuration.h b/code/ryzom/common/src/game_share/deployment_configuration.h
index f79a36410..457d6ee0b 100644
--- a/code/ryzom/common/src/game_share/deployment_configuration.h
+++ b/code/ryzom/common/src/game_share/deployment_configuration.h
@@ -1,8 +1,18 @@
-/** \file deployment_configuration.h
- *
- *
- */
-
+// Ryzom - MMORPG Framework
+// Copyright (C) 2010 Winch Gate Property Limited
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
#ifndef DEPLOYMENT_CONFIGURATION_H
#define DEPLOYMENT_CONFIGURATION_H
diff --git a/code/ryzom/common/src/game_share/msg_ais_egs_gen.h b/code/ryzom/common/src/game_share/msg_ais_egs_gen.h
index d7bfc39e7..e08716a4d 100644
--- a/code/ryzom/common/src/game_share/msg_ais_egs_gen.h
+++ b/code/ryzom/common/src/game_share/msg_ais_egs_gen.h
@@ -884,6 +884,7 @@ namespace RYMSG
std::vector< NLMISC::CSheetId > _LootList;
//
NLMISC::CSheetId _Outpost;
+ uint32 _Organization;
//
float _MaxHitRangeForPC;
//
@@ -1336,6 +1337,21 @@ namespace RYMSG
_Outpost = value;
+ }
+
+ //
+ uint32 getOrganization() const
+ {
+ return _Organization;
+ }
+
+ void setOrganization(uint32 value)
+ {
+
+
+ _Organization = value;
+
+
}
//
float getMaxHitRangeForPC() const
@@ -1431,6 +1447,7 @@ namespace RYMSG
&& _ContextOptions == other._ContextOptions
&& _LootList == other._LootList
&& _Outpost == other._Outpost
+ && _Organization == other._Organization
&& _MaxHitRangeForPC == other._MaxHitRangeForPC
&& _UserModelId == other._UserModelId
&& _CustomLootTableId == other._CustomLootTableId
@@ -1489,6 +1506,7 @@ namespace RYMSG
s.serialCont(_ContextOptions);
s.serialCont(_LootList);
s.serial(_Outpost);
+ s.serial(_Organization);
s.serial(_MaxHitRangeForPC);
s.serial(_UserModelId);
s.serial(_CustomLootTableId);
diff --git a/code/ryzom/common/src/game_share/persistent_data_template.h b/code/ryzom/common/src/game_share/persistent_data_template.h
index 08211687a..21cb2588d 100644
--- a/code/ryzom/common/src/game_share/persistent_data_template.h
+++ b/code/ryzom/common/src/game_share/persistent_data_template.h
@@ -175,6 +175,42 @@
#include "nel/misc/hierarchical_timer.h"
inline uint32 saveGameCycleToSecond(NLMISC::TGameCycle tick)
{
+ // Evaluate the UTC of this event (with the current date of save). Suppose that 1 second==10 tick
+ // NB: result should be positive since no event should have been launched before 1970!
+ if (tick < CTickEventHandler::getGameCycle())
+ {
+ NLMISC::TGameCycle tick_dt = CTickEventHandler::getGameCycle() - tick;
+ uint32 s_dt = tick_dt / 10;
+ return NLMISC::CTime::getSecondsSince1970() - s_dt;
+ }
+ else
+ {
+ NLMISC::TGameCycle tick_dt = tick - CTickEventHandler::getGameCycle();
+ uint32 s_dt = tick_dt / 10;
+ return NLMISC::CTime::getSecondsSince1970() + s_dt;
+ }
+}
+inline NLMISC::TGameCycle loadSecondToGameCycle(uint32 second)
+{
+ if (second < NLMISC::CTime::getSecondsSince1970())
+ {
+ uint32 s_dt = NLMISC::CTime::getSecondsSince1970() - second;
+ NLMISC::TGameCycle tick_dt = s_dt * 10;
+ return CTickEventHandler::getGameCycle() - tick_dt;
+ }
+ else
+ {
+ uint32 s_dt = second - NLMISC::CTime::getSecondsSince1970();
+ NLMISC::TGameCycle tick_dt = s_dt * 10;
+ return CTickEventHandler::getGameCycle() + tick_dt;
+ }
+}
+
+/*inline uint32 saveGameCycleToSecond(NLMISC::TGameCycle tick)
+{
+ sint32 dt = CTickEventHandler::getGameCycle() - tick;
+
+
// Evaluate the UTC of this event (with the current date of save). Suppose that 1 second==10 tick
if (tick < CTickEventHandler::getGameCycle())
return NLMISC::CTime::getSecondsSince1970();
@@ -190,7 +226,7 @@ inline NLMISC::TGameCycle loadSecondToGameCycle(uint32 second)
// Convert UTC of the event to game cycle. Suppose that 1 second==10 tick
return CTickEventHandler::getGameCycle() + (second - NLMISC::CTime::getSecondsSince1970())*10;
-}
+}*/
#endif
// GameCycle property (saved as a UTC of the current game cycle, support server migration)
diff --git a/code/ryzom/common/src/game_share/sp_type.cpp b/code/ryzom/common/src/game_share/sp_type.cpp
index 1ab59ed04..a05a8b554 100644
--- a/code/ryzom/common/src/game_share/sp_type.cpp
+++ b/code/ryzom/common/src/game_share/sp_type.cpp
@@ -51,4 +51,4 @@ std::map CSPType::_ValueMap;
// End of static implementation of CSPType
-} // End of EGSPD
\ No newline at end of file
+} // End of EGSPD
diff --git a/code/ryzom/common/src/game_share/txt_command.h b/code/ryzom/common/src/game_share/txt_command.h
new file mode 100644
index 000000000..f8d2ec39e
--- /dev/null
+++ b/code/ryzom/common/src/game_share/txt_command.h
@@ -0,0 +1,174 @@
+// Ryzom - MMORPG Framework
+// Copyright (C) 2010 Winch Gate Property Limited
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+#ifndef TXT_COMMAND_H
+#define TXT_COMMAND_H
+
+
+//-------------------------------------------------------------------------------------------------
+// includes
+//-------------------------------------------------------------------------------------------------
+
+#include "nel/misc/types_nl.h"
+#include "nel/misc/common.h"
+#include "nel/misc/debug.h"
+#include "nel/misc/sstring.h"
+
+
+//-------------------------------------------------------------------------------------------------
+// MACRO TXT_COMMAND_SET
+//-------------------------------------------------------------------------------------------------
+
+#define TXT_COMMAND_SET(setName,CONTEXT_CLASS)\
+class __CTxtCommandSet_##setName: public ITxtCommandSet\
+{\
+public:\
+ static __CTxtCommandSet_##setName* getInstance()\
+ {\
+ static __CTxtCommandSet_##setName *p=NULL;\
+ if (p==NULL) p= new __CTxtCommandSet_##setName;\
+ return p;\
+ }\
+};\
+static CTxtCommandSetPtr<__CTxtCommandSet_##setName> setName;
+
+
+//-------------------------------------------------------------------------------------------------
+// MACRO TXT_COMMAND
+//-------------------------------------------------------------------------------------------------
+
+#define TXT_COMMAND(cmdName,setName,CONTEXT_CLASS)\
+struct __CTxtCommand_##cmdName: public ITxtCommand\
+{\
+ static __CTxtCommand_##cmdName* getInstance()\
+ {\
+ static __CTxtCommand_##cmdName *p=NULL;\
+ if (p==NULL) p= new __CTxtCommand_##cmdName;\
+ return p;\
+ }\
+ virtual const char* getName() const {return #cmdName;}\
+ virtual CTxtCommandResult execute(CONTEXT_CLASS& context,const NLMISC::CVectorSString& args,const NLMISC::CSString& rawArgs,const NLMISC::CSString& fullCmdLine);\
+private:\
+ __CTxtCommand_##cmdName() {}\
+};\
+static ITxtCommandRegisterer<__CTxtCommand_##cmdName,__CTxtCommandSet_##setName> __CTxtCommand_##cmdName##_Registerer;\
+CTxtCommandResult __CTxtCommand_##cmdName::execute(CONTEXT_CLASS& context,const NLMISC::CVectorSString& args,const NLMISC::CSString& rawArgs,const NLMISC::CSString& fullCmdLine)
+
+
+//-------------------------------------------------------------------------------------------------
+// class CTxtCommandResult
+//-------------------------------------------------------------------------------------------------
+
+class CTxtCommandResult
+{
+public:
+ enum TType
+ {
+ SUCCESS, // command execution was successful
+ SYNTAX_ERROR, // there was a syntax error in the command line
+ BAD_PERMISSION, // the user doesn't have the right to run the given command
+ UNKNOWN_COMMAND, // behave as if the command was not recognised
+ EXECUTION_ERROR // there was an error during execution of the command
+ };
+ CTxtCommandResult(const bool& success): _Type(success?SUCCESS:SYNTAX_ERROR) {}
+ CTxtCommandResult(const TType& type): _Type(type) {}
+ CTxtCommandResult(const TType& type,const NLMISC::CSString& reason): _Type(type), _Reason(reason) {}
+ TType getType() const { return _Type; }
+ const NLMISC::CSString& getReason() const { return _Reason; }
+private:
+ TType _Type;
+ NLMISC::CSString _Reason;
+};
+
+
+//-------------------------------------------------------------------------------------------------
+// class ITxtCommand
+//-------------------------------------------------------------------------------------------------
+
+template class ITxtCommand
+{
+public:
+ virtual const char* getName() const =0;
+ virtual CTxtCommandResult execute(CONTEXT_CLASS& context,const NLMISC::CVectorSString& args,const NLMISC::CSString& rawArgs,const NLMISC::CSString& fullCmdLine) =0;
+};
+
+
+//-------------------------------------------------------------------------------------------------
+// class ITxtCommandRegisterer
+//-------------------------------------------------------------------------------------------------
+
+template struct ITxtCommandRegisterer
+{
+ ITxtCommandRegisterer()
+ {
+ SET::getInstance()->registerTxtCommand(CMD::getInstance());
+ }
+};
+
+
+//-------------------------------------------------------------------------------------------------
+// class ITxtCommandSet
+//-------------------------------------------------------------------------------------------------
+
+template class ITxtCommandSet
+{
+public:
+ void registerTxtCommand(ITxtCommand* txtCommand)
+ {
+ nlassert(_TxtCommands.find(txtCommand->getName())==_TxtCommands.end());
+ _TxtCommands[txtCommand->getName()]= txtCommand;
+ }
+ CTxtCommandResult execute(CONTEXT_CLASS& context,const NLMISC::CSString& cmdLine)
+ {
+ NLMISC::CSString cmdTail=cmdLine;
+ NLMISC::CSString keyword=cmdTail.firstWord(true);
+ typename TTxtCommands::iterator it= _TxtCommands.find(keyword);
+ if (it==_TxtCommands.end()) return CTxtCommandResult::UNKNOWN_COMMAND;
+ NLMISC::CVectorSString args;
+ cmdTail.splitWords(args);
+ return it->second->execute(context,args,cmdTail,cmdLine);
+ }
+private:
+ typedef ITxtCommand TTxtCommand;
+ typedef std::map TTxtCommands;
+ TTxtCommands _TxtCommands;
+};
+
+
+//-------------------------------------------------------------------------------------------------
+// class ITxtCommandRegisterer
+//-------------------------------------------------------------------------------------------------
+
+template struct CTxtCommandSetPtr
+{
+ CTxtCommandSetPtr()
+ {
+ SET::getInstance();
+ }
+
+ SET& operator*()
+ {
+ return *SET::getInstance();
+ }
+
+ SET* operator->()
+ {
+ return SET::getInstance();
+ }
+};
+
+
+//-------------------------------------------------------------------------------------------------
+#endif
diff --git a/code/ryzom/server/data_shard/client_commands_privileges.txt b/code/ryzom/server/data_shard/client_commands_privileges.txt
index c61537dfa..9b0e115d4 100644
--- a/code/ryzom/server/data_shard/client_commands_privileges.txt
+++ b/code/ryzom/server/data_shard/client_commands_privileges.txt
@@ -40,6 +40,9 @@ forceTargetToDie :DEV:SGM:GM:EM: // Force entity target to die
getEventFaction :DEV:SGM:GM:EM: // Get the event faction of player:
giveRespawnPoint :DEV:SGM:GM: // Give a respawn point to a player:
guildInvite // Send a guild invite to a player character without distance constrainte
+setLeague // Create a League
+leagueInvite // Send a League invite to a Team Leader character without distance constrainte
+leagueKick // Kick a player or team from league
roomInvite // Send a room invite
roomKick // Remove a room invite
guildMOTD // Set the guild message of the day, command effective only for officer and more graded guild members
@@ -72,8 +75,6 @@ renameGuild :DEV:SGM:GM:EM: // Rename a guild:
renamePlayerForEvent :DEV:SGM:GM:EM:EG: // Rename a player temporarily for an event:
resetPowerFlags :DEV:SGM:GM:EM: // Reset the ineffective aura and the power flags for given character
-respawnAfterDeath // Respawn after death at re-spawn point name, it must be valid (validated by PC and usable):
-resurrected // Another PC resurrect PC by giving some energy:
root :DEV:SGM:GM:EM:VG:SG: // Root a player:
saveToPDR :DEV:SGM: // Save a character to a binary PDR file:
saveToXML :DEV:SGM: // Save a character to an XML file:
@@ -87,6 +88,8 @@ setGuildMessage // Set the guild message of the day:
setItemSapLoad :DEV:SGM:GM:EM: // Set an item sap load:
setPosFlag :DEV:SGM:GM:EM // Set a position flag:
setPvPTag // Set player character PvP tag to true or false
+setFamePlayer :DEV:SGM:GM:EM: // Set the fame value of a player in the given faction:
+resetPVPTimers :DEV:SGM:GM:EM: // Reset the pvp timers of a player:
setSkillsToMaxValue :DEV:SGM:GM:EM: // Set player skills to max value
showCSR :DEV:SGM:GM:VG:SG:G:EM:EG: // Show CSR title if the player is a CSR
showFBT :DEV:SGM:GM:EM: // Show Focus Beta Tester title if the player is a FBT
@@ -100,6 +103,7 @@ connectUserChannel // Connect to User Channel Chat
webExecCommand // Execute web command (need HMAC signature)
webDelCommandsIds // Delete web transactions for web_app
webAddCommandsIds // Add web command transactions for web_app
+updateTarget // Update current target
teleport :DEV:SGM:GM:VG:SG:G:OBSERVER:EM:EG: // Teleport the CSR in front of a player:
tpPosFlag :DEV:SGM:GM:VG:SG:G:EM:EG: // Teleport a player to a position flag:
universe :DEV:SGM:GM:EM: // Chat in universe mode:
@@ -107,7 +111,6 @@ unmute :DEV:SGM:GM:EM:VG:SG: // Unmute a user:
unmuteUniverse :DEV:SGM:GM:EM:VG:SG: // Unmute the universe channel
unroot :DEV:SGM:GM:EM:VG:SG: // Stop rooting a player:
updateGuildMembersList :DEV:SGM:GM: // update guild members list on members clients:
-validateRespawnPoint // Validate re-spawn point:
//setPvpClan :DEV: // choose a clan for pvp
summonPet // player can summon it's pet one time only
allowSummonPet :DEV:SGM:GM: // autorize player to summon it's pet one time per pet
@@ -121,6 +124,14 @@ farTPReturn :DEV:SGM:GM:VG:SG:EM: // used to tp back to your previous sessio
characterMissionDump :DEV:SGM:GM: //Dump mission list for a character
removeMission :DEV:SGM:GM: //Remove a mission of a character
addMission :DEV:SGM:GM: //add a mission to a character
+characterInventoryDump :DEV:SGM:GM:EM: // Dump character inventory info:
+deleteInventoryItem :DEV:SGM:GM:EM: // Delete an item from a characters inventory:
+lockItem // Lock/unlock item for trading, selling, destruction.
+setTeamLeader // Set the team leader
+setPetAnimalSatiety :DEV:SGM:GM:EM: // Set the satiety of pet animal (petIndex in 0..3): full| []
+getPetAnimalSatiety :DEV:SGM:GM:EM: // Get the satiety of pet animal (petIndex in 0..3): []
+setPetAnimalName :DEV:SGM:GM:EM:EG: // Set the name of a pet animal (petIndex in 0..3):
+setSimplePhrase :DEV:SGM:GM:EM: // Set an IOS phrase: []
// Variables
//
@@ -138,6 +149,7 @@ Name :DEV:SGM:GM:EM: // Name of a player
Position :DEV:SGM:GM:VG:PR:OBSERVER:EM:EG: // Position of a player (in meters) ,[,]] | | | home
Priv :DEV: // User privilege
PriviledgePVP :DEV:SGM:GM:EM:EG: // Turns PVP on/off on character (blame coder for typo)
+FullPVP :DEV:SGM:GM:EM:EG: // Turns Full PVP on/off on character (blame coder for typo)
RyzomDate :DEV:SGM:GM:EM: // Current ryzom date
RyzomTime :DEV:SGM:GM:EM: // Current ryzom time
@@ -160,3 +172,8 @@ eventSetBotFameByKill :DEV:SGM:GM:EM: // Changes the amount of fame earned fo
eventSetBotURL :DEV:SGM:GM:EM: // Set the url of a bot
eventSetBotURLName :DEV:SGM:GM:EM: // Set the url name of a bot
eventSpawnToxic :DEV:SGM:GM:EM: // Add toxic cloud
+eventNpcSay :DEV:SGM:GM:EM: // Have an NPC say a text
+eventSetBotFacing :DEV:SGM:GM:EM: // Set the direction in which a bot faces
+eventGiveControl :DEV:SGM:GM:EM: // Give control of entity A to entity B :
+eventLeaveControl :DEV:SGM:GM:EM: // Leave control of entity :
+resetName // Reset player's name; undo a temporary rename
diff --git a/code/ryzom/server/src/CMakeLists.txt b/code/ryzom/server/src/CMakeLists.txt
index ddcca99bb..13cee545a 100644
--- a/code/ryzom/server/src/CMakeLists.txt
+++ b/code/ryzom/server/src/CMakeLists.txt
@@ -34,7 +34,7 @@ ADD_SUBDIRECTORY(patchman_service)
#ADD_SUBDIRECTORY(ags_test)
#ADD_SUBDIRECTORY(ai_data_service)
#ADD_SUBDIRECTORY(entity_view_service)
-#ADD_SUBDIRECTORY(general_utilities_service)
+ADD_SUBDIRECTORY(general_utilities_service)
# Not sure, no longer used maybe?
#sabrina
diff --git a/code/ryzom/server/src/ai_service/ai.cpp b/code/ryzom/server/src/ai_service/ai.cpp
index b51f1279c..ed8926f5b 100644
--- a/code/ryzom/server/src/ai_service/ai.cpp
+++ b/code/ryzom/server/src/ai_service/ai.cpp
@@ -423,6 +423,15 @@ void CAIS::update()
_CreatureChangeHPList.Entities.clear();
_CreatureChangeHPList.DeltaHp.clear();
}
+ if (!_CreatureChangeMaxHPList.Entities.empty())
+ {
+ nlassert(_CreatureChangeMaxHPList.Entities.size()==_CreatureChangeMaxHPList.MaxHp.size());
+ nlassert(_CreatureChangeMaxHPList.Entities.size()==_CreatureChangeMaxHPList.SetFull.size());
+ _CreatureChangeMaxHPList.send("EGS");
+ _CreatureChangeMaxHPList.Entities.clear();
+ _CreatureChangeMaxHPList.MaxHp.clear();
+ _CreatureChangeMaxHPList.SetFull.clear();
+ }
}
//
diff --git a/code/ryzom/server/src/ai_service/ai.h b/code/ryzom/server/src/ai_service/ai.h
index f06271c17..aed47f262 100644
--- a/code/ryzom/server/src/ai_service/ai.h
+++ b/code/ryzom/server/src/ai_service/ai.h
@@ -221,6 +221,11 @@ public:
{
return _CreatureChangeHPList;
}
+
+ CChangeCreatureMaxHPMsg &getCreatureChangeMaxHP()
+ {
+ return _CreatureChangeMaxHPList;
+ }
enum TSearchType
{
@@ -288,6 +293,7 @@ private:
// Faunas descriptions to be sent each frame
CFaunaBotDescription _FaunaDescriptionList;
CChangeCreatureHPMsg _CreatureChangeHPList;
+ CChangeCreatureMaxHPMsg _CreatureChangeMaxHPList;
/// The emot identifiers
std::map _EmotNames;
diff --git a/code/ryzom/server/src/ai_service/ai_bot.cpp b/code/ryzom/server/src/ai_service/ai_bot.cpp
index 31ce2fce0..03e2a68db 100644
--- a/code/ryzom/server/src/ai_service/ai_bot.cpp
+++ b/code/ryzom/server/src/ai_service/ai_bot.cpp
@@ -61,7 +61,7 @@ CAIInstance* CSpawnBot::getAIInstance() const
void CSpawnBot::setVisualPropertiesName()
{
CBot& botRef = CSpawnBot::getPersistent();
- std::string name = botRef.getName();
+ ucstring name = botRef.getName();
if (CVisualPropertiesInterface::UseIdForName)
{
@@ -85,7 +85,7 @@ void CSpawnBot::setVisualPropertiesName()
if (! botRef.getFaunaBotUseBotName()) //false by default
{
if (botRef.getSheet()->ForceDisplayCreatureName())
- return;
+ return;
// the npc name is displayed as a fauna
}
@@ -403,8 +403,8 @@ std::vector CBot::getMultiLineInfoString() const
pushTitle(container, "CBot");
pushEntry(container, "id=" + getIndexString());
container.back() += " eid=" + getEntityIdString();
- container.back() += " alias=" + getAliasTreeOwner()->getAliasString();
- container.back() += " name=" + getName();
+ container.back() += " alias=" + getAliasTreeOwner()->getAliasString() + " raw alias=" + NLMISC::toString(getAliasTreeOwner()->getAlias());
+ pushEntry(container, " name=" + getName());
if (isSheetValid())
container.back() += " sheet=" + NLMISC::CFile::getFilenameWithoutExtension(getSheet()->SheetId().toString());
pushEntry(container, "fullname=" + getFullName());
diff --git a/code/ryzom/server/src/ai_service/ai_bot.h b/code/ryzom/server/src/ai_service/ai_bot.h
index d74442b83..3156edb82 100644
--- a/code/ryzom/server/src/ai_service/ai_bot.h
+++ b/code/ryzom/server/src/ai_service/ai_bot.h
@@ -95,7 +95,7 @@ public:
virtual float getAggroPropagationRadius() const;
//@}
- void setVisualPropertiesName();
+ virtual void setVisualPropertiesName();
// as there not a lot of prop (1 or 2, maybe 3) stores in this comportment, we don't need hash.
bool getProp(size_t Id, uint32& value) const;
@@ -241,8 +241,8 @@ public:
NLMISC::CEntityId createEntityId() const;
- const std::string& getCustomName() const { return _CustomName; }
- void setCustomName(const std::string &name) { _CustomName = name; }
+ const ucstring& getCustomName() const { return _CustomName; }
+ void setCustomName(const ucstring &name) { _CustomName = name; }
virtual void setClientSheet(const std::string & clientSheetName);
@@ -272,7 +272,7 @@ private:
bool _IgnoreOffensiveActions;
bool _Healer;
bool _BuildingBot;
- std::string _CustomName;
+ ucstring _CustomName;
CTimer _SetSheetTimer;
struct CSetSheetData
{
diff --git a/code/ryzom/server/src/ai_service/ai_bot_npc.cpp b/code/ryzom/server/src/ai_service/ai_bot_npc.cpp
index f56a745db..a8175cc9a 100644
--- a/code/ryzom/server/src/ai_service/ai_bot_npc.cpp
+++ b/code/ryzom/server/src/ai_service/ai_bot_npc.cpp
@@ -274,9 +274,12 @@ std::vector CSpawnBotNpc::getMultiLineInfoString() const
else
{
vector const& missions = _CurrentChatProfile.getMissions();
- pushEntry(container, "missions: " + NLMISC::toString("%u", missions[0]));
- for (size_t i=1; ifindMissionName(missions[i]);
+ pushEntry(container, NLMISC::toString(" %u (%s)", missions[i], name.c_str()));
+ }
}
pushFooter(container);
diff --git a/code/ryzom/server/src/ai_service/ai_bot_pet.cpp b/code/ryzom/server/src/ai_service/ai_bot_pet.cpp
index e6177fda1..6e0747933 100644
--- a/code/ryzom/server/src/ai_service/ai_bot_pet.cpp
+++ b/code/ryzom/server/src/ai_service/ai_bot_pet.cpp
@@ -16,6 +16,7 @@
#include "stdpch.h"
#include "ai_bot_pet.h"
+#include "visual_properties_interface.h"
#include "nel/misc/random.h"
#include "ai_grp_pet.h"
@@ -92,3 +93,28 @@ CSpawnGroupPet& CSpawnBotPet::spawnGrp()
{
return static_cast(CSpawnBot::spawnGrp());
}
+
+void CSpawnBotPet::setVisualPropertiesName()
+{
+ CBotPet& botRef = CSpawnBotPet::getPersistent();
+ ucstring name = botRef.getName();
+
+ if (CVisualPropertiesInterface::UseIdForName)
+ {
+ name = NLMISC::toString("AI:%s", botRef.getIndexString().c_str());
+ }
+
+ if (name.empty() && CVisualPropertiesInterface::ForceNames)
+ {
+ name = NLMISC::CFile::getFilenameWithoutExtension(botRef.getSheet()->SheetId().toString().c_str());
+ }
+
+ if (!botRef.getCustomName().empty())
+ name = botRef.getCustomName();
+
+ // no name the bot will appear without name on the client.
+ if (name.empty())
+ return;
+
+ CVisualPropertiesInterface::setName(dataSetRow(), name);
+}
diff --git a/code/ryzom/server/src/ai_service/ai_bot_pet.h b/code/ryzom/server/src/ai_service/ai_bot_pet.h
index 34eacd039..67a448ee0 100644
--- a/code/ryzom/server/src/ai_service/ai_bot_pet.h
+++ b/code/ryzom/server/src/ai_service/ai_bot_pet.h
@@ -65,6 +65,8 @@ public:
CPathPosition& pathPos() { return _PathPos; }
uint32 _DeathTime;
+
+ void setVisualPropertiesName();
private:
diff --git a/code/ryzom/server/src/ai_service/ai_instance.cpp b/code/ryzom/server/src/ai_service/ai_instance.cpp
index 5fd8e878a..240af6da3 100644
--- a/code/ryzom/server/src/ai_service/ai_instance.cpp
+++ b/code/ryzom/server/src/ai_service/ai_instance.cpp
@@ -653,7 +653,7 @@ static float randomAngle()
return val;
}
-CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& sheetId, CAIVector const& pos, double dispersionRadius, bool spawnBots, double orientation, const std::string &botsName)
+CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& sheetId, CAIVector const& pos, double dispersionRadius, bool spawnBots, double orientation, const std::string &botsName, const std::string &look)
{
if (!_EventNpcManager)
return NULL;
@@ -689,10 +689,13 @@ CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const&
CBotNpc* const bot = NLMISC::safe_cast(grp->bots()[i]);
bot->setSheet(sheet);
+ if (!look.empty())
+ bot->setClientSheet(look);
bot->equipmentInit();
bot->initEnergy(/*groupEnergyCoef()*/0);
CAIVector rpos(pos);
- if (i!=0)
+ // Spawn all randomly except if only 1 bot
+ if (nbBots > 1)
{
RYAI_MAP_CRUNCH::CWorldMap const& worldMap = CWorldContainer::getWorldMap();
RYAI_MAP_CRUNCH::CWorldPosition wp;
@@ -857,6 +860,7 @@ void cbEventCreateNpcGroup( NLNET::CMessage& msgin, const std::string &serviceNa
double dispersionRadius;
bool spawnBots;
std::string botsName;
+ std::string look;
msgin.serial(messageVersion);
nlassert(messageVersion==1);
msgin.serial(instanceNumber);
@@ -869,10 +873,11 @@ void cbEventCreateNpcGroup( NLNET::CMessage& msgin, const std::string &serviceNa
msgin.serial(dispersionRadius);
msgin.serial(spawnBots);
msgin.serial(botsName);
+ msgin.serial(look);
CAIInstance* instance = CAIS::instance().getAIInstance(instanceNumber);
if (instance)
{
- CGroupNpc* npcGroup = instance->eventCreateNpcGroup(nbBots, sheetId, CAIVector((double)x/1000., (double)y/1000.), dispersionRadius, spawnBots, (double)orientation/1000., botsName);
+ CGroupNpc* npcGroup = instance->eventCreateNpcGroup(nbBots, sheetId, CAIVector((double)x/1000., (double)y/1000.), dispersionRadius, spawnBots, (double)orientation/1000., botsName, look);
if (npcGroup != NULL)
{
_PlayersLastCreatedNpcGroup[playerId] = npcGroup->getName();
diff --git a/code/ryzom/server/src/ai_service/ai_instance.h b/code/ryzom/server/src/ai_service/ai_instance.h
index ce53d0559..6540620d9 100644
--- a/code/ryzom/server/src/ai_service/ai_instance.h
+++ b/code/ryzom/server/src/ai_service/ai_instance.h
@@ -207,7 +207,7 @@ public:
return NULL;
}
- CGroupNpc* eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& sheetId, CAIVector const& pos, double dispersionRadius, bool spawnBots, double orientation, const std::string &botsName);
+ CGroupNpc* eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& sheetId, CAIVector const& pos, double dispersionRadius, bool spawnBots, double orientation, const std::string &botsName, const std::string &look);
/// create a new easter egg
CBotEasterEgg* createEasterEgg(uint32 easterEggId, NLMISC::CSheetId const& sheetId, std::string const& botName, double x, double y, double z, double heading, const std::string& look);
diff --git a/code/ryzom/server/src/ai_service/ai_mgr_pet.cpp b/code/ryzom/server/src/ai_service/ai_mgr_pet.cpp
index e72a88abc..31e01d143 100644
--- a/code/ryzom/server/src/ai_service/ai_mgr_pet.cpp
+++ b/code/ryzom/server/src/ai_service/ai_mgr_pet.cpp
@@ -290,6 +290,11 @@ void CPetSpawnMsgImp::callback(std::string const& name, NLNET::TServiceId id)
}
botPet->setSheet(sheet);
+
+ if (!CustomName.empty())
+ {
+ botPet->setCustomName(CustomName);
+ }
if (!botPet->spawn())
{
@@ -314,7 +319,7 @@ void CPetSpawnMsgImp::callback(std::string const& name, NLNET::TServiceId id)
#endif
return;
}
-
+
botPet->getSpawn()->setAIProfile(new CAIPetProfileStand(botPet->getSpawn()));
confirmMsg.PetMirrorRow = botPet->getSpawn()->dataSetRow();
diff --git a/code/ryzom/server/src/ai_service/ai_outpost.cpp b/code/ryzom/server/src/ai_service/ai_outpost.cpp
index 0ef71b2ee..ed2c62b77 100644
--- a/code/ryzom/server/src/ai_service/ai_outpost.cpp
+++ b/code/ryzom/server/src/ai_service/ai_outpost.cpp
@@ -873,14 +873,20 @@ void COutpost::createSquad(CGroupDesc const* groupDesc, COu
// Attack only the declared ennemies of the outpost
if (side==OUTPOSTENUMS::OutpostOwner)
{
- // grp->faction ().addProperty(NLMISC::toString("outpost:%s:defender", getAliasString().c_str()));
- // grp->friendFaction().addProperty(NLMISC::toString("outpost:%s:defender", getAliasString().c_str()));
+ // Bots factions
+ grp->faction ().addProperty(NLMISC::toString("outpost:%s:bot_defender", getAliasString().c_str()));
+ grp->friendFaction().addProperty(NLMISC::toString("outpost:%s:bot_defender", getAliasString().c_str()));
+ grp->ennemyFaction().addProperty(NLMISC::toString("outpost:%s:bot_attacker", getAliasString().c_str()));
+ // Players faction
grp->ennemyFaction().addProperty(NLMISC::toString("outpost:%s:attacker", getAliasString().c_str()));
}
if (side==OUTPOSTENUMS::OutpostAttacker)
{
- // grp->faction ().addProperty(NLMISC::toString("outpost:%s:attacker", getAliasString().c_str()));
- // grp->friendFaction().addProperty(NLMISC::toString("outpost:%s:attacker", getAliasString().c_str()));
+ // Bots factions
+ grp->faction ().addProperty(NLMISC::toString("outpost:%s:bot_attacker", getAliasString().c_str()));
+ grp->friendFaction().addProperty(NLMISC::toString("outpost:%s:bot_attacker", getAliasString().c_str()));
+ grp->ennemyFaction().addProperty(NLMISC::toString("outpost:%s:bot_defender", getAliasString().c_str()));
+ // Players faction
grp->ennemyFaction().addProperty(NLMISC::toString("outpost:%s:defender", getAliasString().c_str()));
}
grp->_AggroRange = 25;
diff --git a/code/ryzom/server/src/ai_service/ai_profile_npc.cpp b/code/ryzom/server/src/ai_service/ai_profile_npc.cpp
index a97beb24f..e47003cb6 100644
--- a/code/ryzom/server/src/ai_service/ai_profile_npc.cpp
+++ b/code/ryzom/server/src/ai_service/ai_profile_npc.cpp
@@ -1562,7 +1562,7 @@ void CGrpProfileGoToPoint::updateProfile(uint ticksSinceLastUpdate)
dx+=dir.x;
dy+=dir.y;
- // 4 rangées.
+ // 4 rows
CAIVector idealPos=groupPosition;
if (botIndex>=_NbBotInNormalShape)
{
@@ -2054,7 +2054,7 @@ void CGrpProfileFollowRoute::updateProfile(uint ticksSinceLastUpdate)
dx+=dir.x;
dy+=dir.y;
- // 4 rangées.
+ // 4 rows
CAIVector idealPos=groupPosition;
if (botIndex>=_NbBotInNormalShape)
{
@@ -2299,6 +2299,94 @@ void CGrpProfileStandOnVertices::updateProfile(uint ticksSinceLastUpdate)
}
}
+//////////////////////////////////////////////////////////////////////////////
+// CGrpProfileFollowPlayer //
+//////////////////////////////////////////////////////////////////////////////
+CGrpProfileFollowPlayer::CGrpProfileFollowPlayer(CProfileOwner* owner, TDataSetRow const& playerRow, uint32 dispersionRadius)
+: CMoveProfile(owner)
+, _PlayerRow(playerRow)
+, _DispersionRadius(dispersionRadius)
+, _PathPos(CAngle(0))
+, _PathCont(NLMISC::safe_cast(owner)->getAStarFlag())
+{
+ PROFILE_LOG("group", "follow player", "ctor", "");
+ _Status = CFollowPath::FOLLOWING;
+}
+
+bool CGrpProfileFollowPlayer::destinationReach() const
+{
+ return _Status == CFollowPath::FOLLOW_ARRIVED
+ || _Status==CFollowPath::FOLLOW_NO_PATH;
+}
+
+void CGrpProfileFollowPlayer::beginProfile()
+{
+ _Status = CFollowPath::FOLLOWING;
+}
+
+// TODO: this doesn't work very well at all...
+void CGrpProfileFollowPlayer::updateProfile(uint ticksSinceLastUpdate)
+{
+ H_AUTO(CGrpProfileFollowPlayerUpdate);
+ CFollowPathContext fpcGrpFollowPlayerUpdate("CGrpProfileFollowPlayerUpdate");
+
+ // check all bot to see if there need to move
+ CSpawnGroupNpc* grp = static_cast(static_cast(_Grp));
+ CGroupNpc &pgrp = grp->getPersistent();
+
+ CBotPlayer* plrPtr = dynamic_cast(CAIS::instance().getEntityPhysical(_PlayerRow));
+
+ if ( ! plrPtr) {
+ nlwarning("CGrpProfileFollowPlayer: No valid player position to follow");
+ return;
+ }
+
+ _PathCont.setDestination(plrPtr->wpos());
+ _PathPos._Angle = plrPtr->theta();
+
+ for (uint i = 0; i < pgrp.bots().size(); ++i)
+ {
+ CBotNpc* bot = static_cast(pgrp.bots()[i]);
+ if (!bot)
+ continue;
+
+ // check current bot state
+ CSpawnBotNpc *sbot = bot->getSpawn();
+ if (!sbot)
+ continue;
+
+ // Need to wait for a correct position before moving?
+ CAIVector const& dest = _PathCont.getDestination();
+ if (dest.x()==0 || dest.y()==0)
+ return;
+
+ static const std::string runParameter("running");
+ float dist;
+ if (sbot->getPersistent().getOwner()->getSpawnObj()->checkProfileParameter(runParameter))
+ dist = sbot->runSpeed()*ticksSinceLastUpdate;
+ else
+ dist = sbot->walkSpeed()*ticksSinceLastUpdate;
+
+ // Move
+ CFollowPath::TFollowStatus const status = CFollowPath::getInstance()->followPath(
+ sbot,
+ _PathPos,
+ _PathCont,
+ dist,
+ 0.f,
+ 0.5f);
+
+ if (status==CFollowPath::FOLLOW_NO_PATH)
+ {
+ nlwarning("Problem with following player");
+ }
+
+
+ }
+}
+
+
+
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileIdle //
//////////////////////////////////////////////////////////////////////////////
@@ -3687,10 +3775,14 @@ bool CGrpProfileFaction::entityHavePartOfFactions(CAIEntityPhysical const* entit
std::set::const_iterator it, end = factionsSet.end();
for (it=factionsSet.begin(); it!=end; ++it)
{
- std::string fameFaction = scriptFactionToFameFaction(CStringMapper::unmap(*it));
+ string factionInfos = CStringMapper::unmap(*it);
+ string fameFaction = scriptFactionToFameFaction(factionInfos);
// sint32 fame = CFameInterface::getInstance().getFameOrCivilisationFame(entity->getEntityId(), CStringMapper::map(fameFaction));
sint32 const fame = entity->getFame(fameFaction);
- if (fame!=NO_FAME && fame>0)
+ sint32 const value = scriptFactionToFameFactionValue(factionInfos);
+ bool gt = scriptFactionToFameFactionGreaterThan(factionInfos);
+ if ((fame != NO_FAME && gt && fame > value) ||
+ (fame != NO_FAME && !gt && fame < value))
{
// nldebug("Entity has faction %s", CStringMapper::unmap(*it).c_str());
return true;
@@ -3731,12 +3823,41 @@ std::string CGrpProfileFaction::scriptFactionToFameFaction(std::string name)
ret += "_";
ret += name[i]-'A'+'a';
}
+ else if (name[i] == '>' || name[i] == '<')
+ {
+ return ret;
+ }
else
+ {
ret += name[i];
+ }
}
return ret;
}
+bool CGrpProfileFaction::scriptFactionToFameFactionGreaterThan(string name)
+{
+ if (name.find("<") != string::npos)
+ return false;
+
+ return true;
+}
+
+sint32 CGrpProfileFaction::scriptFactionToFameFactionValue(string name)
+{
+ size_t start = name.find(">");
+ if (start == string::npos)
+ {
+ start = name.find("<");
+ if (start == string::npos)
+ return 0;
+ }
+
+ sint32 value;
+ NLMISC::fromString(name.substr(start+1), value);
+ return value*6000;
+}
+
std::string CGrpProfileFaction::fameFactionToScriptFaction(std::string name)
{
std::string ret = "Famous";
@@ -3772,9 +3893,9 @@ void CGrpProfileFaction::checkTargetsAround()
CPropertySetWithExtraList const& thisEnnemyFactions = thisGrpNpc.ennemyFaction();
// We don't assist or attack players if our friends/ennemies are not in factions
- bool const assistPlayers = thisFriendFactions.containsPartOfStrict(_FameFactions);
+ bool const assistPlayers = (thisFriendFactions.containsPartOfStrictFilter("Famous*") || thisFriendFactions.have(AITYPES::CPropertyId("Player")));
bool const assistBots = !thisFriendFactions.empty() && !bNoAssist;
- bool const attackPlayers = (!thisEnnemyFactions.extraSetEmpty()) || thisEnnemyFactions.containsPartOfStrict(_FameFactions) || thisEnnemyFactions.containsPartOfStrictFilter("outpost:*");
+ bool const attackPlayers = (!thisEnnemyFactions.extraSetEmpty()) || thisEnnemyFactions.containsPartOfStrictFilter("Famous*") || thisEnnemyFactions.have(AITYPES::CPropertyId("Player")) || thisEnnemyFactions.containsPartOfStrictFilter("outpost:*");
bool const attackBots = !thisEnnemyFactions.empty();
CAIVision Vision;
diff --git a/code/ryzom/server/src/ai_service/ai_profile_npc.h b/code/ryzom/server/src/ai_service/ai_profile_npc.h
index e46f1b4be..9fed6e662 100644
--- a/code/ryzom/server/src/ai_service/ai_profile_npc.h
+++ b/code/ryzom/server/src/ai_service/ai_profile_npc.h
@@ -628,6 +628,49 @@ private:
CAITimer _Timer;
};
+class CGrpProfileFollowPlayer :
+public CMoveProfile
+{
+public:
+ CGrpProfileFollowPlayer(CProfileOwner* owner, TDataSetRow const& playerRow, uint32 dispersionRadius);
+ virtual ~CGrpProfileFollowPlayer() {};
+
+ void setBotStandProfile(AITYPES::TProfiles botStandProfileType, IAIProfileFactory* botStandProfileFactory);
+
+ /// @name IAIProfile implementation
+ //@{
+ virtual void beginProfile();
+ virtual void updateProfile(uint ticksSinceLastUpdate);
+ virtual void endProfile() {};
+ virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::BOT_FOLLOW_POS; }
+ virtual std::string getOneLineInfoString() const { return std::string("follow_player group profile"); }
+ //@}
+
+ void stateChangeProfile() {};
+ bool destinationReach() const;
+
+ void addBot (CBot* bot) {};
+ void removeBot (CBot* bot) {};
+ CPathCont* getPathCont (CBot const* bot) { return NULL; };
+
+
+protected:
+private:
+ /// the profile type to apply to bot standing between two deplacement
+ AITYPES::TProfiles _BotStandProfileType;
+ /// the profile factory to apply to bot standing between two deplacement
+ IAIProfileFactory*_BotStandProfileFactory;
+
+ CFollowPath::TFollowStatus _Status;
+ CPathPosition _PathPos;
+ CPathCont _PathCont;
+ CAIVector _LastPos;
+
+ TDataSetRow _PlayerRow;
+ uint32 _DispersionRadius;
+};
+
+
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileIdle //
//////////////////////////////////////////////////////////////////////////////
@@ -792,6 +835,10 @@ public:
static std::string scriptFactionToFameFaction(std::string name);
static std::string fameFactionToScriptFaction(std::string name);
+ static bool scriptFactionToFameFactionGreaterThan(std::string name);
+ static sint32 scriptFactionToFameFactionValue(std::string name);
+
+
private:
CAITimer _checkTargetTimer;
bool bNoAssist;
diff --git a/code/ryzom/server/src/ai_service/commands.cpp b/code/ryzom/server/src/ai_service/commands.cpp
index 3803462cd..a85e8fe1c 100644
--- a/code/ryzom/server/src/ai_service/commands.cpp
+++ b/code/ryzom/server/src/ai_service/commands.cpp
@@ -259,7 +259,7 @@ NLMISC_COMMAND(eventCreateNpcGroup, "create an event npc group", "
std::string botsName;
if (args.size()>8) botsName = args[8];
- aiInstance->eventCreateNpcGroup(nbBots, sheetId, CAIVector(x, y), dispersionRadius, spawnBots, orientation, botsName);
+ aiInstance->eventCreateNpcGroup(nbBots, sheetId, CAIVector(x, y), dispersionRadius, spawnBots, orientation, botsName, "");
return true;
}
diff --git a/code/ryzom/server/src/ai_service/generic_logic_action.cpp b/code/ryzom/server/src/ai_service/generic_logic_action.cpp
index 5bcb13fca..64c620cb6 100644
--- a/code/ryzom/server/src/ai_service/generic_logic_action.cpp
+++ b/code/ryzom/server/src/ai_service/generic_logic_action.cpp
@@ -3013,7 +3013,10 @@ public:
}
if(!_Id)
- npcChatToChannelSentence(bot->dataSetRow(),CChatGroup::say,_Sentence);
+ {
+ ucstring ucstr = _Sentence;
+ npcChatToChannelSentence(bot->dataSetRow(),CChatGroup::say, ucstr);
+ }
else
{
if(!_Arg)
diff --git a/code/ryzom/server/src/ai_service/messages.cpp b/code/ryzom/server/src/ai_service/messages.cpp
index 64730a1b7..092ab39f8 100644
--- a/code/ryzom/server/src/ai_service/messages.cpp
+++ b/code/ryzom/server/src/ai_service/messages.cpp
@@ -697,7 +697,8 @@ void CMessages::init()
TRANSPORT_CLASS_REGISTER (CReportStaticAIInstanceMsg);
TRANSPORT_CLASS_REGISTER (CReportAIInstanceDespawnMsg);
TRANSPORT_CLASS_REGISTER (CWarnBadInstanceMsgImp);
-
+ TRANSPORT_CLASS_REGISTER (CCreatureSetUrlMsg);
+ TRANSPORT_CLASS_REGISTER (CChangeCreatureMaxHPMsg)
TRANSPORT_CLASS_REGISTER (CChangeCreatureHPMsg);
TRANSPORT_CLASS_REGISTER (CChangeCreatureModeMsgImp);
TRANSPORT_CLASS_REGISTER (CQueryEgs);
@@ -770,10 +771,10 @@ void CAIAskForInfosOnEntityImp::callback (const std::string &name, NLNET::TServi
}
break;
default:
+ std::vector strings = phys->getMultiLineInfoString();
+ msg.Infos.insert(msg.Infos.end(), strings.begin(), strings.end());
break;
}
- std::vector strings = phys->getMultiLineInfoString();
- msg.Infos.insert(msg.Infos.end(), strings.begin(), strings.end());
}
else
{
diff --git a/code/ryzom/server/src/ai_service/nf_grp.cpp b/code/ryzom/server/src/ai_service/nf_grp.cpp
index 572a589cb..eabe61fd4 100644
--- a/code/ryzom/server/src/ai_service/nf_grp.cpp
+++ b/code/ryzom/server/src/ai_service/nf_grp.cpp
@@ -1497,6 +1497,41 @@ void setAutoSpawn_f_(CStateInstance* entity, CScriptStack& stack)
// HP related methods
/** @page code
+@subsection setMaxHP_ff_
+Sets the Max HP level of each bot of the group.
+
+Arguments: f(MaxHp) f(SetFull) ->
+@param[in] MaxHP is the new maximum HP for each bot
+@param[in] SetFull if not 0, will set the HP to the new maximum
+
+@code
+()setMaxHP(50000,1);
+@endcode
+
+*/
+// CGroup
+void setMaxHP_ff_(CStateInstance* entity, CScriptStack& stack)
+{
+ bool setFull = ((float)stack.top() != 0.f); stack.pop();
+ float maxHp = ((float)stack.top()); stack.pop();
+
+ CChangeCreatureMaxHPMsg& msgList = CAIS::instance().getCreatureChangeMaxHP();
+
+ FOREACH(bot, CCont, entity->getGroup()->bots())
+ {
+ if (!bot->isSpawned())
+ continue;
+
+ CSpawnBot* const sbot = bot->getSpawnObj();
+
+ msgList.Entities.push_back(sbot->dataSetRow());
+ msgList.MaxHp.push_back((uint32)(maxHp));
+ msgList.SetFull.push_back((uint8)(setFull?1:0));
+ }
+}
+
+/** @page code
+
@subsection setHPLevel_f_
Sets the current HP level of each bot of the group.
@@ -1573,10 +1608,42 @@ void setHPScale_f_(CStateInstance* entity, CScriptStack& stack)
}
}
+//----------------------------------------------------------------------------
+// Url related method
+/** @page code
+@subsection setUrl_ss_
+Sets the name and url of right-click action
+Arguments: s(actionName),s(url) ->
+@param[in] actionName of action when player mouse over
+@param[in] url of action when player mouse over
+@code
+()setUrl("Click on Me", "http://www.domain.com/script.php");
+@endcode
+*/
+// CGroup
+void setUrl_ss_(CStateInstance* entity, CScriptStack& stack)
+{
+ std::string url = (std::string)stack.top();stack.pop();
+ std::string actionName = (std::string)stack.top();stack.pop();
+
+ CCreatureSetUrlMsg msg;
+ FOREACH(botIt, CCont, entity->getGroup()->bots())
+ {
+ CSpawnBot* pbot = botIt->getSpawnObj();
+ if (pbot!=NULL)
+ {
+ msg.Entities.push_back(pbot->dataSetRow());
+ }
+ }
+
+ msg.ActionName = actionName;
+ msg.Url = url;
+ msg.send(egsString);
+}
@@ -1870,7 +1937,7 @@ Arguments: s(parameterName) ->
@param[in] parameterName is a the id of the parameter to add
@code
-()addProfileParameter("running"); // équivalent à un parameter "running" dans la primitive du groupe
+()addProfileParameter("running"); // equivalent to "running" parameter in group primitive
@endcode
*/
@@ -1898,7 +1965,7 @@ Arguments: s(parameterName),s(parameterContent) ->
@param[in] parameterContent is the value of the parameter
@code
-()addProfileParameter("foo", "bar"); // équivalent à un parameter "foo:bar" dans la primitive du groupe
+()addProfileParameter("foo", "bar"); // equivalent to "foo:bar" parameter in group primitive
@endcode
*/
@@ -1927,7 +1994,7 @@ Arguments: s(parameterName),f(parameterContent) ->
@param[in] parameterContent is the value of the parameter
@code
-()addProfileParameter("foo", 0.5); // équivalent à un parameter "foo:0.5" dans la primitive du groupe
+()addProfileParameter("foo", 0.5); // equivalent to "foo:0.5" parameter in group primitive
@endcode
*/
@@ -4456,6 +4523,37 @@ void setSheet_s_(CStateInstance* entity, CScriptStack& stack)
}
}
+//----------------------------------------------------------------------------
+/** @page code
+
+@subsection setClientSheet_s_
+Change the client sheet of a creature
+
+Arguments: -> s(sheetName)
+
+@code
+()setClientSheet('ccdeb2');
+
+@endcode
+
+*/
+void setClientSheet_s_(CStateInstance* entity, CScriptStack& stack)
+{
+ string sheetname = stack.top();
+ stack.pop();
+
+ if (sheetname.find(".creature") == string::npos)
+ sheetname += ".creature";
+
+ FOREACH(itBot, CCont, entity->getGroup()->bots())
+ {
+ CBot* bot = *itBot;
+ if (bot)
+ {
+ bot->setClientSheet(sheetname);
+ }
+ }
+}
/****************************************************************************/
@@ -4581,6 +4679,62 @@ void setConditionSuccess_f_(CStateInstance* entity, CScriptStack& stack)
CAILogicDynamicIfHelper::setConditionSuccess(conditionState);
}
+inline
+static float randomAngle()
+{
+ uint32 const maxLimit = CAngle::PI*2;
+ float val = (float)CAIS::rand32(maxLimit);
+ return val;
+}
+
+//----------------------------------------------------------------------------
+/** @page code
+
+@subsection facing_f_
+
+The npc will face the given direction
+
+
+Arguments: f(direction)
+@param[in] direction is the new angle of the bot in radians
+
+@code
+()facing(3.14);
+@endcode
+
+*/
+
+// CStateInstance
+void facing_f_(CStateInstance* entity, CScriptStack& stack)
+{
+ float const theta = (float)stack.top(); stack.pop();
+ CGroup* group = entity->getGroup();
+
+ bool bRandomAngle = false;
+ if (theta > (NLMISC::Pi * 2.0) || theta < (-NLMISC::Pi * 2.0))
+ bRandomAngle = true;
+
+ if (group->isSpawned())
+ {
+ FOREACH(itBot, CCont, group->bots())
+ {
+ CBot* bot = *itBot;
+ if (bot)
+ {
+ if (bot->isSpawned())
+ {
+ CSpawnBot *spawnBot = bot->getSpawnObj();
+
+ if (bRandomAngle)
+ spawnBot->setTheta(randomAngle());
+ else
+ spawnBot->setTheta(theta);
+
+ }
+ }
+ }
+ }
+}
std::map nfGetGroupNativeFunctions()
{
@@ -4628,6 +4782,7 @@ std::map nfGetGroupNativeFunctions()
REGISTER_NATIVE_FUNC(functions, clearAggroList__);
REGISTER_NATIVE_FUNC(functions, setMode_s_);
REGISTER_NATIVE_FUNC(functions, setAutoSpawn_f_);
+ REGISTER_NATIVE_FUNC(functions, setMaxHP_ff_);
REGISTER_NATIVE_FUNC(functions, setHPLevel_f_);
REGISTER_NATIVE_FUNC(functions, setHPScale_f_);
REGISTER_NATIVE_FUNC(functions, scaleHP_f_);
@@ -4651,10 +4806,11 @@ std::map nfGetGroupNativeFunctions()
REGISTER_NATIVE_FUNC(functions, getEventParam_f_f);
REGISTER_NATIVE_FUNC(functions, getEventParam_f_s);
REGISTER_NATIVE_FUNC(functions, setSheet_s_);
+ REGISTER_NATIVE_FUNC(functions, setClientSheet_s_);
REGISTER_NATIVE_FUNC(functions, setHealer_f_);
REGISTER_NATIVE_FUNC(functions, setConditionSuccess_f_);
-
-
+ REGISTER_NATIVE_FUNC(functions, facing_f_);
+ REGISTER_NATIVE_FUNC(functions, setUrl_ss_);
// Boss functions (custom text)
REGISTER_NATIVE_FUNC(functions, phraseBegin__);
@@ -4699,10 +4855,7 @@ std::map nfGetGroupNativeFunctions()
REGISTER_NATIVE_FUNC(functions, teleportPlayer_sffff_);
REGISTER_NATIVE_FUNC(functions, summonPlayer_fs_);
-
-
-
#undef REGISTER_NATIVE_FUNC
return functions;
diff --git a/code/ryzom/server/src/ai_service/nf_grp_npc.cpp b/code/ryzom/server/src/ai_service/nf_grp_npc.cpp
index d8ae543a5..2ea93b625 100644
--- a/code/ryzom/server/src/ai_service/nf_grp_npc.cpp
+++ b/code/ryzom/server/src/ai_service/nf_grp_npc.cpp
@@ -462,7 +462,7 @@ Arguments: f(Radius) ->
@param[in] Radius dispersion of wander activity
@code
-()startWander(100); // Gives a wander activity to the group with dispersion of 100
+()startMoving(100,-100,10); // Moves the group to 100,-100 with radius of 10
@endcode
*/
@@ -501,6 +501,56 @@ void startMoving_fff_(CStateInstance* entity, CScriptStack& stack)
return;
}
+//----------------------------------------------------------------------------
+/** @page code
+
+@subsection followPlayer_sf_
+Set activity to follow the given player
+
+Arguments: s(PlayerEid) f(Radius) ->
+@param[in] PlayerEid id of player to follow
+@param[in] Radius dispersion of wander activity
+
+@code
+()followPlayer("(0x0002015bb4:01:88:88)",10);
+@endcode
+
+*/
+// Spawned CGroupNpc not in a family behaviour
+void followPlayer_sf_(CStateInstance* entity, CScriptStack& stack)
+{
+ uint32 dispersionRadius = (uint32)(float&)stack.top(); stack.pop();
+ NLMISC::CEntityId playerId = NLMISC::CEntityId((std::string)stack.top());
+
+ IManagerParent* const managerParent = entity->getGroup()->getOwner()->getOwner();
+ CAIInstance* const aiInstance = dynamic_cast(managerParent);
+ if (!aiInstance)
+ return;
+
+ if (!entity) { nlwarning("followPlayer failed!"); return; }
+
+ CGroupNpc* group = dynamic_cast(entity->getGroup());
+ if (!group)
+ { nlwarning("followPlayer failed: no NPC group");
+ return;
+ }
+ CSpawnGroupNpc* spawnGroup = group->getSpawnObj();
+ if (!spawnGroup)
+ { nlwarning("followPlayer failed: no spawned group");
+ return;
+ }
+
+ if (playerId == CEntityId::Unknown)
+ {
+ nlwarning("followPlayer failed: unknown player");
+ DEBUG_STOP;
+ return;
+ }
+
+ spawnGroup->movingProfile().setAIProfile(new CGrpProfileFollowPlayer(spawnGroup, TheDataset.getDataSetRow(playerId), dispersionRadius));
+
+ return;
+}
//----------------------------------------------------------------------------
@@ -2179,14 +2229,11 @@ void facing_cscs_(CStateInstance* entity, CScriptStack& stack)
// bot1->setTheta(bot1->pos().angleTo(bot2->pos()));
}
-
//----------------------------------------------------------------------------
/** @page code
@subsection npcSay_css_
-A new entry of the npc contextual menu will propose to the targeter player to talk to the npc.
-
Make a npc say a text
There are 3 type of text
@@ -2201,9 +2248,9 @@ Arguments: c(group), s(botname), s(text), ->
@code
(@group)group_name.context();
-()emote(@group, "bob", "DSS_1601 RtEntryText_6") ;// Send To dss
-()emote(@group, "bob", "RAW Ca farte?"); // phrase direcly send to IOS as raw (for debug)
-()emote(@group, "bob", "answer_group_no_m"); //phrase id
+()npcSay(@group, "bob", "DSS_1601 RtEntryText_6") ;// Send To dss
+()npcSay(@group, "bob", "RAW Ca farte?"); // phrase direcly send to IOS as raw (for debug)
+()npcSay(@group, "bob", "answer_group_no_m"); //phrase id
@endcode
@@ -2214,6 +2261,34 @@ Arguments: c(group), s(botname), s(text), ->
#include "game_share/chat_group.h"
#include "game_share/send_chat.h"
+void execSayHelper(CSpawnBot *spawnBot, NLMISC::CSString text, CChatGroup::TGroupType mode = CChatGroup::say)
+{
+ if (spawnBot)
+ {
+ NLMISC::CSString prefix = text.left(4);
+ if (prefix=="DSS_")
+ {
+
+ NLMISC::CSString phrase = text.right(text.length() - 4);
+ NLMISC::CSString idStr = phrase.strtok(" ",false,false,false,false);
+ uint32 scenarioId = atoi(idStr.c_str());
+ forwardToDss(spawnBot->dataSetRow(), mode, phrase, scenarioId);
+ return;
+ }
+
+ if (prefix=="RAW ")
+ {
+ std::string phrase = text.right(text.length()-4);
+ ucstring ucstr = phrase;
+ npcChatToChannelSentence(spawnBot->dataSetRow(), mode, ucstr);
+ return;
+ }
+
+ //Classic phrase ID
+ npcChatToChannel(spawnBot->dataSetRow(), mode, text);
+ }
+}
+
void npcSay_css_(CStateInstance* entity, CScriptStack& stack)
{
string text = (string)stack.top(); stack.pop();
@@ -2224,29 +2299,58 @@ void npcSay_css_(CStateInstance* entity, CScriptStack& stack)
if (!spawnBot) { return; }
+ execSayHelper(spawnBot, text);
+}
- std::string prefix =NLMISC::CSString (text).left(4);
- if(prefix=="DSS_")
- {
-
- NLMISC::CSString phrase = NLMISC::CSString (text).right((uint)text.length()-4);
- NLMISC::CSString idStr = phrase.strtok(" ",false,false,false,false);
- uint32 scenarioId;
- NLMISC::fromString(idStr, scenarioId);
- forwardToDss(spawnBot->dataSetRow(), CChatGroup::say, phrase, scenarioId);
- return;
- }
-
- if (prefix=="RAW ")
- {
- NLMISC::CSString phrase = NLMISC::CSString (text).right((uint)text.length()-4);
- npcChatToChannelSentence(spawnBot->dataSetRow(),CChatGroup::say, phrase);
- return;
- }
+//----------------------------------------------------------------------------
+/** @page code
- //Classic phrase ID
- npcChatToChannel(spawnBot->dataSetRow(), CChatGroup::say, text);
- return;
+@subsection npcSay_ss_
+
+Make a npc say a text
+
+Arguments: s(text), s(mode) ->
+@param[in] text is the text to say. prefix with ID: to use an id
+@param[in] mode is the mode to use (say, shout)
+
+@code
+()npcSay("Hello!","say"); // phrase direcly send to IOS as raw
+()npcSay("ID:answer_group_no_m","shout"); // phrase id
+@endcode
+
+*/
+
+void npcSay_ss_(CStateInstance* entity, CScriptStack& stack)
+{
+ std::string sMode = (std::string)stack.top(); stack.pop();
+ std::string text = (std::string)stack.top(); stack.pop();
+
+ CChatGroup::TGroupType mode = CChatGroup::say;
+ mode = CChatGroup::stringToGroupType(sMode);
+ CGroup* group = entity->getGroup();
+
+ if (group->isSpawned())
+ {
+ FOREACH(itBot, CCont, group->bots())
+ {
+ CBot* bot = *itBot;
+ if (bot)
+ {
+ if (bot->isSpawned())
+ {
+ CSpawnBot *spawnBot = bot->getSpawnObj();
+ std::string prefix = NLMISC::CSString(text).left(3);
+ if (NLMISC::nlstricmp(prefix.c_str(), "id:") == 0) {
+ text = NLMISC::CSString(text).right(text.length()-3);
+ execSayHelper(spawnBot, text, mode);
+ }
+ else {
+ execSayHelper(spawnBot, "RAW " + text, mode);
+ }
+ }
+ }
+ }
+ }
}
@@ -2514,6 +2618,7 @@ void rename_s_(CStateInstance* entity, CScriptStack& stack)
msgout.serial(row);
msgout.serial(name);
sendMessageViaMirror("IOS", msgout);
+ bot->setCustomName(name);
}
}
}
@@ -2650,6 +2755,7 @@ std::map nfGetNpcGroupNativeFunctions()
REGISTER_NATIVE_FUNC(functions, startMoving_fff_);
REGISTER_NATIVE_FUNC(functions, waitInZone_s_);
REGISTER_NATIVE_FUNC(functions, stopMoving__);
+ REGISTER_NATIVE_FUNC(functions, followPlayer_sf_);
REGISTER_NATIVE_FUNC(functions, wander__);
REGISTER_NATIVE_FUNC(functions, setAttackable_f_);
REGISTER_NATIVE_FUNC(functions, setPlayerAttackable_f_);
@@ -2687,6 +2793,7 @@ std::map nfGetNpcGroupNativeFunctions()
REGISTER_NATIVE_FUNC(functions, rename_s_);
REGISTER_NATIVE_FUNC(functions, vpx_s_);
REGISTER_NATIVE_FUNC(functions, npcSay_css_);
+ REGISTER_NATIVE_FUNC(functions, npcSay_ss_);
REGISTER_NATIVE_FUNC(functions, dssMessage_fsss_);
REGISTER_NATIVE_FUNC(functions, despawnBotByAlias_s_);
REGISTER_NATIVE_FUNC(functions, giveReward_ssssc_);
diff --git a/code/ryzom/server/src/ai_service/nf_static.cpp b/code/ryzom/server/src/ai_service/nf_static.cpp
index fa1699b4b..4523d3e1d 100644
--- a/code/ryzom/server/src/ai_service/nf_static.cpp
+++ b/code/ryzom/server/src/ai_service/nf_static.cpp
@@ -1000,8 +1000,8 @@ void setSimplePhrase_ss_(CStateInstance* entity, CScriptStack& stack)
phraseContent2 += "]}";
ucstring ucPhraseContent;
-// ucPhraseContent.fromUtf8(phraseContent2); // utf-8 version
- ucPhraseContent = phraseContent2; // iso-8859-1 version
+ ucPhraseContent.fromUtf8(phraseContent2); // utf-8 version
+ //ucPhraseContent = phraseContent2; // iso-8859-1 version
NLNET::CMessage msgout("SET_PHRASE");
msgout.serial(phraseName);
@@ -1009,6 +1009,33 @@ void setSimplePhrase_ss_(CStateInstance* entity, CScriptStack& stack)
sendMessageViaMirror("IOS", msgout);
}
+void setSimplePhrase_sss_(CStateInstance* entity, CScriptStack& stack)
+{
+ std::string lang = (std::string)stack.top();
+ stack.pop();
+ std::string phraseContent = (std::string)stack.top();
+ stack.pop();
+ std::string phraseName = (std::string)stack.top();
+ stack.pop();
+
+ std::string phraseContent2;
+ phraseContent2 += phraseName;
+ phraseContent2 += "(){[";
+ phraseContent2 += phraseContent;
+ phraseContent2 += "]}";
+
+ ucstring ucPhraseContent;
+ ucPhraseContent.fromUtf8(phraseContent2); // utf-8 version
+ //ucPhraseContent = phraseContent2; // iso-8859-1 version
+
+ NLNET::CMessage msgout("SET_PHRASE_LANG");
+ msgout.serial(phraseName);
+ msgout.serial(ucPhraseContent);
+ msgout.serial(lang);
+ sendMessageViaMirror("IOS", msgout);
+}
+
+
//----------------------------------------------------------------------------
/** @page code
@@ -1330,6 +1357,7 @@ std::map nfGetStaticNativeFunctions()
REGISTER_NATIVE_FUNC(functions, getNamedEntityProp_ss_s);
REGISTER_NATIVE_FUNC(functions, destroyNamedEntity_s_);
REGISTER_NATIVE_FUNC(functions, setSimplePhrase_ss_);
+ REGISTER_NATIVE_FUNC(functions, setSimplePhrase_sss_);
REGISTER_NATIVE_FUNC(functions, dataGetVar_s_s);
REGISTER_NATIVE_FUNC(functions, dataGetVar_s_f);
REGISTER_NATIVE_FUNC(functions, dataSetVar_ss_);
diff --git a/code/ryzom/server/src/ai_service/npc_description_msg.cpp b/code/ryzom/server/src/ai_service/npc_description_msg.cpp
index 70989be8d..ebe7701a7 100644
--- a/code/ryzom/server/src/ai_service/npc_description_msg.cpp
+++ b/code/ryzom/server/src/ai_service/npc_description_msg.cpp
@@ -788,6 +788,13 @@ bool CNpcChatProfileImp::parseChatArgs(CAIInstance *aiInstance, const std::strin
return true;
}
+ // organization entry
+ if (NLMISC::nlstricmp(keyword, "organization") == 0)
+ {
+ NLMISC::fromString(tail, _Organization);
+ return true;
+ }
+
// if no match found throw an error
return false;
}
@@ -830,4 +837,5 @@ void TGenNpcDescMsgImp::setChat(const CNpcChatProfileImp& chatProfile)
_OptionalProperties = chatProfile.getOptionalProperties();
_Outpost = chatProfile.getOutpost();
+ _Organization = chatProfile.getOrganization();
}
diff --git a/code/ryzom/server/src/ai_service/npc_description_msg.h b/code/ryzom/server/src/ai_service/npc_description_msg.h
index e29bdfd13..14c94e9b1 100644
--- a/code/ryzom/server/src/ai_service/npc_description_msg.h
+++ b/code/ryzom/server/src/ai_service/npc_description_msg.h
@@ -36,7 +36,7 @@ public:
CNpcChatProfileImp(const CNpcChatProfileImp &other0,const CNpcChatProfileImp &other1);
// interface for setting up chat info
- void clear() { clearShopInfo(); clearMissions(); clearCellZones(); clearContextOption(); _OptionalProperties.clear(); }
+ void clear() { clearShopInfo(); clearMissions(); clearCellZones(); clearContextOption(); clearWeb(); _OptionalProperties.clear(); }
void clearShopInfo()
{
_ShopTypes.clear();
@@ -56,6 +56,11 @@ public:
}
void clearCellZones() { _CellZones.clear(); }
void clearMissions() { _Missions.clear(); }
+ void clearWeb()
+ {
+ _WebPage.clear();
+ _WebPageName.clear();
+ }
bool add(CAIInstance *aiInstance, const std::string &chatArgs) { return parseChatArgs(aiInstance, chatArgs); }
void addMission(uint32 mission) { _Missions.push_back(mission); }
void clearContextOption() { _ContextOptions.clear(); }
diff --git a/code/ryzom/server/src/ai_service/script_compiler.cpp b/code/ryzom/server/src/ai_service/script_compiler.cpp
index aabe5889c..03d0fe336 100644
--- a/code/ryzom/server/src/ai_service/script_compiler.cpp
+++ b/code/ryzom/server/src/ai_service/script_compiler.cpp
@@ -1083,25 +1083,33 @@ CSmartPtr CCompiler::compileCode (const std::vector=str.size())
+ size_t index = str.find("//",0);
+ if (index == string::npos)
+ code += str;
+ else {
+ // We have a potential comment. Now check if it is quoted or not
+ bool inQuote = false;
+ uint i = 0;
+ for (;;)
{
- firstIndex=string::npos;
- break;
- }
+ if ('"' == str[i])
+ inQuote = !inQuote;
- if (str.at(firstIndex)=='/')
- {
- code+=str.substr(0, firstIndex-1);
- break;
+ if ( !inQuote && ('/' == str[i]) )
+ {
+ ++i;
+ if ('/' == str[i])
+ break;
+
+ code += '/';
+ }
+ code += str[i];
+ ++i;
+ if (str.size() == i)
+ break;
}
- firstIndex=str.find_first_of("/",firstIndex);
}
- if (firstIndex==string::npos)
- code+=str;
+
code+="\n "; // additional ..
}
code+="}";
diff --git a/code/ryzom/server/src/ai_service/script_compiler_native_func.cpp b/code/ryzom/server/src/ai_service/script_compiler_native_func.cpp
index 17bc605c4..dc6b36861 100644
--- a/code/ryzom/server/src/ai_service/script_compiler_native_func.cpp
+++ b/code/ryzom/server/src/ai_service/script_compiler_native_func.cpp
@@ -221,10 +221,12 @@ arguments.
- @ref moveToZone_ss_
- @ref waitInZone_s_
- @ref stopMoving__
+- @ref followPlayer_sf_
- @ref wander__
- @ref downScaleHP_f_
- @ref upScaleHP_f_
- @ref scaleHP_f_
+- @ref setMaxHP_ff_
- @ref setHPLevel_f_
- @ref addHP_f_
- @ref aiAction_s_
diff --git a/code/ryzom/server/src/ai_service/visual_properties_interface.cpp b/code/ryzom/server/src/ai_service/visual_properties_interface.cpp
index e495319f4..20d79f038 100644
--- a/code/ryzom/server/src/ai_service/visual_properties_interface.cpp
+++ b/code/ryzom/server/src/ai_service/visual_properties_interface.cpp
@@ -69,7 +69,7 @@ void CVisualPropertiesInterface::release()
}
// set different visual properties for a bot.
-void CVisualPropertiesInterface::setName(const TDataSetRow& dataSetRow,std::string name)
+void CVisualPropertiesInterface::setName(const TDataSetRow& dataSetRow, ucstring name)
{
if (!IOSHasMirrorReady)
return;
@@ -77,8 +77,6 @@ void CVisualPropertiesInterface::setName(const TDataSetRow& dataSetRow,std::stri
NLNET::CMessage msgout("CHARACTER_NAME");
CEntityId eid=CMirrors::DataSet->getEntityId(dataSetRow);
msgout.serial (const_cast(dataSetRow));
- ucstring uname;
- uname.fromUtf8(name);
- msgout.serial (uname); // Daniel: TODO update all name dependencies to ucstring in your service.
+ msgout.serial (name);
sendMessageViaMirror("IOS",msgout);
}
diff --git a/code/ryzom/server/src/ai_service/visual_properties_interface.h b/code/ryzom/server/src/ai_service/visual_properties_interface.h
index 75d5c5a6d..d814e91da 100644
--- a/code/ryzom/server/src/ai_service/visual_properties_interface.h
+++ b/code/ryzom/server/src/ai_service/visual_properties_interface.h
@@ -39,7 +39,7 @@ public:
static void release();
// set different visual properties for an entity
- static void setName(const TDataSetRow& dataSetRow,std::string name);
+ static void setName(const TDataSetRow& dataSetRow, ucstring name);
// static void setMode(CAIEntityId id,MBEHAV::EMode mode);
// static void setBehaviour(CAIEntityId id,MBEHAV::EBehaviour behaviour);
diff --git a/code/ryzom/server/src/entities_game_service/admin.cpp b/code/ryzom/server/src/entities_game_service/admin.cpp
index 502128805..44a48d3be 100644
--- a/code/ryzom/server/src/entities_game_service/admin.cpp
+++ b/code/ryzom/server/src/entities_game_service/admin.cpp
@@ -15,7 +15,6 @@
// along with this program. If not, see .
-
//
// User Privilege set in the mysql database must be like that ":GM:" or "" or ":GM:ADMIN:" ....
//
@@ -52,8 +51,6 @@
#include "game_share/shard_names.h"
#include "server_share/log_command_gen.h"
#include "server_share/r2_vision.h"
-#include "server_share/log_item_gen.h"
-#include "server_share/log_character_gen.h"
#include "egs_sheets/egs_sheets.h"
#include "egs_sheets/egs_static_rolemaster_phrase.h"
@@ -75,6 +72,8 @@
#include "team_manager/team_manager.h"
#include "world_instances.h"
#include "egs_variables.h"
+#include "building_manager/building_manager.h"
+#include "building_manager/building_physical.h"
#include "player_manager/gm_tp_pending_command.h"
#include "guild_manager/guild_manager.h"
#include "guild_manager/guild.h"
@@ -104,6 +103,10 @@
#include "modules/shard_unifier_client.h"
#include "modules/client_command_forwarder.h"
#include "modules/guild_unifier.h"
+#include "server_share/log_command_gen.h"
+#include "server_share/log_item_gen.h"
+#include "server_share/log_character_gen.h"
+#include "server_share/used_continent.h"
//
// Externs
@@ -162,6 +165,9 @@ AdminCommandsInit[] =
{
// player character accessible commands
"teamInvite", true,
+ "setLeague", true,
+ "leagueInvite", true,
+ "leagueKick", true,
"guildInvite", true,
"roomInvite", true,
"roomKick", true,
@@ -174,6 +180,8 @@ AdminCommandsInit[] =
"validateRespawnPoint", true,
"summonPet", true,
"connectUserChannel", true,
+ "updateTarget", true,
+ "resetName", true,
// Web commands managment
"webExecCommand", true,
@@ -216,6 +224,7 @@ AdminCommandsInit[] =
"allowSummonPet", true,
"setPetAnimalSatiety", true,
"getPetAnimalSatiety", true,
+ "setPetAnimalName", true,
"taskPass", true,
"setFamePlayer", true,
"guildMOTD", true,
@@ -230,7 +239,7 @@ AdminCommandsInit[] =
"renamePlayerForEvent", true,
"renamePlayer", true,
"renameGuild", true,
- "setGuildDescription", true,
+ "setGuildDescription", false,
"setGuildIcon", false,
"killMob", true,
"changeVar", true,
@@ -295,12 +304,15 @@ AdminCommandsInit[] =
"Position", true,
"Priv", true,
"PriviledgePVP", true,
+ "FullPVP", true,
"FBT", true,
"RyzomDate", false,
"RyzomTime", false,
"addGuildXp", false,
"setGuildChargePoint", false,
-
+ "characterInventoryDump", true,
+ "deleteInventoryItem", true,
+ "setSimplePhrase", false,
// PUT HERE THE VARIABLE / COMMAND THAT ARE TEMPORARY
// remove when message of the day interface is ready
@@ -311,6 +323,8 @@ AdminCommandsInit[] =
"EntitiesNoActionFailure", false,
"EntitiesNoCastBreak", false,
"EntitiesNoResist", false,
+ "lockItem", true,
+ "setTeamLeader", true,
// aggroable state
"Aggro", true,
@@ -373,6 +387,15 @@ AdminCommandsInit[] =
"eventSetBotURL", true,
"eventSetBotURLName", true,
"eventSpawnToxic", true,
+ "eventNpcSay", true,
+ "eventSetBotFacing", true,
+ "eventGiveControl", true,
+ "eventLeaveControl", true,
+
+ "setOrganization", true,
+ "setOrganizationStatus", true,
+
+ "addGuildBuilding", true,
};
static vector AdminCommands;
@@ -387,6 +410,22 @@ static void loadCommandsPrivileges(const string & fileName, bool init);
void cbRemoteClientCallback (uint32 rid, const std::string &cmd, const std::string &entityNames);
//
+// get AI instance and remove it form the group name
+bool getAIInstanceFromGroupName(string& groupName, uint32& instanceNumber)
+{
+ if (groupName.find("@") != string::npos)
+ {
+ string continent = groupName.substr(0, groupName.find('@'));
+ uint32 nr = CUsedContinent::instance().getInstanceForContinent(continent);
+ if (nr == ~0)
+ {
+ return false;
+ }
+ instanceNumber = nr;
+ groupName = groupName.substr(groupName.find('@'), groupName.size());
+ }
+ return true;
+}
CAdminCommand * findAdminCommand(const string & name)
{
@@ -432,6 +471,7 @@ void initCommandsPrivileges(const std::string & fileName)
{
H_AUTO(initCommandsPrivileges);
+ initSalt();
loadCommandsPrivileges(fileName, true);
}
@@ -553,43 +593,46 @@ void initPositionFlags(const std::string & fileName)
PositionFlagsFileName = fileName;
}
-string getSalt()
+struct SaltFileLoadCallback: public IBackupFileReceiveCallback
{
- if (Salt.empty())
+ std::string FileName;
+
+ SaltFileLoadCallback(const std::string& fileName): FileName(fileName) {}
+
+ virtual void callback(const CFileDescription& fileDescription, NLMISC::IStream& dataStream)
{
- string fileNameAndPath = Bsi.getLocalPath() + "salt.txt";
- if (CFile::fileExists(fileNameAndPath))
- {
- FILE* f;
- string fileName;
-
- // open the file
- f=fopen(fileNameAndPath.c_str(),"rb");
- if (f == NULL)
- {
- nlinfo("Failed to open file for reading: %s", fileName.c_str() );
- return false;
- }
-
- CSString input;
- // read the file content into a buffer
- uint32 size=NLMISC::CFile::getFileSize(f);
- input.resize(size);
- uint32 readSize= (uint32)fread(&input[0],1,size,f);
- fclose(f);
- Salt = input;
- return Salt;
- }
- return "";
+ // if the file isn't found then just give up
+ DROP_IF(fileDescription.FileName.empty()," file not found: "<< FileName, return);
+
+ dataStream.serial(Salt);
+ nlinfo("Salt loaded : %s", Salt.c_str());
}
+};
+
+void initSalt()
+{
+ H_AUTO(initSalt);
+
+ string fileNameAndPath = Bsi.getLocalPath() + "salt_egs.txt";
+ if (CFile::fileExists(fileNameAndPath))
+ {
+ nlinfo("Salt loading : salt_egs.txt");
+ Bsi.syncLoadFile("salt_egs.txt", new SaltFileLoadCallback("salt_egs.txt"));
+ }
+}
+
+const string &getSalt()
+{
+ if (Salt.empty()) Salt = "abcdefghijklmnopqrstuvwxyz0123456";
+
return Salt;
}
void saveSalt(const string salt)
{
Salt = salt;
- CBackupMsgSaveFile msg("salt.txt", CBackupMsgSaveFile::SaveFile, Bsi );
- msg.DataMsg.serialBuffer((uint8*)Salt.c_str(), (uint)Salt.size());
+ CBackupMsgSaveFile msg("salt_egs.txt", CBackupMsgSaveFile::SaveFile, Bsi );
+ msg.DataMsg.serial(Salt);
Bsi.sendFile(msg);
}
@@ -1087,11 +1130,16 @@ ENTITY_VARIABLE(Position, "Position of a player (in meter) ,[,
explode (value, string(","), res);
if (res.size() >= 2)
{
- x = atoi (res[0].c_str()) * 1000;
- y = atoi (res[1].c_str()) * 1000;
+ fromString(res[0], x);
+ x *= 1000;
+ fromString(res[1], y);
+ y *= 1000;
}
if (res.size() >= 3)
- z = atoi (res[2].c_str()) * 1000;
+ {
+ fromString(res[2], z);
+ z *= 1000;
+ }
}
else
{
@@ -2222,13 +2270,19 @@ NLMISC_COMMAND(addPetAnimal,"Add pet animal to character"," ")
{
CGameItemPtr item = c->createItemInInventoryFreeSlot(INVENTORIES::bag, 1, 1, ticket);
if( item != 0 )
- c->addCharacterAnimal( ticket, 0, item );
- return true;
- }
- else
- {
- log.displayNL(" command, unknown pet ticket '%s'", args[1].c_str() );
+ {
+ if ( ! c->addCharacterAnimal( ticket, 0, item ))
+ {
+ item.deleteItem();
+ return false;
+ }
+ return true;
+ }
+
+ log.displayNL(" command, cannot create item in bag '%s'", args[1].c_str() );
}
+
+ log.displayNL(" command, unknown pet ticket '%s'", args[1].c_str() );
}
return false;
@@ -2271,7 +2325,9 @@ NLMISC_COMMAND(setPetAnimalSatiety,"Set the satiety of pet animal (petIndex in 0
if ( addressee )
{
CHECK_RIGHT( addressee, c );
- CCharacter::sendDynamicSystemMessage( addressee->getId(), result );
+ SM_STATIC_PARAMS_1(params, STRING_MANAGER::literal);
+ params[0].Literal = trim(result);
+ CCharacter::sendDynamicSystemMessage(addressee->getId(), "LITERAL", params);
}
else
result += " nameForAnswer not found";
@@ -2283,7 +2339,7 @@ NLMISC_COMMAND(setPetAnimalSatiety,"Set the satiety of pet animal (petIndex in 0
return true;
}
-NLMISC_COMMAND(getPetAnimalSatiety,"Set the satiety of pet animal (petIndex in 0..3)"," []")
+NLMISC_COMMAND(getPetAnimalSatiety,"Get the satiety of pet animal (petIndex in 0..3)"," []")
{
if (args.size () < 2) return false;
GET_CHARACTER
@@ -2307,7 +2363,9 @@ NLMISC_COMMAND(getPetAnimalSatiety,"Set the satiety of pet animal (petIndex in 0
if ( addressee )
{
CHECK_RIGHT( addressee, c );
- CCharacter::sendDynamicSystemMessage( addressee->getId(), result );
+ SM_STATIC_PARAMS_1(params, STRING_MANAGER::literal);
+ params[0].Literal = trim(result);
+ CCharacter::sendDynamicSystemMessage(addressee->getId(), "LITERAL", params);
}
else
result += " nameForAnswer not found";
@@ -2318,6 +2376,22 @@ NLMISC_COMMAND(getPetAnimalSatiety,"Set the satiety of pet animal (petIndex in 0
return true;
}
+NLMISC_COMMAND(setPetAnimalName, "Set the name of a pet animal (petIndex in 0..3)"," ")
+{
+ if (args.size () < 3) return false;
+ GET_CHARACTER
+
+ if ( c )
+ {
+ uint petIndex;
+ fromString(args[1], petIndex);
+ ucstring customName = args[2];
+ c->setAnimalName(petIndex, customName);
+ }
+
+ return true;
+}
+
NLMISC_COMMAND (addSkillPoints, "add skill points of given type (Fight = 0, Magic = 1,Craft = 2, Harvest = 3)", " ")
{
if (args.size () < 3) return false;
@@ -2330,7 +2404,8 @@ NLMISC_COMMAND (addSkillPoints, "add skill points of given type (Fight = 0, Magi
return false;
}
- uint32 nbSP = atoi (args[2].c_str());
+ uint32 nbSP;
+ fromString(args[2], nbSP);
c->addSP( nbSP, type );
@@ -3723,7 +3798,7 @@ NLMISC_COMMAND( failMission, "force mission failure", "" )
//----------------------------------------------------------------------------
NLMISC_COMMAND( progressMission, "force mission progression", "[repeat]")
{
- if ( args.size() != 2 || args.size() != 3 )
+ if ( args.size() != 2 && args.size() != 3 )
return false;
GET_CHARACTER;
@@ -3964,15 +4039,15 @@ NLMISC_COMMAND (targetInfos, "give infos on the target", "")
//----------------------------------------------------------------------------
NLMISC_COMMAND (infos, "give info on character (GodMode, Invisible...)", "")
{
- CSString str("GM STATUS: ");
+ CSString str("INFO: ");
GET_CHARACTER
if( c->invulnerableMode() )
{
- str << "INVULNERABLE MODE ";
+ str << "INVULNERABLE_MODE ";
}
if( c->godMode() )
{
- str << "GOD MODE ";
+ str << "GOD_MODE ";
}
else
{
@@ -3988,31 +4063,29 @@ NLMISC_COMMAND (infos, "give info on character (GodMode, Invisible...)", "")
{
if (IsRingShard)
{
- str << "INVISIBLE(" <getWhoSeesMe()) << ")";
+ str << "INVISIBLE(" <getWhoSeesMe()) << ") ";
}
else
{
- str << "INVISIBLE";
+ str << "INVISIBLE ";
}
}
if ( IsRingShard && R2_VISION::extractVisionLevel(c->getWhoSeesMe())!=R2_VISION::VISIBLE )
{
- str << "SEEINVIS(" << R2_VISION::extractVisionLevel(c->getWhoSeesMe()) << ")";
+ str << "SEEINVIS(" << R2_VISION::extractVisionLevel(c->getWhoSeesMe()) << ") ";
}
if (c->getAggroableSave())
{
- str << " AGGROABLE";
+ str << "AGGROABLE ";
}
else
{
- str << " NOT_AGGROABLE";
+ str << "NOT_AGGROABLE ";
}
- SM_STATIC_PARAMS_1(params,STRING_MANAGER::literal);
- params[0].Literal = str;
- CCharacter::sendDynamicSystemMessage( eid,"LITERAL", params );
+ log.displayNL(str.c_str());
return true;
}
@@ -4156,7 +4229,7 @@ ENTITY_VARIABLE(Invisible, "Invisibility of a player")
}
//----------------------------------------------------------------------------
-NLMISC_COMMAND(broadcast,"[repeat= or during=] [every=] message","")
+NLMISC_COMMAND(broadcast, "Broadcast a text", "[repeat= or during=] [every=] ")
{
if( args.size() < 1 )
{
@@ -4231,7 +4304,7 @@ NLMISC_COMMAND(broadcast,"[repeat= or during=] [eve
if( message.size() == 0 )
{
- log.displayNL("You must enter a not empty message");
+ log.displayNL("You must enter a message");
return false;
}
@@ -4243,7 +4316,7 @@ NLMISC_COMMAND(broadcast,"[repeat= or during=] [eve
if( ( ( repeat > 1 || during > 0 ) && every == 0 ) || ( ( every > during ) && during > 0 ) )
{
- log.displayNL("Can't execute broadcast command, check you'r repeat/during/every parameters");
+ log.displayNL("Can't execute broadcast command, check your repeat/during/every parameters");
return false;
}
@@ -4368,15 +4441,29 @@ NLMISC_COMMAND (connectUserChannel, "Connect to user channels", " removeFactionChannelForCharacter(channel, c, true);
}
else
- log.displayNL("You don't have rights to connect to channel %s", name.c_str());
+ {
+ SM_STATIC_PARAMS_1(params, STRING_MANAGER::literal);
+ params[0].Literal = name;
+ CCharacter::sendDynamicSystemMessage( eid, "EGS_CHANNEL_NO_RIGHTS", params );
+ }
return true;
}
+ SM_STATIC_PARAMS_1(params, STRING_MANAGER::literal);
+ params[0].Literal = name;
+ CCharacter::sendDynamicSystemMessage( eid, "EGS_CHANNEL_INVALID_NAME", params );
return false;
}
+NLMISC_COMMAND (updateTarget, "Update current target", "")
+{
+ GET_CHARACTER
+ c->updateTarget();
+ return true;
+}
+
NLMISC_COMMAND (setSalt, "Set Salt", " ")
{
if (args.size() != 2)
@@ -4392,6 +4479,7 @@ NLMISC_COMMAND (setSalt, "Set Salt", " ")
return true;
}
+// !!! Deprecated !!!
NLMISC_COMMAND (webAddCommandsIds, "Add ids of commands will be run from webig", " ")
{
if (args.size() != 4)
@@ -4413,6 +4501,7 @@ NLMISC_COMMAND (webAddCommandsIds, "Add ids of commands will be run from webig",
return true;
}
+// !!! Deprecated !!!
NLMISC_COMMAND (webDelCommandsIds, "Del ids of commands", " ")
{
if (args.size() != 2)
@@ -4435,7 +4524,7 @@ NLMISC_COMMAND (webDelCommandsIds, "Del ids of commands", " getInventory(selectedInv);
break;
default:
- inventory = INVENTORIES::bag;
+ // No-op
+ break;
}
}
- return c->getInventory(inventory);
+ return inventoryPtr;
}
-NLMISC_COMMAND (webExecCommand, "Execute a web command", " ")
+NLMISC_COMMAND (webExecCommand, "Execute a web command", " [] [] []")
{
- if (args.size() != 5)
+ if (args.size() < 5)
return false;
GET_CHARACTER
+ bool new_check = false;
+ if (args.size() >= 6 && args[5] == "1")
+ new_check = true;
+
+ bool next_step = false;
+ if (args.size() >= 7 && args[6] == "1")
+ next_step = true;
+
+ bool send_url = false;
+ if (args.size() >= 8 && args[7] == "1")
+ send_url = true;
+
+ c->setAfkState(false);
+
string web_app_url = args[1];
string index = args[2];
+ uint32 iindex;
+ NLMISC::fromString(index, iindex);
string command = args[3];
string hmac = args[4];
- CInventoryPtr check_inv = c->getInventory(INVENTORIES::bag);
vector infos;
CGameItemPtr item;
- if (!c->havePriv(":DEV:") || (web_app_url != "debug"))
+ if (new_check)
{
- uint item_idx = c->checkWebCommand(web_app_url, index+command, hmac, getSalt());
- if (item_idx == INVENTORIES::NbBagSlots)
+ uint32 saved_index = c->getWebCommandIndex();
+ if (iindex <= saved_index)
{
- nlwarning("Bad web command check");
+ // Index of command must be higher than last used index to prevent re-use of commands
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_index", getSalt());
+ return false;
+ }
+ if (next_step && (iindex != saved_index+1))
+ {
+ // Next step commands wants an index who follow the last used index.
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_next_index", getSalt());
return false;
}
- item = check_inv->getItem(item_idx);
- string cText = item->getCustomText().toString();
- NLMISC::splitString(cText, "\n", infos);
-
- vector indexes;
- NLMISC::splitString(infos[1], ",", indexes);
-
- if (index != indexes[0])
+ string salt = getSalt();
+ string checksumEid = web_app_url + toString(c->getLastConnectedDate()) + index + command + c->getId().toString();
+ string checksumRowId = web_app_url + toString(c->getLastConnectedDate()) + index + command + toString(c->getEntityRowId().getIndex());
+ string realhmacEid = getHMacSHA1((uint8*)&checksumEid[0], checksumEid.size(), (uint8*)&salt[0], salt.size()).toString();
+ string realhmacRowId = getHMacSHA1((uint8*)&checksumRowId[0], checksumRowId.size(), (uint8*)&salt[0], salt.size()).toString();
+ if (realhmacEid != hmac && realhmacRowId != hmac)
+ {
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_auth", getSalt());
return false;
+ }
+ }
+ else
+ {
+ // !!! DEPRECATED !!!
+ CInventoryPtr check_inv = c->getInventory(INVENTORIES::bag);
+ if (!c->havePriv(":DEV:") || (web_app_url != "debug"))
+ {
+ uint item_idx = c->checkWebCommand(web_app_url, index+command, hmac, getSalt());
+ if (item_idx == INVENTORIES::NbBagSlots)
+ {
+ nlwarning("Bad web command check");
+ return false;
+ }
+
+ item = check_inv->getItem(item_idx);
+ string cText = item->getCustomText().toString();
+ NLMISC::splitString(cText, "\n", infos);
+
+ vector indexes;
+ NLMISC::splitString(infos[1], ",", indexes);
+
+ if (index != indexes[0])
+ return false;
+ }
}
std::vector command_args;
@@ -4514,10 +4654,12 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_inventory", getSalt());
+ return false;
+ }
+
uint32 numberItem = 0;
for( uint32 i = 0; i < inventory->getSlotCount(); ++ i)
{
const CGameItemPtr itemPtr = inventory->getItem(i);
if( itemPtr != NULL )
{
- if( (itemPtr->getSheetId() == sheetId) && (itemPtr->quality() >= quality) )
+ if( (itemPtr->getSheetId() == sheetId) && (itemPtr->quality() == quality) )
{
numberItem += itemPtr->getStackSize();
}
@@ -4541,7 +4690,8 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=no_items", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=no_items", getSalt());
return false;
}
@@ -4551,7 +4701,7 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " getItem(i);
if( itemPtr != NULL )
{
- if( (itemPtr->getSheetId() == sheetId) && (itemPtr->quality() >= quality) )
+ if( (itemPtr->getSheetId() == sheetId) && (itemPtr->quality() == quality) )
{
numberItem -= inventory->deleteStackItem(i, quantity);
if(numberItem == 0)
@@ -4570,13 +4720,12 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " createItem(quality, quantity, sheetId);
+ CGameItemPtr new_item;
+ string sheet = command_args[1];
+
+ if ( sheet.find(".sitem") == string::npos ) // try named item
+ {
+ new_item = CNamedItems::getInstance().createNamedItem(command_args[1], quantity);
+ if (new_item == NULL)
+ return true;
+ }
+ else
+ {
+ const CSheetId sheetId(sheet);
+ if (sheetId == CSheetId::Unknown)
+ return true;
+ new_item = c->createItem(quality, quantity, sheetId);
+ }
if (!c->addItemToInventory(inventory, new_item))
{
new_item.deleteItem();
- c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=cant_add_item", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=cant_add_item", getSalt());
return false;
}
+
+ ucstring customValue;
+
+ if (command_args.size() == 6 && command_args[5] != "*")
+ {
+ customValue.fromUtf8(command_args[5]);
+ new_item->setCustomName(customValue);
+ }
+
+ if (command_args.size() == 7 && command_args[6] != "*")
+ {
+ customValue.fromUtf8(command_args[6]);
+ new_item->setCustomText(customValue);
+ }
}
//*************************************************
//***************** check_position
@@ -4638,7 +4817,8 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " max_x || y > max_y))
{
- c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_position", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_position", getSalt());
return false;
}
}
@@ -4650,8 +4830,9 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " getId(), factionIndex);
sint32 value;
@@ -4665,12 +4846,46 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " value) || (command_args[2] == "above" && fame < value))
{
- c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_fame", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_fame", getSalt());
return false;
}
}
+ //*************************************************
+ //***************** set_fame (need x6000 to change 1 point)
+ //*************************************************
+ else if (command_args[0] == "change_fame")
+ {
+ if (command_args.size () != 4) return false;
+
+ uint32 factionIndex = CStaticFames::getInstance().getFactionIndex(command_args[1]);
+ if (factionIndex == CStaticFames::INVALID_FACTION_INDEX)
+ return false;
+ sint32 fame = CFameInterface::getInstance().getFameIndexed(c->getId(), factionIndex);
+
+ sint32 value;
+ NLMISC::fromString(command_args[3], value);
+
+ if (command_args[2] == "add")
+ {
+ CFameManager::getInstance().setEntityFame(c->getId(), factionIndex, fame+value, false);
+ nlinfo("fame : %d => %d", fame, fame+value);
+ }
+ else if (command_args[2] == "del")
+ {
+ CFameManager::getInstance().setEntityFame(c->getId(), factionIndex, fame-value, false);
+ nlinfo("fame : %d => %d", fame, fame-value);
+ }
+ else if (command_args[2] == "set")
+ {
+ CFameManager::getInstance().setEntityFame(c->getId(), factionIndex, value, false);
+ nlinfo("fame : %d => %d", fame, value);
+ }
+
+ }
+
//*************************************************
//***************** check_target
//*************************************************
@@ -4681,7 +4896,8 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " getTarget();
if (target == CEntityId::Unknown)
{
- c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=no_target", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=no_target", getSalt());
return false;
}
@@ -4689,14 +4905,16 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_type", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_type", getSalt());
return false;
}
CSheetId creatureSheetId(command_args[2]);
CCreature *creature = CreatureManager.getCreature(target);
if (creature == NULL || creatureSheetId == CSheetId::Unknown || creatureSheetId != creature->getType())
{
- c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_sheet", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_sheet", getSalt());
return false;
}
}
@@ -4704,7 +4922,8 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_type", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_type", getSalt());
return false;
}
vector aliases;
@@ -4721,7 +4940,8 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_bot", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_bot", getSalt());
return false;
}
}
@@ -4729,13 +4949,15 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_type", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_type", getSalt());
return false;
}
CEntityBase *entityBase = PlayerManager.getCharacterByName(CShardNames::getInstance().makeFullNameFromRelative(c->getHomeMainlandSessionId(), command_args[2]));
if (entityBase == NULL)
{
- c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_player", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_player", getSalt());
return false;
}
} else
@@ -4751,7 +4973,8 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " haveBrick(CSheetId(command_args[1])))
{
- c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=no_brick", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=no_brick", getSalt());
return false;
}
}
@@ -4773,7 +4996,8 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_action", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_brick_action", getSalt());
return false;
}
}
@@ -4781,7 +5005,7 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=bad_inventory", getSalt());
+ return false;
+ }
+
uint32 numberItem = 0;
for( uint32 i = 0; i < inventory->getSlotCount(); ++ i)
{
const CGameItemPtr itemPtr = inventory->getItem(i);
if( itemPtr != NULL )
{
- if( (itemPtr->getSheetId() == sheetId) && (itemPtr->quality() >= quality) )
+ if( (itemPtr->getSheetId() == sheetId) && (itemPtr->quality() == quality) )
{
- numberItem += itemPtr->getStackSize();
+ if (!crafted || itemPtr->getCreator() == c->getId())
+ numberItem += itemPtr->getStackSize();
}
}
}
if (numberItem < quantity)
{
- c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=no_items", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=no_items", getSalt());
return false;
}
}
@@ -4852,7 +5089,8 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " getState() != OUTPOSTENUMS::AttackRound) ||
(command_args[2] == "defend" && outpost->getState() != OUTPOSTENUMS::DefenseRound))
{
- c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc="+command_args[2], getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc="+command_args[2], getSalt());
return false;
}
}
@@ -4869,11 +5107,12 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " getY();
sint32 orientation = 6666; // used to specify a random orientation
- uint32 nbBots = NLMISC::atoui(command_args[1].c_str());
+ uint32 nbBots;
+ fromString(command_args[1], nbBots);
if (nbBots<=0)
{
log.displayNL("invalid bot count");
- return true;
+ return false;
}
NLMISC::CSheetId sheetId(command_args[2]);
@@ -4885,7 +5124,7 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " 3)
{
- dispersionRadius = atof(command_args[3].c_str());
+ fromString(command_args[3], dispersionRadius);
if (dispersionRadius < 0.)
return true;
}
@@ -4910,15 +5149,34 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " 6)
+ if (command_args.size() > 7)
{
- NLMISC::fromString(command_args[6], x);
- x = x * 1000;
+
+ if (command_args[6] != "*") {
+ float userX;
+ NLMISC::fromString(command_args[6], userX);
+ x = (sint32)(userX * 1000);
+ }
+
+ if (command_args[7] != "*") {
+ float userY;
+ NLMISC::fromString(command_args[7], userY);
+ y = (sint32)(userY * 1000);
+ }
}
- if (command_args.size()>7)
+
+ std::string look;
+ if (command_args.size() > 8)
{
- NLMISC::fromString(command_args[7], y);
- y = y * 1000;
+ look = command_args[8];
+ if (look.find(".creature") == string::npos)
+ look += ".creature";
+ }
+
+ // See if another AI instance has been specified
+ if ( ! getAIInstanceFromGroupName(botsName, instanceNumber))
+ {
+ return false;
}
CEntityId playerId = c->getId();
@@ -4936,6 +5194,7 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " getInstanceNumber();
uint32 nbString = (uint32)command_args.size();
+ // See if it needs another AI instance
+ string botsName = command_args[1];
+ if ( ! getAIInstanceFromGroupName(botsName, instanceNumber))
+ {
+ return false;
+ }
+
CMessage msgout("EVENT_NPC_GROUP_SCRIPT");
uint32 messageVersion = 1;
msgout.serial(messageVersion);
@@ -4957,8 +5223,7 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " getHomeMainlandSessionId(), command_args[1]));
+
+ CSheetId sheetId(command_args[2]);
+
+ const CStaticItem * form = CSheets::getForm(sheetId);
+ if (form == NULL)
+ {
+ nlwarning("unknown item : '%s'", sheetId.toString().c_str());
+ return true;
+ }
+
+ if (form->Type != ITEM_TYPE::HAIR_MALE && form->Type != ITEM_TYPE::HAIR_FEMALE)
+ {
+ nlwarning("'%s' is not a haircut item", sheetId.toString().c_str());
+ return true;
+ }
+
+ uint32 hairValue = CVisualSlotManager::getInstance()->sheet2Index(form->SheetId, SLOTTYPE::HEAD_SLOT);
+ if (target->setHair(hairValue))
+ {
+ target->resetHairCutDiscount();
+ }
+ }
+
+ //*************************************************
+ //***************** change_hair_color
+ //*************************************************
+
+ else if (command_args[0] == "change_hair_color") {
+ if (command_args.size () != 3) return false;
+
+ CCharacter *target = PlayerManager.getCharacterByName(CShardNames::getInstance().makeFullNameFromRelative(c->getHomeMainlandSessionId(), command_args[1]));
+
+ uint32 value;
+ fromString(command_args[2], value);
+
+ target->setHairColor(value);
+ }
+
//*************************************************
//***************** change_vpx
//*************************************************
@@ -4978,7 +5290,9 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " getHomeMainlandSessionId(), command_args[1]));
string name = command_args[2];
- uint32 value = (uint32)atoi(command_args[3].c_str());
+
+ uint32 value;
+ fromString(command_args[3], value);
if(target && target->getEnterFlag())
{
@@ -5105,7 +5419,8 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed", getSalt());
+ if (send_url)
+ c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=failed&desc=no_vpx_def", getSalt());
}
}
//*************************************************
@@ -5122,25 +5437,489 @@ NLMISC_COMMAND (webExecCommand, "Execute a web command", " havePriv(":DEV:") || (web_app_url != "debug"))
+ else if (command_args[0] == "teleport")
{
- string::size_type pos = infos[1].find(",");
- if (pos!=string::npos && pos!=(infos[1].length()-1))
+ // args: x y z [t]
+ if (command_args.size () < 4 ||
+ command_args.size () > 5 ) return false;
+
+ sint32 x;
+ sint32 y;
+ sint32 z;
+ float t;
+ fromString(command_args[1], x);
+ fromString(command_args[2], y);
+ fromString(command_args[3], z);
+ if (command_args.size() > 4)
{
- item->setCustomText(ucstring(infos[0]+"\n"+infos[1].substr(pos+1)));
+ fromString(command_args[4], t);
}
else
{
- c->sendUrl(web_app_url+"&player_eid="+c->getId().toString()+"&event=finished", getSalt());
+ t = c->getState().Heading;
+ }
+
+ NLNET::CMessage msgout( "TELEPORT_PLAYER" );
+ msgout.serial( const_cast(c->getId()) );
+ msgout.serial( const_cast