From 8ea4ff53cbde3ce66d9f05fbd47a13c3c983fea8 Mon Sep 17 00:00:00 2001 From: Nuno Date: Thu, 25 Nov 2021 09:36:43 +0100 Subject: [PATCH 001/194] Added stairs collisions --- nel/include/nel/pacs/move_container.h | 2 +- nel/include/nel/pacs/move_primitive.h | 25 ++++++ nel/include/nel/pacs/u_move_primitive.h | 14 +++ nel/src/pacs/move_container.cpp | 30 +++++-- nel/src/pacs/move_primitive.cpp | 7 ++ ryzom/client/src/entities.cpp | 114 +++++++++++++----------- ryzom/client/src/entity_cl.cpp | 15 +++- ryzom/client/src/main_loop.cpp | 51 +++++++++-- 8 files changed, 193 insertions(+), 65 deletions(-) diff --git a/nel/include/nel/pacs/move_container.h b/nel/include/nel/pacs/move_container.h index 5193e8386c..f368dd5e9a 100644 --- a/nel/include/nel/pacs/move_container.h +++ b/nel/include/nel/pacs/move_container.h @@ -244,7 +244,7 @@ class CMoveContainer: public UMoveContainer CCollisionOTStaticInfo *staticColInfo); // Add a trigger in the trigger array - void newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType); + bool newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType); // Clear modified primitive list void clearModifiedList (uint8 worldImage); diff --git a/nel/include/nel/pacs/move_primitive.h b/nel/include/nel/pacs/move_primitive.h index aa153c076f..d77517a7d4 100644 --- a/nel/include/nel/pacs/move_primitive.h +++ b/nel/include/nel/pacs/move_primitive.h @@ -251,6 +251,27 @@ class CMovePrimitive: public UMovePrimitive _Height=height; } + void setZOffset(float offset) + { + _ZOffset = offset; + } + + float getZOffset() + { + return _ZOffset; + } + + bool haveZOffset() + { + return _HaveZOffset; + } + + void enableZOffset(bool enabled) + { + _HaveZOffset = enabled; + } + + /** * Set the cylinder size. Only for cylinder. * @@ -466,6 +487,10 @@ class CMovePrimitive: public UMovePrimitive // Iteration count sint32 _IterationCount; + + float _ZOffset; + bool _HaveZOffset; + }; } // NLPACS diff --git a/nel/include/nel/pacs/u_move_primitive.h b/nel/include/nel/pacs/u_move_primitive.h index 5a021daa82..e067c3e6b6 100644 --- a/nel/include/nel/pacs/u_move_primitive.h +++ b/nel/include/nel/pacs/u_move_primitive.h @@ -114,6 +114,12 @@ class UMovePrimitive * This is an overlap trigger. This trigger is actived each time the object overlap the trigger. */ OverlapTrigger=0x400, + + /** + * This is an stairs trigger. This trigger is actived each time the object overlap the trigger and change Z position. + */ + OverlapStairsTrigger=0x800, + }; /** @@ -274,6 +280,14 @@ class UMovePrimitive */ virtual float getHeight () const =0; + virtual void setZOffset(float offset) =0; + + virtual float getZOffset() =0; + + virtual bool haveZOffset() =0; + + virtual void enableZOffset(bool enabled) =0; + /** * Set the cylinder size. Only for cylinder. * diff --git a/nel/src/pacs/move_container.cpp b/nel/src/pacs/move_container.cpp index 35b7ddcd6d..424f7d8b91 100644 --- a/nel/src/pacs/move_container.cpp +++ b/nel/src/pacs/move_container.cpp @@ -918,8 +918,10 @@ bool CMoveContainer::evalPrimAgainstPrimCollision (double beginTime, CMovePrimit || (otherPrimitive->getTriggerType()&UMovePrimitive::EnterTrigger)); bool exit = (beginTime<=lastTime) && (lastTime<_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::ExitTrigger) || (otherPrimitive->getTriggerType()&UMovePrimitive::ExitTrigger)); - bool overlap = (firstTime<=beginTime) && (lastTime>_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::OverlapTrigger) - || (otherPrimitive->getTriggerType()&UMovePrimitive::OverlapTrigger)); + bool overlap = ((firstTime<=beginTime) && (lastTime>_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::OverlapTrigger) + || (otherPrimitive->getTriggerType()&UMovePrimitive::OverlapTrigger)) || + (firstTime<=beginTime) && (lastTime>_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::OverlapStairsTrigger) + || (otherPrimitive->getTriggerType()&UMovePrimitive::OverlapStairsTrigger))); bool contact = ( beginTime<((firstTime+lastTime)/2) ) && (firstTime<=_DeltaTime); bool collision = contact && (primitive->isObstacle() && otherPrimitive->isObstacle ()); @@ -1211,7 +1213,7 @@ void CMoveContainer::newCollision (CMovePrimitive* first, const CCollisionSurfac // *************************************************************************** -void CMoveContainer::newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType) +bool CMoveContainer::newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType) { // Element index uint index=(uint)_Triggers.size(); @@ -1224,6 +1226,14 @@ void CMoveContainer::newTrigger (CMovePrimitive* first, CMovePrimitive* second, _Triggers[index].Object1=second->UserData; _Triggers[index].CollisionDesc=desc; _Triggers[index].CollisionType = uint8(triggerType); + + + if (second->_StaticFlags&UMovePrimitive::OverlapStairsTrigger) { + nlinfo("Col Stairs height %f", second->getHeight()); + return true; + } + + return false; } // *************************************************************************** @@ -1659,8 +1669,18 @@ void CMoveContainer::reaction (const CCollisionOTInfo& first) newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::In); if (dynInfo->isExit()) newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Out); - if (dynInfo->isInside()) - newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Inside); + if (dynInfo->isInside()) { + if (newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Inside)) + { + dynInfo->getFirstPrimitive()->enableZOffset(true); + CVectorD first_pos = dynInfo->getFirstPrimitive()->getFinalPosition(dynInfo->getFirstWorldImage()); + CVectorD second_pos = dynInfo->getSecondPrimitive()->getFinalPosition(dynInfo->getSecondWorldImage()); + nlinfo("P = %f, C = %f, H = %f, D = %f", first_pos.z, second_pos.z, dynInfo->getSecondPrimitive()->getHeight(), second_pos.z-first_pos.z); + dynInfo->getFirstPrimitive()->setZOffset(second_pos.z+dynInfo->getSecondPrimitive()->getHeight()-1.0f); + } + } + if (dynInfo->isExit()) + newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Out); } } } diff --git a/nel/src/pacs/move_primitive.cpp b/nel/src/pacs/move_primitive.cpp index 039fa0c7b8..261d7bbf89 100644 --- a/nel/src/pacs/move_primitive.cpp +++ b/nel/src/pacs/move_primitive.cpp @@ -49,6 +49,8 @@ CMovePrimitive::CMovePrimitive (CMoveContainer* container, uint8 firstWorldImage _StaticFlags=0; _RootOTInfo=NULL; _LastTestTime=0xffffffff; + _ZOffset = 0; + _HaveZOffset = false; // Ptr table alloc _WorldImages=_Container->allocateWorldImagesPtrs (numWorldImage); @@ -149,6 +151,11 @@ bool CMovePrimitive::isTriggered (CMovePrimitive& second, bool enter, bool exit) { // Generate a trigger ? + + // Is one of them is a stairs trigger ? + if ( second._StaticFlags&OverlapStairsTrigger ) + return true; + // Is the two are not triggers ? if ( ( (_StaticFlags&TriggerMask) == NotATrigger ) && ( (second._StaticFlags&TriggerMask) == NotATrigger ) ) return false; diff --git a/ryzom/client/src/entities.cpp b/ryzom/client/src/entities.cpp index 6a64ea449d..a17a49e4fb 100644 --- a/ryzom/client/src/entities.cpp +++ b/ryzom/client/src/entities.cpp @@ -461,7 +461,7 @@ void CEntityManager::initialize(uint nbMaxEntity) NLGUI::CDBManager::getInstance()->getDB()->addObserver(&TeamUIDObserver, textId ); _GroupMemberUidDB[i] = NLGUI::CDBManager::getInstance()->getDbProp(text, false); nlassert(_GroupMemberUidDB[i]); - + text = toString(TEAM_DB_PATH ":%d:NAME", i); textId = ICDBNode::CTextId(text); NLGUI::CDBManager::getInstance()->getDB()->addObserver(&TeamPresentObserver, textId ); @@ -477,13 +477,13 @@ void CEntityManager::initialize(uint nbMaxEntity) NLGUI::CDBManager::getInstance()->getDB()->addObserver(&AnimalUIDObserver, textId); _BeastUidDB[i] = NLGUI::CDBManager::getInstance()->getDbProp(text, false); nlassert(_BeastUidDB[i]); - + text = toString("SERVER:PACK_ANIMAL:BEAST%d:STATUS", i); textId = ICDBNode::CTextId(text); NLGUI::CDBManager::getInstance()->getDB()->addObserver(&AnimalStatusObserver, textId); _BeastStatusDB[i] = NLGUI::CDBManager::getInstance()->getDbProp(text, false); nlassert(_BeastStatusDB[i]); - + text = toString("SERVER:PACK_ANIMAL:BEAST%d:TYPE", i); _BeastTypeDB[i] = NLGUI::CDBManager::getInstance()->getDbProp(text, false); nlassert(_BeastTypeDB[i]); @@ -550,7 +550,7 @@ CShapeInstanceReference CEntityManager::createInstance(const string& shape, cons primitive = PACS->addCollisionablePrimitive(dynamicWI, 1); primitive->setDontSnapToGround(false); } - + // Put instance in last deleted position if found if (_LastRemovedInstance != -1) { @@ -562,7 +562,7 @@ CShapeInstanceReference CEntityManager::createInstance(const string& shape, cons _ShapeInstances[idx].BboxActive = !text.empty() || !url.empty(); _ShapeInstances[idx].Deleted = false; _ShapeInstances[idx].InIGZone = inIgZone > 0; - + _LastRemovedInstance = _ShapeInstances[idx].LastDeleted; _ShapeInstances[idx].LastDeleted = -1; TIGZoneShapes::iterator it = _IgZoneShapes.find(inIgZone); @@ -613,7 +613,7 @@ bool CEntityManager::deleteInstance(uint32 idx) UMovePrimitive *primitive = _ShapeInstances[idx].Primitive; if (primitive) PACS->removePrimitive(primitive); - + if (!_ShapeInstances[idx].Deleted) { _ShapeInstances[idx].Primitive = NULL; @@ -649,7 +649,7 @@ CVector CEntityManager::getInstancePos(uint32 idx) UInstance instance = _ShapeInstances[idx].Instance; if(instance.empty()) return CVector(0,0,0); - + return instance.getPos(); } @@ -657,17 +657,17 @@ bool CEntityManager::setInstancePos(uint32 idx, CVector pos) { if (!Scene || idx >= _ShapeInstances.size() || _ShapeInstances[idx].Deleted) return false; - + UInstance instance = _ShapeInstances[idx].Instance; if(instance.empty()) return false; - + UMovePrimitive *primitive = _ShapeInstances[idx].Primitive; if (primitive) { primitive->setGlobalPosition(_ShapeInstances[idx].PrimRelativePos + pos, dynamicWI); } - + instance.setPos(pos); return true; } @@ -676,11 +676,11 @@ CVector CEntityManager::getInstanceRot(uint32 idx) { if (!Scene || idx >= _ShapeInstances.size() || _ShapeInstances[idx].Deleted) return CVector(0,0,0); - + UInstance instance = _ShapeInstances[idx].Instance; if(instance.empty()) return CVector(0,0,0); - + return instance.getRotEuler(); } @@ -688,13 +688,13 @@ bool CEntityManager::setInstanceRot(uint32 idx, CVector rot) { if (!Scene || idx >= _ShapeInstances.size() || _ShapeInstances[idx].Deleted) return false; - + UInstance instance = _ShapeInstances[idx].Instance; if(instance.empty()) return false; - + instance.setRotEuler(rot); - + return true; } @@ -706,7 +706,7 @@ CVector CEntityManager::getInstanceScale(uint32 idx) UInstance instance = _ShapeInstances[idx].Instance; if(instance.empty()) return CVector(0,0,0); - + return instance.getScale(); } @@ -714,7 +714,7 @@ CVector CEntityManager::getInstanceColPos(uint32 idx) { if (!Scene || idx >= _ShapeInstances.size() || _ShapeInstances[idx].Deleted) return CVector(0,0,0); - + return _ShapeInstances[idx].PrimRelativePos; } @@ -726,11 +726,11 @@ CVector CEntityManager::getInstanceColScale(uint32 idx) UMovePrimitive *primitive = _ShapeInstances[idx].Primitive; if (!primitive) return CVector(0,0,0); - + float width, depth; primitive->getSize(width, depth); float height = primitive->getHeight(); - + return CVector(width, depth, height); } @@ -738,11 +738,11 @@ double CEntityManager::getInstanceColOrient(uint32 idx) { if (!Scene || idx >= _ShapeInstances.size() || _ShapeInstances[idx].Deleted) return 0.f; - + UMovePrimitive *primitive = _ShapeInstances[idx].Primitive; if (!primitive) return 0.f; - + return primitive->getOrientation(dynamicWI); } @@ -754,21 +754,21 @@ CVector CEntityManager::getInstanceBBoxMin(uint32 idx) UInstance instance = _ShapeInstances[idx].Instance; if (instance.empty()) return CVector(0,0,0); - + NLMISC::CAABBox bbox; _ShapeInstances[idx].Instance.getShapeAABBox(bbox); - + CVector bbox_min; - + if (bbox.getCenter() == CVector::Null) bbox_min = CVector(-0.5f, -0.5f, -0.5f); else bbox_min = bbox.getMin(); - + bbox_min.x *= _ShapeInstances[idx].Instance.getScale().x; bbox_min.y *= _ShapeInstances[idx].Instance.getScale().y; bbox_min.z *= _ShapeInstances[idx].Instance.getScale().z; - + return bbox_min+_ShapeInstances[idx].Instance.getPos(); } @@ -780,28 +780,28 @@ CVector CEntityManager::getInstanceBBoxMax(uint32 idx) UInstance instance = _ShapeInstances[idx].Instance; if(instance.empty()) return CVector(0,0,0); - + NLMISC::CAABBox bbox; _ShapeInstances[idx].Instance.getShapeAABBox(bbox); - + CVector bbox_max; - + if (bbox.getCenter() == CVector::Null) bbox_max = CVector(-0.5f, -0.5f, -0.5f); else bbox_max = bbox.getMax(); - + bbox_max.x *= _ShapeInstances[idx].Instance.getScale().x; bbox_max.y *= _ShapeInstances[idx].Instance.getScale().y; bbox_max.z *= _ShapeInstances[idx].Instance.getScale().z; - + return bbox_max+_ShapeInstances[idx].Instance.getPos(); } bool CEntityManager::removeInstances() { if (!Scene) return false; - + for(uint i=0; i<_ShapeInstances.size(); ++i) { if (!_ShapeInstances[i].InIGZone) @@ -814,13 +814,13 @@ bool CEntityManager::setupInstance(uint32 idx, const vector &keys, const { if (!Scene || idx >= _ShapeInstances.size() || _ShapeInstances[idx].Deleted) return false; - + UInstance instance = _ShapeInstances[idx].Instance; if(instance.empty()) return false; - + UMovePrimitive *primitive = _ShapeInstances[idx].Primitive; - + for (uint32 i=0; i < keys.size(); i++) { string param = keys[i]; @@ -891,7 +891,7 @@ bool CEntityManager::setupInstance(uint32 idx, const vector &keys, const { float v; CVector pos = getInstancePos(idx); - + if (getRelativeFloatFromString(values[i], v)) { updateVector(param, pos, v, true); @@ -904,10 +904,10 @@ bool CEntityManager::setupInstance(uint32 idx, const vector &keys, const } else if (param == "rot x" || param == "rot y" || param == "rot z") { - + float v; CVector rot = getInstanceRot(idx); - + if (getRelativeFloatFromString(values[i], v)) { updateVector(param, rot, v, true); @@ -922,7 +922,7 @@ bool CEntityManager::setupInstance(uint32 idx, const vector &keys, const { float v; CVector scale = instance.getScale(); - + if (getRelativeFloatFromString(values[i], v)) { updateVector(param, scale, v, true); @@ -933,17 +933,17 @@ bool CEntityManager::setupInstance(uint32 idx, const vector &keys, const } instance.setScale(scale); } - + // Primitive colissions setups - + if (!primitive) continue; - + if (param == "col size x" || param == "col size y" || param == "col size z") { float width, depth; primitive->getSize(width, depth); float height = primitive->getHeight(); - + CVector size = CVector(width, depth, height); float v; if (getRelativeFloatFromString(values[i], v)) @@ -961,7 +961,7 @@ bool CEntityManager::setupInstance(uint32 idx, const vector &keys, const { CVector pos = instance.getPos(); float v; - + if (getRelativeFloatFromString(values[i], v)) { updateVector(param, _ShapeInstances[idx].PrimRelativePos, v, false); @@ -981,10 +981,10 @@ bool CEntityManager::setupInstance(uint32 idx, const vector &keys, const { double orient = primitive->getOrientation(dynamicWI); double v = 0.f; - + if (values[i].empty()) continue; - + if (values[i][0] == '+') { fromString(values[i].substr(1), v); @@ -995,7 +995,7 @@ bool CEntityManager::setupInstance(uint32 idx, const vector &keys, const fromString(values[i], v); orient = v; } - + primitive->setOrientation(orient, dynamicWI); } else if (param == "col mask player") @@ -1024,9 +1024,23 @@ bool CEntityManager::setupInstance(uint32 idx, const vector &keys, const fromString(values[i], active); primitive->setObstacle(active); } - else if (param == "col obstacle") + else if (param == "col stairs") { - + bool active; + fromString(values[i], active); + primitive->setObstacle(active); + if (active) + { + primitive->setReactionType(UMovePrimitive::DoNothing); + primitive->setTriggerType(UMovePrimitive::OverlapStairsTrigger); + primitive->setGlobalPosition(instance.getPos()+CVector(0, 0, 0.5f), dynamicWI); + } + else + { + primitive->setReactionType(UMovePrimitive::Slide); + primitive->setTriggerType(UMovePrimitive::NotATrigger); + primitive->setGlobalPosition(instance.getPos(), dynamicWI); + } } } @@ -1039,7 +1053,7 @@ CShapeInstanceReference CEntityManager::getShapeInstanceUnderPos(float x, float CShapeInstanceReference selectedInstance(UInstance(), string(""), string("")); _LastInstanceUnderPos= NULL; idx = -1; - + // If not initialised, return if (_ShapeInstances.empty()) return selectedInstance; diff --git a/ryzom/client/src/entity_cl.cpp b/ryzom/client/src/entity_cl.cpp index 9b7ca340e4..c523449a19 100644 --- a/ryzom/client/src/entity_cl.cpp +++ b/ryzom/client/src/entity_cl.cpp @@ -1478,6 +1478,7 @@ void CEntityCL::pacsMove(const CVectorD &vect) if ((fabs (deltaPos.x) > 0.05) || (fabs (deltaPos.y) > 0.05)) { _HasMoved = true; + _Primitive->enableZOffset(false); _Primitive->move (deltaPos, dynamicWI); } } @@ -1657,7 +1658,7 @@ void CEntityCL::snapToGround() { if ( isUser() || isPlayer() || isNPC()) { - + float waterOffset = ClientCfg.WaterOffset; switch(people()) { @@ -1713,6 +1714,12 @@ void CEntityCL::snapToGround() pos().z = vect.z; } + if (_Primitive->haveZOffset()) { + //CVectorD prim_pos = _Primitive->getFinalPosition(dynamicWI); + pos().z = _Primitive->getZOffset(); + } + + // Set the box position. posBox(pos()); }// snapToGround // @@ -2294,7 +2301,7 @@ void CEntityCL::onStringAvailable(uint /* stringId */, const std::string &value) { womanTitle = ( c->getGender() == GSGENDER::female ); } - + string replacement = STRING_MANAGER::CStringManagerClient::getTitleLocalizedName(_TitleRaw, womanTitle); // Sometimes translation contains another title @@ -2792,7 +2799,7 @@ void CEntityCL::setOpacityMin(uint32 value) bool CEntityCL::mustShowInsceneInterface( bool enabledInSheet ) const { return ( - (enabledInSheet /*&& !CNPCIconCache::getInstance().getNPCIcon(this).getTextureMain().empty()*/) && + (enabledInSheet /*&& !CNPCIconCache::getInstance().getNPCIcon(this).getTextureMain().empty()*/) && (_InSceneInterfaceEnabled) && ( ClientCfg.Names || isUser () || @@ -3137,7 +3144,7 @@ void CEntityCL::updateVisiblePostPos(const NLMISC::TTime &/* currentTimeInMs */, if (skeleton()) _StateFX.setClusterSystem(skeleton()->getClusterSystem()); } - + if (!_SelectionFX.empty() || !_MouseOverFX.empty()) { // Build a matrix for the fx diff --git a/ryzom/client/src/main_loop.cpp b/ryzom/client/src/main_loop.cpp index 492d54623b..bb9a29d4d4 100644 --- a/ryzom/client/src/main_loop.cpp +++ b/ryzom/client/src/main_loop.cpp @@ -1421,7 +1421,7 @@ bool mainLoop() MainCam.setTransformMode(UTransformable::RotQuat); CVector cameraMoves = UserEntity->getCameraMoves(); - + currViewPos.z += cameraMoves.z; MainCam.setPos(currViewPos); MainCam.setRotQuat(View.currentViewQuat()); @@ -1435,7 +1435,7 @@ bool mainLoop() } UserEntity->setCameraMoves(CVector(0, 0, 0)); - + if (StereoHMD) { CMatrix camMatrix; @@ -2982,15 +2982,41 @@ CVector PacsBox[PacsBoxPointCount] = CVector( 0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 0), CVector( -0.5f, -0.5f, 0), + CVector( -0.5f, -0.5f, 0), CVector( -0.5f, -0.5f, 1), + CVector( 0.5f, -0.5f, 0), CVector( 0.5f, -0.5f, 1), + CVector( 0.5f, 0.5f, 0), CVector( 0.5f, 0.5f, 1), + CVector( -0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 1), + CVector( -0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 1), CVector( 0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 1), CVector( -0.5f, -0.5f, 1), +}; + +const uint PacsStairPointCount = 32; + +CVector PacsStair[PacsStairPointCount] = +{ + CVector( -0.5f, -0.5f, 0), CVector( 0.5f, -0.5f, 0), + CVector( 0.5f, -0.5f, 0), CVector( 0.5f, 0.5f, 0), + CVector( 0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 0), + CVector( -0.5f, 0.5f, 0), CVector( -0.5f, -0.5f, 0), CVector( -0.5f, -0.5f, 0), CVector( -0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 0), CVector( 0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 0), CVector( 0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 1), + + CVector( -0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 1), + CVector( 0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 1), + CVector( 0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 1), + CVector( -0.5f, 0.5f, 1), CVector( -0.5f, -0.5f, 1), + + CVector( -0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 1), + CVector( -0.5f, 0.5f, 1), CVector( 0.5f, -0.5f, 1), + CVector( -0.5f, 0, 1), CVector( 0.5f, 0, 1), + CVector( 0, - 0.5f, 1), CVector( 0, 0.5f, 1), + }; const uint PacsCylPointCount = 48; @@ -3044,6 +3070,7 @@ void displayPACSPrimitive() // Distance CVector position = prim->getFinalPosition(wI); + bool isStairs = false; if ((position-UserEntity->pos()).sqrnorm() < (200*200)) { // Choose a color @@ -3051,8 +3078,14 @@ void displayPACSPrimitive() if (prim->isCollisionable()) { // Static collision - if (prim->getReactionType() == UMovePrimitive::DoNothing) + if (prim->getTriggerType() == UMovePrimitive::OverlapStairsTrigger) { + line.Color0 = CRGBA::Blue; + isStairs = true; + position.z -= 1.0f; + } + else if (prim->getReactionType() == UMovePrimitive::DoNothing) + { line.Color0 = CRGBA::Red; } else @@ -3082,8 +3115,16 @@ void displayPACSPrimitive() // Draw the primitive if (prim->getPrimitiveType() == UMovePrimitive::_2DOrientedBox) { - lines = PacsBox; - linecount = PacsBoxPointCount/2; + if (isStairs) + { + lines = PacsStair; + linecount = PacsStairPointCount/2; + } + else + { + lines = PacsBox; + linecount = PacsBoxPointCount/2; + } float width; float depth; prim->getSize (width, depth); From f0b74071ad981c1d00a6ea9f1d2d412005454244 Mon Sep 17 00:00:00 2001 From: Nuno Date: Thu, 25 Nov 2021 18:25:41 +0100 Subject: [PATCH 002/194] Npcs and mobs climb in stairs too --- nel/src/pacs/move_container.cpp | 2 +- ryzom/client/src/character_cl.cpp | 16 ++++++++-------- ryzom/client/src/entities.cpp | 8 ++++++-- ryzom/client/src/main_loop.cpp | 4 ++-- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/nel/src/pacs/move_container.cpp b/nel/src/pacs/move_container.cpp index 424f7d8b91..4d093ae6a3 100644 --- a/nel/src/pacs/move_container.cpp +++ b/nel/src/pacs/move_container.cpp @@ -1676,7 +1676,7 @@ void CMoveContainer::reaction (const CCollisionOTInfo& first) CVectorD first_pos = dynInfo->getFirstPrimitive()->getFinalPosition(dynInfo->getFirstWorldImage()); CVectorD second_pos = dynInfo->getSecondPrimitive()->getFinalPosition(dynInfo->getSecondWorldImage()); nlinfo("P = %f, C = %f, H = %f, D = %f", first_pos.z, second_pos.z, dynInfo->getSecondPrimitive()->getHeight(), second_pos.z-first_pos.z); - dynInfo->getFirstPrimitive()->setZOffset(second_pos.z+dynInfo->getSecondPrimitive()->getHeight()-1.0f); + dynInfo->getFirstPrimitive()->setZOffset(second_pos.z+dynInfo->getSecondPrimitive()->getHeight()-10.0f); } } if (dynInfo->isExit()) diff --git a/ryzom/client/src/character_cl.cpp b/ryzom/client/src/character_cl.cpp index 68f8acfcb0..47b1ad4a2e 100644 --- a/ryzom/client/src/character_cl.cpp +++ b/ryzom/client/src/character_cl.cpp @@ -426,7 +426,7 @@ void CCharacterCL::computePrimitive() // Initialize the primitive. if (_Sheet) { - initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, UMovePrimitive::NotATrigger, MaskColNpc, MaskColNone, _Sheet->ClipRadius, _Sheet->ClipHeight); + initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, (UMovePrimitive::TTrigger)(UMovePrimitive::OverlapTrigger | UMovePrimitive::EnterTrigger), MaskColNpc, MaskColDoor, _Sheet->ClipRadius, _Sheet->ClipHeight); } else { @@ -976,7 +976,7 @@ bool CCharacterCL::build(const CEntitySheet *sheet) // virtual _CustomScalePos *= getScale(); // Create PACS Primitive. - initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, UMovePrimitive::NotATrigger, MaskColNpc, MaskColNone, _Sheet->ClipRadius, _Sheet->ClipHeight); + initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, (UMovePrimitive::TTrigger)(UMovePrimitive::OverlapTrigger | UMovePrimitive::EnterTrigger), MaskColNpc, MaskColDoor, _Sheet->ClipRadius, _Sheet->ClipHeight); // Compute the element to be able to snap the entity to the ground. computeCollisionEntity(); @@ -6678,7 +6678,7 @@ ADD_METHOD(void CCharacterCL::updatePos(const TTime ¤tTimeInMs, CEntityCL updatePosCombatFloat(frameTimeRemaining, target); } // Compute the average speed to the destination. - // double spd = + // double spd = computeSpeed(); @@ -8232,14 +8232,14 @@ float CCharacterCL::getSheetScale() const // virtual // getColRadius : // Return the entity collision radius. (return 0.5 if there is any problem). //--------------------------------------------------- -float CCharacterCL::getSheetColRadius() const +float CCharacterCL::getSheetColRadius() const { - if(!_Sheet) + if(!_Sheet) return 0.5f; else return _Sheet->ColRadius; } - + //--------------------------------------------------- // getScale : @@ -8358,7 +8358,7 @@ std::string CCharacterCL::shapeFromItem(const CItemSheet &itemSheet) const sheet = itemSheet.getShape(); return sheet; - + }// shapeFromItem // @@ -9146,7 +9146,7 @@ void CCharacterCL::setAuraFX(uint index, const CAnimationFX *sheet) bi.DelayBeforeStart = 11.5f; _AttachedFXListToStart.push_front(bi); } - else + else { CAttachedFX::TSmartPtr fx = new CAttachedFX; fx->create(*this, bi, CAttachedFX::CTargeterInfo()); diff --git a/ryzom/client/src/entities.cpp b/ryzom/client/src/entities.cpp index a17a49e4fb..3a13e0f300 100644 --- a/ryzom/client/src/entities.cpp +++ b/ryzom/client/src/entities.cpp @@ -945,6 +945,8 @@ bool CEntityManager::setupInstance(uint32 idx, const vector &keys, const float height = primitive->getHeight(); CVector size = CVector(width, depth, height); + if (primitive->getTriggerType() == UMovePrimitive::OverlapStairsTrigger) + size.z -= 10.0f; float v; if (getRelativeFloatFromString(values[i], v)) { @@ -954,6 +956,8 @@ bool CEntityManager::setupInstance(uint32 idx, const vector &keys, const { updateVector(param, size, v, false); } + if (primitive->getTriggerType() == UMovePrimitive::OverlapStairsTrigger) + size.z += 10.0f; primitive->setSize(size.x, size.y); primitive->setHeight(size.z); } @@ -1028,12 +1032,12 @@ bool CEntityManager::setupInstance(uint32 idx, const vector &keys, const { bool active; fromString(values[i], active); - primitive->setObstacle(active); + primitive->setObstacle(!active); if (active) { primitive->setReactionType(UMovePrimitive::DoNothing); primitive->setTriggerType(UMovePrimitive::OverlapStairsTrigger); - primitive->setGlobalPosition(instance.getPos()+CVector(0, 0, 0.5f), dynamicWI); + primitive->setGlobalPosition(instance.getPos(), dynamicWI); } else { diff --git a/ryzom/client/src/main_loop.cpp b/ryzom/client/src/main_loop.cpp index bb9a29d4d4..7ce8b79fed 100644 --- a/ryzom/client/src/main_loop.cpp +++ b/ryzom/client/src/main_loop.cpp @@ -3080,9 +3080,9 @@ void displayPACSPrimitive() // Static collision if (prim->getTriggerType() == UMovePrimitive::OverlapStairsTrigger) { - line.Color0 = CRGBA::Blue; + line.Color0 = CRGBA::Green; isStairs = true; - position.z -= 1.0f; + position.z -= 10.0f; } else if (prim->getReactionType() == UMovePrimitive::DoNothing) { From 85c80ab0f2bb7ed7fcc20dba668bdcb1c3fb4786 Mon Sep 17 00:00:00 2001 From: Nuno Date: Fri, 26 Nov 2021 19:13:53 +0100 Subject: [PATCH 003/194] Smooth the z displacement of entities --- nel/include/nel/pacs/move_primitive.h | 10 +++-- nel/include/nel/pacs/u_move_primitive.h | 4 +- nel/src/pacs/move_container.cpp | 3 +- ryzom/client/src/entity_cl.cpp | 50 +++++++++++++++++++++++-- ryzom/client/src/entity_cl.h | 8 +++- 5 files changed, 62 insertions(+), 13 deletions(-) diff --git a/nel/include/nel/pacs/move_primitive.h b/nel/include/nel/pacs/move_primitive.h index d77517a7d4..928ed10fcc 100644 --- a/nel/include/nel/pacs/move_primitive.h +++ b/nel/include/nel/pacs/move_primitive.h @@ -251,16 +251,17 @@ class CMovePrimitive: public UMovePrimitive _Height=height; } - void setZOffset(float offset) + void setZFinalPosition(float pos) { - _ZOffset = offset; + _ZFinalPosition = pos; } - float getZOffset() + float getZFinalPosition() { - return _ZOffset; + return _ZFinalPosition; } + bool haveZOffset() { return _HaveZOffset; @@ -489,6 +490,7 @@ class CMovePrimitive: public UMovePrimitive sint32 _IterationCount; float _ZOffset; + float _ZFinalPosition; bool _HaveZOffset; }; diff --git a/nel/include/nel/pacs/u_move_primitive.h b/nel/include/nel/pacs/u_move_primitive.h index e067c3e6b6..cba266174e 100644 --- a/nel/include/nel/pacs/u_move_primitive.h +++ b/nel/include/nel/pacs/u_move_primitive.h @@ -280,9 +280,9 @@ class UMovePrimitive */ virtual float getHeight () const =0; - virtual void setZOffset(float offset) =0; + virtual void setZFinalPosition(float pos) =0; - virtual float getZOffset() =0; + virtual float getZFinalPosition() =0; virtual bool haveZOffset() =0; diff --git a/nel/src/pacs/move_container.cpp b/nel/src/pacs/move_container.cpp index 4d093ae6a3..c313fefb91 100644 --- a/nel/src/pacs/move_container.cpp +++ b/nel/src/pacs/move_container.cpp @@ -1675,8 +1675,7 @@ void CMoveContainer::reaction (const CCollisionOTInfo& first) dynInfo->getFirstPrimitive()->enableZOffset(true); CVectorD first_pos = dynInfo->getFirstPrimitive()->getFinalPosition(dynInfo->getFirstWorldImage()); CVectorD second_pos = dynInfo->getSecondPrimitive()->getFinalPosition(dynInfo->getSecondWorldImage()); - nlinfo("P = %f, C = %f, H = %f, D = %f", first_pos.z, second_pos.z, dynInfo->getSecondPrimitive()->getHeight(), second_pos.z-first_pos.z); - dynInfo->getFirstPrimitive()->setZOffset(second_pos.z+dynInfo->getSecondPrimitive()->getHeight()-10.0f); + dynInfo->getFirstPrimitive()->setZFinalPosition(second_pos.z+dynInfo->getSecondPrimitive()->getHeight()-10.0f); } } if (dynInfo->isExit()) diff --git a/ryzom/client/src/entity_cl.cpp b/ryzom/client/src/entity_cl.cpp index c523449a19..616363f0be 100644 --- a/ryzom/client/src/entity_cl.cpp +++ b/ryzom/client/src/entity_cl.cpp @@ -740,6 +740,8 @@ void CEntityCL::init() _EntityName = "Name"; } _NameId = 0; + _LastSnapToGroup = 0; + _CurrentZOffset = 0; _PermanentStatutIcon.clear(); @@ -1481,6 +1483,17 @@ void CEntityCL::pacsMove(const CVectorD &vect) _Primitive->enableZOffset(false); _Primitive->move (deltaPos, dynamicWI); } + else + { + // This code force the player to move even when not moving, it's used to trigger special collissions + if (isUser()) + { + _HasMoved = true; + deltaPos.x = 0.0001; + _Primitive->move (deltaPos, dynamicWI); + } + + } } else { @@ -1714,11 +1727,42 @@ void CEntityCL::snapToGround() pos().z = vect.z; } - if (_Primitive->haveZOffset()) { - //CVectorD prim_pos = _Primitive->getFinalPosition(dynamicWI); - pos().z = _Primitive->getZOffset(); + if (_Primitive->haveZOffset()) + { + + if (_LastSnapToGroup > 0) + { + if (pos().z + _CurrentZOffset < _Primitive->getZFinalPosition()) + { + _CurrentZOffset += (ryzomGetLocalTime() - _LastSnapToGroup)/100.0f; + + if (pos().z + _CurrentZOffset > _Primitive->getZFinalPosition()) + _CurrentZOffset = _Primitive->getZFinalPosition() - pos().z; + } + + if (pos().z + _CurrentZOffset > _Primitive->getZFinalPosition()) + { + _CurrentZOffset -= (ryzomGetLocalTime() - _LastSnapToGroup)/100.0f; + + if (pos().z + _CurrentZOffset < _Primitive->getZFinalPosition()) + _CurrentZOffset = _Primitive->getZFinalPosition() - pos().z; + } + + pos().z += _CurrentZOffset; + } } + else + { + if (_CurrentZOffset > 0) + { + _CurrentZOffset -= (ryzomGetLocalTime() - _LastSnapToGroup)/100.0f; + if (_CurrentZOffset < 0) + _CurrentZOffset = 0; + pos().z += _CurrentZOffset; + } + } + _LastSnapToGroup = ryzomGetLocalTime(); // Set the box position. posBox(pos()); diff --git a/ryzom/client/src/entity_cl.h b/ryzom/client/src/entity_cl.h index f2f99b347d..092a85dd3c 100644 --- a/ryzom/client/src/entity_cl.h +++ b/ryzom/client/src/entity_cl.h @@ -241,7 +241,7 @@ class CEntityCL : public NLMISC::IStreamable, public STRING_MANAGER::IStringWait /// Return the persistent NPC alias of entity (0 if N/A). uint32 npcAlias() const {return _NPCAlias; } - /// Set the persistent NPC alias of the entity. + /// Set the persistent NPC alias of the entity. void npcAlias(uint32 alias) {_NPCAlias = alias; } /// Method to call to initialize all members of the right class. @@ -702,7 +702,7 @@ class CEntityCL : public NLMISC::IStreamable, public STRING_MANAGER::IStringWait // todo handle NPC entities // Return true if this entity is a NPC (not a fauna) bool isNPC () const { return Type == NPC; } - + // Return true if this entity can have missions icons (humanoid NPCs (including Karavan), Kami or Bot Object) bool canHaveMissionIcon() const { return isNPC() || isKami() || isUnknownRace(); } @@ -949,6 +949,10 @@ class CEntityCL : public NLMISC::IStreamable, public STRING_MANAGER::IStringWait uint32 _NameId; // Primitive used for the collision in PACS NLPACS::UMovePrimitive *_Primitive; + + uint64 _LastSnapToGroup; + float _CurrentZOffset; + // 3D Logic info for light request. CEntityLogicInfo3D _LogicInfo3D; // Box around the entity. From 80497e08e692b4f49acc571b7e203353801ad9d5 Mon Sep 17 00:00:00 2001 From: nimetu Date: Mon, 21 Mar 2022 10:46:12 +0200 Subject: [PATCH 004/194] Add toggle_free_look action handler --- .../src/interface_v3/action_handler_game.cpp | 14 ++++++++++++++ ryzom/client/src/motion/user_controls.h | 2 ++ 2 files changed, 16 insertions(+) diff --git a/ryzom/client/src/interface_v3/action_handler_game.cpp b/ryzom/client/src/interface_v3/action_handler_game.cpp index 8c8c56e34e..15851758db 100644 --- a/ryzom/client/src/interface_v3/action_handler_game.cpp +++ b/ryzom/client/src/interface_v3/action_handler_game.cpp @@ -860,6 +860,20 @@ class CHandlerContextFreeLook : public IActionHandler }; REGISTER_ACTION_HANDLER( CHandlerContextFreeLook, "context_free_look"); +// *************************************************************************** +class CHandlerToggleFreeLook : public IActionHandler +{ +public: + void execute(CCtrlBase * /* pCaller */, const std::string & /* sParams */) + { + if (UserControls.getFreeLook()) + UserControls.stopFreeLook(); + else + UserControls.startFreeLook(); + } +}; +REGISTER_ACTION_HANDLER( CHandlerToggleFreeLook, "toggle_free_look"); + // *************************************************************************** // GCM Move // *************************************************************************** diff --git a/ryzom/client/src/motion/user_controls.h b/ryzom/client/src/motion/user_controls.h index 1ceabd8d9c..7f09ef7f29 100644 --- a/ryzom/client/src/motion/user_controls.h +++ b/ryzom/client/src/motion/user_controls.h @@ -179,6 +179,8 @@ class CUserControls /// Stop Free Look (can be called multiple times if needed). Additionaly, the mouse/pointer is restored void stopFreeLook(); + bool getFreeLook() const { return _FreeLook; } + /// Is the camera inside the character. bool isInternalView() {return _InternalView;} From 4aeb93270cf37a2304c1b166149a33af9c8689a9 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Mon, 21 Mar 2022 10:52:01 +0200 Subject: [PATCH 005/194] Add toggle_free_look ah keybinding and macro options --- ryzom/client/data/gamedev/interfaces_v3/actions.xml | 1 + ryzom/client/data/gamedev/interfaces_v3/keys.xml | 1 + ryzom/client/data/gamedev/interfaces_v3/keys_r2ed.xml | 1 + 3 files changed, 3 insertions(+) diff --git a/ryzom/client/data/gamedev/interfaces_v3/actions.xml b/ryzom/client/data/gamedev/interfaces_v3/actions.xml index 0a00cb0f64..194434a839 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/actions.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/actions.xml @@ -417,6 +417,7 @@ + diff --git a/ryzom/client/data/gamedev/interfaces_v3/keys.xml b/ryzom/client/data/gamedev/interfaces_v3/keys.xml index 677854a9ef..60d219ddb2 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/keys.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/keys.xml @@ -36,6 +36,7 @@ + diff --git a/ryzom/client/data/gamedev/interfaces_v3/keys_r2ed.xml b/ryzom/client/data/gamedev/interfaces_v3/keys_r2ed.xml index 65c7603cd2..b7ecb65519 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/keys_r2ed.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/keys_r2ed.xml @@ -37,6 +37,7 @@ + From d84e477c351d529d3572030a50b7fcdf53e29d19 Mon Sep 17 00:00:00 2001 From: nimetu Date: Mon, 19 Dec 2022 14:49:39 +0200 Subject: [PATCH 006/194] Unassign key-combo from macro --- .../src/interface_v3/macrocmd_manager.cpp | 38 +++++++++++++++++++ .../src/interface_v3/macrocmd_manager.h | 2 + 2 files changed, 40 insertions(+) diff --git a/ryzom/client/src/interface_v3/macrocmd_manager.cpp b/ryzom/client/src/interface_v3/macrocmd_manager.cpp index f942ae7e1d..f19bd71d52 100644 --- a/ryzom/client/src/interface_v3/macrocmd_manager.cpp +++ b/ryzom/client/src/interface_v3/macrocmd_manager.cpp @@ -162,6 +162,12 @@ void CMacroCmd::moveDownCommand (uint cmdNb) Commands[cmdNb+1] = c; } +// ------------------------------------------------------------------------------------------------ +void CMacroCmd::unassignCombo() +{ + Combo.Key = KeyCount; + Combo.KeyButtons = noKeyButton; +} // ------------------------------------------------------------------------------------------------ // CMacroCmdManager @@ -304,6 +310,19 @@ void CMacroCmdManager::delMacro(sint32 nMacNb) addActionManagerEntries(); } +void CMacroCmdManager::unassignMacro(size_t nMacNb) +{ + if (nMacNb >= _Macros.size()) + { + nlwarning("unassign called on out-of-bounds index %lu, (size %lu)", nMacNb, _Macros.size()); + return; + } + + delActionManagerEntries(); + _Macros[nMacNb].unassignCombo(); + addActionManagerEntries(); +} + // ------------------------------------------------------------------------------------------------ // Refresh key association that can be changed in another place than in macro container void CMacroCmdManager::refreshMacroCombo() @@ -1128,6 +1147,25 @@ class CHandlerMacrosCopy : public IActionHandler }; REGISTER_ACTION_HANDLER( CHandlerMacrosCopy, "macros_copy"); + +// *************************************************************************** +// Called from context menu on a macro +class CHandlerMacrosUnassign : public IActionHandler +{ +public: + virtual void execute(CCtrlBase *pCaller, const string &/* Params */) + { + sint nMacNb = getMacroFromId(pCaller->getId()); + if (nMacNb < 0) return; + + CMacroCmdManager::getInstance()->unassignMacro(nMacNb); + // update keybinding in macros list without calling runActionHandler("macros_open", NULL) + CViewText *pVT = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(pCaller->getId() + ":" + TEMPLATE_MACRO_ELT_KEYTEXT)); + if (pVT) pVT->setText(CI18N::get(VIEW_EDITCMD_TEXT_KEY_DEFAULT)); + } +}; +REGISTER_ACTION_HANDLER( CHandlerMacrosUnassign, "macros_unassign"); + // *************************************************************************** // Called from context menu on a macro class CHandlerMacrosDel : public IActionHandler diff --git a/ryzom/client/src/interface_v3/macrocmd_manager.h b/ryzom/client/src/interface_v3/macrocmd_manager.h index 0bc2eec03c..dfe59b67b7 100644 --- a/ryzom/client/src/interface_v3/macrocmd_manager.h +++ b/ryzom/client/src/interface_v3/macrocmd_manager.h @@ -78,6 +78,7 @@ class CMacroCmd void delCommand (uint cmdNb); void moveUpCommand (uint cmdNb); void moveDownCommand (uint cmdNb); + void unassignCombo(); void writeTo (xmlNodePtr node) const; bool readFrom (xmlNodePtr node); @@ -104,6 +105,7 @@ class CMacroCmdManager const std::vector &getMacros() { return _Macros; } void addMacro (const CMacroCmd &m, sint32 nPos=-1); void delMacro(sint32 nMacNb); + void unassignMacro(size_t nMacNb); void removeAllMacros(); void refreshMacroCombo(); From ebd9b0f5d525427f1f6145522795c800458b011c Mon Sep 17 00:00:00 2001 From: nimetu Date: Mon, 19 Dec 2022 14:59:14 +0200 Subject: [PATCH 007/194] Right-click menu command for macros_unassign --- ryzom/client/data/gamedev/interfaces_v3/macros.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/ryzom/client/data/gamedev/interfaces_v3/macros.xml b/ryzom/client/data/gamedev/interfaces_v3/macros.xml index d14e6e8886..297a94980d 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/macros.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/macros.xml @@ -238,6 +238,7 @@ + From b0a61fa9bbd0bce9e2bdd71a0f2b3a2661f921bd Mon Sep 17 00:00:00 2001 From: Nuno Date: Mon, 13 Mar 2023 15:18:21 +0100 Subject: [PATCH 008/194] Switch to a real fame, added cap to minimal fame based on equipment --- .../entity_manager/entity_callbacks.cpp | 1 + .../game_item_manager/player_inv_equip.cpp | 15 +- .../guild_manager/fame_manager.cpp | 131 +++++++++++------- .../player_manager/character.cpp | 59 ++------ .../player_manager/character.h | 9 ++ .../player_manager/character_inlines.h | 28 ++++ .../character_inventory_manipulation.cpp | 8 +- 7 files changed, 151 insertions(+), 100 deletions(-) diff --git a/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp b/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp index cd8fdcefcd..e2bc9a3fef 100644 --- a/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp +++ b/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp @@ -453,6 +453,7 @@ void cbClientReady( CMessage& msgin, const std::string &serviceName, NLNET::TSer c->initPvpPointDb(); c->initOrganizationInfos(); + c->resetFameDatabase(); c->updateOutpostAdminFlagInDB(); if ( !player->getUserPriv().empty() && !player->havePriv(":DEV:") ) diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_equip.cpp b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_equip.cpp index 15a1b49fe4..eb2a02cff7 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_equip.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_equip.cpp @@ -20,6 +20,7 @@ #include "game_share/slot_equipment.h" #include "player_manager/character.h" +#include "guild_manager/fame_manager.h" #include "egs_sheets/egs_sheets.h" using namespace NLMISC; @@ -123,8 +124,18 @@ void CEquipInvView::onItemChanged(uint32 slot, INVENTORIES::TItemChangeFlags cha } // Update jewels enchants - getCharacter()->updateJewelsTags(false); - getCharacter()->updateJewelsModifiers(); + if (getInventory()->getInventoryId() == INVENTORIES::equipment) + { + getCharacter()->updateJewelsTags(false); + getCharacter()->updateJewelsModifiers(); + } + + // Update fame + if (getInventory()->getInventoryId() == INVENTORIES::handling) + { + CFameManager::getInstance().enforceFameCaps(getCharacter()->getId(), getCharacter()->getOrganization(), getCharacter()->getAllegiance()); + } + } // **************************************************************************** diff --git a/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp b/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp index fd7bf33486..0f319a4b17 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp @@ -27,6 +27,7 @@ #include "player_manager/player.h" #include "guild_manager/guild.h" #include "guild_manager/guild_manager.h" +#include "egs_sheets/egs_sheets.h" using namespace std; using namespace NLMISC; @@ -870,11 +871,11 @@ void CFameManager::addFameIndexed(const CEntityId &entityId, uint32 faction, sin realDeltaFame = ((FAME_GAIN_FACTOR - fame) / FameAbsoluteMax) * deltaFame; } - if (realDeltaFame > 3*6000) - realDeltaFame = 3*6000; + if (realDeltaFame > 3*kFameMultipler) + realDeltaFame = 3*kFameMultipler; - if (realDeltaFame < -3*6000) - realDeltaFame = -3*6000; + if (realDeltaFame < -3*kFameMultipler) + realDeltaFame = -3*kFameMultipler; if (!isMarauder && realDeltaFame < 0) realDeltaFame /= 10; @@ -905,6 +906,7 @@ void CFameManager::addFameIndexed(const CEntityId &entityId, uint32 faction, sin clamp(fame,FameAbsoluteMin,maxFame); // Check to make sure player still qualifies to be in declared allegiances. c->verifyClanAllegiance(PVP_CLAN::getClanFromIndex(faction), sint32(fame)); + c->addSavedFame((uint32)PVP_CLAN::getClanFromIndex(faction), realDeltaFame); c->setFameValuePlayer(faction, sint32(fame), maxFame, fow.LastFameChangeTrends[faction]); if (deltaFame > 0) CCharacter::sendDynamicSystemMessage( c->getEntityRowId(), "FAME_GAIN_CHAR", fameMsgParams ); @@ -1287,14 +1289,21 @@ sint32 CFameManager::getMaxFameByClan(std::pairsetFameValuePlayer(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); - } - if (gu) - { - gu->setFameValueGuild(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); - } - } + const CStaticItem *leftForm = NULL; + const CStaticItem *rightForm = NULL; - for (int looper = PVP_CLAN::BeginCivs; looper <= PVP_CLAN::EndCivs; looper++) + CGameItemPtr leftItem = ch->getLeftHandItem(); + if (leftItem != NULL) + leftForm = CSheets::getForm(leftItem->getSheetId()); + + CGameItemPtr rightItem = ch->getRightHandItem(); + if (rightItem != NULL) + rightForm = CSheets::getForm(rightItem->getSheetId()); + + haveWeapons = (leftForm && (leftForm->Family == ITEMFAMILY::MELEE_WEAPON || leftForm->Family == ITEMFAMILY::RANGE_WEAPON)) + || + (rightForm && (rightForm->Family == ITEMFAMILY::MELEE_WEAPON || rightForm->Family == ITEMFAMILY::RANGE_WEAPON)); + + if (ch->getSavedFames() && haveWeapons) { - theFactionIndex = PVP_CLAN::getFactionIndex((PVP_CLAN::TPVPClan)looper); - fame = fow.Fames[theFactionIndex]; - maxFame = -30*kFameMultipler; - if( fame != NO_FAME) - { - clamp(fame,FameAbsoluteMin,maxFame); - fow.Fames[theFactionIndex] = fame; - } - if (ch) - { - ch->setFameValuePlayer(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); - } - if (gu) + ch->setSavedFames(false); + for (uint i = PVP_CLAN::BeginClans; i < PVP_CLAN::EndClans; i++) { - gu->setFameValueGuild(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); + theFactionIndex = PVP_CLAN::getFactionIndex((PVP_CLAN::TPVPClan)i); + fow.Fames[theFactionIndex] = ch->restoreFame(i); } } - return; + if (!ch->getSavedFames() && !haveWeapons) + ch->setSavedFames(true); + } // Check cults, first member of allegiance @@ -1564,16 +1558,25 @@ void CFameManager::enforceFameCaps(const NLMISC::CEntityId &entityId, uint32 org clamp(fame,FameAbsoluteMin,maxFame); fow.Fames[theFactionIndex] = fame; } + if (ch) { + // Cap to -40 + if (!haveWeapons) + { + ch->saveFame(looper, fame); + clamp(maxFame, -40*kFameMultipler, maxFame); + clamp(fame, -40*kFameMultipler, fame); + fow.Fames[theFactionIndex] = fame; + } + ch->setFameValuePlayer(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); } if (gu) - { gu->setFameValueGuild(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); - } } } + // Check civs, second member of allegiance if (theCiv != PVP_CLAN::None) { @@ -1589,6 +1592,14 @@ void CFameManager::enforceFameCaps(const NLMISC::CEntityId &entityId, uint32 org } if (ch) { + // Cap to -40 + if (!haveWeapons) + { + ch->saveFame(looper, fame); + clamp(maxFame, -40*kFameMultipler, maxFame); + clamp(fame, -40*kFameMultipler, fame); + fow.Fames[theFactionIndex] = fame; + } ch->setFameValuePlayer(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); } if (gu) @@ -1597,6 +1608,32 @@ void CFameManager::enforceFameCaps(const NLMISC::CEntityId &entityId, uint32 org } } } + + + theFactionIndex = PVP_CLAN::getFactionIndex(PVP_CLAN::Marauder); + fame = fow.Fames[theFactionIndex]; + maxFame = getMaxFameByClan(allegiance, organization, PVP_CLAN::Marauder); + if( fame != NO_FAME) + { + clamp(fame,FameAbsoluteMin,maxFame); + fow.Fames[theFactionIndex] = fame; + } + + if (ch) + { + // Cap to -40 + if (!haveWeapons) + { + ch->saveFame((uint32)PVP_CLAN::Marauder, fame); + clamp(maxFame, -40*kFameMultipler, maxFame); + clamp(fame, -40*kFameMultipler, fame); + fow.Fames[theFactionIndex] = fame; + } + ch->setFameValuePlayer(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); + } + + if (gu) + gu->setFameValueGuild(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); } void CFameManager::setAndEnforceTribeFameCap(const NLMISC::CEntityId &entityId, uint32 organization, std::pair allegiance) diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index 2169e7de4f..cb32da5f31 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -677,6 +677,8 @@ CCharacter::CCharacter() _FriendVisibility = VisibleToAll; _LangChannel = "rf"; _NewTitle = "Refugee"; + _SavedFame = false; + initDatabase(); _PowoCell = 0; @@ -17072,36 +17074,6 @@ void CCharacter::setFameValuePlayer(uint32 factionIndex, sint32 playerFame, sint { if (playerFame != NO_FAME) { - // Update Marauder fame when < 50 and other fame change - uint32 marauderIdx = PVP_CLAN::getFactionIndex(PVP_CLAN::Marauder); - sint32 marauderFame = CFameInterface::getInstance().getFameIndexed(_Id, marauderIdx); - if (factionIndex != marauderIdx) - { - sint32 maxOtherfame = -100*kFameMultipler; - for (uint8 fameIdx = 0; fameIdx < 7; fameIdx++) - { - if (fameIdx == marauderIdx) - continue; - - sint32 fame = CFameInterface::getInstance().getFameIndexed(_Id, fameIdx); - - if (fame > maxOtherfame) - maxOtherfame = fame; - } - - if (marauderFame < 50*kFameMultipler) - { - if (maxOtherfame < -50*kFameMultipler) // Cap to 50 - maxOtherfame = -50*kFameMultipler; - CFameManager::getInstance().setEntityFame(_Id, marauderIdx, -maxOtherfame, false); - } - else - { - if (maxOtherfame > -40*kFameMultipler) - CFameManager::getInstance().setEntityFame(_Id, marauderIdx, -maxOtherfame, false); - } - } - // _PropertyDatabase.setProp( toString("FAME:PLAYER%d:VALUE", fameIndexInDatabase), // sint64(float(playerFame)/FameAbsoluteMax*100) ); CBankAccessor_PLR::getFAME() @@ -17129,18 +17101,11 @@ void CCharacter::setFameValuePlayer(uint32 factionIndex, sint32 playerFame, sint bool canPvp = false; - for (uint8 fameIdx = 0; fameIdx < 7; fameIdx++) + for (uint8 fameIdx = PVP_CLAN::BeginClans; fameIdx < PVP_CLAN::EndClans; fameIdx++) { - sint32 fame = CFameInterface::getInstance().getFameIndexed(_Id, fameIdx); - - if (fame >= PVPFameRequired * 6000) - { - canPvp = true; - } - else if (fame <= -PVPFameRequired * 6000) - { + sint32 fame = CFameInterface::getInstance().getFameIndexed(_Id, PVP_CLAN::getFactionIndex((PVP_CLAN::TPVPClan)fameIdx)); + if ((fame >= PVPFameRequired * kFameMultipler) || (fame <= -PVPFameRequired * kFameMultipler)) canPvp = true; - } } if (_LoadingFinish) @@ -17186,13 +17151,15 @@ void CCharacter::resetFameDatabase() CFameManager::getInstance().enforceFameCaps(getId(), getOrganization(), getAllegiance()); CFameManager::getInstance().setAndEnforceTribeFameCap(getId(), getOrganization(), getAllegiance()); } - - for (uint i = 0; i < CStaticFames::getInstance().getNbFame(); ++i) + else { - // update player fame info - sint32 fame = fi.getFameIndexed(_Id, i, false, true); - sint32 maxFame = CFameManager::getInstance().getMaxFameByFactionIndex(getAllegiance(), getOrganization(), i); - setFameValuePlayer(i, fame, maxFame, 0); + for (uint i = 0; i < CStaticFames::getInstance().getNbFame(); ++i) + { + // update player fame info + sint32 fame = fi.getFameIndexed(_Id, i, false, true); + sint32 maxFame = CFameManager::getInstance().getMaxFameByFactionIndex(getAllegiance(), getOrganization(), i); + setFameValuePlayer(i, fame, maxFame, 0); + } } } diff --git a/ryzom/server/src/entities_game_service/player_manager/character.h b/ryzom/server/src/entities_game_service/player_manager/character.h index 558c7ffe81..9e676d07fc 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.h +++ b/ryzom/server/src/entities_game_service/player_manager/character.h @@ -1998,6 +1998,8 @@ class CCharacter : public CCharacterPersistantData, public CEntityBase, public N /// set a fame value for the player, send info to the client. void setFameValuePlayer(uint32 factionIndex, sint32 playerFame, sint32 fameMax, uint16 fameTrend); + void saveFameValuePlayer(uint32 factionIndex, sint32 playerFame); + // set the fame boundaries, send info to the client. // Called when some of the CVariables are changed. void setFameBoundaries(); @@ -2318,6 +2320,11 @@ class CCharacter : public CCharacterPersistantData, public CEntityBase, public N CPlayerRoomInterface &getRoomInterface(); EGSPD::CFameContainerPD &getPlayerFamesContainer(); + void setSavedFames(bool status); + bool getSavedFames(); + void saveFame(uint32 i, sint32 fame); + void addSavedFame(uint32 i, sint32 fame); + sint32 restoreFame(uint32 i); bool checkCharacterStillValide(const char* msgError); @@ -3437,6 +3444,8 @@ class CCharacter : public CCharacterPersistantData, public CEntityBase, public N std::string _DontTranslate; + sint32 _SavedFames[PVP_CLAN::NbClans]; + bool _SavedFame; /// SDB path where player wins HoF points in PvP (if not empty) std::string _SDBPvPPath; diff --git a/ryzom/server/src/entities_game_service/player_manager/character_inlines.h b/ryzom/server/src/entities_game_service/player_manager/character_inlines.h index 471bfc42cf..59aa565e9e 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character_inlines.h +++ b/ryzom/server/src/entities_game_service/player_manager/character_inlines.h @@ -773,6 +773,34 @@ inline EGSPD::CFameContainerPD &CCharacter::getPlayerFamesContainer() return *_Fames; } +inline void CCharacter::setSavedFames(bool status) +{ + _SavedFame = status; +} + +inline bool CCharacter::getSavedFames() +{ + return _SavedFame; +} + + +inline void CCharacter::saveFame(uint32 i, sint32 fame) +{ + _SavedFames[i] = fame; +} + +inline void CCharacter::addSavedFame(uint32 i, sint32 fame) +{ + _SavedFames[i] += fame; +} + + +inline sint32 CCharacter::restoreFame(uint32 i) +{ + return _SavedFames[i]; +} + + //------------------------------------------------------------------------------ inline bool CCharacter::logXpGain() const diff --git a/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp b/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp index 2dbb9b04f9..42dce8fc17 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp @@ -60,6 +60,7 @@ #include "game_item_manager/player_inventory.h" #include "guild_manager/guild.h" #include "guild_manager/guild_manager.h" +#include "guild_manager/fame_manager.h" #include "mission_manager/mission_guild.h" #include "mission_manager/mission_solo.h" #include "mission_manager/mission_team.h" @@ -1222,11 +1223,8 @@ void CCharacter::unequipCharacter(INVENTORIES::TInventory invId, uint32 slot, bo CBankAccessor_PLR::getCHARACTER_INFO().getPARRY().setCurrent( _PropertyDatabase, checkedCast(_CurrentParryLevel)); CPhraseManager::getInstance().disengage(_EntityRowId, true); - } - // Remove enchant weapon effects as they are linked to equipped item - if (invId == INVENTORIES::handling && slot == 0) - { + // Remove enchant weapon effects as they are linked to equipped item CSEffectPtr const effect = lookForActiveEffect(EFFECT_FAMILIES::PowerEnchantWeapon); if (effect) @@ -3165,7 +3163,7 @@ void CCharacter::rechargeItem(INVENTORIES::TInventory invId, uint32 slot) sendDynamicSystemMessage(_EntityRowId, "ITEM_IS_FULLY_RECHARGED", params); return; } - + rightHandItem->reloadSapLoad(sapRechargeItem->sapLoad()); // consume sap recharge (destroy it) inv->deleteStackItem(slot, 1); From 8539e8c72f550586fc1c6ee8c7000d49d3a728cd Mon Sep 17 00:00:00 2001 From: Nuno Date: Fri, 17 Mar 2023 13:46:23 +0100 Subject: [PATCH 009/194] Fix getPlayerPetsInfos --- .../entities_game_service/mission_manager/missions_commands.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index 77284befe3..a58dd9d166 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -3660,7 +3660,7 @@ NLMISC_COMMAND(getPlayerPetsInfos, "get player pets infos", "") GET_ACTIVE_CHARACTER std::vector< std::string > lines; - NLMISC::splitString(c->getPetsInfos(), ",", lines); + NLMISC::splitString(c->getPetsInfos(), "\n", lines); for (uint8 i = 0; i < lines.size(); i++) log.displayNL("%s", lines[i].c_str()); return true; From 424866b718d718e3e6ce79ad6b72bc5dacc7552b Mon Sep 17 00:00:00 2001 From: Nuno Date: Fri, 17 Mar 2023 13:46:23 +0100 Subject: [PATCH 010/194] Fix getPlayerPetsInfos --- .../entities_game_service/mission_manager/missions_commands.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index 77284befe3..a58dd9d166 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -3660,7 +3660,7 @@ NLMISC_COMMAND(getPlayerPetsInfos, "get player pets infos", "") GET_ACTIVE_CHARACTER std::vector< std::string > lines; - NLMISC::splitString(c->getPetsInfos(), ",", lines); + NLMISC::splitString(c->getPetsInfos(), "\n", lines); for (uint8 i = 0; i < lines.size(); i++) log.displayNL("%s", lines[i].c_str()); return true; From ecd4bab466861696aa7f926566cde99c607863f5 Mon Sep 17 00:00:00 2001 From: Nuno Date: Sat, 18 Mar 2023 17:26:49 +0100 Subject: [PATCH 011/194] Fix ark lua --- .../client/data/gamedev/interfaces_v3/ark.lua | 2 +- .../gamedev/interfaces_v3/ark_lessons.lua | 108 +++++++++++++++++- .../gamedev/interfaces_v3/info_player.lua | 99 +--------------- .../gamedev/interfaces_v3/tp_interface.lua | 2 +- ryzom/server/src/ai_service/ai.cpp | 2 +- 5 files changed, 108 insertions(+), 105 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark.lua b/ryzom/client/data/gamedev/interfaces_v3/ark.lua index e4f62fbcae..30040e00a6 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark.lua @@ -101,7 +101,7 @@ function ArkMissionCatalog:OpenCat(cat, url) local htmlA = getUI(ArkMissionCatalog.window_id..":content:htmlA") local htmlB = getUI(ArkMissionCatalog.window_id..":content:htmlB") local htmlC = getUI(ArkMissionCatalog.window_id..":content:htmlC") - if cat == "title" or cat == "academic" or cat == "rykea" or cat == "workshops" or cat == "etools" then + if cat ~= "storyline" and cat ~= "daily" and cat ~= "achv" and cat ~= "puzzle" then ArkMissionCatalog.posxB = 180 ArkMissionCatalog.widthB = 240 ArkMissionCatalog.widthC = 530 diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua b/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua index eaf6db232a..fffaf0800d 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua @@ -1,3 +1,7 @@ +if game == nil then + game= {} +end + if ArkLessons == nil then ArkLessons = {} @@ -24,8 +28,108 @@ function ArkLessons:Callback(event, id, args) end end +game.ArkLessonUsedWindowUrl = "https://app.ryzom.com/app_arcc/index.php?action=mLesson_Run&script=" + webig.urls_to_check = {} + +function ArkOpenLesson(id, require_rpitem) + debug(require_rpitem) + if id ~= 0 and id ~= nil then + local win = getUI("ui:interface:web_transaction_lessons") + if win then + win:find("html"):browse(game.ArkLessonUsedWindowUrl..id) + else + getUI("ui:interface:web_transactions"):find("html"):browse(game.ArkLessonUsedWindowUrl..id) + end + end +end + +function ArkRevealLesson(id, i, total) + if i == game.ArkLessonRevealStep[id] then + game.ArkLessonRevealStep[id] = game.ArkLessonRevealStep[id] + 1 + game:ArkLessonCallback("step", id, i) + game:ArkRevealLessonInfos(id, i, total) + if i == total then + game:ArkAcceptLesson() + end + end +end + +function game:ArkRevealLessonInfos(id, i, total) + local ui = getUI("ui:interface:ArkLessonWin"..tostring(id)) + if ui ~= nil then + local html = ui:find("html") + html:showDiv("enabled_"..tostring(i), false) + html:showDiv("disabled_"..tostring(i), false) + html:showDiv("current_"..tostring(i), true) + if i > 1 then + if i ~= total+1 then + html:showDiv("current_"..tostring(i-1), false) + html:showDiv("enabled_"..tostring(i-1), true) + end + end + if game.ArkLessonRevealCaps and game.ArkLessonRevealCaps[id] then + if total > i then + setCap(game.ArkLessonRevealCaps[id], "p", math.floor((100*i)/total), tostring(i).." / "..tostring(total)) + else + setCap(game.ArkLessonRevealCaps[id], "p", 100, "") + end + end + end +end + + +function ArkLessonUpdateHtml(win, scriptid, title, progression, started, finished, requirement, reward) + win = getUI(win) + win = win:find("div_lesson_"..scriptid..":html") + if requirement ~= [[]] then + requirement = game.ArkLessonNeedRequirement + else + requirement = "" + end + + local progressionHtml = "
" + local height = "50" + if progression then + height = "12" + pogressionHtml = ""..progression.."" + end + + local color = "AAA" + if started then + if finished then + color = "FFFFFF" + else + color = "FFDD4AFF" + end + end + + win:renderHtml([[ + + + + + + + + +
+ + + + + + + + ]]..pogressionHtml..[[ +
]]..title..[[
]]..requirement..[[
+
]]..reward..[[
+ + ]]) +end + + function ArkLessons:Show(id, w, h, content, scriptid) local ui = getUI("ui:interface:"..id) -- deleteUI(framewin) @@ -119,10 +223,6 @@ function ArkLessons:ArkRevealLessonInfos(scriptid, i, total) end end -function ArkOpenLesson(id) - WebQueue:push("https://app.ryzom.com/app_arcc/index.php?action=mLesson_Run&script="..tostring(id)) -end - function openArkLessonScript(i, script_id, url) if i == ArkLessons.RevealStep[script_id] then getUI("ui:interface:ArkLessonWin"..tostring(script_id)).active = false diff --git a/ryzom/client/data/gamedev/interfaces_v3/info_player.lua b/ryzom/client/data/gamedev/interfaces_v3/info_player.lua index 38ceec1972..862124a61b 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/info_player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/info_player.lua @@ -16,7 +16,7 @@ game.PrevSessionMission = - 1 game.InGameDbInitialized = false game.WebMissionLastDesc = {} -game.ArkLessonUsedWindowUrl = "https://app.ryzom.com/app_arcc/index.php?action=mLesson_Run&script=" + ------------------------------------------------------------------------------------------------------------ -- CAP ------------------------------------------------------------------------------------------------------------ @@ -1579,103 +1579,6 @@ function game:setNextUrl(url) game.CapNextUrl = url end -function ArkOpenLesson(id) - if id ~= 0 and id ~= nil then - local win = getUI("ui:interface:web_transaction_lessons") - if win then - win:find("html"):browse(game.ArkLessonUsedWindowUrl..id) - else - getUI("ui:interface:web_transactions"):find("html"):browse(game.ArkLessonUsedWindowUrl..id) - end - end -end - -function ArkRevealLesson(id, i, total) - if i == game.ArkLessonRevealStep[id] then - game.ArkLessonRevealStep[id] = game.ArkLessonRevealStep[id] + 1 - game:ArkLessonCallback("step", id, i) - game:ArkRevealLessonInfos(id, i, total) - if i == total then - game:ArkAcceptLesson() - end - end -end - -function game:ArkRevealLessonInfos(id, i, total) - local ui = getUI("ui:interface:ArkLessonWin"..tostring(id)) - if ui ~= nil then - local html = ui:find("html") - html:showDiv("enabled_"..tostring(i), false) - html:showDiv("disabled_"..tostring(i), false) - html:showDiv("current_"..tostring(i), true) - if i > 1 then - if i ~= total+1 then - html:showDiv("current_"..tostring(i-1), false) - html:showDiv("enabled_"..tostring(i-1), true) - end - end - if game.ArkLessonRevealCaps and game.ArkLessonRevealCaps[id] then - if total > i then - setCap(game.ArkLessonRevealCaps[id], "p", math.floor((100*i)/total), tostring(i).." / "..tostring(total)) - else - setCap(game.ArkLessonRevealCaps[id], "p", 100, "") - end - end - end -end - - -function ArkLessonUpdateHtml(win, scriptid, title, progression, started, finished, requirement, reward) - win = getUI(win) - win = win:find("div_lesson_"..scriptid..":html") - if requirement ~= [[]] then - requirement = game.ArkLessonNeedRequirement - else - requirement = "" - end - - local progressionHtml = "
" - local height = "50" - if progression then - height = "12" - pogressionHtml = ""..progression.."" - end - - local color = "AAA" - if started then - if finished then - color = "FFFFFF" - else - color = "FFDD4AFF" - end - end - - win:renderHtml([[ - - - - - - - - -
- - - - - - - - ]]..pogressionHtml..[[ -
]]..title..[[
]]..requirement..[[
-
]]..reward..[[
- - ]]) -end - - - function setCap(id, element, a, b) if element == nil then game.CapId = id diff --git a/ryzom/client/data/gamedev/interfaces_v3/tp_interface.lua b/ryzom/client/data/gamedev/interfaces_v3/tp_interface.lua index 48ceaaf3fd..b9ee004710 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/tp_interface.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/tp_interface.lua @@ -77,7 +77,7 @@ if artefact == nil then isMinimized = true, isLogoMinimized = false, web_item = "params_l:#L;template:webig_inv_item_artefact;\ - display:inline-block;id:pact#P;tooltip:u:#T;\ + display:inline-block;id:pact#P;tooltip:#T;\ quantity:q0;#Q;#O;img1:tp_#I.tga;\ bg:bk_#E.tga;col_over:255 255 255 45", -- slotbg:blank2.tga; uiWindow = nil, diff --git a/ryzom/server/src/ai_service/ai.cpp b/ryzom/server/src/ai_service/ai.cpp index 49144fa9dd..3e2efeeca8 100644 --- a/ryzom/server/src/ai_service/ai.cpp +++ b/ryzom/server/src/ai_service/ai.cpp @@ -69,7 +69,7 @@ const std::string egsString("EGS"); const uint32 Default_MaxPlayers=5000; -const uint32 Default_MaxBotsPet=Default_MaxPlayers*4; +const uint32 Default_MaxBotsPet=Default_MaxPlayers*7; const uint32 Default_MaxBotsFauna=40000; const uint32 Default_MaxBotsNpc=20000; const uint32 Default_MaxBotsFx=200; From aed289651f7e54faf4ceeff8aa55506a40cf04d3 Mon Sep 17 00:00:00 2001 From: Nuno Date: Sat, 18 Mar 2023 20:52:59 +0100 Subject: [PATCH 012/194] Added getTags --- .../mission_manager/missions_commands.cpp | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index a58dd9d166..d0ce37cbc0 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -2824,7 +2824,7 @@ NLMISC_COMMAND(setTitle, "set player title", " ") //setTag 2 pvpA pvp_ally_6.tga //---------------------------------------------------------------------------- -NLMISC_COMMAND(setTag, "set player title", "<uid> <tag> <value>") +NLMISC_COMMAND(setTag, "set player tags", "<uid> <tag> <value>") { if (args.size() != 3) { log.displayNL("ERR: invalid arg count"); @@ -2851,6 +2851,31 @@ NLMISC_COMMAND(setTag, "set player title", "<uid> <tag> <value>") return true; } +//---------------------------------------------------------------------------- +NLMISC_COMMAND(getTags, "get player tags", "<uid>") +{ + if (args.size() != 1) { + log.displayNL("ERR: invalid arg count"); + return false; + } + + GET_ACTIVE_CHARACTER + + log.displayNL(c->getTagPvPA().c_str()); + log.displayNL(c->getTagPvPB().c_str()); + log.displayNL(c->getDefaultTagA().c_str()); + log.displayNL(c->getDefaultTagB().c_str()); + log.displayNL(c->getTagA().c_str()); + log.displayNL(c->getTagB().c_str()); + log.displayNL(c->getTagRightHand().c_str()); + log.displayNL(c->getTagLeftHand().c_str()); + log.displayNL(c->getTagHat().c_str()); + log.displayNL("%d", c->getVisualPropertyA().directAccessForStructMembers().PropertySubData.WeaponRightHand); + log.displayNL("%d", c->getVisualPropertyA().directAccessForStructMembers().PropertySubData.WeaponLeftHand); + log.displayNL("%d", c->getVisualPropertyA().directAccessForStructMembers().PropertySubData.HatModel); + return true; +} + //----------------------------------------------- NLMISC_COMMAND(getArkMissions,"dump character ark missions","<uid>") { From df662971673968cc68abc364430e07e11e1cb4df Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Sat, 18 Mar 2023 20:59:32 +0100 Subject: [PATCH 013/194] fix --- .../gamedev/interfaces_v3/ark_lessons.lua | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua b/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua index fffaf0800d..0a1bf8b2e7 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua @@ -83,16 +83,22 @@ end function ArkLessonUpdateHtml(win, scriptid, title, progression, started, finished, requirement, reward) win = getUI(win) win = win:find("div_lesson_"..scriptid..":html") + local top = "" if requirement ~= [[]] then - requirement = game.ArkLessonNeedRequirement + requirement = [[<tr><td height="20px" style="font-size: 11px; color: pink">]]..ArkLessons.NeedRequirement..[[</td>]] else requirement = "" + top = [[<tr><td height="5px"></td></tr>]] end local progressionHtml = "<td><table><tr><td><table style=\'background-color: black;\'><tr><td></td></tr></table></td></tr></table></td>" local height = "50" if progression then - height = "12" + if requirement ~= "" then + height = "12" + else + height = "25" + end pogressionHtml = "<tr><td height=\'12px\' align=\'left\' >"..progression.."</td></tr>" end @@ -112,13 +118,11 @@ function ArkLessonUpdateHtml(win, scriptid, title, progression, started, finishe <td width="2px"></td> <td width="407px" align="left" valign="top"> <table width="407px" cellspacing="0" cellpadding="0"> + ]]..top..[[ <tr> - <td height="]]..height..[[px" valign="middle"><strong style="color: #]]..color..[[">]]..title..[[</strong></td> + <td height="]]..height..[[px" valign="top"><strong style="color: #]]..color..[[">]]..title..[[</strong></td> </tr> - <tr> - <td height="12px" style="font-size: 11px; color: pink">]]..requirement..[[</td> - </tr> - ]]..pogressionHtml..[[ + ]]..requirement..pogressionHtml..[[ </table> </td> <td width="6px"></td> @@ -129,7 +133,6 @@ function ArkLessonUpdateHtml(win, scriptid, title, progression, started, finishe ]]) end - function ArkLessons:Show(id, w, h, content, scriptid) local ui = getUI("ui:interface:"..id) -- deleteUI(framewin) From 0e0cf4e0b9df2a185c4fb20d004a795e71719550 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Sun, 19 Mar 2023 20:45:04 +0100 Subject: [PATCH 014/194] Fix issues --- .../creature_manager/harvestable.cpp | 6 +- .../entities_game_service/egs_variables.cpp | 4 +- .../player_manager/character.cpp | 139 ++++++++++++------ 3 files changed, 98 insertions(+), 51 deletions(-) diff --git a/ryzom/server/src/entities_game_service/creature_manager/harvestable.cpp b/ryzom/server/src/entities_game_service/creature_manager/harvestable.cpp index bfc7d2b163..86ee631e35 100644 --- a/ryzom/server/src/entities_game_service/creature_manager/harvestable.cpp +++ b/ryzom/server/src/entities_game_service/creature_manager/harvestable.cpp @@ -133,9 +133,11 @@ bool CHarvestable::writeMpInfos() bool useGenericMats = false; + CSheetId usedSheet; - CSBrickParamJewelAttrs sbrickParam = harvester->getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERL, usedSheet); - if (sbrickParam.ParsedOk && sbrickParam.Value == "generic") + CSBrickParamJewelAttrs sbrickParamL = harvester->getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERL, usedSheet); + CSBrickParamJewelAttrs sbrickParamR = harvester->getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERR, usedSheet); + if ((sbrickParamL.ParsedOk && sbrickParamL.Value == "generic") || (sbrickParamR.ParsedOk && sbrickParamR.Value == "generic")) { useGenericMats = true; } diff --git a/ryzom/server/src/entities_game_service/egs_variables.cpp b/ryzom/server/src/entities_game_service/egs_variables.cpp index 3202a39256..ff834e4dd5 100644 --- a/ryzom/server/src/entities_game_service/egs_variables.cpp +++ b/ryzom/server/src/entities_game_service/egs_variables.cpp @@ -389,13 +389,11 @@ CVariable<float> ForageExtractionXPFactor( "egs", "ForageExtractionXPFactor", "" CVariable<float> ForageExtractionNbParticipantsXPBonusRatio( "egs", "ForageExtractionNbParticipantsXPBonusRatio", "", 0.1f, 0, true ); CVariable<float> ForageExtractionNastyEventXPMalusRatio( "egs", "ForageExtractionNastyEventXPMalusRatio", "", 0.1f, 0, true ); -CVariable<uint32> ArkLootTimeBeforeNewDraw( "egs", "ArkLootTimeBeforeNewDraw", "Time need before a new ark loot draw", 600, 0, true ); // 60sec - +CVariable<uint32> ArkLootTimeBeforeNewDraw( "egs", "ArkLootTimeBeforeNewDraw", "Time need before a new ark loot draw", 120, 0, true ); // 12sec CVariable<float> ToxicCloudDamage( "egs","ToxicCloudDamage", "Max HP hit by a toxic cloud at ToxicCloudUpdateFrequency", 800.0f, true ); CVariable<float> ForageExplosionDamage( "egs","ForageExplosionDamage", "Max HP hit once by a forage explosion", 4000.0f, true ); - CVariable<sint32> FameByKill( "egs","FameByKill", "Number of fame point lost for a kill", -5000, true ); CVariable<sint32> PVPFameRequired ("egs","PVPFameRequired", "Minimum of positive or negative fame for PVP", 25, 0, true ); diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index a9d4b5106e..f4496ee3f8 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -1113,13 +1113,17 @@ uint32 CCharacter::tickUpdate() // Check Death of player and manage pact if death occurs if (currentHp() <= 0 && !_IsDead && !teleportInProgress()) { - CSheetId usedSheet; CSBrickParamJewelAttrs sbrickParam = getJewelAttrs("rez", SLOT_EQUIPMENT::NECKLACE, usedSheet); SM_STATIC_PARAMS_1(params, STRING_MANAGER::sbrick); params[0].SheetId = usedSheet; - if (sbrickParam.ParsedOk && sbrickParam.Value == "lastPoint" && (rand() % 200) < sbrickParam.Modifier) + uint32 randvalue = rand() % 400; + + if (sbrickParam.ParsedOk && sbrickParam.Value == "lastPoint" && randvalue < sbrickParam.Modifier) + { _PhysScores._PhysicalScores[SCORES::hit_points].Current = 1; + sendDynamicSystemMessage(_Id, "ALLEGORY_EFFECT_TRIGGERED", params); + } else { kill(); @@ -8157,8 +8161,6 @@ void CCharacter::addGuildPoints(uint32 points) guild->addXP(1); _GuildPoints = 0; } - - nlinfo("_TodayGuildPoints, wantedPoints, _GuildPoints = %u, %u, %u", _TodayGuildPoints, wantedPoints, _GuildPoints); } //--------------------------------------------------- @@ -14448,21 +14450,15 @@ void CCharacter::botChatMissionAdvance(uint8 index) } - nlinfo("_CurrentInterlocutor = %d", _CurrentInterlocutor.toString().c_str()); - nlinfo("_Target = %d", getTarget().toString().c_str()); - uint idx = 0; - nlinfo("index = %d", index); for (map<TAIAlias, CMission*>::iterator it = getMissionsBegin(); it != getMissionsEnd(); ++it) { std::vector<CMission::CBotChat> botchats; (*it).second->getBotChatOptions(_EntityRowId, TheDataset.getDataSetRow(_CurrentInterlocutor), botchats); - nlinfo("botchats.size = %d", botchats.size()); for (uint j = 0; j < botchats.size();) { - nlinfo("idx = %d", idx); if (idx == index) { if (!botchats[j].Gift) @@ -16785,7 +16781,7 @@ void CCharacter::getMatchingMissionLootRequirements(uint16 itemLevel, const std: // (note: If he can get, it doesn't mean it will get) if ((!foundMatchingOK) && foundMatchingExceptLevel) { - PHRASE_UTILITIES::sendDynamicSystemMessage(getEntityRowId(), "AUTO_LOOT_LEVEL_TOO_LOW"); + PHRASE_UTILITIES::sendDynamicSystemMessage(_EntityRowId, "AUTO_LOOT_LEVEL_TOO_LOW"); } } @@ -16836,19 +16832,30 @@ bool CCharacter::pickUpRawMaterial(uint32 indexInTempInv, bool* lastMaterial) params[0].Int = (sint32)_ForageProgress->amount(); params[1].SheetId = _ForageProgress->material(); params[2].Int = (sint32)_ForageProgress->quality(); - PHRASE_UTILITIES::sendDynamicSystemMessage(_EntityRowId, "HARVEST_SUCCESS", params); + sendDynamicSystemMessage(_EntityRowId, "HARVEST_SUCCESS", params); } if ((CTickEventHandler::getGameCycle() - _LastTickForageLoot) > ArkLootTimeBeforeNewDraw) { _LastTickForageLoot = CTickEventHandler::getGameCycle(); CSheetId usedSheet; - CSBrickParamJewelAttrs sbrickParam = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERL, usedSheet); - if (sbrickParam.ParsedOk && sbrickParam.Value == "loot" && (rand() % 1000) < sbrickParam.Modifier) + CSBrickParamJewelAttrs sbrickParamL = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERL, usedSheet); + CSBrickParamJewelAttrs sbrickParamR = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERR, usedSheet); + sint32 modifierL = -1; + sint32 modifierR = -1; + + if (sbrickParamL.ParsedOk && sbrickParamL.Value == "loot") + modifierL = sbrickParamL.Modifier; + + if (sbrickParamR.ParsedOk && sbrickParamR.Value == "loot") + modifierR = sbrickParamR.Modifier; + + sint32 modifier = max(modifierL, modifierR); + if (modifier >= 0 && rand() % 1000 < modifier) { SM_STATIC_PARAMS_1(params, STRING_MANAGER::sbrick); params[0].SheetId = usedSheet; - sendDynamicSystemMessage(_Id, "ALLEGORY_EFFECT_TRIGGERED", params); + sendDynamicSystemMessage(_EntityRowId, "ALLEGORY_EFFECT_TRIGGERED", params); sendUrl(toString("app_arcc action=mScript_Run&script_name=ArkLoot&type=Forage&quality=%d%quantity=%d&command=reset_all", quality, _ForageProgress->amount())); } } @@ -16925,22 +16932,24 @@ bool CCharacter::pickUpRawMaterial(uint32 indexInTempInv, bool* lastMaterial) } } - bool useGenericMats = false; + uint8 bonus = 1; CSheetId usedSheet; - CSBrickParamJewelAttrs sbrickParam = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERL, usedSheet); - if (sbrickParam.ParsedOk && sbrickParam.Value == "generic") - { - useGenericMats = true; - if ((rand() % 1000) < sbrickParam.Modifier) - { - SM_STATIC_PARAMS_1(params, STRING_MANAGER::sbrick); - params[0].SheetId = usedSheet; - sendDynamicSystemMessage(_Id, "ALLEGORY_EFFECT_TRIGGERED", params); - bonus = 2; - } - } + CSBrickParamJewelAttrs sbrickParamL = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERL, usedSheet); + CSBrickParamJewelAttrs sbrickParamR = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERR, usedSheet); + sint32 modifierL = -1; + sint32 modifierR = -1; + + if (sbrickParamL.ParsedOk && sbrickParamL.Value == "generic") + modifierL = sbrickParamL.Modifier; + + if (sbrickParamR.ParsedOk && sbrickParamR.Value == "generic") + modifierR = sbrickParamR.Modifier; + + sint32 modifier = max(modifierL, modifierR); + + bool useGenericMats = modifier >= 0; // first slots are filled with loot items, quarter items are not in temp inv but only info in DB @@ -16962,10 +16971,20 @@ bool CCharacter::pickUpRawMaterial(uint32 indexInTempInv, bool* lastMaterial) if (quality != 0) { - // Create and stack the item in the bag (use genericMp beca + // Create and stack the item in the bag CGameItemPtr item; if (useGenericMats) + { + // Not Named or Boss mats + if (genericMp->ItemId != mp->ItemId && rand() % 500 < modifier) + { + SM_STATIC_PARAMS_1(params, STRING_MANAGER::sbrick); + params[0].SheetId = usedSheet; + sendDynamicSystemMessage(_EntityRowId, "ALLEGORY_EFFECT_TRIGGERED", params); + bonus = 2; + } item = createItem(quality, bonus*genericMp->Quantity, genericMp->ItemId); + } else item = createItem(quality, mp->Quantity, mp->ItemId); @@ -17019,21 +17038,6 @@ bool CCharacter::pickUpRawMaterial(uint32 indexInTempInv, bool* lastMaterial) } } } - - if ((CTickEventHandler::getGameCycle() - _LastTickCreatureLoot) > ArkLootTimeBeforeNewDraw) - { - _LastTickCreatureLoot = CTickEventHandler::getGameCycle(); - CSheetId usedSheet; - CSBrickParamJewelAttrs sbrickParam = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERR, usedSheet); - if ((sbrickParam.ParsedOk && sbrickParam.Value == "loot" && (rand() % 1000) < sbrickParam.Modifier)) - { - SM_STATIC_PARAMS_1(params, STRING_MANAGER::sbrick); - params[0].SheetId = usedSheet; - sendDynamicSystemMessage(_Id, "ALLEGORY_EFFECT_TRIGGERED", params); - sendUrl(toString("app_arcc action=mScript_Run&script_name=ArkLoot&type=Loot&quality=%d&quantity=%d&command=reset_all", (uint32)quality, (uint32)mp->Quantity)); - } - } - } // remove the quantity of mp harvested from the ressource @@ -17054,6 +17058,33 @@ bool CCharacter::pickUpRawMaterial(uint32 indexInTempInv, bool* lastMaterial) { if (lastMaterial) *lastMaterial = true; + if ((CTickEventHandler::getGameCycle() - _LastTickCreatureLoot) > ArkLootTimeBeforeNewDraw) + { + _LastTickCreatureLoot = CTickEventHandler::getGameCycle(); + CSheetId usedSheet; + + CSBrickParamJewelAttrs sbrickParamL = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERL, usedSheet); + CSBrickParamJewelAttrs sbrickParamR = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERR, usedSheet); + sint32 modifierL = -1; + sint32 modifierR = -1; + + if (sbrickParamL.ParsedOk && sbrickParamL.Value == "loot") + modifierL = sbrickParamL.Modifier; + + if (sbrickParamR.ParsedOk && sbrickParamR.Value == "loot") + modifierR = sbrickParamR.Modifier; + + sint32 modifier = max(modifierL, modifierR); + + if (modifier >= 0 && (rand() % 1000) < modifier) + { + SM_STATIC_PARAMS_1(params, STRING_MANAGER::sbrick); + params[0].SheetId = usedSheet; + sendDynamicSystemMessage(_Id, "ALLEGORY_EFFECT_TRIGGERED", params); + sendUrl(toString("app_arcc action=mScript_Run&script_name=ArkLoot&type=Loot&quality=%d&quantity=%d&command=reset_all", (uint32)quality, (uint32)mp->Quantity)); + } + } + } } @@ -19224,8 +19255,24 @@ bool CCharacter::changeCurrentHp(sint32 deltaValue, TDataSetRow responsibleEntit // for god mode if (!_GodMode && !_Invulnerable) { - kill(responsibleEntity); - return true; + CSheetId usedSheet; + CSBrickParamJewelAttrs sbrickParam = getJewelAttrs("rez", SLOT_EQUIPMENT::NECKLACE, usedSheet); + SM_STATIC_PARAMS_1(params, STRING_MANAGER::sbrick); + params[0].SheetId = usedSheet; + uint32 randvalue = rand() % 400; + + if (sbrickParam.ParsedOk && sbrickParam.Value == "lastPoint" && randvalue < sbrickParam.Modifier) + { + _PhysScores._PhysicalScores[SCORES::hit_points].Current = 1; + setHpBar(1); + sendDynamicSystemMessage(_Id, "ALLEGORY_EFFECT_TRIGGERED", params); + return false; + } + else + { + kill(responsibleEntity); + return true; + } } else { From c250936692ed593f1f8af3a2f5675208e52857f0 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Sun, 19 Mar 2023 22:26:43 +0100 Subject: [PATCH 015/194] Fix --- .../player_manager/character.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index f4496ee3f8..514aba30f1 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -17061,18 +17061,25 @@ bool CCharacter::pickUpRawMaterial(uint32 indexInTempInv, bool* lastMaterial) if ((CTickEventHandler::getGameCycle() - _LastTickCreatureLoot) > ArkLootTimeBeforeNewDraw) { _LastTickCreatureLoot = CTickEventHandler::getGameCycle(); - CSheetId usedSheet; + CSheetId usedSheetL; + CSheetId usedSheetR; - CSBrickParamJewelAttrs sbrickParamL = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERL, usedSheet); - CSBrickParamJewelAttrs sbrickParamR = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERR, usedSheet); + CSBrickParamJewelAttrs sbrickParamL = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERL, usedSheetL); + CSBrickParamJewelAttrs sbrickParamR = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERR, usedSheetR); sint32 modifierL = -1; sint32 modifierR = -1; if (sbrickParamL.ParsedOk && sbrickParamL.Value == "loot") + { modifierL = sbrickParamL.Modifier; + usedSheet = usedSheetL; + } if (sbrickParamR.ParsedOk && sbrickParamR.Value == "loot") + { modifierR = sbrickParamR.Modifier; + usedSheet = usedSheetR; + } sint32 modifier = max(modifierL, modifierR); From 7e19cde5808b125b92ae1084affa742ef7c0e85b Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Mon, 20 Mar 2023 14:05:51 +0100 Subject: [PATCH 016/194] Fixed display bugs --- .../player_manager/character.cpp | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index 514aba30f1..69f15ea15c 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -16839,16 +16839,24 @@ bool CCharacter::pickUpRawMaterial(uint32 indexInTempInv, bool* lastMaterial) { _LastTickForageLoot = CTickEventHandler::getGameCycle(); CSheetId usedSheet; - CSBrickParamJewelAttrs sbrickParamL = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERL, usedSheet); - CSBrickParamJewelAttrs sbrickParamR = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERR, usedSheet); + CSheetId usedSheetL; + CSheetId usedSheetR; + CSBrickParamJewelAttrs sbrickParamL = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERL, usedSheetL); + CSBrickParamJewelAttrs sbrickParamR = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERR, usedSheetR); sint32 modifierL = -1; sint32 modifierR = -1; if (sbrickParamL.ParsedOk && sbrickParamL.Value == "loot") + { modifierL = sbrickParamL.Modifier; + usedSheet = usedSheetL; + } if (sbrickParamR.ParsedOk && sbrickParamR.Value == "loot") + { modifierR = sbrickParamR.Modifier; + usedSheet = usedSheetR; + } sint32 modifier = max(modifierL, modifierR); if (modifier >= 0 && rand() % 1000 < modifier) @@ -16936,16 +16944,26 @@ bool CCharacter::pickUpRawMaterial(uint32 indexInTempInv, bool* lastMaterial) uint8 bonus = 1; CSheetId usedSheet; - CSBrickParamJewelAttrs sbrickParamL = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERL, usedSheet); - CSBrickParamJewelAttrs sbrickParamR = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERR, usedSheet); + CSheetId usedSheetL; + CSheetId usedSheetR; + CSBrickParamJewelAttrs sbrickParamL = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERL, usedSheetL); + CSBrickParamJewelAttrs sbrickParamR = getJewelAttrs("arkloot", SLOT_EQUIPMENT::FINGERR, usedSheetR); sint32 modifierL = -1; sint32 modifierR = -1; + if (sbrickParamL.ParsedOk && sbrickParamL.Value == "generic") + { modifierL = sbrickParamL.Modifier; + usedSheet = usedSheetL; + } if (sbrickParamR.ParsedOk && sbrickParamR.Value == "generic") + { modifierR = sbrickParamR.Modifier; + usedSheet = usedSheetR; + } + sint32 modifier = max(modifierL, modifierR); From 9d2485a091249d663f15269ecf83a0e0e293c7d5 Mon Sep 17 00:00:00 2001 From: nimetu <nimetu@gmail.com> Date: Sat, 18 Mar 2023 12:21:28 +0200 Subject: [PATCH 017/194] Add trigger condition to azure-pipelines.yml --- azure-pipelines.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 9c735531ba..e42680e060 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,3 +1,10 @@ +trigger: + branches: + include: + - core4 + - feature/* + - main/atys-live + jobs: - job: ubuntu18 timeoutInMinutes: 120 From 5bd60fcbbbef8caae7af27e3db227f8e1eb34d6b Mon Sep 17 00:00:00 2001 From: kaetemi <jan.boon@kaetemi.be> Date: Sat, 4 Mar 2023 20:56:23 +0800 Subject: [PATCH 018/194] Stop sound manager from the right thread --- ryzom/client/src/login_patch.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ryzom/client/src/login_patch.cpp b/ryzom/client/src/login_patch.cpp index 82665aac1d..b97d410bef 100644 --- a/ryzom/client/src/login_patch.cpp +++ b/ryzom/client/src/login_patch.cpp @@ -533,6 +533,8 @@ void CPatchManager::getInfoToDisp(SPatchInfo &piOut) } } +void stopSoundMngr(); + // **************************************************************************** // TODO : use selected categories to patch a list of files void CPatchManager::startPatchThread(const vector<string> &CategoriesSelected, bool applyPatch) @@ -623,6 +625,12 @@ void CPatchManager::startPatchThread(const vector<string> &CategoriesSelected, b // Close opened big files CBigFile::getInstance().remove(FilesToPatch[k].FileName); + + if (NLMISC::startsWith(FilesToPatch[k].FileName, "sound")) + { + // Stop sound playback + stopSoundMngr(); + } } } } @@ -2605,8 +2613,6 @@ class CPatchThreadDownloadProgress : public NLMISC::IProgressCallback } }; -void stopSoundMngr(); - // **************************************************************************** void CPatchThread::processFile (CPatchManager::SFileToPatch &rFTP) { @@ -2618,12 +2624,6 @@ void CPatchThread::processFile (CPatchManager::SFileToPatch &rFTP) // Destination File Name (in writable directory) string DestinationName; - if (NLMISC::startsWith(rFTP.FileName, "sound")) - { - // Stop sound playback - stopSoundMngr(); - } - if (rFTP.ExtractPath.empty()) { DestinationName = pPM->WritableClientDataPath + rFTP.FileName; From 1e5c6c41b6059039ee793808c42fa67e2139bd71 Mon Sep 17 00:00:00 2001 From: nimetu <nimetu@gmail.com> Date: Sat, 18 Mar 2023 01:38:40 +0200 Subject: [PATCH 019/194] Fix possible crash on login --- ryzom/client/src/user_entity.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/ryzom/client/src/user_entity.cpp b/ryzom/client/src/user_entity.cpp index 0077b2bc46..9ec59f6fb1 100644 --- a/ryzom/client/src/user_entity.cpp +++ b/ryzom/client/src/user_entity.cpp @@ -194,6 +194,7 @@ CUserEntity::CUserEntity() _R2CharMode= R2::TCharMode::Player; + _CameraMoves = NLMISC::CVector(0, 0, 0); }// CUserEntity // From 05ddcd5d5454427bf05e6c964e58619751ef3de6 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Fri, 31 Mar 2023 13:39:19 +0200 Subject: [PATCH 020/194] Added ArkLootExtraModifierMultiplier --- .../src/entities_game_service/egs_variables.cpp | 3 ++- .../player_manager/character.cpp | 12 +++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ryzom/server/src/entities_game_service/egs_variables.cpp b/ryzom/server/src/entities_game_service/egs_variables.cpp index ff834e4dd5..0d084a4af8 100644 --- a/ryzom/server/src/entities_game_service/egs_variables.cpp +++ b/ryzom/server/src/entities_game_service/egs_variables.cpp @@ -389,7 +389,8 @@ CVariable<float> ForageExtractionXPFactor( "egs", "ForageExtractionXPFactor", "" CVariable<float> ForageExtractionNbParticipantsXPBonusRatio( "egs", "ForageExtractionNbParticipantsXPBonusRatio", "", 0.1f, 0, true ); CVariable<float> ForageExtractionNastyEventXPMalusRatio( "egs", "ForageExtractionNastyEventXPMalusRatio", "", 0.1f, 0, true ); -CVariable<uint32> ArkLootTimeBeforeNewDraw( "egs", "ArkLootTimeBeforeNewDraw", "Time need before a new ark loot draw", 120, 0, true ); // 12sec +CVariable<uint32> ArkLootTimeBeforeNewDraw( "egs", "ArkLootTimeBeforeNewDraw", "Time need before a new Ark Loot draw", 120, 0, true ); // 12sec +CVariable<float> ArkLootExtraModifierMultiplier( "egs", "ArkLootExtraModifierMultiplier", "Extra multiplier for Ark Loot modifier", 1.0f, 0, true ); // 12sec CVariable<float> ToxicCloudDamage( "egs","ToxicCloudDamage", "Max HP hit by a toxic cloud at ToxicCloudUpdateFrequency", 800.0f, true ); CVariable<float> ForageExplosionDamage( "egs","ForageExplosionDamage", "Max HP hit once by a forage explosion", 4000.0f, true ); diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index 69f15ea15c..b7b53df05d 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -16859,12 +16859,13 @@ bool CCharacter::pickUpRawMaterial(uint32 indexInTempInv, bool* lastMaterial) } sint32 modifier = max(modifierL, modifierR); - if (modifier >= 0 && rand() % 1000 < modifier) + if (modifier >= 0 && rand() % 1000 < (uint32)(modifier * ArkLootExtraModifierMultiplier)) { SM_STATIC_PARAMS_1(params, STRING_MANAGER::sbrick); params[0].SheetId = usedSheet; - sendDynamicSystemMessage(_EntityRowId, "ALLEGORY_EFFECT_TRIGGERED", params); - sendUrl(toString("app_arcc action=mScript_Run&script_name=ArkLoot&type=Forage&quality=%d%quantity=%d&command=reset_all", quality, _ForageProgress->amount())); + // ArkLoot script will trigger it + // sendDynamicSystemMessage(_EntityRowId, "ALLEGORY_EFFECT_TRIGGERED", params); + sendUrl(toString("app_arcc action=mScript_Run&script_name=ArkLoot&type=Forage&quality=%d&quantity=%d&command=reset_all", (sint32)_ForageProgress->quality(), (sint32)_ForageProgress->amount())); } } @@ -17101,11 +17102,12 @@ bool CCharacter::pickUpRawMaterial(uint32 indexInTempInv, bool* lastMaterial) sint32 modifier = max(modifierL, modifierR); - if (modifier >= 0 && (rand() % 1000) < modifier) + if (modifier >= 0 && (rand() % 1000) < (uint32)(modifier*ArkLootExtraModifierMultiplier)) { SM_STATIC_PARAMS_1(params, STRING_MANAGER::sbrick); params[0].SheetId = usedSheet; - sendDynamicSystemMessage(_Id, "ALLEGORY_EFFECT_TRIGGERED", params); + // Arkloot script will trigger it + // sendDynamicSystemMessage(_Id, "ALLEGORY_EFFECT_TRIGGERED", params); sendUrl(toString("app_arcc action=mScript_Run&script_name=ArkLoot&type=Loot&quality=%d&quantity=%d&command=reset_all", (uint32)quality, (uint32)mp->Quantity)); } } From c8204acb7ad91998923930dbdec3ac5ff4448546 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Fri, 31 Mar 2023 14:06:14 +0200 Subject: [PATCH 021/194] Fix guild points --- ryzom/common/src/game_share/entity_types.h | 2 +- .../server/src/entities_game_service/egs_variables.cpp | 1 + .../src/entities_game_service/guild_manager/guild.cpp | 2 +- .../guild_manager/guild_version_adapter.cpp | 10 +++++++++- .../guild_manager/guild_version_adapter.h | 1 + 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ryzom/common/src/game_share/entity_types.h b/ryzom/common/src/game_share/entity_types.h index 6087b33bbe..7645c28a99 100644 --- a/ryzom/common/src/game_share/entity_types.h +++ b/ryzom/common/src/game_share/entity_types.h @@ -157,7 +157,7 @@ const TCoord THRESHOLD_VPB = MAX_THRESHOLD; // Visual property C const TPropIndex PROPERTY_VPC = 11; -const TCoord THRESHOLD_VPC = 10000; +const TCoord THRESHOLD_VPC = MAX_THRESHOLD; // Entity mounted const TPropIndex PROPERTY_ENTITY_MOUNTED_ID = 12; diff --git a/ryzom/server/src/entities_game_service/egs_variables.cpp b/ryzom/server/src/entities_game_service/egs_variables.cpp index 3202a39256..fc67192883 100644 --- a/ryzom/server/src/entities_game_service/egs_variables.cpp +++ b/ryzom/server/src/entities_game_service/egs_variables.cpp @@ -426,6 +426,7 @@ CVariable<sint16> MinFameToBuyGuildBuilding("egs","MinFameToBuyGuildBuilding", " CVariable<sint16> MinFameToBuyPlayerBuilding("egs","MinFameToBuyPlayerBuilding", "Minimum Fame To Buy a Player Building", 0, 0, true); CVariable<uint32> GuildCreationCost("egs","GuildCreationCost", "", 100, 0, true); CVariable<uint32> GuildMaxMemberCount("egs","GuildMaxMemberCount", "", 256, 0, true); +CVariable<uint32> GuildMaxPoints("egs","GuildMaxPoints", "", 200, 0, true); CVariable<NLMISC::TGameCycle> TriggerRequestTimout("egs","TriggerRequestTimout", "", 300, 0, true); diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp index d7669a806e..5214c9a0ea 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp @@ -136,7 +136,7 @@ void CGuild::spendXP( uint32 xp ) //---------------------------------------------------------------------------- void CGuild::addXP( uint32 xp ) { - if (_XP < 1000) // TEMPORARY LIMIT : must be removed when added more stuff to pay with guild points + if (_XP < GuildMaxPoints) { setXP( _XP + xp ); CBankAccessor_GUILD::getGUILD().setXP(_DbGroup, _XP); diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild_version_adapter.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild_version_adapter.cpp index 0eda589063..f688d090fe 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild_version_adapter.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild_version_adapter.cpp @@ -47,8 +47,9 @@ uint32 CGuildVersionAdapter::currentVersionNumber() const // 3 : (01/11/2004) guild allegiance of previous existing guild setted to undefined... // 4 : (07/03/2006) give full hp to all tools // 5 : (13/03/2023) reset guild points + // 6 : (31/03/2023) set guild points to 100 (default) //////////////////////////////////// - return 5; + return 6; } @@ -63,6 +64,7 @@ void CGuildVersionAdapter::adaptGuildFromVersion( CGuild & guild ) const case 2: break; //adaptToVersion3(guild); // when we change guild save and have currentVersion = 4, we can re-active adapter (we can re-active case 3: adaptToVersion4(guild); case 4: adaptToVersion5(guild); + case 5: adaptToVersion6(guild); default:; // the adapter at the next patch in fact... } @@ -108,5 +110,11 @@ void CGuildVersionAdapter::adaptToVersion5(CGuild & guild) const guild.setPoints(0); } +//--------------------------------------------------- +void CGuildVersionAdapter::adaptToVersion6(CGuild & guild) const +{ + guild.setPoints(50); +} + diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild_version_adapter.h b/ryzom/server/src/entities_game_service/guild_manager/guild_version_adapter.h index 6dcd27f743..e020d8254b 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild_version_adapter.h +++ b/ryzom/server/src/entities_game_service/guild_manager/guild_version_adapter.h @@ -49,6 +49,7 @@ class CGuildVersionAdapter void adaptToVersion3(CGuild &guild) const; void adaptToVersion4(CGuild &guild) const; void adaptToVersion5(CGuild &guild) const; + void adaptToVersion6(CGuild &guild) const; private: CGuildVersionAdapter(){} From 21e6ee12d1e25adbf3e58cdfbac24ca8a6a03810 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Fri, 31 Mar 2023 15:37:41 +0200 Subject: [PATCH 022/194] Miss --- ryzom/server/src/entities_game_service/egs_variables.h | 1 + 1 file changed, 1 insertion(+) diff --git a/ryzom/server/src/entities_game_service/egs_variables.h b/ryzom/server/src/entities_game_service/egs_variables.h index 25df74de73..7565ef87ff 100644 --- a/ryzom/server/src/entities_game_service/egs_variables.h +++ b/ryzom/server/src/entities_game_service/egs_variables.h @@ -303,6 +303,7 @@ extern NLMISC::CVariable<sint16> MinFameToBuyGuildBuilding; extern NLMISC::CVariable<sint16> MinFameToBuyPlayerBuilding; extern NLMISC::CVariable<uint32> GuildCreationCost; extern NLMISC::CVariable<uint32> GuildMaxMemberCount; +extern NLMISC::CVariable<float> GuildMaxPoints; extern NLMISC::CVariable<NLMISC::TGameCycle> TriggerRequestTimout; From 1ec4fb0443f28845057c9a627497311425315592 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Fri, 31 Mar 2023 15:42:03 +0200 Subject: [PATCH 023/194] Fix --- ryzom/server/src/entities_game_service/egs_variables.cpp | 2 +- ryzom/server/src/entities_game_service/egs_variables.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ryzom/server/src/entities_game_service/egs_variables.cpp b/ryzom/server/src/entities_game_service/egs_variables.cpp index 61c3017051..de5c38297b 100644 --- a/ryzom/server/src/entities_game_service/egs_variables.cpp +++ b/ryzom/server/src/entities_game_service/egs_variables.cpp @@ -425,7 +425,7 @@ CVariable<sint16> MinFameToBuyGuildBuilding("egs","MinFameToBuyGuildBuilding", " CVariable<sint16> MinFameToBuyPlayerBuilding("egs","MinFameToBuyPlayerBuilding", "Minimum Fame To Buy a Player Building", 0, 0, true); CVariable<uint32> GuildCreationCost("egs","GuildCreationCost", "", 100, 0, true); CVariable<uint32> GuildMaxMemberCount("egs","GuildMaxMemberCount", "", 256, 0, true); -CVariable<uint32> GuildMaxPoints("egs","GuildMaxPoints", "", 200, 0, true); +CVariable<float> GuildMaxPoints("egs","GuildMaxPoints", "", 200, 0, true); CVariable<NLMISC::TGameCycle> TriggerRequestTimout("egs","TriggerRequestTimout", "", 300, 0, true); diff --git a/ryzom/server/src/entities_game_service/egs_variables.h b/ryzom/server/src/entities_game_service/egs_variables.h index 7565ef87ff..eee9eea1b1 100644 --- a/ryzom/server/src/entities_game_service/egs_variables.h +++ b/ryzom/server/src/entities_game_service/egs_variables.h @@ -303,7 +303,7 @@ extern NLMISC::CVariable<sint16> MinFameToBuyGuildBuilding; extern NLMISC::CVariable<sint16> MinFameToBuyPlayerBuilding; extern NLMISC::CVariable<uint32> GuildCreationCost; extern NLMISC::CVariable<uint32> GuildMaxMemberCount; -extern NLMISC::CVariable<float> GuildMaxPoints; +extern NLMISC::CVariable<float> GuildMaxPoints; extern NLMISC::CVariable<NLMISC::TGameCycle> TriggerRequestTimout; From 508248badcbdd47b36b594defd8f5ec3b6b6486e Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Fri, 31 Mar 2023 15:49:45 +0200 Subject: [PATCH 024/194] Fix GP --- .../mission_manager/missions_commands.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index d0ce37cbc0..45a918a526 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -1054,7 +1054,7 @@ string getJewelEnchantAttr(CSheetId sbrick) //enchantEquipedItem 2 FingerL jloot_generic.sbrick,jboost_100x.sbrick -//enchantEquipedItem 2 FingerL jloot_forage.sbrick,jboost_100x.sbrick +//enchantEquipedItem 2 FingerL jloot_forage.sbrick,jboost_1000x.sbrick //enchantEquipedItem 2 FingerR jloot_hunt.sbrick,jboost_100x.sbrick //enchantEquipedItem 2 Neck jrez_lastpoint.sbrick,jboost_100x.sbrick //enchantEquipedItem 2 WristR jmod_focus_tryker_1.sbrick @@ -3545,6 +3545,7 @@ NLMISC_COMMAND(setGuildPoints, "get/set the guild points", "<uid> <value>") { fromString(quant.substr(1), quantity); points += quantity; + guild->addXP(quantity); } } else if (quant[0] == '-') @@ -3561,14 +3562,14 @@ NLMISC_COMMAND(setGuildPoints, "get/set the guild points", "<uid> <value>") log.displayNL("ERR: not enough"); // No enough points return true; } + guild->spendXP(quantity); } } else { fromString(quant, points); + guild->setPoints(points); } - - guild->setPoints(points); } log.displayNL("%u", points); From dc479deeadf331fc1602b424ee90e13d0afd055c Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Fri, 31 Mar 2023 15:51:17 +0200 Subject: [PATCH 025/194] Fix --- ryzom/server/src/entities_game_service/egs_variables.cpp | 2 +- ryzom/server/src/entities_game_service/egs_variables.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ryzom/server/src/entities_game_service/egs_variables.cpp b/ryzom/server/src/entities_game_service/egs_variables.cpp index de5c38297b..61c3017051 100644 --- a/ryzom/server/src/entities_game_service/egs_variables.cpp +++ b/ryzom/server/src/entities_game_service/egs_variables.cpp @@ -425,7 +425,7 @@ CVariable<sint16> MinFameToBuyGuildBuilding("egs","MinFameToBuyGuildBuilding", " CVariable<sint16> MinFameToBuyPlayerBuilding("egs","MinFameToBuyPlayerBuilding", "Minimum Fame To Buy a Player Building", 0, 0, true); CVariable<uint32> GuildCreationCost("egs","GuildCreationCost", "", 100, 0, true); CVariable<uint32> GuildMaxMemberCount("egs","GuildMaxMemberCount", "", 256, 0, true); -CVariable<float> GuildMaxPoints("egs","GuildMaxPoints", "", 200, 0, true); +CVariable<uint32> GuildMaxPoints("egs","GuildMaxPoints", "", 200, 0, true); CVariable<NLMISC::TGameCycle> TriggerRequestTimout("egs","TriggerRequestTimout", "", 300, 0, true); diff --git a/ryzom/server/src/entities_game_service/egs_variables.h b/ryzom/server/src/entities_game_service/egs_variables.h index eee9eea1b1..ab952d81e0 100644 --- a/ryzom/server/src/entities_game_service/egs_variables.h +++ b/ryzom/server/src/entities_game_service/egs_variables.h @@ -271,6 +271,7 @@ extern NLMISC::CVariable<float> ForageExtractionXPFactor; extern NLMISC::CVariable<float> ForageExtractionNbParticipantsXPBonusRatio; extern NLMISC::CVariable<float> ForageExtractionNastyEventXPMalusRatio; extern NLMISC::CVariable<uint32> ArkLootTimeBeforeNewDraw; +extern NLMISC::CVariable<float> ArkLootExtraModifierMultiplier; extern NLMISC::CVariable<float> ForageKamiOfferingSpeed; extern NLMISC::CVariable<uint32> ForageReduceDamageTimeWindow; extern NLMISC::CVariable<uint32> ForageDebug; @@ -303,7 +304,7 @@ extern NLMISC::CVariable<sint16> MinFameToBuyGuildBuilding; extern NLMISC::CVariable<sint16> MinFameToBuyPlayerBuilding; extern NLMISC::CVariable<uint32> GuildCreationCost; extern NLMISC::CVariable<uint32> GuildMaxMemberCount; -extern NLMISC::CVariable<float> GuildMaxPoints; +extern NLMISC::CVariable<uint32> GuildMaxPoints; extern NLMISC::CVariable<NLMISC::TGameCycle> TriggerRequestTimout; From 12776eb108e7c4adccd32008de72a21c9c06f32d Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Thu, 27 Apr 2023 11:43:00 +0200 Subject: [PATCH 026/194] Improve notify.sh --- ryzom/server/tools/notify.sh | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/ryzom/server/tools/notify.sh b/ryzom/server/tools/notify.sh index 7f9990b526..1279eb7420 100755 --- a/ryzom/server/tools/notify.sh +++ b/ryzom/server/tools/notify.sh @@ -25,29 +25,50 @@ if [[ "$COMMAND" == "ServiceStarted" ]] then if [[ ! -z "$NOTIFY_URL_SERVICE_RESTARTED" ]] then - echo "nofitiy $(hostname -s):$2 started" + echo "Nofitiy $(hostname -s):$2 started" curl "$NOTIFY_URL_SERVICE_RESTARTED?command=started&shard=$(hostname -s)&apikey=$NOTIFY_URL_KEY&service=$2" & 2> /dev/null + echo $COMMAND > $SHARD_PATH/states/$2.txt + fi +elif [[ "$COMMAND" == "ServiceStarting" ]] +then + if [[ ! -z "$NOTIFY_URL_SERVICE_RESTARTED" ]] + then + echo "Nofitiy $(hostname -s):$2 starting" + curl "$NOTIFY_URL_SERVICE_RESTARTED?command=starting&shard=$(hostname -s)&apikey=$NOTIFY_URL_KEY&service=$2" & 2> /dev/null + echo $COMMAND > $SHARD_PATH/states/$2.txt fi elif [[ "$COMMAND" == "ServiceStopped" ]] then if [[ ! -z "$NOTIFY_URL_SERVICE_RESTARTED" ]] then - echo "nofitiy $(hostname -s):$2 stopped" + echo "Nofitiy $(hostname -s):$2 stopped" curl "$NOTIFY_URL_SERVICE_RESTARTED?command=stopped&shard=$(hostname -s)&apikey=$NOTIFY_URL_KEY&service=$2" & 2> /dev/null + echo $COMMAND > $SHARD_PATH/states/$2.txt fi elif [[ "$COMMAND" == "ShardStopped" ]] then if [[ ! -z "$NOTIFY_URL_SERVICE_RESTARTED" ]] then - echo "nofitiy $(hostname -s):$2 shard stopped" + echo "Nofitiy $(hostname -s):$2 shard stopped" curl "$NOTIFY_URL_SERVICE_RESTARTED?command=shard_stopped&shard=$(hostname -s)&apikey=$NOTIFY_URL_KEY" & 2> /dev/null + echo $COMMAND > $SHARD_PATH/states/shard.txt fi elif [[ "$COMMAND" == "ShardStarted" ]] then if [[ ! -z "$NOTIFY_URL_SERVICE_RESTARTED" ]] then - echo "nofitiy $(hostname -s):$2 shard started" + echo "Nofitiy $(hostname -s):$2 shard started" curl "$NOTIFY_URL_SERVICE_RESTARTED?command=shard_started&shard=$(hostname -s)&apikey=$NOTIFY_URL_KEY" & 2> /dev/null + echo $COMMAND > $SHARD_PATH/states/shard.txt + fi +elif [[ "$COMMAND" == "ShardStarting" ]] +then + if [[ ! -z "$NOTIFY_URL_SERVICE_RESTARTED" ]] + then + echo "Nofitiy $(hostname -s):$2 shard starting" + curl "$NOTIFY_URL_SERVICE_RESTARTED?command=shard_starting&shard=$(hostname -s)&apikey=$NOTIFY_URL_KEY" & 2> /dev/null + echo $COMMAND > $SHARD_PATH/states/shard.txt fi fi +sleep 1 From 50f663afcac064525ed6ecb486e17f2d6c75641e Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Thu, 27 Apr 2023 16:12:30 +0200 Subject: [PATCH 027/194] Update --- ryzom/server/tools/service_launcher.sh | 45 +++++++++++++++++++++----- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/ryzom/server/tools/service_launcher.sh b/ryzom/server/tools/service_launcher.sh index 4c74b61d50..6040830aff 100755 --- a/ryzom/server/tools/service_launcher.sh +++ b/ryzom/server/tools/service_launcher.sh @@ -76,22 +76,51 @@ do #notify start - if [ "$NAME" = "egs" ] || [ "$NAME" = "ios" ] || [ "$NAME" = "gpms" ] + if [[ "$NAME" == "ais_fyros" ]] || [[ "$NAME" == "ais_matis" ]] || [[ "$NAME" == "ais_tryker" ]] || [[ "$NAME" == "ais_roots" ]] || [[ "$NAME" == "ais_zorai" ]] || [[ "$NAME" == "ais_ark" ]] then + touch "$SHARD_PATH/logs/ai_service_${NAME}.log" + "$CWD/wait_and_notify.sh" "$SHARD_PATH/logs/ai_service_${NAME}.log" "[[ARK]] AIS UP" $NAME 0 & + sleep 4 + elif [[ "$NAME" == "egs" ]] + then + touch "$SHARD_PATH/logs/entities_game_service.log" + "$CWD/wait_and_notify.sh" "$SHARD_PATH/logs/entities_game_service.log" "onAiInstanceReady : AI Instance 1 is up" $NAME 0 & sleep 2 - elif [ "$NAME" = "ais_fyros" ] || [ "$NAME" = "ais_matis" ] || [ "$NAME" = "ais_tryker" ] || [ "$NAME" = "ais_roots" ] || [ "$NAME" = "ais_zorai" ] || [ "$NAME" = "ais_ark" ] + elif [[ "$NAME" == "ios" ]] then - sleep 4 + touch "$SHARD_PATH/logs/input_output_service.log" + "$CWD/wait_and_notify.sh" "$SHARD_PATH/logs/input_output_service.log" "cbDynChatAddChan: add channel : FACTION_MARAUDER" $NAME 0 & + sleep 2 + elif [[ "$NAME" == "gpms" ]] + then + touch "$SHARD_PATH/logs/gpm_service.log" + "$CWD/wait_and_notify.sh" "$SHARD_PATH/logs/gpm_service.log" "cbCreateIndoorUnit : MSG: Creating indoor unit 256" $NAME 0 & + sleep 2 + else + declare -A ServiceLogs + ServiceLogs[aes] = "admin_executor_service.log" + ServiceLogs[bms_master] = "backup_service.log" + ServiceLogs[fes] = "frontend_service.log" + ServiceLogs[las] = "log_analyser_service.log" + ServiceLogs[lgs] = "logger_service.log" + ServiceLogs[mos] = "monitor_service.log" + ServiceLogs[ms] = "mirror_service.log" + ServiceLogs[ras] = "admin_service.log" + ServiceLogs[rns] = "naming_service.log" + ServiceLogs[rws] = "welcome_service.log" + ServiceLogs[sbs] = "session_browser_server.log" + ServiceLogs[su] = "shard_unifier_service.log" + ServiceLogs[ts] = "tick_service.log" + + touch "$SHARD_PATH/logs/${ServiceLogs[$NAME]}" + "$CWD/wait_and_notify.sh" "$SHARD_PATH/logs/${ServiceLogs[$NAME]}" "SERVICE: Service ready" $NAME 2 & fi - - echo "notifying $CWD/notify.sh ServiceStarted $NAME" - "$CWD/notify.sh" ServiceStarted $NAME - + export LC_ALL=C; unset LANGUAGE if [[ "$USE_GDB" == "1" ]] then - if [ "$NAME" = "egs" ] || [ "$NAME" = "ios" ] || [ "$NAME" = "ais_fyros" ] || [ "$NAME" = "ais_matis" ] || [ "$NAME" = "ais_tryker" ] || [ "$NAME" = "ais_roots" ] || [ "$NAME" = "ais_zorai" ] || [ "$NAME" = "ais_ark" ] || [ "$NAME" = "gpms" ] + if [[ "$NAME" == "egs" ]] || [[ "$NAME" == "ios" ]] || [[ "$NAME" == "ais_fyros" ]] || [[ "$NAME" == "ais_matis" ]] || [[ "$NAME" == "ais_tryker" ]] || [[ "$NAME" == "ais_roots" ]] || [[ "$NAME" == "ais_zorai" ]] || [[ "$NAME" == "ais_ark" ]] || [[ "$NAME" == "gpms" ]] then echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SHARD_PATH/lib gdb -batch -ex 'set logging file $NAME/gdb_dump.txt' -ex 'set logging on' -ex 'run $CTRL_CMDLINE' -ex 'bt' $EXECUTABLE" > /tmp/run_$NAME else From e3306ba07f65e41e2b42289ec265c34f3601fac5 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Sun, 30 Apr 2023 15:21:23 +0200 Subject: [PATCH 028/194] Fixes --- .gitignore | 4 + ryzom/server/www/.htaccess | 8 + ryzom/server/www/libs/.htaccess | 1 + ryzom/server/www/libs/nel_message.php | 592 +++++++++++++------------- ryzom/server/www/tools/.htaccess | 1 + 5 files changed, 310 insertions(+), 296 deletions(-) create mode 100644 ryzom/server/www/.htaccess create mode 100644 ryzom/server/www/libs/.htaccess create mode 100644 ryzom/server/www/tools/.htaccess diff --git a/.gitignore b/.gitignore index 51a5071f78..f50164ac22 100644 --- a/.gitignore +++ b/.gitignore @@ -271,3 +271,7 @@ web/public_php/db_version_ring web/public_php/config_user.php nel/tools/build_gamedata/processes/pz/build_world_packed_col.cfg nel/tools/build_gamedata/processes/cartographer/island_screenshots.cfg + +# Configs +ryzom/server/www/config.php +ryzom/server/tools/config.sh diff --git a/ryzom/server/www/.htaccess b/ryzom/server/www/.htaccess new file mode 100644 index 0000000000..b47d2b304e --- /dev/null +++ b/ryzom/server/www/.htaccess @@ -0,0 +1,8 @@ +<FilesMatch "\.(log)$"> + Deny from all +</FilesMatch> + +<FilesMatch "config.*$"> + Deny from all +</FilesMatch> + diff --git a/ryzom/server/www/libs/.htaccess b/ryzom/server/www/libs/.htaccess new file mode 100644 index 0000000000..3a42882788 --- /dev/null +++ b/ryzom/server/www/libs/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/ryzom/server/www/libs/nel_message.php b/ryzom/server/www/libs/nel_message.php index d8669f1e44..65a415ddf0 100644 --- a/ryzom/server/www/libs/nel_message.php +++ b/ryzom/server/www/libs/nel_message.php @@ -1,296 +1,296 @@ -<?php - - $SockTimeOut = 10; - - function debug($text) - { -// flush(); -// echo $text; - } - - class CMemStream - { - var $Buffer; - var $InputStream; - var $Pos; - - function CMemStream () - { - $this->InputStream = false; - $this->Pos = 0; - $this->Buffer = ""; - debug("A : ".gettype($this->Buffer)."<br>"); - } - - function setBuffer ($Buffer) - { - $this->InputStream = true; - $this->Buffer = $Buffer; - $this->Pos = 0; - } - - function isReading () { return $this->InputStream; } - - function serialUInt8 (&$val) - { - if ($this->isReading()) - { - $val = ord($this->Buffer{$this->Pos++}); - debug(sprintf ("read uint8 '%d'<br>\n", $val)); - } - else - { - debug("B".gettype($this->Buffer)."<br>"); - debug(sprintf ("write uint8 Buffer size before = %u<br>\n", strlen($this->Buffer))); - $this->Buffer = $this->Buffer . chr($val & 0xFF); - $this->Pos++; - debug("C".gettype($this->Buffer)."<br>"); - debug(sprintf ("write uint8 '%d' %d<br>\n", $val, $this->Pos)); - debug(sprintf ("write uint8 Buffer size after = %u<br>\n", strlen($this->Buffer))); - } - } - - function serialUInt32 (&$val) - { - if ($this->isReading()) - { - $val = ord($this->Buffer{$this->Pos++}); - $val += ord($this->Buffer{$this->Pos++})*256; - $val += ord($this->Buffer{$this->Pos++})*(double)256*256; - $val += ord($this->Buffer{$this->Pos++})*(double)256*256*256; - debug(sprintf ("read uint32 '%d'<br>\n", $val)); -// var_dump($val); - } - else - { - debug("D".gettype($this->Buffer)."<br>"); - $this->Buffer .= chr($val & 0xFF); - $this->Buffer .= chr(($val>>8) & 0xFF); - $this->Buffer .= chr(($val>>16) & 0xFF); - $this->Buffer .= chr(($val>>24) & 0xFF); - $this->Pos += 4; - debug("E".gettype($this->Buffer)."<br>"); - debug(sprintf ("write uint32 '%d' %d<br>\n", $val, $this->Pos)); - } - } - - function serialString (&$val) - { - if ($this->isReading()) - { - $this->serialUInt32($size); - debug(sprintf ("read string : size = %u<br>\n", $size)); - $val = substr ($this->Buffer, $this->Pos, $size); - debug(sprintf ("read string '%s'<br>\n", $val)); - $this->Pos += strlen($val); - } - else - { - $valLen = strlen($val); - $this->serialUInt32($valLen); - $this->Buffer .= $val; - $this->Pos += $valLen; - debug(sprintf ("write string '%s' %d<br>\n", $val, $this->Pos)); - } - } - function serialEnum (&$val) - { - if ($this->isReading()) - { - $intValue = 0; - $this->serialUInt32($intValue); - $val->fromInt((int)$intValue); - debug(sprintf ("read enum '%s'<br>\n", $val->toString())); - } - else - { - $intValue = $val->toInt(); - $this->serialUInt32($intValue); - debug(sprintf ("write enum '%s' %d<br>\n", $val->toString(), $this->Pos)); - } - } - } - - class CMessage extends CMemStream - { - var $MsgName; - - function CMessage() - { - $this->CMemStream(); - } - - function setName($name) - { - $this->MsgName = $name; - } - } - - class CCallbackClient - { - var $ConSock = false; - - var $MsgNum = 0; - - function connect($addr, $port, &$res) - { - global $SockTimeOut; - - debug(sprintf("Connect<br>")); - $this->MsgNum = 0; - - $this->ConSock = fsockopen ($addr, $port, $errno, $errstr, $SockTimeOut); - debug("H".gettype($this->ConSock)."<br>"); - - if (!$this->ConSock) - { - $res = "Can't connect to the callback server '$addr:$port' ($errno: $errstr)"; - - return false; - } - else - { - // set time out on the socket to 2 secondes - stream_set_timeout($this->ConSock, $SockTimeOut); - $res = ""; - return true; - } - } - - function close() - { - if ($this->ConSock) - { - fclose($this->ConSock); - debug(sprintf("Close<br>")); - } - else - debug(sprintf("Already Closed !<br>")); - } - - function sendMessage(&$message) - { - if (!$this->ConSock) - { - debug(sprintf ("Socket is not valid\n")); - return false; - } - debug(sprintf ("sendMessage : message Buffer is '%d'<br>\n", $message->Pos)); - debug(sprintf ("sendMessage : message Buffer is '%d'<br>\n", strlen($message->Buffer))); - $hd = new CMemStream; - debug(sprintf("SendMessage number %u<br>", $this->MsgNum)); - $hd->serialUInt32 ($this->MsgNum); // number the packet - $this->MsgNum += 1; - debug(sprintf("After SendMessage, number %u<br>", $this->MsgNum)); - $messageType = 0; - $hd->serialUInt8 ($messageType); - $hd->serialString ($message->MsgName); - - debug(sprintf ("sendMessage : header size is '%d'<br>\n", $hd->Pos)); - -// $sb .= $message->Buffer; - - $size = $hd->Pos + $message->Pos; - $Buffer = (string) chr(($size>>24)&0xFF); - $Buffer .= chr(($size>>16)&0xFF); - $Buffer .= chr(($size>>8)&0xFF); - $Buffer .= chr($size&0xFF); - debug( "E".gettype($hd->Buffer)."<br>"); - debug("F".gettype($message->Buffer)."<br>"); - $Buffer .= (string) $hd->Buffer; - $Buffer .= (string) $message->Buffer; - - debug("G".gettype($this->ConSock)."<br>"); - - if (!fwrite ($this->ConSock, $Buffer)) - { - debug(sprintf ("Error writing to socket\n")); - return false; - } - debug(sprintf ("sent packet size '%d' (written size = %d) <br>\n", strlen($Buffer), $size)); - fflush ($this->ConSock); - - return true; - } - - function waitMessage() - { - if (!$this->ConSock) - { - debug(sprintf ("Socket is not valid\n")); - return false; - } - - - $size = 0; - $val = fread ($this->ConSock, 1); - $info = stream_get_meta_data($this->ConSock); - if ($info['timed_out']) - { - debug('Connection timed out!'); - return false; - } - $size = ord($val) << 24; - $val = fread ($this->ConSock, 1); - $info = stream_get_meta_data($this->ConSock); - if ($info['timed_out']) - { - debug('Connection timed out!'); - return false; - } - $size = ord($val) << 16; - $val = fread ($this->ConSock, 1); - $info = stream_get_meta_data($this->ConSock); - if ($info['timed_out']) - { - debug('Connection timed out!'); - return false; - } - $size += ord($val) << 8; - $val = fread ($this->ConSock, 1); - $info = stream_get_meta_data($this->ConSock); - if ($info['timed_out']) - { - debug('Connection timed out!'); - return false; - } - $size += ord($val); - debug(sprintf ("receive packet size '%d'<br>\n", $size)); - $fake = fread ($this->ConSock, 5); - $info = stream_get_meta_data($this->ConSock); - if ($info['timed_out']) - { - debug('Connection timed out!'); - return false; - } - $size -= 5; // remove the fake - - $Buffer = ""; - while ($size > 0 && strlen($Buffer) != $size) - { - $Buffer .= fread ($this->ConSock, $size - strlen($Buffer)); - $info = stream_get_meta_data($this->ConSock); - if ($info['timed_out']) - { - debug('Connection timed out!'); - return false; - } - } - $msgin = new CMemStream; - $msgin->setBuffer ($Buffer); - - // decode msg name - $msgin->serialString($name); - - debug(sprintf("Message name = '%s'<BR>", $name)); - $message = new CMessage; - $message->setBuffer(substr($msgin->Buffer, $msgin->Pos)); - $message->setName($name); - - debug(sprintf("In message name = '%s'<br>", $message->MsgName)); - - return $message; - } - } - -?> +<?php + + $SockTimeOut = 10; + + function debug($text) + { +// flush(); +// echo $text; + } + + class CMemStream + { + var $Buffer; + var $InputStream; + var $Pos; + + function CMemStream () + { + $this->InputStream = false; + $this->Pos = 0; + $this->Buffer = ""; + debug("A : ".gettype($this->Buffer)."<br>"); + } + + function setBuffer ($Buffer) + { + $this->InputStream = true; + $this->Buffer = $Buffer; + $this->Pos = 0; + } + + function isReading () { return $this->InputStream; } + + function serialUInt8 (&$val) + { + if ($this->isReading()) + { + $val = ord($this->Buffer[$this->Pos++]); + debug(sprintf ("read uint8 '%d'<br>\n", $val)); + } + else + { + debug("B".gettype($this->Buffer)."<br>"); + debug(sprintf ("write uint8 Buffer size before = %u<br>\n", strlen($this->Buffer))); + $this->Buffer = $this->Buffer . chr($val & 0xFF); + $this->Pos++; + debug("C".gettype($this->Buffer)."<br>"); + debug(sprintf ("write uint8 '%d' %d<br>\n", $val, $this->Pos)); + debug(sprintf ("write uint8 Buffer size after = %u<br>\n", strlen($this->Buffer))); + } + } + + function serialUInt32 (&$val) + { + if ($this->isReading()) + { + $val = ord($this->Buffer[$this->Pos++]); + $val += ord($this->Buffer[$this->Pos++])*256; + $val += ord($this->Buffer[$this->Pos++])*(double)256*256; + $val += ord($this->Buffer[$this->Pos++])*(double)256*256*256; + debug(sprintf ("read uint32 '%d'<br>\n", $val)); +// var_dump($val); + } + else + { + debug("D".gettype($this->Buffer)."<br>"); + $this->Buffer .= chr($val & 0xFF); + $this->Buffer .= chr(($val>>8) & 0xFF); + $this->Buffer .= chr(($val>>16) & 0xFF); + $this->Buffer .= chr(($val>>24) & 0xFF); + $this->Pos += 4; + debug("E".gettype($this->Buffer)."<br>"); + debug(sprintf ("write uint32 '%d' %d<br>\n", $val, $this->Pos)); + } + } + + function serialString (&$val) + { + if ($this->isReading()) + { + $this->serialUInt32($size); + debug(sprintf ("read string : size = %u<br>\n", $size)); + $val = substr ($this->Buffer, $this->Pos, $size); + debug(sprintf ("read string '%s'<br>\n", $val)); + $this->Pos += strlen($val); + } + else + { + $valLen = strlen($val); + $this->serialUInt32($valLen); + $this->Buffer .= $val; + $this->Pos += $valLen; + debug(sprintf ("write string '%s' %d<br>\n", $val, $this->Pos)); + } + } + function serialEnum (&$val) + { + if ($this->isReading()) + { + $intValue = 0; + $this->serialUInt32($intValue); + $val->fromInt((int)$intValue); + debug(sprintf ("read enum '%s'<br>\n", $val->toString())); + } + else + { + $intValue = $val->toInt(); + $this->serialUInt32($intValue); + debug(sprintf ("write enum '%s' %d<br>\n", $val->toString(), $this->Pos)); + } + } + } + + class CMessage extends CMemStream + { + var $MsgName; + + function CMessage() + { + $this->CMemStream(); + } + + function setName($name) + { + $this->MsgName = $name; + } + } + + class CCallbackClient + { + var $ConSock = false; + + var $MsgNum = 0; + + function connect($addr, $port, &$res) + { + global $SockTimeOut; + + debug(sprintf("Connect<br>")); + $this->MsgNum = 0; + + $this->ConSock = fsockopen ($addr, $port, $errno, $errstr, $SockTimeOut); + debug("H".gettype($this->ConSock)."<br>"); + + if (!$this->ConSock) + { + $res = "Can't connect to the callback server '$addr:$port' ($errno: $errstr)"; + + return false; + } + else + { + // set time out on the socket to 2 secondes + stream_set_timeout($this->ConSock, $SockTimeOut); + $res = ""; + return true; + } + } + + function close() + { + if ($this->ConSock) + { + fclose($this->ConSock); + debug(sprintf("Close<br>")); + } + else + debug(sprintf("Already Closed !<br>")); + } + + function sendMessage(&$message) + { + if (!$this->ConSock) + { + debug(sprintf ("Socket is not valid\n")); + return false; + } + debug(sprintf ("sendMessage : message Buffer is '%d'<br>\n", $message->Pos)); + debug(sprintf ("sendMessage : message Buffer is '%d'<br>\n", strlen($message->Buffer))); + $hd = new CMemStream; + debug(sprintf("SendMessage number %u<br>", $this->MsgNum)); + $hd->serialUInt32 ($this->MsgNum); // number the packet + $this->MsgNum += 1; + debug(sprintf("After SendMessage, number %u<br>", $this->MsgNum)); + $messageType = 0; + $hd->serialUInt8 ($messageType); + $hd->serialString ($message->MsgName); + + debug(sprintf ("sendMessage : header size is '%d'<br>\n", $hd->Pos)); + +// $sb .= $message->Buffer; + + $size = $hd->Pos + $message->Pos; + $Buffer = (string) chr(($size>>24)&0xFF); + $Buffer .= chr(($size>>16)&0xFF); + $Buffer .= chr(($size>>8)&0xFF); + $Buffer .= chr($size&0xFF); + debug( "E".gettype($hd->Buffer)."<br>"); + debug("F".gettype($message->Buffer)."<br>"); + $Buffer .= (string) $hd->Buffer; + $Buffer .= (string) $message->Buffer; + + debug("G".gettype($this->ConSock)."<br>"); + + if (!fwrite ($this->ConSock, $Buffer)) + { + debug(sprintf ("Error writing to socket\n")); + return false; + } + debug(sprintf ("sent packet size '%d' (written size = %d) <br>\n", strlen($Buffer), $size)); + fflush ($this->ConSock); + + return true; + } + + function waitMessage() + { + if (!$this->ConSock) + { + debug(sprintf ("Socket is not valid\n")); + return false; + } + + + $size = 0; + $val = fread ($this->ConSock, 1); + $info = stream_get_meta_data($this->ConSock); + if ($info['timed_out']) + { + debug('Connection timed out!'); + return false; + } + $size = ord($val) << 24; + $val = fread ($this->ConSock, 1); + $info = stream_get_meta_data($this->ConSock); + if ($info['timed_out']) + { + debug('Connection timed out!'); + return false; + } + $size = ord($val) << 16; + $val = fread ($this->ConSock, 1); + $info = stream_get_meta_data($this->ConSock); + if ($info['timed_out']) + { + debug('Connection timed out!'); + return false; + } + $size += ord($val) << 8; + $val = fread ($this->ConSock, 1); + $info = stream_get_meta_data($this->ConSock); + if ($info['timed_out']) + { + debug('Connection timed out!'); + return false; + } + $size += ord($val); + debug(sprintf ("receive packet size '%d'<br>\n", $size)); + $fake = fread ($this->ConSock, 5); + $info = stream_get_meta_data($this->ConSock); + if ($info['timed_out']) + { + debug('Connection timed out!'); + return false; + } + $size -= 5; // remove the fake + + $Buffer = ""; + while ($size > 0 && strlen($Buffer) != $size) + { + $Buffer .= fread ($this->ConSock, $size - strlen($Buffer)); + $info = stream_get_meta_data($this->ConSock); + if ($info['timed_out']) + { + debug('Connection timed out!'); + return false; + } + } + $msgin = new CMemStream; + $msgin->setBuffer ($Buffer); + + // decode msg name + $msgin->serialString($name); + + debug(sprintf("Message name = '%s'<BR>", $name)); + $message = new CMessage; + $message->setBuffer(substr($msgin->Buffer, $msgin->Pos)); + $message->setName($name); + + debug(sprintf("In message name = '%s'<br>", $message->MsgName)); + + return $message; + } + } + +?> diff --git a/ryzom/server/www/tools/.htaccess b/ryzom/server/www/tools/.htaccess new file mode 100644 index 0000000000..3a42882788 --- /dev/null +++ b/ryzom/server/www/tools/.htaccess @@ -0,0 +1 @@ +Deny from all From 8a7883e18aafff37548cb83912382455f881486e Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Mon, 8 May 2023 21:42:34 +0200 Subject: [PATCH 029/194] Fix ark commands --- .../mission_manager/missions_commands.cpp | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index 45a918a526..e65ef0f8f2 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -3589,7 +3589,7 @@ NLMISC_COMMAND(resetTodayGuildPoints, "reset the today guild points", "<uid>") } //---------------------------------------------------------------------------- -NLMISC_COMMAND(addPlayerPet, "add a pet to player", "<uid> <sheetid> [size] [name]") +NLMISC_COMMAND(addPlayerPet, "add a pet to player", "<uid> <sheetid> [size] [name] [clientsheet]") { if (args.size() < 2) return false; @@ -3599,19 +3599,23 @@ NLMISC_COMMAND(addPlayerPet, "add a pet to player", "<uid> <sheetid> [size] [nam CSheetId ticket = CSheetId(args[1]); uint8 size = 100; - if (args.size() >= 3) + if (args.size() > 2) fromString(args[2], size); ucstring customName; - if (args.size() >= 4) + if (args.size() >= 3) customName.fromUtf8(args[3]); + string clientSheet; + if (args.size() > 4) + clientSheet = args[4]; + if (ticket != CSheetId::Unknown) { CGameItemPtr item = c->createItemInInventoryFreeSlot(INVENTORIES::bag, 1, 1, ticket); if (item != 0) { - if (! c->addCharacterAnimal(ticket, 0, item, size, customName)) + if (! c->addCharacterAnimal(ticket, 0, item, size, customName, clientSheet)) { item.deleteItem(); log.displayNL("ERR: CAN'T ADD ANIMAL"); @@ -4310,17 +4314,39 @@ NLMISC_COMMAND(removeDp, "Update the DP", "<uid> <dp>") } -NLMISC_COMMAND(addBricks, "Specified player learns given brick", "<uid> <brick1,brick2>") +NLMISC_COMMAND(haveBricks, "Return list of player selected learned bricks", "<uid> <brick1,brick2>") { if (args.size() != 2) return false; GET_ACTIVE_CHARACTER + std::vector< std::string > bricks; + NLMISC::splitString(args[1], ",", bricks); + bool res = true; + for (uint32 i=0; i<bricks.size(); i++) + { + CSheetId brickId(bricks[i]); + if (c->haveBrick(brickId)) + log.displayNL(bricks[i].c_str()); + } + + return true; +} + + +NLMISC_COMMAND(addBricks, "Specified player learns given brick", "<uid> <brick1,brick2> [dont_add_again?]") +{ + if (args.size() < 2) return false; + GET_ACTIVE_CHARACTER + + bool checkHave = args.size() > 2 && args[2] == "1"; + std::vector< std::string > bricks; NLMISC::splitString(args[1], ",", bricks); for (uint32 i=0; i<bricks.size(); i++) { CSheetId brickId(bricks[i]); - c->addKnownBrick(brickId); + if (!c->haveBrick(brickId)) + c->addKnownBrick(brickId); } return true; } @@ -4332,7 +4358,10 @@ NLMISC_COMMAND(delBrick, "Specified player unlearns given brick", "<uid> <brick1 GET_ACTIVE_CHARACTER CSheetId brickId(args[1]); - c->removeKnownBrick(brickId); + if (c->haveBrick(brickId)) + c->removeKnownBrick(brickId); + else + log.displayNL("ERR: don't have brick"); return true; } From 39e04126a068c007f1254ee1ce59d77155853073 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Mon, 8 May 2023 21:45:23 +0200 Subject: [PATCH 030/194] Added aqua_speed for rite geo 50 tryker --- .../entities_game_service.cpp | 7 ++++--- .../mission_manager/missions_commands.cpp | 16 ++++++++++++++++ .../player_manager/character.cpp | 17 +++++++++++++++++ .../player_manager/character.h | 4 ++++ .../player_manager/character_inlines.h | 6 ++++++ 5 files changed, 47 insertions(+), 3 deletions(-) diff --git a/ryzom/server/src/entities_game_service/entities_game_service.cpp b/ryzom/server/src/entities_game_service/entities_game_service.cpp index f2d2b1cee7..4031b5f5b0 100644 --- a/ryzom/server/src/entities_game_service/entities_game_service.cpp +++ b/ryzom/server/src/entities_game_service/entities_game_service.cpp @@ -389,6 +389,7 @@ void processMirrorUpdates() { user->entersWater(); } + user->applyRegenAndClipCurrentValue(); } } TheDataset.endChangedValuesForProp(); @@ -672,7 +673,7 @@ string getServerInfos(float x, float y) pos.y = y; pos.z = 0; CRyzomTime::EWeather weather = WeatherEverywhere.getWeather(pos, CTimeDateSeasonManager::getRyzomTimeReference()); - + return toString("%f|%d|%s|%u", CTimeDateSeasonManager::getRyzomTimeReference().getRyzomTime(), CTimeDateSeasonManager::getRyzomTimeReference().getRyzomDay(), @@ -1642,7 +1643,7 @@ nlassert(nodeLeaf->getType() == ICDBStructNode::TEXT); // { // if( args.size() == 0 ) // return false; -// +// // NLMEMORY::StatisticsReport( args[0].c_str(), args.size() > 1 ); // return true; //} @@ -2047,7 +2048,7 @@ void cbMirrorUp( const std::string &serviceName, NLNET::TServiceId serviceId, vo IOSIsUp = true; nlinfo("IOS connection, serviceId %d",serviceId.get()); DynChatEGS.iosConnection(); - + CGuildManager::getInstance()->onIOSConnection(); CPVPManager2::getInstance()->onIOSMirrorUp(); diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index 45a918a526..aecf7cf763 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -5229,3 +5229,19 @@ NLMISC_COMMAND(executePhrase,"execute a sabrina phrase","uid cyclic? [<brick ids } return true; } + +NLMISC_COMMAND(setSpecial,"set special values","uid special value") +{ + if (args.size() < 3) + return false; + + GET_ACTIVE_CHARACTER + + uint32 value; + + if (args[1] == "speedswimbonus") { + NLMISC::fromString(args[2], value); + c->setCurrentSpeedSwimBonus(value); + } +} + diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index b7b53df05d..642a1b44da 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -591,6 +591,7 @@ CCharacter::CCharacter() _MinPriceFilter = 0; _MaxPriceFilter = ~0u; _LastAppliedWeightMalus = 0; + _CurrentSpeedSwimBonus = 0; _CurrentRegenerateReposBonus = 0; _TpTicketSlot = INVENTORIES::INVALID_INVENTORY_SLOT; // setup timer for tickUpdate() calling @@ -2777,6 +2778,22 @@ void CCharacter::applyRegenAndClipCurrentValue() _LastAppliedWeightMalus = getWeightMalus(); _PhysScores.SpeedVariationModifier += _LastAppliedWeightMalus; sint16 speedVariationModifier = std::max((sint)_PhysScores.SpeedVariationModifier, (sint) - 100); + CSheetId aqua_speed("aqua_speed.sbrick"); + if (isInWater() && (haveBrick(aqua_speed) || _CurrentSpeedSwimBonus > 0)) + { + setBonusMalusName("aqua_speed", addEffectInDB(aqua_speed, true)); + if (_CurrentSpeedSwimBonus > 0) + speedVariationModifier = std::min(speedVariationModifier + (sint16)_CurrentSpeedSwimBonus, 100); + else + speedVariationModifier = std::min(speedVariationModifier + 100, 100); + } + else + { + sint8 bonus = getBonusMalusName("aqua_speed"); + if (bonus > -1) + removeEffectInDB(bonus, true); + } + // Speed // while stunned/root/mezzed etc speed is forced to 0 float oldCurrentSpeed; diff --git a/ryzom/server/src/entities_game_service/player_manager/character.h b/ryzom/server/src/entities_game_service/player_manager/character.h index 187169e131..f55ee5e4e2 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.h +++ b/ryzom/server/src/entities_game_service/player_manager/character.h @@ -2713,6 +2713,7 @@ class CCharacter : public CCharacterPersistantData, public CEntityBase, public N uint32 getLastExchangeMount() const; bool getRespawnMainLandInTown() const; void setRespawnMainLandInTown(bool status); + void setCurrentSpeedSwimBonus(uint32 speed); const std::list<TCharacterLogTime> &getLastLogStats() const; void updateConnexionStat(); @@ -3886,6 +3887,9 @@ class CCharacter : public CCharacterPersistantData, public CEntityBase, public N /// backup last used weight malus sint32 _LastAppliedWeightMalus; + /// aqua speed bonus (used for tryker rite) + uint32 _CurrentSpeedSwimBonus; + /// Regenerte factor float _CurrentRegenerateReposBonus; NLMISC::TGameCycle _CurrentRegenerateReposBonusTickUpdate; diff --git a/ryzom/server/src/entities_game_service/player_manager/character_inlines.h b/ryzom/server/src/entities_game_service/player_manager/character_inlines.h index 471bfc42cf..9840eef329 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character_inlines.h +++ b/ryzom/server/src/entities_game_service/player_manager/character_inlines.h @@ -1256,6 +1256,12 @@ inline void CCharacter::setRespawnMainLandInTown(bool status) { _RespawnMainLandInTown = status; } + +inline void CCharacter::setCurrentSpeedSwimBonus(uint32 speed) +{ + _CurrentSpeedSwimBonus = speed; +} + //------------------------------------------------------------------------------ inline const std::list<TCharacterLogTime>& CCharacter::getLastLogStats() const From 01b57a480ef14545f1c0e269a68986c4af0c8c9d Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Mon, 8 May 2023 21:45:46 +0200 Subject: [PATCH 031/194] Fix --- .../entities_game_service/player_manager/character.cpp | 7 +++++-- .../src/entities_game_service/player_manager/character.h | 8 ++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index b7b53df05d..fe8c4f8f3e 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -6030,7 +6030,7 @@ void CCharacter::setCurrentContinent(CONTINENT::TContinent continent) //----------------------------------------------- // CCharacter::addCharacterAnimal buy a creature //----------------------------------------------- -bool CCharacter::addCharacterAnimal(const CSheetId &PetTicket, uint32 Price, CGameItemPtr ptr, uint8 size, const ucstring &customName) +bool CCharacter::addCharacterAnimal(const CSheetId &PetTicket, uint32 Price, CGameItemPtr ptr, uint8 size, const ucstring &customName, const string &clientSheet) { if (!PackAnimalSystemEnabled) return false; @@ -6046,7 +6046,10 @@ bool CCharacter::addCharacterAnimal(const CSheetId &PetTicket, uint32 Price, CGa if (checkAnimalCount(PetTicket, true, 1)) { const CStaticItem* form = CSheets::getForm(PetTicket); - pet.PetSheetId = form->PetSheet; + if (!clientSheet.empty()) + pet.PetSheetId = CSheetId(clientSheet.c_str()); + else + pet.PetSheetId = form->PetSheet; pet.Satiety = form->PetHungerCount; pet.MaxSatiety = form->PetHungerCount; uint8 startSlot = 0; diff --git a/ryzom/server/src/entities_game_service/player_manager/character.h b/ryzom/server/src/entities_game_service/player_manager/character.h index 187169e131..bfbcb4b338 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.h +++ b/ryzom/server/src/entities_game_service/player_manager/character.h @@ -988,7 +988,7 @@ class CCharacter : public CCharacterPersistantData, public CEntityBase, public N void setTimeOfDeath(NLMISC::TGameTime t); // character buy a creature - bool addCharacterAnimal(const NLMISC::CSheetId &PetTicket, uint32 Price, CGameItemPtr ptr, uint8 size = 100, const ucstring &customName = ucstring("")); + bool addCharacterAnimal(const NLMISC::CSheetId &PetTicket, uint32 Price, CGameItemPtr ptr, uint8 size = 100, const ucstring &customName = ucstring(""), const std::string &clientSheet = ""); // return free slot for pet spawn or -1 if there are no free slot sint32 getFreePetSlot(uint8 startSlot = 0); @@ -3024,6 +3024,9 @@ class CCharacter : public CCharacterPersistantData, public CEntityBase, public N return (_EntityState.X() != _OldPosX || _EntityState.Y() != _OldPosY); } + /// apply regenerate and clip currents value + void applyRegenAndClipCurrentValue(); + /// Kill the player void killMe(); @@ -3079,9 +3082,6 @@ class CCharacter : public CCharacterPersistantData, public CEntityBase, public N /// recompute all Max value void computeMaxValue(); - /// apply regenerate and clip currents value - void applyRegenAndClipCurrentValue(); - /// character is dead void deathOccurs(void); From a574dfe529ccd4dba99cab4ff79fe342408c10cf Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Sat, 13 May 2023 18:56:16 +0200 Subject: [PATCH 032/194] Let F2P buy or get zigs --- .../src/entities_game_service/player_manager/character.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index fe8c4f8f3e..c9510925d4 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -6356,7 +6356,7 @@ bool CCharacter::checkAnimalCount(const CSheetId &PetTicket, bool sendMessage, s return false; } - CPlayer* p = PlayerManager.getPlayer(PlayerManager.getPlayerId(getId())); + /*CPlayer* p = PlayerManager.getPlayer(PlayerManager.getPlayerId(getId())); BOMB_IF(p == NULL, "Failed to find player record for character: " << getId().toString(), return 0.0); if (p->isTrialPlayer()) @@ -6365,6 +6365,7 @@ bool CCharacter::checkAnimalCount(const CSheetId &PetTicket, bool sendMessage, s sendDynamicSystemMessage(_Id, "EGS_CANT_BUY_PACKER_IS_TRIAL_PLAYER"); return false; } + * */ } else { From 133547bb9e918f0873570f6dab44a44e6155303a Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Sat, 13 May 2023 18:56:37 +0200 Subject: [PATCH 033/194] Fix classique titles display --- ryzom/client/data/gamedev/interfaces_v3/info_player.lua | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/info_player.lua b/ryzom/client/data/gamedev/interfaces_v3/info_player.lua index 862124a61b..54b2414080 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/info_player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/info_player.lua @@ -2170,6 +2170,7 @@ function game:setInfoPlayerCharacterRace() end function game:arkTitlesAddClassics() + local current_title = getUI("ui:interface:player:header_opened:player_title").uc_hardtext runAH(nil, "title_init_combobox", "") local cb = getUI("ui:interface:info_player_skills:content:webinfos:title:player_title") local ui = getUI("ui:interface:encyclopedia:content:htmlC") @@ -2181,7 +2182,12 @@ function game:arkTitlesAddClassics() end table.sort(titles) for i,title in ipairs(titles) do - html = html .. [[<div class="ryzom-ui-grouptemplate" id="div_ark_title" style="template:title_template;id:div_ark_title:display_title;icon:ico_amber_ball.tga;text:]] + local current = "_blue" + if tostring(current_title) == tostring(title) then + current = "" + end + + html = html .. [[<div class="ryzom-ui-grouptemplate" id="div_ark_title" style="template:title_template;id:div_ark_title:display_title;icon:ico_amber_ball]]..current..[[.tga;text:]] html = html .. title .. [[;titleid:]] .. title html = html .. [[;color:255 255 255 255;enable:50;tooltip:"></div>]] end @@ -2189,3 +2195,4 @@ function game:arkTitlesAddClassics() ui:renderHtml(html) end + From 89206bf318baf472aa0489c115e1522033dacbc6 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Sat, 13 May 2023 18:58:14 +0200 Subject: [PATCH 034/194] Prevent mounted players to use aqua_speed. Aqua speed at +33% --- .../src/entities_game_service/player_manager/character.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index 642a1b44da..0965e3882e 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -2779,13 +2779,13 @@ void CCharacter::applyRegenAndClipCurrentValue() _PhysScores.SpeedVariationModifier += _LastAppliedWeightMalus; sint16 speedVariationModifier = std::max((sint)_PhysScores.SpeedVariationModifier, (sint) - 100); CSheetId aqua_speed("aqua_speed.sbrick"); - if (isInWater() && (haveBrick(aqua_speed) || _CurrentSpeedSwimBonus > 0)) + if (isInWater() && getMode() != MBEHAV::MOUNT_NORMAL && (haveBrick(aqua_speed) || _CurrentSpeedSwimBonus > 0)) { setBonusMalusName("aqua_speed", addEffectInDB(aqua_speed, true)); if (_CurrentSpeedSwimBonus > 0) speedVariationModifier = std::min(speedVariationModifier + (sint16)_CurrentSpeedSwimBonus, 100); else - speedVariationModifier = std::min(speedVariationModifier + 100, 100); + speedVariationModifier = std::min(speedVariationModifier + 33, 100); } else { From cf903a114406b3c41fba6b0a6af90ba7e4cf9328 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Mon, 15 May 2023 15:34:48 +0200 Subject: [PATCH 035/194] Added ai command setEquipment --- ryzom/server/src/ai_service/nf_grp_npc.cpp | 50 ++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/ryzom/server/src/ai_service/nf_grp_npc.cpp b/ryzom/server/src/ai_service/nf_grp_npc.cpp index 7190c063d9..0a67aea43c 100644 --- a/ryzom/server/src/ai_service/nf_grp_npc.cpp +++ b/ryzom/server/src/ai_service/nf_grp_npc.cpp @@ -2725,6 +2725,55 @@ void maxHitRange_f_(CStateInstance* entity, CScriptStack& stack) } } +//---------------------------------------------------------------------------- +/** @page code + +@subsection setEquipement_s_ + +Arguments: -> + +arg1: is the equipment list (in hex) + +@code +()setEquipement("xxxxx"); +@endcode + +*/ +void setEquipment_s_(CStateInstance* entity, CScriptStack& stack) +{ + string script = stack.top(); + stack.pop(); + + IManagerParent* const managerParent = entity->getGroup()->getOwner()->getOwner(); + CAIInstance* const aiInstance = dynamic_cast<CAIInstance*>(managerParent); + if (!aiInstance) + return; + + std::vector<CAIActions::CArg> args; + std::vector<std::string> equipements; + NLMISC::splitString(script, ";", equipements); + + CGroup* group = entity->getGroup(); + + FOREACH(botIt, CCont<CBot>, group->bots()) + { + CBot* bot = *botIt; + + if (bot->getRyzomType() == RYZOMID::npc) + { + CBotNpc* botNpc = NLMISC::safe_cast<CBotNpc*>(bot); + if (botNpc==NULL) + return; + botNpc->equipmentInit(); + + FOREACHC(it, std::vector<std::string>, equipements) + { + botNpc->equipmentAdd(*it); + } + } + } +} + //---------------------------------------------------------------------------- /** @page code @@ -3370,6 +3419,7 @@ std::map<std::string, FScrptNativeFunc> nfGetNpcGroupNativeFunctions() REGISTER_NATIVE_FUNC(functions, setParent_s_); REGISTER_NATIVE_FUNC(functions, addHealGroup_s_); + REGISTER_NATIVE_FUNC(functions, setEquipment_s_); REGISTER_NATIVE_FUNC(functions, addUserModel_sss_); REGISTER_NATIVE_FUNC(functions, addCustomLoot_ss_); REGISTER_NATIVE_FUNC(functions, setUserModel_s_); From 6164c7f44cebee431785584f1aa181cdb8ef2e84 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Mon, 15 May 2023 17:21:28 +0200 Subject: [PATCH 036/194] Fix bad merge --- .../game_item_manager/player_inv_equip.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_equip.cpp b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_equip.cpp index a0af7063e3..eb2a02cff7 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_equip.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_equip.cpp @@ -124,7 +124,18 @@ void CEquipInvView::onItemChanged(uint32 slot, INVENTORIES::TItemChangeFlags cha } // Update jewels enchants + if (getInventory()->getInventoryId() == INVENTORIES::equipment) + { + getCharacter()->updateJewelsTags(false); + getCharacter()->updateJewelsModifiers(); + } + // Update fame + if (getInventory()->getInventoryId() == INVENTORIES::handling) + { + CFameManager::getInstance().enforceFameCaps(getCharacter()->getId(), getCharacter()->getOrganization(), getCharacter()->getAllegiance()); + } + } // **************************************************************************** From 909ea344a87a8969cbf25d21932c9ceea0e6fbb7 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Mon, 22 May 2023 16:53:31 +0200 Subject: [PATCH 037/194] Added persistante SavedFames, improvements --- ryzom/common/src/game_share/pvp_clan.cpp | 2 +- .../game_item_manager/player_inv_equip.cpp | 7 - .../game_item_manager/player_inv_hand.cpp | 20 ++- .../guild_manager/fame_manager.cpp | 143 ++++++++++-------- .../player_manager/persistent_player_data.cpp | 7 + 5 files changed, 99 insertions(+), 80 deletions(-) diff --git a/ryzom/common/src/game_share/pvp_clan.cpp b/ryzom/common/src/game_share/pvp_clan.cpp index b25ce99712..0a467027e7 100644 --- a/ryzom/common/src/game_share/pvp_clan.cpp +++ b/ryzom/common/src/game_share/pvp_clan.cpp @@ -87,7 +87,7 @@ namespace PVP_CLAN { // These names are in order of the enum TPVPClan // The first two clans, "None" and "Neutral", don't count. Subtract 2 from the lookup. - std::string FactionNames[] = { "kami","karavan","fyros","matis","tryker","zorai","marauder" }; + std::string FactionNames[] = { "kami","karavan","fyros","matis","tryker","zorai","black_kami" }; for (int looper = BeginClans; looper <= EndClans; looper += 1) { diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_equip.cpp b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_equip.cpp index eb2a02cff7..faa870bbef 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_equip.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_equip.cpp @@ -129,13 +129,6 @@ void CEquipInvView::onItemChanged(uint32 slot, INVENTORIES::TItemChangeFlags cha getCharacter()->updateJewelsTags(false); getCharacter()->updateJewelsModifiers(); } - - // Update fame - if (getInventory()->getInventoryId() == INVENTORIES::handling) - { - CFameManager::getInstance().enforceFameCaps(getCharacter()->getId(), getCharacter()->getOrganization(), getCharacter()->getAllegiance()); - } - } // **************************************************************************** diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_hand.cpp b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_hand.cpp index 40e01d40ef..1502ce9482 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_hand.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_hand.cpp @@ -20,6 +20,7 @@ #include "game_share/slot_equipment.h" #include "player_manager/character.h" +#include "guild_manager/fame_manager.h" #include "egs_sheets/egs_sheets.h" extern NLMISC::CVariable<uint32> MaxPlayerBulk; @@ -68,7 +69,7 @@ void CHandlingInvView::onItemChanged(uint32 slot, INVENTORIES::TItemChangeFlags { const CGameItemPtr item = getInventory()->getItem(slot); nlassert(item != NULL); - + updateClientSlot(slot, item); const CStaticItem * form = CSheets::getForm( item->getSheetId() ); @@ -78,9 +79,9 @@ void CHandlingInvView::onItemChanged(uint32 slot, INVENTORIES::TItemChangeFlags return; } getCharacter()->addWearMalus(form->WearEquipmentMalus); - + getCharacter()->applyItemModifiers(item); - + // if equip right hand item, compute parry level and disengage if player is engaged in combat if (slot == INVENTORIES::right ) getCharacter()->updateParry(form->Family, form->Skill); @@ -90,7 +91,7 @@ void CHandlingInvView::onItemChanged(uint32 slot, INVENTORIES::TItemChangeFlags { const CGameItemPtr item = getInventory()->getItem(slot); nlassert(item != NULL); - + updateClientSlot(slot, item); } @@ -99,6 +100,13 @@ void CHandlingInvView::onItemChanged(uint32 slot, INVENTORIES::TItemChangeFlags // Cleanup the item in player inventory updateClientSlot(slot, NULL); } + + // Update fame + if (getInventory()->getInventoryId() == INVENTORIES::handling) + { + CFameManager::getInstance().enforceFameCaps(getCharacter()->getId(), getCharacter()->getOrganization(), getCharacter()->getAllegiance()); + } + } // **************************************************************************** @@ -122,11 +130,11 @@ void CHandlingInvView::updateClientSlot(uint32 clientSlot, const CGameItemPtr it // unequip getCharacter()->updateVisualInformation( getInventory()->getInventoryId(), uint16(clientSlot), INVENTORIES::UNDEFINED, 0, NLMISC::CSheetId::Unknown, 0 ); } - + // do nothing else if client is not ready if (!getCharacter()->getEnterFlag()) return; - + if (item != NULL) // getCharacter()->_PropertyDatabase.setProp( NLMISC::toString("INVENTORY:HAND:%u:INDEX_IN_BAG", clientSlot ).c_str(), item->getInventorySlot() + 1 ); CBankAccessor_PLR::getINVENTORY().getHAND().getArray(clientSlot).setINDEX_IN_BAG(getCharacter()->_PropertyDatabase, checkedCast<uint16>(item->getInventorySlot()+1)); diff --git a/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp b/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp index 0f319a4b17..91d68bbd16 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp @@ -841,7 +841,6 @@ void CFameManager::addFameIndexed(const CEntityId &entityId, uint32 faction, sin double fame = fow.Fames[faction]; CCharacter* character = PlayerManager.getChar( entityId ); - bool isMarauder = (character && character->getOrganization() == 5); if (fame == NO_FAME) { @@ -877,11 +876,21 @@ void CFameManager::addFameIndexed(const CEntityId &entityId, uint32 faction, sin if (realDeltaFame < -3*kFameMultipler) realDeltaFame = -3*kFameMultipler; - if (!isMarauder && realDeltaFame < 0) + if (realDeltaFame < 0) realDeltaFame /= 10; fame += realDeltaFame; + if (character && character->getSavedFames()) + { + string factionName = CStaticFames::getInstance().getFactionName(faction); + if (factionName == "black_kami") + factionName = "marauder"; + PVP_CLAN::TPVPClan theClan = PVP_CLAN::fromString(factionName); + sint32 saveFame = character->restoreFame((uint32)theClan); + character->saveFame((uint32)theClan, saveFame+realDeltaFame); + } + fameMsgParams[2].Int = (uint32)(abs(realDeltaFame)); // set fame tendance info @@ -1203,7 +1212,7 @@ void CFameManager::setEntityFame(const NLMISC::CEntityId & entityId, uint32 fact if( setDirectValue ) { // change the scale( because this value comes from a user command) - fame = fame*(FameAbsoluteMax/100); + fame = fame*kFameMultipler; } if (fame == NO_FAME) @@ -1227,7 +1236,6 @@ void CFameManager::setEntityFame(const NLMISC::CEntityId & entityId, uint32 fact oldFame = 0; } clamp(oldFame, FameAbsoluteMin, FameAbsoluteMax); - const sint32 deltaFame = fame - oldFame; if (deltaFame == 0 && fow.Fames[faction] != NO_FAME ) return; @@ -1244,6 +1252,16 @@ void CFameManager::setEntityFame(const NLMISC::CEntityId & entityId, uint32 fact { nldebug("FAME: set fame for character %s as P:%d", entityId.toString().c_str(), fame); + + if (ch->getSavedFames()) + { + string factionName = CStaticFames::getInstance().getFactionName(faction); + if (factionName == "black_kami") + factionName = "marauder"; + PVP_CLAN::TPVPClan theClan = PVP_CLAN::fromString(factionName); + ch->saveFame((uint32)theClan, fame); + } + sint32 maxFame = getMaxFameByFactionIndex(ch->getAllegiance(), ch->getOrganization(), faction); ch->setFameValuePlayer(faction, fame, maxFame, fow.LastFameChangeTrends[faction]); @@ -1294,9 +1312,8 @@ sint32 CFameManager::getMaxFameByClan(std::pair<PVP_CLAN::TPVPClan, PVP_CLAN::TP } // None or Neutrals - if (playerClans.first < PVP_CLAN::BeginClans && playerClans.second < PVP_CLAN::BeginClans) { + if (playerClans.first < PVP_CLAN::BeginClans && playerClans.second < PVP_CLAN::BeginClans) return 50*kFameMultipler; - } return -50*kFameMultipler; } @@ -1369,12 +1386,13 @@ sint32 CFameManager::getMaxFameByClan(std::pair<PVP_CLAN::TPVPClan, PVP_CLAN::TP sint32 CFameManager::getMaxFameByFactionIndex(std::pair<PVP_CLAN::TPVPClan, PVP_CLAN::TPVPClan> allegiance, uint32 organization, uint32 factionIndex) { - PVP_CLAN::TPVPClan pvpClan; + PVP_CLAN::TPVPClan pvpClan; // try first with a clan - pvpClan= PVP_CLAN::getClanFromIndex(factionIndex); + pvpClan = PVP_CLAN::getClanFromIndex(factionIndex); if(pvpClan != PVP_CLAN::Unknown) return getMaxFameByClan(allegiance, organization, pvpClan); + // search for tribe else { @@ -1505,14 +1523,10 @@ void CFameManager::enforceFameCaps(const NLMISC::CEntityId &entityId, uint32 org bool haveWeapons = false; if (ch) { - if (organization) + if (organization && (theCult != PVP_CLAN::Neutral || theCiv != PVP_CLAN::Neutral)) { - if (theCult != PVP_CLAN::Neutral) - if (theCult != PVP_CLAN::Neutral || theCiv != PVP_CLAN::Neutral) - { - ch->setOrganization(0, false); - organization = 0; - } + ch->setOrganization(0, false); + organization = 0; } const CStaticItem *leftForm = NULL; @@ -1531,81 +1545,76 @@ void CFameManager::enforceFameCaps(const NLMISC::CEntityId &entityId, uint32 org (rightForm && (rightForm->Family == ITEMFAMILY::MELEE_WEAPON || rightForm->Family == ITEMFAMILY::RANGE_WEAPON)); if (ch->getSavedFames() && haveWeapons) + + if (haveWeapons && ch->getSavedFames()) { ch->setSavedFames(false); - for (uint i = PVP_CLAN::BeginClans; i < PVP_CLAN::EndClans; i++) + for (uint i = PVP_CLAN::BeginClans; i <= PVP_CLAN::EndClans; i++) { theFactionIndex = PVP_CLAN::getFactionIndex((PVP_CLAN::TPVPClan)i); fow.Fames[theFactionIndex] = ch->restoreFame(i); } } - - if (!ch->getSavedFames() && !haveWeapons) - ch->setSavedFames(true); - } // Check cults, first member of allegiance - if (theCult != PVP_CLAN::None) + for (int looper = PVP_CLAN::BeginCults; looper <= PVP_CLAN::EndCults; looper++) { - for (int looper = PVP_CLAN::BeginCults; looper <= PVP_CLAN::EndCults; looper++) + theFactionIndex = PVP_CLAN::getFactionIndex((PVP_CLAN::TPVPClan)looper); + fame = fow.Fames[theFactionIndex]; + maxFame = getMaxFameByClan(allegiance, organization, (PVP_CLAN::TPVPClan)looper); + if( fame != NO_FAME) { - theFactionIndex = PVP_CLAN::getFactionIndex((PVP_CLAN::TPVPClan)looper); - fame = fow.Fames[theFactionIndex]; - maxFame = getMaxFameByClan(allegiance, organization, (PVP_CLAN::TPVPClan)looper); - if( fame != NO_FAME) - { - clamp(fame,FameAbsoluteMin,maxFame); - fow.Fames[theFactionIndex] = fame; - } + clamp(fame,FameAbsoluteMin,maxFame); + fow.Fames[theFactionIndex] = fame; + } - if (ch) + if (ch) + { + // Cap to -40 + if (!haveWeapons) { - // Cap to -40 - if (!haveWeapons) - { + if (!ch->getSavedFames()) ch->saveFame(looper, fame); - clamp(maxFame, -40*kFameMultipler, maxFame); - clamp(fame, -40*kFameMultipler, fame); - fow.Fames[theFactionIndex] = fame; - } - - ch->setFameValuePlayer(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); + clamp(maxFame, -40*kFameMultipler, maxFame); + clamp(fame, -40*kFameMultipler, fame); + fow.Fames[theFactionIndex] = fame; } - if (gu) - gu->setFameValueGuild(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); + + ch->setFameValuePlayer(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); } + if (gu) + gu->setFameValueGuild(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); } + // Check civs, second member of allegiance - if (theCiv != PVP_CLAN::None) + for (int looper = PVP_CLAN::BeginCivs; looper <= PVP_CLAN::EndCivs; looper++) { - for (int looper = PVP_CLAN::BeginCivs; looper <= PVP_CLAN::EndCivs; looper++) + theFactionIndex = PVP_CLAN::getFactionIndex((PVP_CLAN::TPVPClan)looper); + fame = fow.Fames[theFactionIndex]; + maxFame = getMaxFameByClan(allegiance, organization, (PVP_CLAN::TPVPClan)looper); + if( fame != NO_FAME) { - theFactionIndex = PVP_CLAN::getFactionIndex((PVP_CLAN::TPVPClan)looper); - fame = fow.Fames[theFactionIndex]; - maxFame = getMaxFameByClan(allegiance, organization, (PVP_CLAN::TPVPClan)looper); - if( fame != NO_FAME) - { - clamp(fame,FameAbsoluteMin,maxFame); - fow.Fames[theFactionIndex] = fame; - } - if (ch) + clamp(fame,FameAbsoluteMin,maxFame); + fow.Fames[theFactionIndex] = fame; + } + if (ch) + { + // Cap to -40 + if (!haveWeapons) { - // Cap to -40 - if (!haveWeapons) - { + if (!ch->getSavedFames()) ch->saveFame(looper, fame); - clamp(maxFame, -40*kFameMultipler, maxFame); - clamp(fame, -40*kFameMultipler, fame); - fow.Fames[theFactionIndex] = fame; - } - ch->setFameValuePlayer(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); - } - if (gu) - { - gu->setFameValueGuild(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); + clamp(maxFame, -40*kFameMultipler, maxFame); + clamp(fame, -40*kFameMultipler, fame); + fow.Fames[theFactionIndex] = fame; } + ch->setFameValuePlayer(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); + } + if (gu) + { + gu->setFameValueGuild(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); } } @@ -1624,10 +1633,12 @@ void CFameManager::enforceFameCaps(const NLMISC::CEntityId &entityId, uint32 org // Cap to -40 if (!haveWeapons) { - ch->saveFame((uint32)PVP_CLAN::Marauder, fame); + if (!ch->getSavedFames()) + ch->saveFame((uint32)PVP_CLAN::Marauder, fame); clamp(maxFame, -40*kFameMultipler, maxFame); clamp(fame, -40*kFameMultipler, fame); fow.Fames[theFactionIndex] = fame; + ch->setSavedFames(true); } ch->setFameValuePlayer(theFactionIndex, fame, maxFame, fow.LastFameChangeTrends[theFactionIndex]); } diff --git a/ryzom/server/src/entities_game_service/player_manager/persistent_player_data.cpp b/ryzom/server/src/entities_game_service/player_manager/persistent_player_data.cpp index 4cb1a47161..6418aad94d 100644 --- a/ryzom/server/src/entities_game_service/player_manager/persistent_player_data.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/persistent_player_data.cpp @@ -434,6 +434,13 @@ static void prepareCharacterPositionForStore ( COfflineEntityState & state, cons PVP_CLAN::toString((PVP_CLAN::TPVPClan)(i+PVP_CLAN::BeginClans)),\ _FactionPoint[i],\ PVP_CLAN::TPVPClan k=PVP_CLAN::fromString(key); if ((k>=PVP_CLAN::BeginClans) && (k<=PVP_CLAN::EndClans)) _FactionPoint[k-PVP_CLAN::BeginClans]=val)\ +\ + PROP(bool,_SavedFame)\ + LPROP_MAP2(SavedFames, string, sint32,\ + for(uint32 i = 0; i < (PVP_CLAN::EndClans-PVP_CLAN::BeginClans+1); ++i),\ + PVP_CLAN::toString((PVP_CLAN::TPVPClan)(i+PVP_CLAN::BeginClans)),\ + _SavedFames[i],\ + PVP_CLAN::TPVPClan k=PVP_CLAN::fromString(key); if ((k>=PVP_CLAN::BeginClans) && (k<=PVP_CLAN::EndClans)) _SavedFames[k-PVP_CLAN::BeginClans]=val)\ \ PROP(uint32,_LastTpTick)\ PROP(uint32,_LastOverSpeedTick)\ From 11fd0bba4a7712efaa786301f2f36fddcd37132d Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Thu, 25 May 2023 13:26:46 +0200 Subject: [PATCH 038/194] Fix --- ryzom/client/src/player_cl.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/ryzom/client/src/player_cl.cpp b/ryzom/client/src/player_cl.cpp index ef11ab6f5b..cbd8928987 100644 --- a/ryzom/client/src/player_cl.cpp +++ b/ryzom/client/src/player_cl.cpp @@ -507,15 +507,15 @@ void CPlayerCL::equip(SLOTTYPE::EVisualSlot slot, const std::string &shapeName, _Instances[s].createLoading(string(), stickPoint); // Create the instance. - if (item) + if (color != -1) + _Instances[s].createLoading(shapeName, stickPoint, color); + else { - if (color != -1) { - _Instances[s].createLoading(shapeName, stickPoint, color); - } else + if (item) _Instances[s].createLoading(shapeName, stickPoint, item->MapVariant); + else + _Instances[s].createLoading(shapeName, stickPoint); } - else - _Instances[s].createLoading(shapeName, stickPoint); // If shapeName is empty, only clear the slot if(shapeName.empty()) @@ -877,10 +877,11 @@ void CPlayerCL::updateVisualPropertyVpa(const NLMISC::TGameCycle &/* gameCycle * sint instTexture; fromString(tagInfos[1], instTexture); equip(slot, tagInfos[0], itemSheet); - UInstance pInst = _Instances[slot].createLoadingFromCurrent(); + equip(slot, tagInfos[0], itemSheet, instTexture); + /*UInstance pInst = _Instances[slot].createLoadingFromCurrent(); if(!pInst.empty()) pInst.selectTextureSet(instTexture); - _Instances[slot].TextureSet = instTexture; + _Instances[slot].TextureSet = instTexture;*/ } else { @@ -939,9 +940,9 @@ void CPlayerCL::updateVisualPropertyVpa(const NLMISC::TGameCycle &/* gameCycle * { sint instTexture; fromString(tagInfos[1], instTexture); - equip(slot, tagInfos[0], itemSheet); - _Instances[slot].selectTextureSet(instTexture); - _Instances[slot].TextureSet = instTexture; + equip(slot, tagInfos[0], itemSheet, instTexture); + //_Instances[slot].selectTextureSet(instTexture); + //_Instances[slot].TextureSet = instTexture; } else { From e5aa59825ed6053041a3289277cc513d0e0f07f0 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Thu, 25 May 2023 19:36:33 +0200 Subject: [PATCH 039/194] Change Encyclo button name and macros icon --- .../gamedev/html/help/interf_action_book_de.html | 10 +++++----- .../gamedev/html/help/interf_action_book_en.html | 14 +++++++------- .../gamedev/html/help/interf_action_book_fr.html | 12 ++++++------ ryzom/client/data/gamedev/interfaces_v3/phrase.xml | 2 +- .../client/data/gamedev/interfaces_v3/taskbar.xml | 8 ++++---- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/ryzom/client/data/gamedev/html/help/interf_action_book_de.html b/ryzom/client/data/gamedev/html/help/interf_action_book_de.html index 9790edee04..91a9d4b95b 100644 --- a/ryzom/client/data/gamedev/html/help/interf_action_book_de.html +++ b/ryzom/client/data/gamedev/html/help/interf_action_book_de.html @@ -8,9 +8,9 @@ <table width="100%" border="0" cellspacing="4" cellpadding="0"> - <tr> - <td align="center"> - <h1><a href="ah:context_help&target=ui:interface:phrase_book&text=uiPhraseBookTitle">Aktionsentwicklungsfenster</a></h1> + <tr> + <td align="center"> + <h1><a href="ah:context_help&target=ui:interface:phrase_book&text=uiMK_Actions">Levels</a></h1> </td> </tr> </table> @@ -36,8 +36,8 @@ <h4>Aktionen</h4> Du musst eine <a href="ah:context_help&target=ui:interface:phrase_book:content:content:sbtree:tree_list:0&itext=Select">Fähigkeit auswählen</a> um Dir die Aktionen, die zu dieser Fähigkeit gehören, anzeigen zu lassen. <BR> Die noch nicht erlernten Aktionen sind ausgegraut. <BR> Die Aktionen, die Du noch nicht lernen kannst, da bestimmte Vorraussetzungen noch nicht erfüllt sind (z.B.: Du hast den benötigten Fähigkeitslevel noch nicht erreicht) werden rot angezeigt. <BR> -Die Aktionen sind in zwei Gruppen aufgeteilt: -<a href="ah:context_help&target=ui:interface:phrase_book:content:tab_group:action_select:tab0&text=uitabPhraseActions">Aktionen</a>, and +Die Aktionen sind in zwei Gruppen aufgeteilt: +<a href="ah:context_help&target=ui:interface:phrase_book:content:tab_group:action_select:tab0&text=uitabPhraseActions">Aktionen</a>, and <a href="ah:context_help&target=ui:interface:phrase_book:content:tab_group:action_select:tab1&text=uitabPhraseUpgrades">Aktions-Verbesserungen</a>.<BR> Du kannst Aktionen von hier aus per Drag'n'Drop in die Aktionsleiste ziehen, bei Aktions-Verbesserungen geht dies nicht, da sie keine eigenständige Aktion verkörpern und somit nicht ausgeführt werden können.<BR> </P> diff --git a/ryzom/client/data/gamedev/html/help/interf_action_book_en.html b/ryzom/client/data/gamedev/html/help/interf_action_book_en.html index b53599e749..37c298890a 100644 --- a/ryzom/client/data/gamedev/html/help/interf_action_book_en.html +++ b/ryzom/client/data/gamedev/html/help/interf_action_book_en.html @@ -8,9 +8,9 @@ <table width="100%" border="0" cellspacing="4" cellpadding="0"> - <tr> - <td align="center"> - <h1><a href="ah:context_help&target=ui:interface:phrase_book&text=uiPhraseBookTitle">Action Progression</a></h1> + <tr> + <td align="center"> + <h1><a href="ah:context_help&target=ui:interface:phrase_book&text=uiMK_Actions">Levels</a></h1> </td> </tr> </table> @@ -22,22 +22,22 @@ <h1><a href="ah:context_help&target=ui:interface:phrase_book&text=uiPhraseBookTi <br><h4>Skill Tree</h4> The <a href="ah:context_help&target=ui:interface:phrase_book:content:content:sbtree&text=uiSkillTree">Skill Tree</a> allows you to see the state of your skills. <BR>It displays the current level of the skill and its max level (eg: Craft: 1/20</a>). -<BR>The bar indicates the progression in the current skill level. +<BR>The bar indicates the progression in the current skill level. <BR>The color of the skill indicates either: <BR>- transparent: skill not trained <BR>- orange: skill currently trained <BR>- green: skill completed <BR><BR>When you complete a skill, a new part of the tree is opened, which you can see by clicking on "+". -<BR>The whole skill tree is not displayed. Only completed skills, currently trained skills, +<BR>The whole skill tree is not displayed. Only completed skills, currently trained skills, and the untrained skills that relies directly on a trained skill are displayed. <br><h4>Actions</h4> The Actions part shows the actions you can learn or the actions you have learnt at each skill level. <BR>You have to <a href="ah:context_help&target=ui:interface:phrase_book:content:content:sbtree:tree_list:0&itext=Select">select a skill</a> to see the actions related to this skill. <BR>The actions you have not learned are grayed out. <BR>The actions you cannot learn because you do not meet the requirements (e.g. you don't have the required skill level) displayed are in red. -<br><br>The actions are separated in two groups: -<a href="ah:context_help&target=ui:interface:phrase_book:content:tab_group:action_select:tab0&text=uitabPhraseActions">Actions</a>, and +<br><br>The actions are separated in two groups: +<a href="ah:context_help&target=ui:interface:phrase_book:content:tab_group:action_select:tab0&text=uitabPhraseActions">Actions</a>, and <a href="ah:context_help&target=ui:interface:phrase_book:content:tab_group:action_select:tab1&text=uitabPhraseUpgrades">Upgrades</a>. <BR><br>You can drag and drop an Action to your action bar, but you cannot drag an Action Upgrade because they are either characteristic upgrades, or action upgrades which are not castable directly. diff --git a/ryzom/client/data/gamedev/html/help/interf_action_book_fr.html b/ryzom/client/data/gamedev/html/help/interf_action_book_fr.html index 3956342a27..82ca7c4b2f 100644 --- a/ryzom/client/data/gamedev/html/help/interf_action_book_fr.html +++ b/ryzom/client/data/gamedev/html/help/interf_action_book_fr.html @@ -8,9 +8,9 @@ <table width="100%" border="0" cellspacing="4" cellpadding="0"> - <tr> - <td align="center"> - <h1><a href="ah:context_help&target=ui:interface:phrase_book&text=uiPhraseBookTitle">Progession des Actions</a></h1> + <tr> + <td align="center"> + <h1><a href="ah:context_help&target=ui:interface:phrase_book&text=uiMK_Actions">Niveaux</a></h1> </td> </tr> </table> @@ -30,15 +30,15 @@ <h4>Arbre de Compétences</h4> - vert : compétence terminée <BR> <BR> Lorsque vous terminez une compétence, vous avez accès à de nouvelles compétences. Vous pouvez explorer l'arbre de compétences en cliquant sur "+". <BR> -L'arbre de compétences n'est pas affiché dans son ensemble. Il n'y a que les compétences terminées ou en cours d'entraînement d'affichées. +L'arbre de compétences n'est pas affiché dans son ensemble. Il n'y a que les compétences terminées ou en cours d'entraînement d'affichées. Les compétences non entraînées en rapport direct avec une compétence entraînée sont également affichées. <BR> <h4>Actions</h4> La partie Actions indique les actions que vous pouvez apprendre ou avez appris à chaque niveau de compétence. <BR> Vous devez <a href="ah:context_help&target=ui:interface:phrase_book:content:content:sbtree:tree_list:0&itext=Select">sélectionner une compétence</a> pour connaître les actions liées à cette compétence. <BR> Les actions que vous ne connaissez pas sont grisées. <BR> Les actions que vous n'avez pas apprises car les prérequis ne sont pas remplis (ex. : vous n'avez pas atteint le niveau de compétence requis) sont en rouge. <BR> -Les actions se distinguent en deux groupes : -<a href="ah:context_help&target=ui:interface:phrase_book:content:tab_group:action_select:tab0&text=uitabPhraseActions">Actions</a>, et +Les actions se distinguent en deux groupes : +<a href="ah:context_help&target=ui:interface:phrase_book:content:tab_group:action_select:tab0&text=uitabPhraseActions">Actions</a>, et <a href="ah:context_help&target=ui:interface:phrase_book:content:tab_group:action_select:tab1&text=uitabPhraseUpgrades">Actions Suprêmes</a>.<BR> Vous pouvez glisser-déposer une Action dans votre barre actions mais vous ne pouvez pas glisser une Action Suprême car il peut s'agir d'une mise à jour de caractéristiques ou d'actions qui ne sont pas utilisables en tant que sorts.<BR> diff --git a/ryzom/client/data/gamedev/interfaces_v3/phrase.xml b/ryzom/client/data/gamedev/interfaces_v3/phrase.xml index 8588668dcc..9cde224ade 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/phrase.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/phrase.xml @@ -133,7 +133,7 @@ <!-- **** Main container SKILLS PROGRESSION & ACTIONS --> -<group type="container" id="phrase_book" title="uiPhraseBookTitle" global_color="false" opened="true" openable="false" +<group type="container" id="phrase_book" title="uiMK_Actions" global_color="false" opened="true" openable="false" movable="true" active="true" header_color="UI:SAVE:WIN:COLORS:INV" on_active="proc" on_active_params="phrase_book_opened" on_deactive="set" on_deactive_params="dblink=UI:VARIABLES:ISACTIVE:ACTIONS|value=0" diff --git a/ryzom/client/data/gamedev/interfaces_v3/taskbar.xml b/ryzom/client/data/gamedev/interfaces_v3/taskbar.xml index f39640a7f7..59a6819534 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/taskbar.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/taskbar.xml @@ -455,7 +455,7 @@ <!-- Ency --> <instance template="mk_icon_text" id="window5" hardtext="uiMk_Encyclopedia" posparent="window4" posref="BL TL" c="%color_orange" - tooltip="uiMk_Encyclopedia" onclick_l="show_hide" params_l="encyclopedia" tx_normal="tb_encyclopedia.tga" tx_pushed="tb_encyclopedia.tga"/> + tooltip="uiMk_Encyclopedia" onclick_l="show_hide" params_l="encyclopedia" tx_normal="tb_actions.tga" tx_pushed="tb_actions.tga"/> <!-- Tasks --> <instance template="mk_icon_text" id="window6" hardtext="uiMk_window4" posparent="window5" posref="BL TL" c="%color_turquoise" @@ -616,7 +616,7 @@ <!-- Encyclopedia --> <instance template="mk_icon" id="window5" tooltip="uiMk_Encyclopedia" posparent="window4" posref="BL TL" onclick_l="show_hide" params_l="encyclopedia" - tx_normal="tb_encyclopedia.tga" tx_pushed="tb_encyclopedia.tga"/> + tx_normal="tb_actions.tga" tx_pushed="tb_actions.tga"/> <!-- Tasks --> <instance template="mk_icon" id="window6" tooltip="uiMk_window4" posparent="window5" posref="BL TL" @@ -722,7 +722,7 @@ <!-- Encyclopedia --> <instance template="mk_icon" id="window5" tooltip="uiMk_Encyclopedia" posparent="window4" posref="TR TL" onclick_l="show_hide" params_l="encyclopedia" - tx_normal="tb_encyclopedia.tga" tx_pushed="tb_encyclopedia.tga"/> + tx_normal="tb_actions.tga" tx_pushed="tb_actions.tga"/> <!-- Tasks --> <instance template="mk_icon" id="window6" tooltip="uiMk_window4" posparent="window5" posref="TR TL" @@ -1057,7 +1057,7 @@ <instance template="win_button" id="invent" color="UI:SAVE:WIN:COLORS:INV" text="uimwInventory" posparent="hotbar" posref="BL TL" x="0" y="-4" pushflag="UI:VARIABLES:ISACTIVE:INVENTORY" win_name="inventory" /> - <instance template="win_button" id="action_book" color="UI:SAVE:WIN:COLORS:INV" text="uiPhraseBookTitle" posparent="invent" posref="BL TL" x="0" y="-4" + <instance template="win_button" id="action_book" color="UI:SAVE:WIN:COLORS:INV" text="uiMK_Actions" posparent="invent" posref="BL TL" x="0" y="-4" pushflag="UI:VARIABLES:ISACTIVE:ACTIONS" win_name="phrase_book" /> <instance template="win_button" id="links" color="UI:SAVE:WIN:COLORS:INV" text="uiLinksTitle" posparent="action_book" posref="BL TL" x="0" y="-4" From c731e8f20bb924b1baf81bfe5a882701c4ca67fd Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Fri, 26 May 2023 18:20:53 +0200 Subject: [PATCH 040/194] Fix crash with fame and new player --- ryzom/server/src/ai_service/commands.cpp | 2 +- .../src/entities_game_service/guild_manager/fame_manager.cpp | 3 +++ .../src/entities_game_service/player_manager/character.cpp | 3 +-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ryzom/server/src/ai_service/commands.cpp b/ryzom/server/src/ai_service/commands.cpp index 417dcab43a..10db3a862a 100644 --- a/ryzom/server/src/ai_service/commands.cpp +++ b/ryzom/server/src/ai_service/commands.cpp @@ -1680,7 +1680,7 @@ NLMISC_COMMAND(getDatasetId,"get datasetid of bots with name matchiong the given if (bots.empty()) { log.displayNL("ERR: No bot correspond to name %s", botName.c_str()); - return false; + return true; } else { diff --git a/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp b/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp index fd7bf33486..0910a836a1 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp @@ -1278,6 +1278,9 @@ sint32 CFameManager::getStartFame(PVP_CLAN::TPVPClan playerClan, PVP_CLAN::TPVPC return NO_FAME; } + if (targetClan == PVP_CLAN::Marauder) + return 0; + // Parameters are within values, so return the lookup. return *FameStart[playerClan-PVP_CLAN::BeginCivs][targetClan-PVP_CLAN::BeginClans]; } diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index c9510925d4..35cea3cb44 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -23570,8 +23570,7 @@ void CCharacter::updateEffectInDB(uint8 index, bool bonus, NLMISC::TGameCycle ac sint32 CCharacter::getWeightMalus() { - sint32 maxWeight - = BaseMaxCarriedWeight + 1000 * _PhysCharacs._PhysicalCharacteristics[CHARACTERISTICS::strength].Current; + sint32 maxWeight = BaseMaxCarriedWeight + 1000 * _PhysCharacs._PhysicalCharacteristics[CHARACTERISTICS::strength].Current; sint32 weightDiff = (maxWeight - sint32(getCarriedWeight())); sint32 weightMalus = weightDiff / 1000; From bda458028eb40f76a063319293300208b1c78754 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Mon, 29 May 2023 16:58:09 +0200 Subject: [PATCH 041/194] Fix fames bug --- .../guild_manager/fame_manager.cpp | 23 ++++++++++--------- .../player_manager/persistent_player_data.cpp | 6 ++--- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp b/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp index 1a4f78e269..d271d14675 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/fame_manager.cpp @@ -881,14 +881,18 @@ void CFameManager::addFameIndexed(const CEntityId &entityId, uint32 faction, sin fame += realDeltaFame; - if (character && character->getSavedFames()) + if (character) { string factionName = CStaticFames::getInstance().getFactionName(faction); if (factionName == "black_kami") factionName = "marauder"; PVP_CLAN::TPVPClan theClan = PVP_CLAN::fromString(factionName); - sint32 saveFame = character->restoreFame((uint32)theClan); - character->saveFame((uint32)theClan, saveFame+realDeltaFame); + sint32 saveFame; + if (character->getSavedFames()) + saveFame = character->restoreFame((uint32)theClan)+realDeltaFame; + else + saveFame = fame; + character->saveFame((uint32)theClan, saveFame); } fameMsgParams[2].Int = (uint32)(abs(realDeltaFame)); @@ -1253,14 +1257,11 @@ void CFameManager::setEntityFame(const NLMISC::CEntityId & entityId, uint32 fact nldebug("FAME: set fame for character %s as P:%d", entityId.toString().c_str(), fame); - if (ch->getSavedFames()) - { - string factionName = CStaticFames::getInstance().getFactionName(faction); - if (factionName == "black_kami") - factionName = "marauder"; - PVP_CLAN::TPVPClan theClan = PVP_CLAN::fromString(factionName); - ch->saveFame((uint32)theClan, fame); - } + string factionName = CStaticFames::getInstance().getFactionName(faction); + if (factionName == "black_kami") + factionName = "marauder"; + PVP_CLAN::TPVPClan theClan = PVP_CLAN::fromString(factionName); + ch->saveFame((uint32)theClan, fame); sint32 maxFame = getMaxFameByFactionIndex(ch->getAllegiance(), ch->getOrganization(), faction); ch->setFameValuePlayer(faction, fame, maxFame, fow.LastFameChangeTrends[faction]); diff --git a/ryzom/server/src/entities_game_service/player_manager/persistent_player_data.cpp b/ryzom/server/src/entities_game_service/player_manager/persistent_player_data.cpp index 6418aad94d..74db9875ff 100644 --- a/ryzom/server/src/entities_game_service/player_manager/persistent_player_data.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/persistent_player_data.cpp @@ -437,10 +437,10 @@ static void prepareCharacterPositionForStore ( COfflineEntityState & state, cons \ PROP(bool,_SavedFame)\ LPROP_MAP2(SavedFames, string, sint32,\ - for(uint32 i = 0; i < (PVP_CLAN::EndClans-PVP_CLAN::BeginClans+1); ++i),\ - PVP_CLAN::toString((PVP_CLAN::TPVPClan)(i+PVP_CLAN::BeginClans)),\ + for(uint32 i = PVP_CLAN::BeginClans; i <= PVP_CLAN::EndClans; ++i),\ + PVP_CLAN::toString((PVP_CLAN::TPVPClan)i),\ _SavedFames[i],\ - PVP_CLAN::TPVPClan k=PVP_CLAN::fromString(key); if ((k>=PVP_CLAN::BeginClans) && (k<=PVP_CLAN::EndClans)) _SavedFames[k-PVP_CLAN::BeginClans]=val)\ + PVP_CLAN::TPVPClan k=PVP_CLAN::fromString(key); if ((k>=PVP_CLAN::BeginClans) && (k<=PVP_CLAN::EndClans)) _SavedFames[k]=val)\ \ PROP(uint32,_LastTpTick)\ PROP(uint32,_LastOverSpeedTick)\ From bfdab44b1b4e4ec25b40659e44fd21a5edc670e5 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Tue, 30 May 2023 15:21:34 +0200 Subject: [PATCH 042/194] Fix timers --- .../src/entities_game_service/player_manager/character.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index 6d5eecf57d..aab3eb6696 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -2793,7 +2793,10 @@ void CCharacter::applyRegenAndClipCurrentValue() { sint8 bonus = getBonusMalusName("aqua_speed"); if (bonus > -1) + { + setBonusMalusName("aqua_speed", -1); removeEffectInDB(bonus, true); + } } // Speed From 014abf6f9e3e00addc27340da1193ea2586b7bd3 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Tue, 6 Jun 2023 16:32:04 +0200 Subject: [PATCH 043/194] Fix game:addSpawnShapesByZone --- ryzom/client/data/gamedev/interfaces_v3/map.lua | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/map.lua b/ryzom/client/data/gamedev/interfaces_v3/map.lua index 5e18772209..83dbd304a6 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/map.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/map.lua @@ -196,7 +196,7 @@ function game:openFullMap() end end -function game:addSpawnShapesByZone(zone, continent, name, displayIcon, setup, finish, openShape) +function game:addSpawnShapesByZone(zone, continent, name, displayIcon, setup, finish, openShape, text, icon) local id1 = -1 local id2 = -1 @@ -217,8 +217,18 @@ function game:addSpawnShapesByZone(zone, continent, name, displayIcon, setup, fi game.spawnShapesByZone[continent][name] = setup game.spawnShapesByZone[continent][name][8] = Json.decode(setup[8]) + if not text then + text = i18n.get("uiWisdomChest"):toUtf8() + end + + if not icon then + icon = "ico_box" + end + if displayIcon == 1 then - game:addMapArkPoint(zone, setup[2], setup[3], setup[1], i18n.get("uiWisdomChest"):toUtf8(), "ico_box.tga") + game:addMapArkPoint(zone, setup[2], setup[3], setup[1], text, icon..".tga") + else + game:delMapArkPoint(zone, setup[1]) end end @@ -245,6 +255,8 @@ end game.mapRegionSections["Silan"] = {} game.mapRegionSections["Silan"]["newbieland_city.tga"] = true +game.mapRegionSections["Zorai"] = {} +game.mapRegionSections["Zorai"]["zorai_map.tga"] = true game:addMapArkPoint("Vip/Silan", 10276, -11791, "vip_silan_tryker", "", "dynicon_vip.tga", "https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script=9894&vip=nb_tryker_leader&title=fct_chief_explorer&gender=1", 150) game:addMapArkPoint("Vip/Silan", 10341, -11822, "vip_silan_matis", "", "dynicon_vip.tga", "https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script=9894&vip=nb_matis_leader&title=fct_matis_master_artisan&gender=1", 150) From a8e400221d6617f3fa051121b9826879238484d8 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Tue, 6 Jun 2023 16:40:47 +0200 Subject: [PATCH 044/194] Update lua versions --- ryzom/client/data/gamedev/interfaces_v3/appzone.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/ark.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/base64.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/bg_downloader.lua | 4 +++- ryzom/client/data/gamedev/interfaces_v3/bot_chat_v4.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/compass.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/game_config.lua | 5 ++++- ryzom/client/data/gamedev/interfaces_v3/game_r2_loading.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/guild.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/help.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/info_player.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/interaction.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/inventory.lua | 4 +++- ryzom/client/data/gamedev/interfaces_v3/json.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/map.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/misc.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/names_fyros.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/names_matis.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/names_tryker.lua | 4 +++- ryzom/client/data/gamedev/interfaces_v3/names_zorai.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/out_v2_select.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/outpost.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/player.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/player_trade.lua | 3 +++ .../client/data/gamedev/interfaces_v3/ring_access_point.lua | 3 +++ .../data/gamedev/interfaces_v3/ring_access_point_filter.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/ring_window.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/ryzhome_toolbar.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/taskbar.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/tp_interface.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/web_queue.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/webbrowser.lua | 3 +++ ryzom/client/data/gamedev/interfaces_v3/webig.lua | 3 +++ 36 files changed, 109 insertions(+), 4 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/appzone.lua b/ryzom/client/data/gamedev/interfaces_v3/appzone.lua index af9f584cd8..878ea0a7b3 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/appzone.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/appzone.lua @@ -190,3 +190,6 @@ function AppZone:handle(cmd) self:launchApp(cmd) end end + +-- VERSION -- +RYZOM_APPZONE_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark.lua b/ryzom/client/data/gamedev/interfaces_v3/ark.lua index 30040e00a6..ac32ba43eb 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark.lua @@ -621,3 +621,6 @@ function S2E1:newQuake(timer) end + +-- VERSION -- +RYZOM_ARK_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua b/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua index 0a1bf8b2e7..59a0541822 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua @@ -419,3 +419,6 @@ function webig:openWin(ui_name) end end + +-- VERSION -- +RYZOM_ARK_LESSONS_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/base64.lua b/ryzom/client/data/gamedev/interfaces_v3/base64.lua index 203d0aa52d..60aab44bed 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/base64.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/base64.lua @@ -200,3 +200,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------ --]] + +-- VERSION -- +RYZOM_BASE64_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/bg_downloader.lua b/ryzom/client/data/gamedev/interfaces_v3/bg_downloader.lua index 161012d9e5..2264e48246 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/bg_downloader.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/bg_downloader.lua @@ -178,4 +178,6 @@ function bgdownloader:inGamePatchUncompleteWarning() pg:blink(2) messageBoxWithHelp(i18n.get("uiBGD_InGamePatchIncomplete"), "ui:interface", tonumber(getDefine("case_normal"))) displaySystemInfo(i18n.get("uiBGD_InGamePatchIncompleteBC"), "BC") -end \ No newline at end of file +end +-- VERSION -- +RYZOM_BG_DOWNLOADER_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/bot_chat_v4.lua b/ryzom/client/data/gamedev/interfaces_v3/bot_chat_v4.lua index f0b3ec9130..ab145ecff8 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/bot_chat_v4.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/bot_chat_v4.lua @@ -62,3 +62,6 @@ function game:bcMissionsUpdate() ui = getUI('ui:interface:bot_chat_accept_mission') ui.title = title; end + +-- VERSION -- +RYZOM_BOT_CHAT_V4_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/compass.lua b/ryzom/client/data/gamedev/interfaces_v3/compass.lua index 414c9c137f..df4727b1c9 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/compass.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/compass.lua @@ -48,3 +48,6 @@ function game:displayCalendar() end setOnDraw(getUI("ui:interface:compass"), "game:updateCompass()") + +-- VERSION -- +RYZOM_COMPASS_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/game_config.lua b/ryzom/client/data/gamedev/interfaces_v3/game_config.lua index dc39f93a16..c33e62fd6b 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/game_config.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/game_config.lua @@ -129,7 +129,7 @@ function game:configShowOne(strUIToShow) -- special case : if the display tab was shown, update the aspect ratio if needed local generalGrp = getUI('ui:interface:game_config:content:general'); local uiGrp = getUI('ui:interface:game_config:content:' .. strUIToShow); - -- Removed the following code to solve RT n°14720 + -- Removed the following code to solve RT n°14720 -- The 'game_config_change_screen_ratio_custom' action handler -- should only be called if the user changed the apect ratio himself -- (else the edit box containing the aspect ratio may not have been initiliazed here) @@ -198,3 +198,6 @@ function game:configInit() winActive("wc_r2_scenario_control", true) winActive("wc_r2_player_tracking", r2WinOn) end + +-- VERSION -- +RYZOM_GAME_CONFIG_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/game_r2_loading.lua b/ryzom/client/data/gamedev/interfaces_v3/game_r2_loading.lua index 33a3810d31..2ad99629ec 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/game_r2_loading.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/game_r2_loading.lua @@ -636,3 +636,6 @@ function GameR2Loading:buildNewbielandScenarioTree() tree:forceRebuild() end + +-- VERSION -- +RYZOM_GAME_R2_LOADING_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/guild.lua b/ryzom/client/data/gamedev/interfaces_v3/guild.lua index 4c3bc0646c..2d33203486 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/guild.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/guild.lua @@ -96,3 +96,6 @@ function game:guildDeactive() setDbProp('UI:VARIABLES:ISACTIVE:GUILD', 0); end + +-- VERSION -- +RYZOM_GUILD_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/help.lua b/ryzom/client/data/gamedev/interfaces_v3/help.lua index a175e2f03c..9d3d437531 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/help.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/help.lua @@ -140,3 +140,6 @@ function help:continueLesson(id, url) end + +-- VERSION -- +RYZOM_HELP_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/info_player.lua b/ryzom/client/data/gamedev/interfaces_v3/info_player.lua index 54b2414080..3073321a45 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/info_player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/info_player.lua @@ -2196,3 +2196,6 @@ function game:arkTitlesAddClassics() end + +-- VERSION -- +RYZOM_INFO_PLAYER_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua index 663d352a1b..2c351f90b2 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua @@ -1288,3 +1288,6 @@ function arkNpcShop:Buy(id) end arkNpcShop:Close() end + +-- VERSION -- +RYZOM_INTERACTION_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/inventory.lua b/ryzom/client/data/gamedev/interfaces_v3/inventory.lua index eb2892b0a6..b2f3b82c39 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/inventory.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/inventory.lua @@ -74,4 +74,6 @@ function game:updateEquipOnResize(base, force) handl.active = false end end -end \ No newline at end of file +end +-- VERSION -- +RYZOM_INVENTORY_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/json.lua b/ryzom/client/data/gamedev/interfaces_v3/json.lua index 70d8c4413b..5de24111cc 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/json.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/json.lua @@ -374,3 +374,6 @@ function Json.decode(str) end return ( parse(str, next_char(str, 1, space_chars, true)) ) end + +-- VERSION -- +RYZOM_JSON_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/map.lua b/ryzom/client/data/gamedev/interfaces_v3/map.lua index 83dbd304a6..54f4a27855 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/map.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/map.lua @@ -269,3 +269,6 @@ game:addMapArkPoint("Vip", 4154, -3305, "vip_allegory", "", "allegory_16.tga", " -- register map overrride -- game:setAltMap("fyros_map.tga", "fyros_map_sp.tga") + +-- VERSION -- +RYZOM_MAP_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/misc.lua b/ryzom/client/data/gamedev/interfaces_v3/misc.lua index 6127a3a0ac..ac920e5912 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/misc.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/misc.lua @@ -134,3 +134,6 @@ function misc:initInvObserver( end return setmetatable(misc, self.invObserver) end + +-- VERSION -- +RYZOM_MISC_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/names_fyros.lua b/ryzom/client/data/gamedev/interfaces_v3/names_fyros.lua index d208e62de4..d6e0cbf2cf 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/names_fyros.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/names_fyros.lua @@ -293,3 +293,6 @@ fyrosLastNames = {"Abyan", "Abybus", "Abycaon", "Abycus", "Abydix", "Abydon", "A , "Aeton", "Aexius", "Apoan", "Apobus", "Apocaon", "Apocus", "Apodix", "Apodon", "Apodos", "Apoion", "Apokos", "Apola", "Apolaus", "Apolion" , "Apollo", "Apolus", "Apomus", "Apon", "Aponix", "Apops", "Aporius", "Aporon", "Aporos", "Aporus", "Aposeus", "Aposse", "Apotheus", "Apothus", "Apotis", "Apoton", "Apoxius", "Boean", "Boebus", "Boecaon", "Boecus", "Boedix", "Boedon", "Boedos", "Boeion", "Boekos", "Boela", "Boelaus", "Boelion", "Boello", "Boelus", "Boemus", "Boen", "Boenix", "Boeps", "Boerius", "Boeron", "Boeros", "Boerus", "Boeseus", "Boesse", "Boetheus", "Boethus", "Boetis", "Boeton", "Boexius", "Cean", "Cebus", "Cecaon", "Cecus", "Cedix", "Cedon", "Cedos", "Ceion", "Cekos", "Cela", "Celaus", "Celion", "Cello", "Celus", "Cemus", "Cen", "Cenix", "Ceps", "Cerius", "Ceron", "Ceros", "Cerus", "Ceseus", "Cesse", "Cetheus", "Cethus", "Cetis", "Ceton", "Cexius", "Dean", "Debus", "Decaon", "Decus", "Dedix", "Dedon", "Dedos", "Deion", "Dekos", "Dela", "Delaus", "Delion", "Dello", "Delus", "Demus", "Den", "Denix", "Deps", "Derius", "Deron", "Deros", "Derus", "Deseus", "Desse", "Detheus" , "Dethus", "Detis", "Deton", "Deuan", "Deubus", "Deucaon", "Deucus", "Deudix", "Deudon", "Deudos", "Deuion", "Deukos", "Deula", "Deulaus", "Deulion", "Deullo", "Deulus", "Deumus", "Deun", "Deunix", "Deups", "Deurius", "Deuron", "Deuros", "Deurus", "Deuseus", "Deusse", "Deutheus", "Deuthus", "Deutis", "Deuton", "Deuxius", "Dexius", "Dioan", "Diobus", "Diocaon", "Diocus", "Diodix", "Diodon", "Diodos", "Dioion", "Diokos", "Diola", "Diolaus", "Diolion", "Diollo", "Diolus", "Diomus", "Dion", "Dionix", "Diops", "Diorius", "Dioron", "Dioros", "Diorus", "Dioseus", "Diosse", "Diotheus", "Diothus", "Diotis", "Dioton", "Dioxius", "Dyan", "Dybus", "Dycaon", "Dycus", "Dydix", "Dydon", "Dydos", "Dyion", "Dykos", "Dyla", "Dylaus", "Dylion", "Dyllo", "Dylus", "Dymus", "Dyn", "Dynix", "Dyps", "Dyrius", "Dyron", "Dyros", "Dyrus", "Dyseus", "Dysse", "Dytheus", "Dythus", "Dytis", "Dyton", "Dyxius", "Euan", "Eubus", "Eucaon", "Eucus", "Eudix", "Eudon", "Eudos", "Euion", "Eukos", "Eula", "Eulaus", "Eulion", "Eullo", "Eulus", "Eumus", "Eun", "Eunix", "Eups", "Eurius", "Euron", "Euros", "Eurus", "Euseus", "Eusse", "Eutheus", "Euthus", "Eutis", "Euton", "Euxius", "Gaan", "Gabus", "Gacaon", "Gacus", "Gadix", "Gadon", "Gados", "Gaion", "Gakos", "Gala", "Galaus", "Galion", "Gallo", "Galus", "Gamus", "Gan", "Ganix", "Gaps", "Garius", "Garon", "Garos", "Garus", "Gaseus", "Gasse", "Gatheus", "Gathus", "Gatis", "Gaton", "Gaxius", "Ibian", "Ibibus", "Ibicaon", "Ibicus", "Ibidix", "Ibidon", "Ibidos", "Ibiion", "Ibikos", "Ibila", "Ibilaus", "Ibilion", "Ibillo", "Ibilus", "Ibimus", "Ibin", "Ibinix", "Ibips", "Ibirius", "Ibiron", "Ibiros", "Ibirus", "Ibiseus", "Ibisse", "Ibitheus", "Ibithus", "Ibitis", "Ibiton", "Ibixius", "Icaan", "Icabus", "Icacaon", "Icacus", "Icadix", "Icadon", "Icados", "Icaion", "Icakos", "Icala", "Icalaus", "Icalion", "Icallo", "Icalus", "Icamus", "Ican", "Icanix", "Icaps", "Icarius", "Icaron", "Icaros", "Icarus", "Icaseus", "Icasse", "Icatheus", "Icathus", "Icatis", "Icaton", "Icaxius", "Ioan", "Iobus", "Iocaon", "Iocus", "Iodix", "Iodon", "Iodos", "Ioion", "Iokos", "Iola", "Iolaus", "Iolion", "Iollo", "Iolus", "Iomus", "Ion", "Ionix", "Iops", "Iorius", "Ioron", "Ioros", "Iorus", "Ioseus", "Iosse", "Iotheus", "Iothus", "Iotis", "Ioton", "Ioxius", "Krian", "Kribus", "Kricaon", "Kricus", "Kridix", "Kridon", "Kridos", "Kriion", "Krikos", "Krila", "Krilaus", "Krilion", "Krillo", "Krilus", "Krimus", "Krin", "Krinix", "Krips", "Kririus", "Kriron", "Kriros", "Krirus", "Kriseus", "Krisse", "Kritheus", "Krithus", "Kritis", "Kriton", "Krixius", "Kyan", "Kybus", "Kycaon", "Kycus", "Kydix", "Kydon", "Kydos", "Kyion", "Kykos", "Kyla", "Kylaus", "Kylion", "Kyllo", "Kylus", "Kymus", "Kyn", "Kynix", "Kyps", "Kyrius", "Kyron", "Kyros", "Kyrus", "Kyseus", "Kysse", "Kytheus", "Kythus", "Kytis", "Kyton", "Kyxius", "Lyan", "Lybus", "Lycaon", "Lycus", "Lydix", "Lydon", "Lydos", "Lyion", "Lykos", "Lyla", "Lylaus", "Lylion", "Lyllo", "Lylus", "Lymus", "Lyn", "Lynix", "Lyps", "Lyrius", "Lyron", "Lyros", "Lyrus", "Lyseus", "Lysse", "Lytheus", "Lythus", "Lytis", "Lyton", "Lyxius", "Mean", "Mebus", "Mecaon", "Mecus", "Medix", "Medon", "Medos", "Meion", "Mekos", "Mela", "Melaus", "Melion", "Mello", "Melus", "Memus", "Men", "Menix", "Meps", "Merius", "Meron", "Meros", "Merus", "Meseus", "Messe", "Metheus", "Methus", "Metis", "Meton", "Mexius", "Mian", "Mibus", "Micaon", "Micus", "Midix", "Midon", "Midos", "Miion", "Mikos", "Mila", "Milaus", "Milion", "Millo", "Milus", "Mimus", "Min", "Minix", "Mips", "Mirius", "Miron", "Miros", "Mirus", "Miseus", "Misse", "Mitheus", "Mithus", "Mitis", "Miton", "Mixius", "Pean", "Pebus", "Pecaon", "Pecus", "Pedix", "Pedon", "Pedos", "Peion", "Pekos", "Pela", "Pelaus", "Pelion", "Pello", "Pelus", "Pemus", "Pen", "Penix", "Peps", "Perius", "Peron", "Peros", "Perus", "Peseus", "Pesse", "Petheus", "Pethus", "Petis", "Peton", "Pexius", "Pian", "Pibus", "Picaon", "Picus", "Pidix", "Pidon", "Pidos", "Piion", "Pikos", "Pila", "Pilaus", "Pilion", "Pillo", "Pilus", "Pimus", "Pin", "Pinix", "Pips", "Pirius", "Piron", "Piros", "Pirus", "Piseus", "Pisse", "Pitheus", "Pithus", "Pitis", "Piton", "Pixius", "Plean", "Plebus", "Plecaon", "Plecus", "Pledix", "Pledon", "Pledos", "Pleion", "Plekos", "Plela", "Plelaus", "Plelion", "Plello", "Plelus", "Plemus", "Plen", "Plenix", "Pleps", "Plerius", "Pleron", "Pleros", "Plerus", "Pleseus", "Plesse", "Pletheus", "Plethus", "Pletis", "Pleton", "Plexius", "Pyan", "Pybus", "Pycaon", "Pycus", "Pydix", "Pydon", "Pydos", "Pyion", "Pykos", "Pyla", "Pylaus", "Pylion", "Pyllo", "Pylus", "Pymus", "Pyn", "Pynix", "Pyps", "Pyrius", "Pyron", "Pyros", "Pyrus", "Pyseus", "Pysse", "Pytheus", "Pythus", "Pytis", "Pyton", "Pyxius", "Thean", "Thebus", "Thecaon", "Thecus", "Thedix", "Thedon", "Thedos", "Theion", "Thekos", "Thela", "Thelaus", "Thelion", "Thello", "Thelus", "Themus", "Then", "Thenix", "Theps", "Therius", "Theron", "Theros", "Therus", "Theseus", "Thesse", "Thetheus", "Thethus", "Thetis", "Theton", "Thexius", "Tian", "Tibus", "Ticaon", "Ticus", "Tidix", "Tidon", "Tidos", "Tiion", "Tikos", "Tila", "Tilaus", "Tilion", "Tillo", "Tilus", "Timus", "Tin", "Tinix", "Tips", "Tirius", "Tiron", "Tiros", "Tirus", "Tiseus", "Tisse", "Titheus", "Tithus", "Titis", "Titon", "Tixius", "Ulyan", "Ulybus", "Ulycaon", "Ulycus", "Ulydix", "Ulydon", "Ulydos", "Ulyion", "Ulykos", "Ulyla", "Ulylaus", "Ulylion", "Ulyllo", "Ulylus", "Ulymus", "Ulyn", "Ulynix", "Ulyps", "Ulyrius", "Ulyron", "Ulyros", "Ulyrus", "Ulyseus", "Ulysse", "Ulytheus", "Ulythus", "Ulytis", "Ulyton", "Ulyxius", "Xaan", "Xabus", "Xacaon", "Xacus", "Xadix", "Xadon", "Xados", "Xaion", "Xakos", "Xala", "Xalaus", "Xalion", "Xallo", "Xalus", "Xamus", "Xan", "Xanix", "Xaps", "Xarius", "Xaron", "Xaros", "Xarus", "Xaseus", "Xasse", "Xatheus", "Xathus", "Xatis", "Xaton", "Xaxius", "Xyan", "Xybus", "Xycaon", "Xycus", "Xydix", "Xydon", "Xydos", "Xyion", "Xykos", "Xyla", "Xylaus", "Xylion", "Xyllo", "Xylus", "Xymus", "Xyn", "Xynix", "Xyps", "Xyrius", "Xyron", "Xyros", "Xyrus", "Xyseus", "Xysse", "Xytheus", "Xythus", "Xytis", "Xyton", "Xyxius", "Zean", "Zebus", "Zecaon", "Zecus", "Zedix", "Zedon", "Zedos", "Zeion", "Zekos", "Zela", "Zelaus", "Zelion", "Zello", "Zelus", "Zemus", "Zen", "Zenix", "Zeps", "Zerius", "Zeron", "Zeros", "Zerus", "Zeseus", "Zesse", "Zetheus", "Zethus", "Zetis", "Zeton", "Zexius"} + +-- VERSION -- +RYZOM_NAMES_FYROS_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/names_matis.lua b/ryzom/client/data/gamedev/interfaces_v3/names_matis.lua index 28d9584f7e..f0c1954e79 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/names_matis.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/names_matis.lua @@ -1,3 +1,6 @@ matisLastNames = {"Anibi", "Anicco", "Anichini", "Anichio", "Anidera", "Anidi", "Anido", "Anigno", "Anildo", "Anilli", "Anillo", "Anilo", "Anindi", "Anini", "Aninia", "Aninio", "Anino", "Aninti", "Anipi", "Anirello", "Aniri", "Anirini", "Anirinia", "Anisi", "Anisti", "Anivaldo", "Anizzo", "Antobi", "Antocco", "Antochini", "Antochio", "Antodera", "Antodi", "Antodo", "Antogno", "Antoldo", "Antolli", "Antollo", "Antolo", "Antondi", "Antoni", "Antonia", "Antonio", "Antono", "Antonti", "Antopi", "Antorello", "Antori", "Antorini", "Antorinia", "Antosi", "Antosti", "Antovaldo", "Antozzo", "Bebi", "Becco", "Bechini", "Bechio", "Bedera", "Bedi", "Bedo", "Begno", "Beldo", "Belli", "Bello", "Belo", "Bendi", "Beni", "Benia", "Benio", "Beno", "Benti", "Bepi", "Berello", "Beri", "Berini", "Berinia", "Besi", "Besti", "Bevaldo", "Bezzo", "Chiabi", "Chiacco", "Chiachini", "Chiachio", "Chiadera", "Chiadi", "Chiado", "Chiagno", "Chialdo", "Chialli", "Chiallo", "Chialo", "Chiandi", "Chiani", "Chiania", "Chianio", "Chiano", "Chianti", "Chiapi", "Chiarello", "Chiari", "Chiarini", "Chiarinia", "Chiasi", "Chiasti", "Chiavaldo", "Chiazzo", "Cibi", "Cicco", "Cichini", "Cichio", "Cidera", "Cidi", "Cido", "Cigno", "Cildo", "Cilli", "Cillo", "Cilo", "Cindi", "Cini", "Cinia", "Cinio", "Cino", "Cinti", "Ciobi", "Ciocco", "Ciochini", "Ciochio", "Ciodera", "Ciodi", "Ciodo", "Ciogno", "Cioldo", "Ciolli", "Ciollo", "Ciolo", "Ciondi", "Cioni", "Cionia", "Cionio", "Ciono", "Cionti", "Ciopi", "Ciorello", "Ciori", "Ciorini", "Ciorinia", "Ciosi", "Ciosti", "Ciovaldo", "Ciozzo", "Cipi", "Cirello", "Ciri", "Cirini", "Cirinia", "Cisi", "Cisti", "Civaldo", "Cizzo", "Cuibi", "Cuicco", "Cuichini", "Cuichio", "Cuidera", "Cuidi", "Cuido", "Cuigno", "Cuildo", "Cuilli", "Cuillo", "Cuilo", "Cuindi", "Cuini", "Cuinia", "Cuinio", "Cuino", "Cuinti", "Cuipi", "Cuirello", "Cuiri", "Cuirini", "Cuirinia", "Cuisi", "Cuisti", "Cuivaldo", "Cuizzo", "Frebi", "Frecco", "Frechini", "Frechio", "Fredera", "Fredi", "Fredo", "Fregno", "Freldo", "Frelli", "Frello", "Frelo", "Frendi", "Freni", "Frenia", "Frenio", "Freno", "Frenti", "Frepi", "Frerello", "Freri", "Frerini", "Frerinia", "Fresi", "Fresti", "Frevaldo", "Frezzo", "Gibi", "Gicco", "Gichini", "Gichio", "Gidera", "Gidi", "Gido", "Gigno", "Gildo", "Gilli", "Gillo", "Gilo", "Gindi", "Gini", "Ginia", "Ginio", "Gino", "Ginti", "Gipi", "Girello", "Giri", "Girini", "Girinia", "Gisi", "Gisti", "Givaldo", "Gizzo", "Libi", "Licco", "Lichini", "Lichio", "Lidera", "Lidi", "Lido", "Ligno", "Lildo", "Lilli", "Lillo", "Lilo", "Lindi", "Lini", "Linia", "Linio", "Lino", "Linti", "Lipi", "Lirello", "Liri", "Lirini", "Lirinia", "Lisi", "Listi", "Livaldo", "Lizzo", "Miabi", "Miacco", "Miachini", "Miachio", "Miadera", "Miadi", "Miado", "Miagno", "Mialdo", "Mialli", "Miallo", "Mialo", "Miandi", "Miani", "Miania", "Mianio", "Miano", "Mianti", "Miapi", "Miarello", "Miari", "Miarini", "Miarinia", "Miasi", "Miasti", "Miavaldo", "Miazzo", "Nibi", "Nicco", "Nichini", "Nichio", "Nidera", "Nidi", "Nido", "Nigno", "Nildo", "Nilli", "Nillo", "Nilo", "Nindi", "Nini", "Ninia", "Ninio", "Nino", "Ninti", "Nipi", "Nirello", "Niri", "Nirini", "Nirinia", "Nisi", "Nisti", "Nivaldo", "Nizzo", "Pebi", "Pecco", "Pechini", "Pechio", "Pedera", "Pedi", "Pedo", "Pegno", "Peldo", "Pelli", "Pello", "Pelo", "Pendi", "Peni", "Penia", "Penio", "Peno", "Penti", "Pepi", "Perello", "Peri", "Perini", "Perinia", "Pesi", "Pesti", "Pevaldo", "Pezzo", "Pibi", "Picco", "Pichini", "Pichio", "Pidera", "Pidi", "Pido", "Pigno", "Pildo", "Pilli", "Pillo", "Pilo", "Pindi", "Pini", "Pinia", "Pinio", "Pino", "Pinti", "Pipi", "Pirello", "Piri", "Pirini", "Pirinia", "Pisi", "Pisti", "Pivaldo", "Pizzo", "Robi", "Rocco", "Rochini", "Rochio", "Rodera", "Rodi", "Rodo", "Rogno", "Roldo", "Rolli", "Rollo", "Rolo", "Rondi", "Roni", "Ronia", "Ronio", "Rono", "Ronti", "Ropi", "Rorello", "Rori", "Rorini", "Rorinia", "Rosi", "Rosibi", "Rosicco", "Rosichini", "Rosichio", "Rosidera", "Rosidi", "Rosido", "Rosigno", "Rosildo", "Rosilli", "Rosillo", "Rosilo", "Rosindi", "Rosini", "Rosinia", "Rosinio", "Rosino", "Rosinti", "Rosipi", "Rosirello", "Rosiri", "Rosirini", "Rosirinia", "Rosisi", "Rosisti", "Rosivaldo", "Rosizzo", "Rosti", "Rovaldo", "Rozzo", "Sibi", "Sicco", "Sichini", "Sichio", "Sidera", "Sidi", "Sido", "Signo", "Sildo", "Silli", "Sillo", "Silo", "Sindi", "Sini", "Sinia", "Sinio", "Sino", "Sinti", "Sipi", "Sirello", "Siri", "Sirini", "Sirinia", "Sisi", "Sisti", "Sivaldo", "Sizzo", "Stabi", "Stacco", "Stachini", "Stachio", "Stadera", "Stadi", "Stado", "Stagno", "Staldo", "Stalli", "Stallo", "Stalo", "Standi", "Stani", "Stania", "Stanio", "Stano", "Stanti", "Stapi", "Starello", "Stari", "Starini", "Starinia", "Stasi", "Stasti", "Stavaldo", "Stazzo", "Tinabi", "Tinacco", "Tinachini", "Tinachio", "Tinadera", "Tinadi", "Tinado", "Tinagno", "Tinaldo", "Tinalli", "Tinallo", "Tinalo", "Tinandi", "Tinani", "Tinania", "Tinanio", "Tinano", "Tinanti", "Tinapi", "Tinarello", "Tinari", "Tinarini", "Tinarinia", "Tinasi", "Tinasti", "Tinavaldo", "Tinazzo", "Tribi", "Tricco", "Trichini", "Trichio", "Tridera", "Tridi", "Trido", "Trigno", "Trildo", "Trilli", "Trillo", "Trilo", "Trindi", "Trini", "Trinia", "Trinio", "Trino", "Trinti", "Tripi", "Trirello", "Triri", "Tririni", "Tririnia", "Trisi", "Tristi", "Trivaldo", "Trizzo", "Vabi", "Vacco", "Vachini", "Vachio", "Vadera", "Vadi", "Vado", "Vagno", "Valdo", "Valli", "Vallo", "Valo", "Vandi", "Vani", "Vania", "Vanio", "Vano", "Vanti", "Vapi", "Varello", "Vari", "Varini", "Varinia", "Vasi", "Vasti", "Vavaldo", "Vazzo", "Vibi", "Vicco", "Vichini", "Vichio", "Videra", "Vidi", "Vido", "Vigno", "Vildo", "Villi", "Villo", "Vilo", "Vindi", "Vini", "Vinia", "Vinio", "Vino", "Vinti", "Vipi", "Virello", "Viri", "Virini", "Virinia", "Visi", "Visti", "Vivaldo", "Vizzo", "Zabi", "Zacco", "Zachini", "Zachio", "Zadera", "Zadi", "Zado", "Zagno", "Zaldo", "Zalli", "Zallo", "Zalo", "Zandi", "Zani", "Zania", "Zanio", "Zano", "Zanti", "Zapi", "Zarello", "Zari", "Zarini", "Zarinia", "Zasi", "Zasti", "Zavaldo", "Zazzo"} matisFemaleFirstNames = {"Anibi", "Anichi", "Anichini", "Anidi", "Anilli", "Anini", "Aninni", "Anirni", "Anisti", "Antobi", "Antochi", "Antochini", "Antodi", "Antolli", "Antoni", "Antonni", "Antorni", "Antosti", "Bebi", "Bechi", "Bechini", "Bedi", "Belli", "Beni", "Benni", "Berni", "Besti", "Chiabi", "Chiachi", "Chiachini", "Chiadi", "Chialli", "Chiani", "Chianni", "Chiarni", "Chiasti", "Cibi", "Cichi", "Cichini", "Cidi", "Cilli", "Cini", "Cinni", "Ciobi", "Ciochi", "Ciochini", "Ciodi", "Ciolli", "Cioni", "Cionni", "Ciorni", "Ciosti", "Cirni", "Cisti", "Cuibi", "Cuichi", "Cuichini", "Cuidi", "Cuilli", "Cuini", "Cuinni", "Cuirni", "Cuisti", "Frebi", "Frechi", "Frechini", "Fredi", "Frelli", "Freni", "Frenni", "Frerni", "Fresti", "Gibi", "Gichi", "Gichini", "Gidi", "Gilli", "Gini", "Ginni", "Girni", "Gisti", "Libi", "Lichi", "Lichini", "Lidi", "Lilli", "Lini", "Linni", "Lirni", "Listi", "Miabi", "Miachi", "Miachini", "Miadi", "Mialli", "Miani", "Mianni", "Miarni", "Miasti", "Nibi", "Nichi", "Nichini", "Nidi", "Nilli", "Nini", "Ninni", "Nirni", "Nisti", "Pebi", "Pechi", "Pechini", "Pedi", "Pelli", "Peni", "Penni", "Perni", "Pesti", "Pibi", "Pichi", "Pichini", "Pidi", "Pilli", "Pini", "Pinni", "Pirni", "Pisti", "Robi", "Rochi", "Rochini", "Rodi", "Rolli", "Roni", "Ronni", "Rorni", "Rosibi", "Rosichi", "Rosichini", "Rosidi", "Rosilli", "Rosini", "Rosinni", "Rosirni", "Rosisti", "Rosti", "Sibi", "Sichi", "Sichini", "Sidi", "Silli", "Sini", "Sinni", "Sirni", "Sisti", "Stabi", "Stachi", "Stachini", "Stadi", "Stalli", "Stani", "Stanni", "Starni", "Stasti", "Tinabi", "Tinachi", "Tinachini", "Tinadi", "Tinalli", "Tinani", "Tinanni", "Tinarni", "Tinasti", "Tribi", "Trichi", "Trichini", "Tridi", "Trilli", "Trini", "Trinni", "Trirni", "Tristi", "Vabi", "Vachi", "Vachini", "Vadi", "Valli", "Vani", "Vanni", "Varni", "Vasti", "Vibi", "Vichi", "Vichini", "Vidi", "Villi", "Vini", "Vinni", "Virni", "Visti", "Zabi", "Zachi", "Zachini", "Zadi", "Zalli", "Zani", "Zanni", "Zarni", "Zasti", "Andrea", "Chiabre", "Aninne", "Gibre", "Fresse", "Liche", "Nirni", "Pechi"} matisMaleFirstNames = {"Anibre", "Aniccio", "Anicco", "Anichio", "Anicho", "Aniero", "Anigio", "Anigno", "Anillo", "Anilo", "Anine", "Aninio", "Anino", "Anirgio", "Aniro", "Anisse", "Anivaldo", "Anizzo", "Antobre", "Antoccio", "Antocco", "Antochio", "Antocho", "Antoero", "Antogio", "Antogno", "Antollo", "Antolo", "Antone", "Antonio", "Antono", "Antorgio", "Antoro", "Antosse", "Antovaldo", "Antozzo", "Bebre", "Beccio", "Becco", "Bechio", "Becho", "Beero", "Begio", "Begno", "Bello", "Belo", "Bene", "Benio", "Beno", "Bergio", "Bero", "Besse", "Bevaldo", "Bezzo", "Chiabre", "Chiaccio", "Chiacco", "Chiachio", "Chiacho", "Chiaero", "Chiagio", "Chiagno", "Chiallo", "Chialo", "Chiane", "Chianio", "Chiano", "Chiargio", "Chiaro", "Chiasse", "Chiavaldo", "Chiazzo", "Cibre", "Ciccio", "Cicco", "Cichio", "Cicho", "Ciero", "Cigio", "Cigno", "Cillo", "Cilo", "Cine", "Cinio", "Cino", "Ciobre", "Cioccio", "Ciocco", "Ciochio", "Ciocho", "Cioero", "Ciogio", "Ciogno", "Ciollo", "Ciolo", "Cione", "Cionio", "Ciono", "Ciorgio", "Cioro", "Ciosse", "Ciovaldo", "Ciozzo", "Cirgio", "Ciro", "Cisse", "Civaldo", "Cizzo", "Cuibre", "Cuiccio", "Cuicco", "Cuichio", "Cuiero", "Cuigio", "Cuigno", "Cuillo", "Cuilo", "Cuine", "Cuinio", "Cuino", "Cuirgio", "Cuiro", "Cuisse", "Cuivaldo", "Cuizzo", "Frebre", "Freccio", "Frecco", "Frechio", "Frecho", "Freero", "Fregio", "Fregno", "Frello", "Frelo", "Frene", "Frenio", "Freno", "Frergio", "Frero", "Fresse", "Frevaldo", "Frezzo", "Gibre", "Giccio", "Gicco", "Gichio", "Gicho", "Giero", "Gigio", "Gigno", "Gillo", "Gilo", "Gine", "Ginio", "Gino", "Girgio", "Giro", "Gisse", "Givaldo", "Gizzo", "Libre", "Liccio", "Licco", "Lichio", "Licho", "Liero", "Ligio", "Ligno", "Lillo", "Lilo", "Line", "Linio", "Lino", "Lirgio", "Liro", "Lisse", "Livaldo", "Lizzo", "Miabre", "Miaccio", "Miacco", "Miachio", "Miacho", "Miaero", "Miagio", "Miagno", "Miallo", "Mialo", "Miane", "Mianio", "Miano", "Miargio", "Miaro", "Miasse", "Miavaldo", "Miazzo", "Nibre", "Niccio", "Nicco", "Nichio", "Nicho", "Niero", "Nigio", "Nigno", "Nillo", "Nilo", "Nine", "Ninio", "Nino", "Nirgio", "Niro", "Nisse", "Nivaldo", "Nizzo", "Pebre", "Peccio", "Pecco", "Pechio", "Pecho", "Peero", "Pegio", "Pegno", "Pello", "Pelo", "Pene", "Penio", "Peno", "Pergio", "Pero", "Pesse", "Pevaldo", "Pezzo", "Pibre", "Piccio", "Picco", "Pichio", "Picho", "Piero", "Pigio", "Pigno", "Pillo", "Pilo", "Pine", "Pinio", "Pino", "Pirgio", "Piro", "Pisse", "Pivaldo", "Pizzo", "Robre", "Roccio", "Rocco", "Rochio", "Rocho", "Roero", "Rogio", "Rogno", "Rollo", "Rolo", "Rone", "Ronio", "Rono", "Rorgio", "Roro", "Rosibre", "Rosiccio", "Rosicco", "Rosichio", "Rosicho", "Rosiero", "Rosigio", "Rosigno", "Rosillo", "Rosilo", "Rosine", "Rosinio", "Rosino", "Rosirgio", "Rosiro", "Rosisse", "Rosivaldo", "Rosizzo", "Rosse", "Rovaldo", "Rozzo", "Sibre", "Siccio", "Sicco", "Sichio", "Sicho", "Siero", "Sigio", "Signo", "Sillo", "Silo", "Sine", "Sinio", "Sino", "Sirgio", "Siro", "Sisse", "Sivaldo", "Sizzo", "Stabre", "Staccio", "Stacco", "Stachio", "Stacho", "Staero", "Stagio", "Stagno", "Stallo", "Stalo", "Stane", "Stanio", "Stano", "Stargio", "Staro", "Stasse", "Stavaldo", "Stazzo", "Tinabre", "Tinaccio", "Tinacco", "Tinachio", "Tinacho", "Tinaero", "Tinagio", "Tinagno", "Tinallo", "Tinalo", "Tinane", "Tinanio", "Tinano", "Tinargio", "Tinaro", "Tinasse", "Tinavaldo", "Tinazzo", "Tribre", "Triccio", "Tricco", "Trichio", "Tricho", "Triero", "Trigio", "Trigno", "Trillo", "Trilo", "Trine", "Trinio", "Trino", "Trirgio", "Triro", "Trisse", "Trivaldo", "Trizzo", "Vabre", "Vaccio", "Vacco", "Vachio", "Vacho", "Vaero", "Vagio", "Vagno", "Vallo", "Valo", "Vane", "Vanio", "Vano", "Vargio", "Varo", "Vasse", "Vavaldo", "Vazzo", "Vibre", "Viccio", "Vicco", "Vichio", "Vicho", "Viero", "Vigio", "Vigno", "Villo", "Vilo", "Vine", "Vinio", "Vino", "Virgio", "Viro", "Visse", "Vivaldo", "Vizzo", "Zabre", "Zaccio", "Zacco", "Zachio", "Zacho", "Zaero", "Zagio", "Zagno", "Zallo", "Zalo", "Zane", "Zanio", "Zano", "Zargio", "Zaro", "Zasse", "Zavaldo", "Zazzo", "Andrea", "Chiabre", "Aninne", "Gibre", "Fresse", "Liche", "Nirni", "Pechi"} + +-- VERSION -- +RYZOM_NAMES_MATIS_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/names_tryker.lua b/ryzom/client/data/gamedev/interfaces_v3/names_tryker.lua index 3d4c535cce..d3aa20da5f 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/names_tryker.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/names_tryker.lua @@ -1,3 +1,5 @@ trykerFirstNames = {"Abban", "Abben", "Abber", "Abbie", "Abby", "Achan", "Achen", "Acher", "Achie", "Achy", "Ackan", "Acken", "Acker", "Ackie", "Acky", "Addan", "Adden", "Adder", "Addie", "Addy", "Adgan", "Adgen", "Adger", "Adgie", "Adgy", "Aebban", "Aebben", "Aebber", "Aebbie", "Aebby", "Aechan", "Aechen", "Aecher", "Aechie", "Aechy", "Aeckan", "Aecken", "Aecker", "Aeckie", "Aecky", "Aeddan", "Aedden", "Aedder", "Aeddie", "Aeddy", "Aedgan", "Aedgen", "Aedger", "Aedgie", "Aedgy", "Aeffan", "Aeffen", "Aeffer", "Aeffie", "Aeffy", "Aegan", "Aegen", "Aeger", "Aeggan", "Aeggen", "Aegger", "Aeggie", "Aeggy", "Aegie", "Aegy", "Aeksan", "Aeksen", "Aekser", "Aeksie", "Aeksy", "Aelan", "Aelen", "Aeler", "Aelie", "Aellan", "Aellen", "Aeller", "Aellie", "Aelly", "Aely", "Aeman", "Aemen", "Aemer", "Aemie", "Aemman", "Aemmen", "Aemmer", "Aemmie", "Aemmy", "Aemy", "Aenan", "Aendan", "Aenden", "Aender", "Aendie", "Aendy", "Aenen", "Aener", "Aenie", "Aennan", "Aennen", "Aenner", "Aennie", "Aenny", "Aeny", "Aepan", "Aepen", "Aeper", "Aepie", "Aeppan", "Aeppen", "Aepper", "Aeppie", "Aeppy", "Aepsan", "Aepsen", "Aepser", "Aepsie", "Aepsy", "Aepy", "Aerdan", "Aerden", "Aerder", "Aerdie", "Aerdy", "Aerman", "Aermen", "Aermer", "Aermie", "Aermy", "Aerran", "Aerren", "Aerrer", "Aerrie", "Aerry", "Aertan", "Aerten", "Aerter", "Aertie", "Aerty", "Aesan", "Aesen", "Aeser", "Aesie", "Aeskan", "Aesken", "Aesker", "Aeskie", "Aesky", "Aessan", "Aessen", "Aesser", "Aessie", "Aessy", "Aesy", "Aethan", "Aethen", "Aether", "Aethie", "Aethy", "Aettan", "Aetten", "Aetter", "Aettie", "Aetty", "Aexan", "Aexen", "Aexer", "Aexie", "Aexy", "Aezzan", "Aezzen", "Aezzer", "Aezzie", "Aezzy", "Affan", "Affen", "Affer", "Affie", "Affy", "Agan", "Agen", "Ager", "Aggan", "Aggen", "Agger", "Aggie", "Aggy", "Agie", "Agy", "Aibban", "Aibben", "Aibber", "Aibbie", "Aibby", "Aichan", "Aichen", "Aicher", "Aichie", "Aichy", "Aickan", "Aicken", "Aicker", "Aickie", "Aicky", "Aiddan", "Aidden", "Aidder", "Aiddie", "Aiddy", "Aidgan", "Aidgen", "Aidger", "Aidgie", "Aidgy", "Aiffan", "Aiffen", "Aiffer", "Aiffie", "Aiffy", "Aigan", "Aigen", "Aiger", "Aiggan", "Aiggen", "Aigger", "Aiggie", "Aiggy", "Aigie", "Aigy", "Aiksan", "Aiksen", "Aikser", "Aiksie", "Aiksy", "Ailan", "Ailen", "Ailer", "Ailie", "Aillan", "Aillen", "Ailler", "Aillie", "Ailly", "Aily", "Aiman", "Aimen", "Aimer", "Aimie", "Aimman", "Aimmen", "Aimmer", "Aimmie", "Aimmy", "Aimy", "Ainan", "Aindan", "Ainden", "Ainder", "Aindie", "Aindy", "Ainen", "Ainer", "Ainie", "Ainnan", "Ainnen", "Ainner", "Ainnie", "Ainny", "Ainy", "Aipan", "Aipen", "Aiper", "Aipie", "Aippan", "Aippen", "Aipper", "Aippie", "Aippy", "Aipsan", "Aipsen", "Aipser", "Aipsie", "Aipsy", "Aipy", "Airdan", "Airden", "Airder", "Airdie", "Airdy", "Airman", "Airmen", "Airmer", "Airmie", "Airmy", "Airran", "Airren", "Airrer", "Airrie", "Airry", "Airtan", "Airten", "Airter", "Airtie", "Airty", "Aisan", "Aisen", "Aiser", "Aisie", "Aiskan", "Aisken", "Aisker", "Aiskie", "Aisky", "Aissan", "Aissen", "Aisser", "Aissie", "Aissy", "Aisy", "Aithan", "Aithen", "Aither", "Aithie", "Aithy", "Aittan", "Aitten", "Aitter", "Aittie", "Aitty", "Aixan", "Aixen", "Aixer", "Aixie", "Aixy", "Aizzan", "Aizzen", "Aizzer", "Aizzie", "Aizzy", "Aksan", "Aksen", "Akser", "Aksie", "Aksy", "Alan", "Alen", "Aler", "Alie", "Allan", "Allen", "Aller", "Allie", "Ally", "Aly", "Aman", "Amen", "Amer", "Amie", "Amman", "Ammen", "Ammer", "Ammie", "Ammy", "Amy", "Anan", "Andan", "Anden", "Ander", "Andie", "Andy", "Anen", "Aner", "Anie", "Annan", "Annen", "Anner", "Annie", "Anny", "Any", "Apan", "Apen", "Aper", "Apie", "Appan", "Appen", "Apper", "Appie", "Appy", "Apsan", "Apsen", "Apser", "Apsie", "Apsy", "Apy", "Ardan", "Arden", "Arder", "Ardie", "Ardy", "Arman", "Armen", "Armer", "Armie", "Army", "Arran", "Arren", "Arrer", "Arrie", "Arry", "Artan", "Arten", "Arter", "Artie", "Arty", "Asan", "Asen", "Aser", "Asie", "Askan", "Asken", "Asker", "Askie", "Asky", "Assan", "Assen", "Asser", "Assie", "Assy", "Asy", "Athan", "Athen", "Ather", "Athie", "Athy", "Attan", "Atten", "Atter", "Attie", "Atty", "Axan", "Axen", "Axer", "Axie", "Axy", "Azzan", "Azzen", "Azzer", "Azzie", "Azzy", "Babban", "Babben", "Babber", "Babbie", "Babby", "Bachan", "Bachen", "Bacher", "Bachie", "Bachy", "Backan", "Backen", "Backer", "Backie", "Backy", "Baddan", "Badden", "Badder", "Baddie", "Baddy", "Badgan", "Badgen", "Badger", "Badgie", "Badgy", "Baffan", "Baffen", "Baffer", "Baffie", "Baffy", "Bagan", "Bagen", "Bager", "Baggan", "Baggen", "Bagger", "Baggie", "Baggy", "Bagie", "Bagy", "Baksan", "Baksen", "Bakser", "Baksie", "Baksy", "Balan", "Balen", "Baler", "Balie", "Ballan", "Ballen", "Baller", "Ballie", "Bally", "Baly", "Baman", "Bamen", "Bamer", "Bamie", "Bamman", "Bammen", "Bammer", "Bammie", "Bammy", "Bamy", "Banan", "Bandan", "Banden", "Bander", "Bandie", "Bandy", "Banen", "Baner", "Banie", "Bannan", "Bannen", "Banner", "Bannie", "Banny", "Bany", "Bapan", "Bapen", "Baper", "Bapie", "Bappan", "Bappen", "Bapper", "Bappie", "Bappy", "Bapsan", "Bapsen", "Bapser", "Bapsie", "Bapsy", "Bapy", "Bardan", "Barden", "Barder", "Bardie", "Bardy", "Barman", "Barmen", "Barmer", "Barmie", "Barmy", "Barran", "Barren", "Barrer", "Barrie", "Barry", "Bartan", "Barten", "Barter", "Bartie", "Barty", "Basan", "Basen", "Baser", "Basie", "Baskan", "Basken", "Basker", "Baskie", "Basky", "Bassan", "Bassen", "Basser", "Bassie", "Bassy", "Basy", "Bathan", "Bathen", "Bather", "Bathie", "Bathy", "Battan", "Batten", "Batter", "Battie", "Batty", "Baxan", "Baxen", "Baxer", "Baxie", "Baxy", "Bazzan", "Bazzen", "Bazzer", "Bazzie", "Bazzy", "Brabban", "Brabben", "Brabber", "Brabbie", "Brabby", "Brachan", "Brachen", "Bracher", "Brachie", "Brachy", "Brackan", "Bracken", "Bracker", "Brackie", "Bracky", "Braddan", "Bradden", "Bradder", "Braddie", "Braddy", "Bradgan", "Bradgen", "Bradger", "Bradgie", "Bradgy", "Braffan", "Braffen", "Braffer", "Braffie", "Braffy", "Bragan", "Bragen", "Brager", "Braggan", "Braggen", "Bragger", "Braggie", "Braggy", "Bragie", "Bragy", "Braksan", "Braksen", "Brakser", "Braksie", "Braksy", "Bralan", "Bralen", "Braler", "Bralie", "Brallan", "Brallen", "Braller", "Brallie", "Brally", "Braly", "Braman", "Bramen", "Bramer", "Bramie", "Bramman", "Brammen", "Brammer", "Brammie", "Brammy", "Bramy", "Branan", "Brandan", "Branden", "Brander", "Brandie", "Brandy", "Branen", "Braner", "Branie", "Brannan", "Brannen", "Branner", "Brannie", "Branny", "Brany", "Brapan", "Brapen", "Braper", "Brapie", "Brappan", "Brappen", "Brapper", "Brappie", "Brappy", "Brapsan", "Brapsen", "Brapser", "Brapsie", "Brapsy", "Brapy", "Brardan", "Brarden", "Brarder", "Brardie", "Brardy", "Brarman", "Brarmen", "Brarmer", "Brarmie", "Brarmy", "Brarran", "Brarren", "Brarrer", "Brarrie", "Brarry", "Brartan", "Brarten", "Brarter", "Brartie", "Brarty", "Brasan", "Brasen", "Braser", "Brasie", "Braskan", "Brasken", "Brasker", "Braskie", "Brasky", "Brassan", "Brassen", "Brasser", "Brassie", "Brassy", "Brasy", "Brathan", "Brathen", "Brather", "Brathie", "Brathy", "Brattan", "Bratten", "Bratter", "Brattie", "Bratty", "Braxan", "Braxen", "Braxer", "Braxie", "Braxy", "Brazzan", "Brazzen", "Brazzer", "Brazzie", "Brazzy", "Brebban", "Brebben", "Brebber", "Brebbie", "Brebby", "Brechan", "Brechen", "Brecher", "Brechie", "Brechy", "Breckan", "Brecken", "Brecker", "Breckie", "Brecky", "Breddan", "Bredden", "Bredder", "Breddie", "Breddy", "Bredgan", "Bredgen", "Bredger", "Bredgie", "Bredgy", "Breffan", "Breffen", "Breffer", "Breffie", "Breffy", "Bregan", "Bregen", "Breger", "Breggan", "Breggen", "Bregger", "Breggie", "Breggy", "Bregie", "Bregy", "Breksan", "Breksen", "Brekser", "Breksie", "Breksy", "Brelan", "Brelen", "Breler", "Brelie", "Brellan", "Brellen", "Breller", "Brellie", "Brelly", "Brely", "Breman", "Bremen", "Bremer", "Bremie", "Bremman", "Bremmen", "Bremmer", "Bremmie", "Bremmy", "Bremy", "Brenan", "Brendan", "Brenden", "Brender", "Brendie", "Brendy", "Brenen", "Brener", "Brenie", "Brennan", "Brennen", "Brenner", "Brennie", "Brenny", "Breny", "Brepan", "Brepen", "Breper", "Brepie", "Breppan", "Breppen", "Brepper", "Breppie", "Breppy", "Brepsan", "Brepsen", "Brepser", "Brepsie", "Brepsy", "Brepy", "Brerdan", "Brerden", "Brerder", "Brerdie", "Brerdy", "Brerman", "Brermen", "Brermer", "Brermie", "Brermy", "Brerran", "Brerren", "Brerrer", "Brerrie", "Brerry", "Brertan", "Brerten", "Brerter", "Brertie", "Brerty", "Bresan", "Bresen", "Breser", "Bresie", "Breskan", "Bresken", "Bresker", "Breskie", "Bresky", "Bressan", "Bressen", "Bresser", "Bressie", "Bressy", "Bresy", "Brethan", "Brethen", "Brether", "Brethie", "Brethy", "Brettan", "Bretten", "Bretter", "Brettie", "Bretty", "Brexan", "Brexen", "Brexer", "Brexie", "Brexy", "Brezzan", "Brezzen", "Brezzer", "Brezzie", "Brezzy", "Bribban", "Bribben", "Bribber", "Bribbie", "Bribby", "Brichan", "Brichen", "Bricher", "Brichie", "Brichy", "Brickan", "Bricken", "Bricker", "Brickie", "Bricky", "Briddan", "Bridden", "Bridder", "Briddie", "Briddy", "Bridgan", "Bridgen", "Bridger", "Bridgie", "Bridgy", "Briffan", "Briffen", "Briffer", "Briffie", "Briffy", "Brigan", "Brigen", "Briger", "Briggan", "Briggen", "Brigger", "Briggie", "Briggy", "Brigie", "Brigy", "Briksan", "Briksen", "Brikser", "Briksie", "Briksy", "Brilan", "Brilen", "Briler", "Brilie", "Brillan", "Brillen", "Briller", "Brillie", "Brilly", "Brily", "Briman", "Brimen", "Brimer", "Brimie", "Brimman", "Brimmen", "Brimmer", "Brimmie", "Brimmy", "Brimy", "Brinan", "Brindan", "Brinden", "Brinder", "Brindie", "Brindy", "Brinen", "Briner", "Brinie", "Brinnan", "Brinnen", "Brinner", "Brinnie", "Brinny", "Briny", "Bripan", "Bripen", "Briper", "Bripie", "Brippan", "Brippen", "Bripper", "Brippie", "Brippy", "Bripsan", "Bripsen", "Bripser", "Bripsie", "Bripsy", "Bripy", "Brirdan", "Brirden", "Brirder", "Brirdie", "Brirdy", "Brirman", "Brirmen", "Brirmer", "Brirmie", "Brirmy", "Brirran", "Brirren", "Brirrer", "Brirrie", "Brirry", "Brirtan", "Brirten", "Brirter", "Brirtie", "Brirty", "Brisan", "Brisen", "Briser", "Brisie", "Briskan", "Brisken", "Brisker", "Briskie", "Brisky", "Brissan", "Brissen", "Brisser", "Brissie", "Brissy", "Brisy", "Brithan", "Brithen", "Brither", "Brithie", "Brithy", "Brittan", "Britten", "Britter", "Brittie", "Britty", "Brixan", "Brixen", "Brixer", "Brixie", "Brixy", "Brizzan", "Brizzen", "Brizzer", "Brizzie", "Brizzy", "Cabban", "Cabben", "Cabber", "Cabbie", "Cabby", "Cachan", "Cachen", "Cacher", "Cachie", "Cachy", "Cackan", "Cacken", "Cacker", "Cackie", "Cacky", "Caddan", "Cadden", "Cadder", "Caddie", "Caddy", "Cadgan", "Cadgen", "Cadger", "Cadgie", "Cadgy", "Caffan", "Caffen", "Caffer", "Caffie", "Caffy", "Cagan", "Cagen", "Cager", "Caggan", "Caggen", "Cagger", "Caggie", "Caggy", "Cagie", "Cagy", "Caksan", "Caksen", "Cakser", "Caksie", "Caksy", "Calan", "Calen", "Caler", "Calie", "Callan", "Callen", "Caller", "Callie", "Cally", "Caly", "Caman", "Camen", "Camer", "Camie", "Camman", "Cammen", "Cammer", "Cammie", "Cammy", "Camy", "Canan", "Candan", "Canden", "Cander", "Candie", "Candy", "Canen", "Caner", "Canie", "Cannan", "Cannen", "Canner", "Cannie", "Canny", "Cany", "Capan", "Capen", "Caper", "Capie", "Cappan", "Cappen", "Capper", "Cappie", "Cappy", "Capsan", "Capsen", "Capser", "Capsie", "Capsy", "Capy", "Cardan", "Carden", "Carder", "Cardie", "Cardy", "Carman", "Carmen", "Carmer", "Carmie", "Carmy", "Carran", "Carren", "Carrer", "Carrie", "Carry", "Cartan", "Carten", "Carter", "Cartie", "Carty", "Casan", "Casen", "Caser", "Casie", "Caskan", "Casken", "Casker", "Caskie", "Casky", "Cassan", "Cassen", "Casser", "Cassie", "Cassy", "Casy", "Cathan", "Cathen", "Cather", "Cathie", "Cathy", "Cattan", "Catten", "Catter", "Cattie", "Catty", "Caxan", "Caxen", "Caxer", "Caxie", "Caxy", "Cazzan", "Cazzen", "Cazzer", "Cazzie", "Cazzy", "Cobban", "Cobben", "Cobber", "Cobbie", "Cobby", "Cochan", "Cochen", "Cocher", "Cochie", "Cochy", "Cockan", "Cocken", "Cocker", "Cockie", "Cocky", "Coddan", "Codden", "Codder", "Coddie", "Coddy", "Codgan", "Codgen", "Codger", "Codgie", "Codgy", "Coffan", "Coffen", "Coffer", "Coffie", "Coffy", "Cogan", "Cogen", "Coger", "Coggan", "Coggen", "Cogger", "Coggie", "Coggy", "Cogie", "Cogy", "Coksan", "Coksen", "Cokser", "Coksie", "Coksy", "Colan", "Colen", "Coler", "Colie", "Collan", "Collen", "Coller", "Collie", "Colly", "Coly", "Coman", "Comen", "Comer", "Comie", "Comman", "Commen", "Commer", "Commie", "Commy", "Comy", "Conan", "Condan", "Conden", "Conder", "Condie", "Condy", "Conen", "Coner", "Conie", "Connan", "Connen", "Conner", "Connie", "Conny", "Cony", "Copan", "Copen", "Coper", "Copie", "Coppan", "Coppen", "Copper", "Coppie", "Coppy", "Copsan", "Copsen", "Copser", "Copsie", "Copsy", "Copy", "Cordan", "Corden", "Corder", "Cordie", "Cordy", "Corman", "Cormen", "Cormer", "Cormie", "Cormy", "Corran", "Corren", "Correr", "Corrie", "Corry", "Cortan", "Corten", "Corter", "Cortie", "Corty", "Cosan", "Cosen", "Coser", "Cosie", "Coskan", "Cosken", "Cosker", "Coskie", "Cosky", "Cossan", "Cossen", "Cosser", "Cossie", "Cossy", "Cosy", "Cothan", "Cothen", "Cother", "Cothie", "Cothy", "Cottan", "Cotten", "Cotter", "Cottie", "Cotty", "Coxan", "Coxen", "Coxer", "Coxie", "Coxy", "Cozzan", "Cozzen", "Cozzer", "Cozzie", "Cozzy", "Dabban", "Dabben", "Dabber", "Dabbie", "Dabby", "Dachan", "Dachen", "Dacher", "Dachie", "Dachy", "Dackan", "Dacken", "Dacker", "Dackie", "Dacky", "Daddan", "Dadden", "Dadder", "Daddie", "Daddy", "Dadgan", "Dadgen", "Dadger", "Dadgie", "Dadgy", "Daffan", "Daffen", "Daffer", "Daffie", "Daffy", "Dagan", "Dagen", "Dager", "Daggan", "Daggen", "Dagger", "Daggie", "Daggy", "Dagie", "Dagy", "Daksan", "Daksen", "Dakser", "Daksie", "Daksy", "Dalan", "Dalen", "Daler", "Dalie", "Dallan", "Dallen", "Daller", "Dallie", "Dally", "Daly", "Daman", "Damen", "Damer", "Damie", "Damman", "Dammen", "Dammer", "Dammie", "Dammy", "Damy", "Danan", "Dandan", "Danden", "Dander", "Dandie", "Dandy", "Danen", "Daner", "Danie", "Dannan", "Dannen", "Danner", "Dannie", "Danny", "Dany", "Dapan", "Dapen", "Daper", "Dapie", "Dappan", "Dappen", "Dapper", "Dappie", "Dappy", "Dapsan", "Dapsen", "Dapser", "Dapsie", "Dapsy", "Dapy", "Dardan", "Darden", "Darder", "Dardie", "Dardy", "Darman", "Darmen", "Darmer", "Darmie", "Darmy", "Darran", "Darren", "Darrer", "Darrie", "Darry", "Dartan", "Darten", "Darter", "Dartie", "Darty", "Dasan", "Dasen", "Daser", "Dasie", "Daskan", "Dasken", "Dasker", "Daskie", "Dasky", "Dassan", "Dassen", "Dasser", "Dassie", "Dassy", "Dasy", "Dathan", "Dathen", "Dather", "Dathie", "Dathy", "Dattan", "Datten", "Datter", "Dattie", "Datty", "Daxan", "Daxen", "Daxer", "Daxie", "Daxy", "Dazzan", "Dazzen", "Dazzer", "Dazzie", "Dazzy", "Debban", "Debben", "Debber", "Debbie", "Debby", "Dechan", "Dechen", "Decher", "Dechie", "Dechy", "Deckan", "Decken", "Decker", "Deckie", "Decky", "Deddan", "Dedden", "Dedder", "Deddie", "Deddy", "Dedgan", "Dedgen", "Dedger", "Dedgie", "Dedgy", "Deffan", "Deffen", "Deffer", "Deffie", "Deffy", "Degan", "Degen", "Deger", "Deggan", "Deggen", "Degger", "Deggie", "Deggy", "Degie", "Degy", "Deksan", "Deksen", "Dekser", "Deksie", "Deksy", "Delan", "Delen", "Deler", "Delie", "Dellan", "Dellen", "Deller", "Dellie", "Delly", "Dely", "Deman", "Demen", "Demer", "Demie", "Demman", "Demmen", "Demmer", "Demmie", "Demmy", "Demy", "Denan", "Dendan", "Denden", "Dender", "Dendie", "Dendy", "Denen", "Dener", "Denie", "Dennan", "Dennen", "Denner", "Dennie", "Denny", "Deny", "Depan", "Depen", "Deper", "Depie", "Deppan", "Deppen", "Depper", "Deppie", "Deppy", "Depsan", "Depsen", "Depser", "Depsie", "Depsy", "Depy", "Derdan", "Derden", "Derder", "Derdie", "Derdy", "Derman", "Dermen", "Dermer", "Dermie", "Dermy", "Derran", "Derren", "Derrer", "Derrie", "Derry", "Dertan", "Derten", "Derter", "Dertie", "Derty", "Desan", "Desen", "Deser", "Desie", "Deskan", "Desken", "Desker", "Deskie", "Desky", "Dessan", "Dessen", "Desser", "Dessie", "Dessy", "Desy", "Dethan", "Dethen", "Dether", "Dethie", "Dethy", "Dettan", "Detten", "Detter", "Dettie", "Detty", "Dexan", "Dexen", "Dexer", "Dexie", "Dexy", "Dezzan", "Dezzen", "Dezzer", "Dezzie", "Dezzy", "Dibban", "Dibben", "Dibber", "Dibbie", "Dibby", "Dichan", "Dichen", "Dicher", "Dichie", "Dichy", "Dickan", "Dicken", "Dicker", "Dickie", "Dicky", "Diddan", "Didden", "Didder", "Diddie", "Diddy", "Didgan", "Didgen", "Didger", "Didgie", "Didgy", "Diffan", "Diffen", "Differ", "Diffie", "Diffy", "Digan", "Digen", "Diger", "Diggan", "Diggen", "Digger", "Diggie", "Diggy", "Digie", "Digy", "Diksan", "Diksen", "Dikser", "Diksie", "Diksy", "Dilan", "Dilen", "Diler", "Dilie", "Dillan", "Dillen", "Diller", "Dillie", "Dilly", "Dily", "Diman", "Dimen", "Dimer", "Dimie", "Dimman", "Dimmen", "Dimmer", "Dimmie", "Dimmy", "Dimy", "Dinan", "Dindan", "Dinden", "Dinder", "Dindie", "Dindy", "Dinen", "Diner", "Dinie", "Dinnan", "Dinnen", "Dinner", "Dinnie", "Dinny", "Diny", "Dipan", "Dipen", "Diper", "Dipie", "Dippan", "Dippen", "Dipper", "Dippie", "Dippy", "Dipsan", "Dipsen", "Dipser", "Dipsie", "Dipsy", "Dipy", "Dirdan", "Dirden", "Dirder", "Dirdie", "Dirdy", "Dirman", "Dirmen", "Dirmer", "Dirmie", "Dirmy", "Dirran", "Dirren", "Dirrer", "Dirrie", "Dirry", "Dirtan", "Dirten", "Dirter", "Dirtie", "Dirty", "Disan", "Disen", "Diser", "Disie", "Diskan", "Disken", "Disker", "Diskie", "Disky", "Dissan", "Dissen", "Disser", "Dissie", "Dissy", "Disy", "Dithan", "Dithen", "Dither", "Dithie", "Dithy", "Dittan", "Ditten", "Ditter", "Dittie", "Ditty", "Dixan", "Dixen", "Dixer", "Dixie", "Dixy", "Dizzan", "Dizzen", "Dizzer", "Dizzie", "Dizzy", "Ebban", "Ebben", "Ebber", "Ebbie", "Ebby", "Echan", "Echen", "Echer", "Echie", "Echy", "Eckan", "Ecken", "Ecker", "Eckie", "Ecky", "Eddan", "Edden", "Edder", "Eddie", "Eddy", "Edgan", "Edgen", "Edger", "Edgie", "Edgy", "Effan", "Effen", "Effer", "Effie", "Effy", "Egan", "Egen", "Eger", "Eggan", "Eggen", "Egger", "Eggie", "Eggy", "Egie", "Egy", "Eksan", "Eksen", "Ekser", "Eksie", "Eksy", "Elan", "Elen", "Eler", "Elie", "Ellan", "Ellen", "Eller", "Ellie", "Elly", "Ely", "Eman", "Emen", "Emer", "Emie", "Emman", "Emmen", "Emmer", "Emmie", "Emmy", "Emy", "Enan", "Endan", "Enden", "Ender", "Endie", "Endy", "Enen", "Ener", "Enie", "Ennan", "Ennen", "Enner", "Ennie", "Enny", "Eny", "Eobban", "Eobben", "Eobber", "Eobbie", "Eobby", "Eochan", "Eochen", "Eocher", "Eochie", "Eochy", "Eockan", "Eocken", "Eocker", "Eockie", "Eocky", "Eoddan", "Eodden", "Eodder", "Eoddie", "Eoddy", "Eodgan", "Eodgen", "Eodger", "Eodgie", "Eodgy", "Eoffan", "Eoffen", "Eoffer", "Eoffie", "Eoffy", "Eogan", "Eogen", "Eoger", "Eoggan", "Eoggen", "Eogger", "Eoggie", "Eoggy", "Eogie", "Eogy", "Eoksan", "Eoksen", "Eokser", "Eoksie", "Eoksy", "Eolan", "Eolen", "Eoler", "Eolie", "Eollan", "Eollen", "Eoller", "Eollie", "Eolly", "Eoly", "Eoman", "Eomen", "Eomer", "Eomie", "Eomman", "Eommen", "Eommer", "Eommie", "Eommy", "Eomy", "Eonan", "Eondan", "Eonden", "Eonder", "Eondie", "Eondy", "Eonen", "Eoner", "Eonie", "Eonnan", "Eonnen", "Eonner", "Eonnie", "Eonny", "Eony", "Eopan", "Eopen", "Eoper", "Eopie", "Eoppan", "Eoppen", "Eopper", "Eoppie", "Eoppy", "Eopsan", "Eopsen", "Eopser", "Eopsie", "Eopsy", "Eopy", "Eordan", "Eorden", "Eorder", "Eordie", "Eordy", "Eorman", "Eormen", "Eormer", "Eormie", "Eormy", "Eorran", "Eorren", "Eorrer", "Eorrie", "Eorry", "Eortan", "Eorten", "Eorter", "Eortie", "Eorty", "Eosan", "Eosen", "Eoser", "Eosie", "Eoskan", "Eosken", "Eosker", "Eoskie", "Eosky", "Eossan", "Eossen", "Eosser", "Eossie", "Eossy", "Eosy", "Eothan", "Eothen", "Eother", "Eothie", "Eothy", "Eottan", "Eotten", "Eotter", "Eottie", "Eotty", "Eoxan", "Eoxen", "Eoxer", "Eoxie", "Eoxy", "Eozzan", "Eozzen", "Eozzer", "Eozzie", "Eozzy", "Epan", "Epen", "Eper", "Epie", "Eppan", "Eppen", "Epper", "Eppie", "Eppy", "Epsan", "Epsen", "Epser", "Epsie", "Epsy", "Epy", "Erdan", "Erden", "Erder", "Erdie", "Erdy", "Erman", "Ermen", "Ermer", "Ermie", "Ermy", "Erran", "Erren", "Errer", "Errie", "Erry", "Ertan", "Erten", "Erter", "Ertie", "Erty", "Esan", "Esen", "Eser", "Esie", "Eskan", "Esken", "Esker", "Eskie", "Esky", "Essan", "Essen", "Esser", "Essie", "Essy", "Esy", "Ethan", "Ethen", "Ether", "Ethie", "Ethy", "Ettan", "Etten", "Etter", "Ettie", "Etty", "Exan", "Exen", "Exer", "Exie", "Exy", "Ezzan", "Ezzen", "Ezzer", "Ezzie", "Ezzy", "Gabban", "Gabben", "Gabber", "Gabbie", "Gabby", "Gachan", "Gachen", "Gacher", "Gachie", "Gachy", "Gackan", "Gacken", "Gacker", "Gackie", "Gacky", "Gaddan", "Gadden", "Gadder", "Gaddie", "Gaddy", "Gadgan", "Gadgen", "Gadger", "Gadgie", "Gadgy", "Gaffan", "Gaffen", "Gaffer", "Gaffie", "Gaffy", "Gagan", "Gagen", "Gager", "Gaggan", "Gaggen", "Gagger", "Gaggie", "Gaggy", "Gagie", "Gagy", "Gaksan", "Gaksen", "Gakser", "Gaksie", "Gaksy", "Galan", "Galen", "Galer", "Galie", "Gallan", "Gallen", "Galler", "Gallie", "Gally", "Galy", "Gaman", "Gamen", "Gamer", "Gamie", "Gamman", "Gammen", "Gammer", "Gammie", "Gammy", "Gamy", "Ganan", "Gandan", "Ganden", "Gander", "Gandie", "Gandy", "Ganen", "Ganer", "Ganie", "Gannan", "Gannen", "Ganner", "Gannie", "Ganny", "Gany", "Gapan", "Gapen", "Gaper", "Gapie", "Gappan", "Gappen", "Gapper", "Gappie", "Gappy", "Gapsan", "Gapsen", "Gapser", "Gapsie", "Gapsy", "Gapy", "Gardan", "Garden", "Garder", "Gardie", "Gardy", "Garman", "Garmen", "Garmer", "Garmie", "Garmy", "Garran", "Garren", "Garrer", "Garrie", "Garry", "Gartan", "Garten", "Garter", "Gartie", "Garty", "Gasan", "Gasen", "Gaser", "Gasie", "Gaskan", "Gasken", "Gasker", "Gaskie", "Gasky", "Gassan", "Gassen", "Gasser", "Gassie", "Gassy", "Gasy", "Gathan", "Gathen", "Gather", "Gathie", "Gathy", "Gattan", "Gatten", "Gatter", "Gattie", "Gatty", "Gaxan", "Gaxen", "Gaxer", "Gaxie", "Gaxy", "Gazzan", "Gazzen", "Gazzer", "Gazzie", "Gazzy", "Gebban", "Gebben", "Gebber", "Gebbie", "Gebby", "Gechan", "Gechen", "Gecher", "Gechie", "Gechy", "Geckan", "Gecken", "Gecker", "Geckie", "Gecky", "Geddan", "Gedden", "Gedder", "Geddie", "Geddy", "Gedgan", "Gedgen", "Gedger", "Gedgie", "Gedgy", "Geffan", "Geffen", "Geffer", "Geffie", "Geffy", "Gegan", "Gegen", "Geger", "Geggan", "Geggen", "Gegger", "Geggie", "Geggy", "Gegie", "Gegy", "Geksan", "Geksen", "Gekser", "Geksie", "Geksy", "Gelan", "Gelen", "Geler", "Gelie", "Gellan", "Gellen", "Geller", "Gellie", "Gelly", "Gely", "Geman", "Gemen", "Gemer", "Gemie", "Gemman", "Gemmen", "Gemmer", "Gemmie", "Gemmy", "Gemy", "Genan", "Gendan", "Genden", "Gender", "Gendie", "Gendy", "Genen", "Gener", "Genie", "Gennan", "Gennen", "Genner", "Gennie", "Genny", "Geny", "Gepan", "Gepen", "Geper", "Gepie", "Geppan", "Geppen", "Gepper", "Geppie", "Geppy", "Gepsan", "Gepsen", "Gepser", "Gepsie", "Gepsy", "Gepy", "Gerdan", "Gerden", "Gerder", "Gerdie", "Gerdy", "German", "Germen", "Germer", "Germie", "Germy", "Gerran", "Gerren", "Gerrer", "Gerrie", "Gerry", "Gertan", "Gerten", "Gerter", "Gertie", "Gerty", "Gesan", "Gesen", "Geser", "Gesie", "Geskan", "Gesken", "Gesker", "Geskie", "Gesky", "Gessan", "Gessen", "Gesser", "Gessie", "Gessy", "Gesy", "Gethan", "Gethen", "Gether", "Gethie", "Gethy", "Gettan", "Getten", "Getter", "Gettie", "Getty", "Gexan", "Gexen", "Gexer", "Gexie", "Gexy", "Gezzan", "Gezzen", "Gezzer", "Gezzie", "Gezzy", "Habban", "Habben", "Habber", "Habbie", "Habby", "Hachan", "Hachen", "Hacher", "Hachie", "Hachy", "Hackan", "Hacken", "Hacker", "Hackie", "Hacky", "Haddan", "Hadden", "Hadder", "Haddie", "Haddy", "Hadgan", "Hadgen", "Hadger", "Hadgie", "Hadgy", "Haffan", "Haffen", "Haffer", "Haffie", "Haffy", "Hagan", "Hagen", "Hager", "Haggan", "Haggen", "Hagger", "Haggie", "Haggy", "Hagie", "Hagy", "Haksan", "Haksen", "Hakser", "Haksie", "Haksy", "Halan", "Halen", "Haler", "Halie", "Hallan", "Hallen", "Haller", "Hallie", "Hally", "Haly", "Haman", "Hamen", "Hamer", "Hamie", "Hamman", "Hammen", "Hammer", "Hammie", "Hammy", "Hamy", "Hanan", "Handan", "Handen", "Hander", "Handie", "Handy", "Hanen", "Haner", "Hanie", "Hannan", "Hannen", "Hanner", "Hannie", "Hanny", "Hany", "Hapan", "Hapen", "Haper", "Hapie", "Happan", "Happen", "Happer", "Happie", "Happy", "Hapsan", "Hapsen", "Hapser", "Hapsie", "Hapsy", "Hapy", "Hardan", "Harden", "Harder", "Hardie", "Hardy", "Harman", "Harmen", "Harmer", "Harmie", "Harmy", "Harran", "Harren", "Harrer", "Harrie", "Harry", "Hartan", "Harten", "Harter", "Hartie", "Harty", "Hasan", "Hasen", "Haser", "Hasie", "Haskan", "Hasken", "Hasker", "Haskie", "Hasky", "Hassan", "Hassen", "Hasser", "Hassie", "Hassy", "Hasy", "Hathan", "Hathen", "Hather", "Hathie", "Hathy", "Hattan", "Hatten", "Hatter", "Hattie", "Hatty", "Haxan", "Haxen", "Haxer", "Haxie", "Haxy", "Hazzan", "Hazzen", "Hazzer", "Hazzie", "Hazzy", "Jibban", "Jibben", "Jibber", "Jibbie", "Jibby", "Jichan", "Jichen", "Jicher", "Jichie", "Jichy", "Jickan", "Jicken", "Jicker", "Jickie", "Jicky", "Jiddan", "Jidden", "Jidder", "Jiddie", "Jiddy", "Jidgan", "Jidgen", "Jidger", "Jidgie", "Jidgy", "Jiffan", "Jiffen", "Jiffer", "Jiffie", "Jiffy", "Jigan", "Jigen", "Jiger", "Jiggan", "Jiggen", "Jigger", "Jiggie", "Jiggy", "Jigie", "Jigy", "Jiksan", "Jiksen", "Jikser", "Jiksie", "Jiksy", "Jilan", "Jilen", "Jiler", "Jilie", "Jillan", "Jillen", "Jiller", "Jillie", "Jilly", "Jily", "Jiman", "Jimen", "Jimer", "Jimie", "Jimman", "Jimmen", "Jimmer", "Jimmie", "Jimmy", "Jimy", "Jinan", "Jindan", "Jinden", "Jinder", "Jindie", "Jindy", "Jinen", "Jiner", "Jinie", "Jinnan", "Jinnen", "Jinner", "Jinnie", "Jinny", "Jiny", "Jipan", "Jipen", "Jiper", "Jipie", "Jippan", "Jippen", "Jipper", "Jippie", "Jippy", "Jipsan", "Jipsen", "Jipser", "Jipsie", "Jipsy", "Jipy", "Jirdan", "Jirden", "Jirder", "Jirdie", "Jirdy", "Jirman", "Jirmen", "Jirmer", "Jirmie", "Jirmy", "Jirran", "Jirren", "Jirrer", "Jirrie", "Jirry", "Jirtan", "Jirten", "Jirter", "Jirtie", "Jirty", "Jisan", "Jisen", "Jiser", "Jisie", "Jiskan", "Jisken", "Jisker", "Jiskie", "Jisky", "Jissan", "Jissen", "Jisser", "Jissie", "Jissy", "Jisy", "Jithan", "Jithen", "Jither", "Jithie", "Jithy", "Jittan", "Jitten", "Jitter", "Jittie", "Jitty", "Jixan", "Jixen", "Jixer", "Jixie", "Jixy", "Jizzan", "Jizzen", "Jizzer", "Jizzie", "Jizzy", "Kebban", "Kebben", "Kebber", "Kebbie", "Kebby", "Kechan", "Kechen", "Kecher", "Kechie", "Kechy", "Keckan", "Kecken", "Kecker", "Keckie", "Kecky", "Keddan", "Kedden", "Kedder", "Keddie", "Keddy", "Kedgan", "Kedgen", "Kedger", "Kedgie", "Kedgy", "Keffan", "Keffen", "Keffer", "Keffie", "Keffy", "Kegan", "Kegen", "Keger", "Keggan", "Keggen", "Kegger", "Keggie", "Keggy", "Kegie", "Kegy", "Keksan", "Keksen", "Kekser", "Keksie", "Keksy", "Kelan", "Kelen", "Keler", "Kelie", "Kellan", "Kellen", "Keller", "Kellie", "Kelly", "Kely", "Keman", "Kemen", "Kemer", "Kemie", "Kemman", "Kemmen", "Kemmer", "Kemmie", "Kemmy", "Kemy", "Kenan", "Kendan", "Kenden", "Kender", "Kendie", "Kendy", "Kenen", "Kener", "Kenie", "Kennan", "Kennen", "Kenner", "Kennie", "Kenny", "Keny", "Kepan", "Kepen", "Keper", "Kepie", "Keppan", "Keppen", "Kepper", "Keppie", "Keppy", "Kepsan", "Kepsen", "Kepser", "Kepsie", "Kepsy", "Kepy", "Kerdan", "Kerden", "Kerder", "Kerdie", "Kerdy", "Kerman", "Kermen", "Kermer", "Kermie", "Kermy", "Kerran", "Kerren", "Kerrer", "Kerrie", "Kerry", "Kertan", "Kerten", "Kerter", "Kertie", "Kerty", "Kesan", "Kesen", "Keser", "Kesie", "Keskan", "Kesken", "Kesker", "Keskie", "Kesky", "Kessan", "Kessen", "Kesser", "Kessie", "Kessy", "Kesy", "Kethan", "Kethen", "Kether", "Kethie", "Kethy", "Kettan", "Ketten", "Ketter", "Kettie", "Ketty", "Kexan", "Kexen", "Kexer", "Kexie", "Kexy", "Kezzan", "Kezzen", "Kezzer", "Kezzie", "Kezzy", "Kibban", "Kibben", "Kibber", "Kibbie", "Kibby", "Kichan", "Kichen", "Kicher", "Kichie", "Kichy", "Kickan", "Kicken", "Kicker", "Kickie", "Kicky", "Kiddan", "Kidden", "Kidder", "Kiddie", "Kiddy", "Kidgan", "Kidgen", "Kidger", "Kidgie", "Kidgy", "Kiffan", "Kiffen", "Kiffer", "Kiffie", "Kiffy", "Kigan", "Kigen", "Kiger", "Kiggan", "Kiggen", "Kigger", "Kiggie", "Kiggy", "Kigie", "Kigy", "Kiksan", "Kiksen", "Kikser", "Kiksie", "Kiksy", "Kilan", "Kilen", "Kiler", "Kilie", "Killan", "Killen", "Killer", "Killie", "Killy", "Kily", "Kiman", "Kimen", "Kimer", "Kimie", "Kimman", "Kimmen", "Kimmer", "Kimmie", "Kimmy", "Kimy", "Kinan", "Kindan", "Kinden", "Kinder", "Kindie", "Kindy", "Kinen", "Kiner", "Kinie", "Kinnan", "Kinnen", "Kinner", "Kinnie", "Kinny", "Kiny", "Kipan", "Kipen", "Kiper", "Kipie", "Kippan", "Kippen", "Kipper", "Kippie", "Kippy", "Kipsan", "Kipsen", "Kipser", "Kipsie", "Kipsy", "Kipy", "Kirdan", "Kirden", "Kirder", "Kirdie", "Kirdy", "Kirman", "Kirmen", "Kirmer", "Kirmie", "Kirmy", "Kirran", "Kirren", "Kirrer", "Kirrie", "Kirry", "Kirtan", "Kirten", "Kirter", "Kirtie", "Kirty", "Kisan", "Kisen", "Kiser", "Kisie", "Kiskan", "Kisken", "Kisker", "Kiskie", "Kisky", "Kissan", "Kissen", "Kisser", "Kissie", "Kissy", "Kisy", "Kithan", "Kithen", "Kither", "Kithie", "Kithy", "Kittan", "Kitten", "Kitter", "Kittie", "Kitty", "Kixan", "Kixen", "Kixer", "Kixie", "Kixy", "Kizzan", "Kizzen", "Kizzer", "Kizzie", "Kizzy", "Libban", "Libben", "Libber", "Libbie", "Libby", "Lichan", "Lichen", "Licher", "Lichie", "Lichy", "Lickan", "Licken", "Licker", "Lickie", "Licky", "Liddan", "Lidden", "Lidder", "Liddie", "Liddy", "Lidgan", "Lidgen", "Lidger", "Lidgie", "Lidgy", "Liffan", "Liffen", "Liffer", "Liffie", "Liffy", "Ligan", "Ligen", "Liger", "Liggan", "Liggen", "Ligger", "Liggie", "Liggy", "Ligie", "Ligy", "Liksan", "Liksen", "Likser", "Liksie", "Liksy", "Lilan", "Lilen", "Liler", "Lilie", "Lillan", "Lillen", "Liller", "Lillie", "Lilly", "Lily", "Liman", "Limen", "Limer", "Limie", "Limman", "Limmen", "Limmer", "Limmie", "Limmy", "Limy", "Linan", "Lindan", "Linden", "Linder", "Lindie", "Lindy", "Linen", "Liner", "Linie", "Linnan", "Linnen", "Linner", "Linnie", "Linny", "Liny", "Lipan", "Lipen", "Liper", "Lipie", "Lippan", "Lippen", "Lipper", "Lippie", "Lippy", "Lipsan", "Lipsen", "Lipser", "Lipsie", "Lipsy", "Lipy", "Lirdan", "Lirden", "Lirder", "Lirdie", "Lirdy", "Lirman", "Lirmen", "Lirmer", "Lirmie", "Lirmy", "Lirran", "Lirren", "Lirrer", "Lirrie", "Lirry", "Lirtan", "Lirten", "Lirter", "Lirtie", "Lirty", "Lisan", "Lisen", "Liser", "Lisie", "Liskan", "Lisken", "Lisker", "Liskie", "Lisky", "Lissan", "Lissen", "Lisser", "Lissie", "Lissy", "Lisy", "Lithan", "Lithen", "Lither", "Lithie", "Lithy", "Littan", "Litten", "Litter", "Littie", "Litty", "Lixan", "Lixen", "Lixer", "Lixie", "Lixy", "Lizzan", "Lizzen", "Lizzer", "Lizzie", "Lizzy", "Mabban", "Mabben", "Mabber", "Mabbie", "Mabby", "Machan", "Machen", "Macher", "Machie", "Machy", "Mackan", "Macken", "Macker", "Mackie", "Macky", "Maddan", "Madden", "Madder", "Maddie", "Maddy", "Madgan", "Madgen", "Madger", "Madgie", "Madgy", "Maffan", "Maffen", "Maffer", "Maffie", "Maffy", "Magan", "Magen", "Mager", "Maggan", "Maggen", "Magger", "Maggie", "Maggy", "Magie", "Magy", "Maksan", "Maksen", "Makser", "Maksie", "Maksy", "Malan", "Malen", "Maler", "Malie", "Mallan", "Mallen", "Maller", "Mallie", "Mally", "Maly", "Maman", "Mamen", "Mamer", "Mamie", "Mamman", "Mammen", "Mammer", "Mammie", "Mammy", "Mamy", "Manan", "Mandan", "Manden", "Mander", "Mandie", "Mandy", "Manen", "Maner", "Manie", "Mannan", "Mannen", "Manner", "Mannie", "Manny", "Many", "Mapan", "Mapen", "Maper", "Mapie", "Mappan", "Mappen", "Mapper", "Mappie", "Mappy", "Mapsan", "Mapsen", "Mapser", "Mapsie", "Mapsy", "Mapy", "Mardan", "Marden", "Marder", "Mardie", "Mardy", "Marman", "Marmen", "Marmer", "Marmie", "Marmy", "Marran", "Marren", "Marrer", "Marrie", "Marry", "Martan", "Marten", "Marter", "Martie", "Marty", "Masan", "Masen", "Maser", "Masie", "Maskan", "Masken", "Masker", "Maskie", "Masky", "Massan", "Massen", "Masser", "Massie", "Massy", "Masy", "Mathan", "Mathen", "Mather", "Mathie", "Mathy", "Mattan", "Matten", "Matter", "Mattie", "Matty", "Maxan", "Maxen", "Maxer", "Maxie", "Maxy", "Mazzan", "Mazzen", "Mazzer", "Mazzie", "Mazzy", "Pabban", "Pabben", "Pabber", "Pabbie", "Pabby", "Pachan", "Pachen", "Pacher", "Pachie", "Pachy", "Packan", "Packen", "Packer", "Packie", "Packy", "Paddan", "Padden", "Padder", "Paddie", "Paddy", "Padgan", "Padgen", "Padger", "Padgie", "Padgy", "Paffan", "Paffen", "Paffer", "Paffie", "Paffy", "Pagan", "Pagen", "Pager", "Paggan", "Paggen", "Pagger", "Paggie", "Paggy", "Pagie", "Pagy", "Paksan", "Paksen", "Pakser", "Paksie", "Paksy", "Palan", "Palen", "Paler", "Palie", "Pallan", "Pallen", "Paller", "Pallie", "Pally", "Paly", "Paman", "Pamen", "Pamer", "Pamie", "Pamman", "Pammen", "Pammer", "Pammie", "Pammy", "Pamy", "Panan", "Pandan", "Panden", "Pander", "Pandie", "Pandy", "Panen", "Paner", "Panie", "Pannan", "Pannen", "Panner", "Pannie", "Panny", "Pany", "Papan", "Papen", "Paper", "Papie", "Pappan", "Pappen", "Papper", "Pappie", "Pappy", "Papsan", "Papsen", "Papser", "Papsie", "Papsy", "Papy", "Pardan", "Parden", "Parder", "Pardie", "Pardy", "Parman", "Parmen", "Parmer", "Parmie", "Parmy", "Parran", "Parren", "Parrer", "Parrie", "Parry", "Partan", "Parten", "Parter", "Partie", "Party", "Pasan", "Pasen", "Paser", "Pasie", "Paskan", "Pasken", "Pasker", "Paskie", "Pasky", "Passan", "Passen", "Passer", "Passie", "Passy", "Pasy", "Pathan", "Pathen", "Pather", "Pathie", "Pathy", "Pattan", "Patten", "Patter", "Pattie", "Patty", "Paxan", "Paxen", "Paxer", "Paxie", "Paxy", "Pazzan", "Pazzen", "Pazzer", "Pazzie", "Pazzy", "Ribban", "Ribben", "Ribber", "Ribbie", "Ribby", "Richan", "Richen", "Richer", "Richie", "Richy", "Rickan", "Ricken", "Ricker", "Rickie", "Ricky", "Riddan", "Ridden", "Ridder", "Riddie", "Riddy", "Ridgan", "Ridgen", "Ridger", "Ridgie", "Ridgy", "Riffan", "Riffen", "Riffer", "Riffie", "Riffy", "Rigan", "Rigen", "Riger", "Riggan", "Riggen", "Rigger", "Riggie", "Riggy", "Rigie", "Rigy", "Riksan", "Riksen", "Rikser", "Riksie", "Riksy", "Rilan", "Rilen", "Riler", "Rilie", "Rillan", "Rillen", "Riller", "Rillie", "Rilly", "Rily", "Riman", "Rimen", "Rimer", "Rimie", "Rimman", "Rimmen", "Rimmer", "Rimmie", "Rimmy", "Rimy", "Rinan", "Rindan", "Rinden", "Rinder", "Rindie", "Rindy", "Rinen", "Riner", "Rinie", "Rinnan", "Rinnen", "Rinner", "Rinnie", "Rinny", "Riny", "Ripan", "Ripen", "Riper", "Ripie", "Rippan", "Rippen", "Ripper", "Rippie", "Rippy", "Ripsan", "Ripsen", "Ripser", "Ripsie", "Ripsy", "Ripy", "Rirdan", "Rirden", "Rirder", "Rirdie", "Rirdy", "Rirman", "Rirmen", "Rirmer", "Rirmie", "Rirmy", "Rirran", "Rirren", "Rirrer", "Rirrie", "Rirry", "Rirtan", "Rirten", "Rirter", "Rirtie", "Rirty", "Risan", "Risen", "Riser", "Risie", "Riskan", "Risken", "Risker", "Riskie", "Risky", "Rissan", "Rissen", "Risser", "Rissie", "Rissy", "Risy", "Rithan", "Rithen", "Rither", "Rithie", "Rithy", "Rittan", "Ritten", "Ritter", "Rittie", "Ritty", "Rixan", "Rixen", "Rixer", "Rixie", "Rixy", "Rizzan", "Rizzen", "Rizzer", "Rizzie", "Rizzy", "Robban", "Robben", "Robber", "Robbie", "Robby", "Rochan", "Rochen", "Rocher", "Rochie", "Rochy", "Rockan", "Rocken", "Rocker", "Rockie", "Rocky", "Roddan", "Rodden", "Rodder", "Roddie", "Roddy", "Rodgan", "Rodgen", "Rodger", "Rodgie", "Rodgy", "Roffan", "Roffen", "Roffer", "Roffie", "Roffy", "Rogan", "Rogen", "Roger", "Roggan", "Roggen", "Rogger", "Roggie", "Roggy", "Rogie", "Rogy", "Roksan", "Roksen", "Rokser", "Roksie", "Roksy", "Rolan", "Rolen", "Roler", "Rolie", "Rollan", "Rollen", "Roller", "Rollie", "Rolly", "Roly", "Roman", "Romen", "Romer", "Romie", "Romman", "Rommen", "Rommer", "Rommie", "Rommy", "Romy", "Ronan", "Rondan", "Ronden", "Ronder", "Rondie", "Rondy", "Ronen", "Roner", "Ronie", "Ronnan", "Ronnen", "Ronner", "Ronnie", "Ronny", "Rony", "Ropan", "Ropen", "Roper", "Ropie", "Roppan", "Roppen", "Ropper", "Roppie", "Roppy", "Ropsan", "Ropsen", "Ropser", "Ropsie", "Ropsy", "Ropy", "Rordan", "Rorden", "Rorder", "Rordie", "Rordy", "Rorman", "Rormen", "Rormer", "Rormie", "Rormy", "Rorran", "Rorren", "Rorrer", "Rorrie", "Rorry", "Rortan", "Rorten", "Rorter", "Rortie", "Rorty", "Rosan", "Rosen", "Roser", "Rosie", "Roskan", "Rosken", "Rosker", "Roskie", "Rosky", "Rossan", "Rossen", "Rosser", "Rossie", "Rossy", "Rosy", "Rothan", "Rothen", "Rother", "Rothie", "Rothy", "Rottan", "Rotten", "Rotter", "Rottie", "Rotty", "Roxan", "Roxen", "Roxer", "Roxie", "Roxy", "Rozzan", "Rozzen", "Rozzer", "Rozzie", "Rozzy", "Sabban", "Sabben", "Sabber", "Sabbie", "Sabby", "Sachan", "Sachen", "Sacher", "Sachie", "Sachy", "Sackan", "Sacken", "Sacker", "Sackie", "Sacky", "Saddan", "Sadden", "Sadder", "Saddie", "Saddy", "Sadgan", "Sadgen", "Sadger", "Sadgie", "Sadgy", "Saffan", "Saffen", "Saffer", "Saffie", "Saffy", "Sagan", "Sagen", "Sager", "Saggan", "Saggen", "Sagger", "Saggie", "Saggy", "Sagie", "Sagy", "Saksan", "Saksen", "Sakser", "Saksie", "Saksy", "Salan", "Salen", "Saler", "Salie", "Sallan", "Sallen", "Saller", "Sallie", "Sally", "Saly", "Saman", "Samen", "Samer", "Samie", "Samman", "Sammen", "Sammer", "Sammie", "Sammy", "Samy", "Sanan", "Sandan", "Sanden", "Sander", "Sandie", "Sandy", "Sanen", "Saner", "Sanie", "Sannan", "Sannen", "Sanner", "Sannie", "Sanny", "Sany", "Sapan", "Sapen", "Saper", "Sapie", "Sappan", "Sappen", "Sapper", "Sappie", "Sappy", "Sapsan", "Sapsen", "Sapser", "Sapsie", "Sapsy", "Sapy", "Sardan", "Sarden", "Sarder", "Sardie", "Sardy", "Sarman", "Sarmen", "Sarmer", "Sarmie", "Sarmy", "Sarran", "Sarren", "Sarrer", "Sarrie", "Sarry", "Sartan", "Sarten", "Sarter", "Sartie", "Sarty", "Sasan", "Sasen", "Saser", "Sasie", "Saskan", "Sasken", "Sasker", "Saskie", "Sasky", "Sassan", "Sassen", "Sasser", "Sassie", "Sassy", "Sasy", "Sathan", "Sathen", "Sather", "Sathie", "Sathy", "Sattan", "Satten", "Satter", "Sattie", "Satty", "Saxan", "Saxen", "Saxer", "Saxie", "Saxy", "Sazzan", "Sazzen", "Sazzer", "Sazzie", "Sazzy", "Shabban", "Shabben", "Shabber", "Shabbie", "Shabby", "Shachan", "Shachen", "Shacher", "Shachie", "Shachy", "Shackan", "Shacken", "Shacker", "Shackie", "Shacky", "Shaddan", "Shadden", "Shadder", "Shaddie", "Shaddy", "Shadgan", "Shadgen", "Shadger", "Shadgie", "Shadgy", "Shaffan", "Shaffen", "Shaffer", "Shaffie", "Shaffy", "Shagan", "Shagen", "Shager", "Shaggan", "Shaggen", "Shagger", "Shaggie", "Shaggy", "Shagie", "Shagy", "Shaksan", "Shaksen", "Shakser", "Shaksie", "Shaksy", "Shalan", "Shalen", "Shaler", "Shalie", "Shallan", "Shallen", "Shaller", "Shallie", "Shally", "Shaly", "Shaman", "Shamen", "Shamer", "Shamie", "Shamman", "Shammen", "Shammer", "Shammie", "Shammy", "Shamy", "Shanan", "Shandan", "Shanden", "Shander", "Shandie", "Shandy", "Shanen", "Shaner", "Shanie", "Shannan", "Shannen", "Shanner", "Shannie", "Shanny", "Shany", "Shapan", "Shapen", "Shaper", "Shapie", "Shappan", "Shappen", "Shapper", "Shappie", "Shappy", "Shapsan", "Shapsen", "Shapser", "Shapsie", "Shapsy", "Shapy", "Shardan", "Sharden", "Sharder", "Shardie", "Shardy", "Sharman", "Sharmen", "Sharmer", "Sharmie", "Sharmy", "Sharran", "Sharren", "Sharrer", "Sharrie", "Sharry", "Shartan", "Sharten", "Sharter", "Shartie", "Sharty", "Shasan", "Shasen", "Shaser", "Shasie", "Shaskan", "Shasken", "Shasker", "Shaskie", "Shasky", "Shassan", "Shassen", "Shasser", "Shassie", "Shassy", "Shasy", "Shathan", "Shathen", "Shather", "Shathie", "Shathy", "Shattan", "Shatten", "Shatter", "Shattie", "Shatty", "Shaxan", "Shaxen", "Shaxer", "Shaxie", "Shaxy", "Shazzan", "Shazzen", "Shazzer", "Shazzie", "Shazzy", "Shibban", "Shibben", "Shibber", "Shibbie", "Shibby", "Shichan", "Shichen", "Shicher", "Shichie", "Shichy", "Shickan", "Shicken", "Shicker", "Shickie", "Shicky", "Shiddan", "Shidden", "Shidder", "Shiddie", "Shiddy", "Shidgan", "Shidgen", "Shidger", "Shidgie", "Shidgy", "Shiffan", "Shiffen", "Shiffer", "Shiffie", "Shiffy", "Shigan", "Shigen", "Shiger", "Shiggan", "Shiggen", "Shigger", "Shiggie", "Shiggy", "Shigie", "Shigy", "Shiksan", "Shiksen", "Shikser", "Shiksie", "Shiksy", "Shilan", "Shilen", "Shiler", "Shilie", "Shillan", "Shillen", "Shiller", "Shillie", "Shilly", "Shily", "Shiman", "Shimen", "Shimer", "Shimie", "Shimman", "Shimmen", "Shimmer", "Shimmie", "Shimmy", "Shimy", "Shinan", "Shindan", "Shinden", "Shinder", "Shindie", "Shindy", "Shinen", "Shiner", "Shinie", "Shinnan", "Shinnen", "Shinner", "Shinnie", "Shinny", "Shiny", "Shipan", "Shipen", "Shiper", "Shipie", "Shippan", "Shippen", "Shipper", "Shippie", "Shippy", "Shipsan", "Shipsen", "Shipser", "Shipsie", "Shipsy", "Shipy", "Shirdan", "Shirden", "Shirder", "Shirdie", "Shirdy", "Shirman", "Shirmen", "Shirmer", "Shirmie", "Shirmy", "Shirran", "Shirren", "Shirrer", "Shirrie", "Shirry", "Shirtan", "Shirten", "Shirter", "Shirtie", "Shirty", "Shisan", "Shisen", "Shiser", "Shisie", "Shiskan", "Shisken", "Shisker", "Shiskie", "Shisky", "Shissan", "Shissen", "Shisser", "Shissie", "Shissy", "Shisy", "Shithan", "Shithen", "Shither", "Shithie", "Shithy", "Shittan", "Shitten", "Shitter", "Shittie", "Shitty", "Shixan", "Shixen", "Shixer", "Shixie", "Shixy", "Shizzan", "Shizzen", "Shizzer", "Shizzie", "Shizzy", "Thobban", "Thobben", "Thobber", "Thobbie", "Thobby", "Thochan", "Thochen", "Thocher", "Thochie", "Thochy", "Thockan", "Thocken", "Thocker", "Thockie", "Thocky", "Thoddan", "Thodden", "Thodder", "Thoddie", "Thoddy", "Thodgan", "Thodgen", "Thodger", "Thodgie", "Thodgy", "Thoffan", "Thoffen", "Thoffer", "Thoffie", "Thoffy", "Thogan", "Thogen", "Thoger", "Thoggan", "Thoggen", "Thogger", "Thoggie", "Thoggy", "Thogie", "Thogy", "Thoksan", "Thoksen", "Thokser", "Thoksie", "Thoksy", "Tholan", "Tholen", "Tholer", "Tholie", "Thollan", "Thollen", "Tholler", "Thollie", "Tholly", "Tholy", "Thoman", "Thomen", "Thomer", "Thomie", "Thomman", "Thommen", "Thommer", "Thommie", "Thommy", "Thomy", "Thonan", "Thondan", "Thonden", "Thonder", "Thondie", "Thondy", "Thonen", "Thoner", "Thonie", "Thonnan", "Thonnen", "Thonner", "Thonnie", "Thonny", "Thony", "Thopan", "Thopen", "Thoper", "Thopie", "Thoppan", "Thoppen", "Thopper", "Thoppie", "Thoppy", "Thopsan", "Thopsen", "Thopser", "Thopsie", "Thopsy", "Thopy", "Thordan", "Thorden", "Thorder", "Thordie", "Thordy", "Thorman", "Thormen", "Thormer", "Thormie", "Thormy", "Thorran", "Thorren", "Thorrer", "Thorrie", "Thorry", "Thortan", "Thorten", "Thorter", "Thortie", "Thorty", "Thosan", "Thosen", "Thoser", "Thosie", "Thoskan", "Thosken", "Thosker", "Thoskie", "Thosky", "Thossan", "Thossen", "Thosser", "Thossie", "Thossy", "Thosy", "Thothan", "Thothen", "Thother", "Thothie", "Thothy", "Thottan", "Thotten", "Thotter", "Thottie", "Thotty", "Thoxan", "Thoxen", "Thoxer", "Thoxie", "Thoxy", "Thozzan", "Thozzen", "Thozzer", "Thozzie", "Thozzy", "Wibban", "Wibben", "Wibber", "Wibbie", "Wibby", "Wichan", "Wichen", "Wicher", "Wichie", "Wichy", "Wickan", "Wicken", "Wicker", "Wickie", "Wicky", "Widdan", "Widden", "Widder", "Widdie", "Widdy", "Widgan", "Widgen", "Widger", "Widgie", "Widgy", "Wiffan", "Wiffen", "Wiffer", "Wiffie", "Wiffy", "Wigan", "Wigen", "Wiger", "Wiggan", "Wiggen", "Wigger", "Wiggie", "Wiggy", "Wigie", "Wigy", "Wiksan", "Wiksen", "Wikser", "Wiksie", "Wiksy", "Wilan", "Wilen", "Wiler", "Wilie", "Willan", "Willen", "Willer", "Willie", "Willy", "Wily", "Wiman", "Wimen", "Wimer", "Wimie", "Wimman", "Wimmen", "Wimmer", "Wimmie", "Wimmy", "Wimy", "Winan", "Windan", "Winden", "Winder", "Windie", "Windy", "Winen", "Winer", "Winie", "Winnan", "Winnen", "Winner", "Winnie", "Winny", "Winy", "Wipan", "Wipen", "Wiper", "Wipie", "Wippan", "Wippen", "Wipper", "Wippie", "Wippy", "Wipsan", "Wipsen", "Wipser", "Wipsie", "Wipsy", "Wipy", "Wirdan", "Wirden", "Wirder", "Wirdie", "Wirdy", "Wirman", "Wirmen", "Wirmer", "Wirmie", "Wirmy", "Wirran", "Wirren", "Wirrer", "Wirrie", "Wirry", "Wirtan", "Wirten", "Wirter", "Wirtie", "Wirty", "Wisan", "Wisen", "Wiser", "Wisie", "Wiskan", "Wisken", "Wisker", "Wiskie", "Wisky", "Wissan", "Wissen", "Wisser", "Wissie", "Wissy", "Wisy", "Withan", "Withen", "Wither", "Withie", "Withy", "Wittan", "Witten", "Witter", "Wittie", "Witty", "Wixan", "Wixen", "Wixer", "Wixie", "Wixy", "Wizzan", "Wizzen", "Wizzer", "Wizzie", "Wizzy"} -trykerLastNames = {"Ardan", "Arddy", "Arer", "Arffy", "Argan", "Arggan", "Argh", "Arghan", "Arins", "Arkry", "Arlan", "Arle", "Arley", "Arliam", "Arlly", "Arn", "Arnin", "Arny", "Arppy", "Arpsey", "Arra", "Arroy", "Arrrell", "Arrroy", "Arry", "Arssey", "Artty", "Arty", "Ba'ardan", "Ba'arddy", "Ba'arer", "Ba'arffy", "Ba'argan", "Ba'arggan", "Ba'argh", "Ba'arghan", "Ba'arins", "Ba'arkry", "Ba'arlan", "Ba'arle", "Ba'arley", "Ba'arliam", "Ba'arlly", "Ba'arn", "Ba'arnin", "Ba'arny", "Ba'arppy", "Ba'arpsey", "Ba'arra", "Ba'arroy", "Ba'arrrell", "Ba'arrroy", "Ba'arry", "Ba'arssey", "Ba'artty", "Ba'arty", "Ba'bidan", "Ba'biddy", "Ba'bier", "Ba'biffy", "Ba'bigan", "Ba'biggan", "Ba'bigh", "Ba'bighan", "Ba'biins", "Ba'bikry", "Ba'bilan", "Ba'bile", "Ba'biley", "Ba'biliam", "Ba'billy", "Ba'bin", "Ba'binin", "Ba'biny", "Ba'bippy", "Ba'bipsey", "Ba'bira", "Ba'biroy", "Ba'birrell", "Ba'birroy", "Ba'biry", "Ba'bissey", "Ba'bitty", "Ba'bity", "Ba'caudan", "Ba'cauddy", "Ba'cauer", "Ba'cauffy", "Ba'caugan", "Ba'cauggan", "Ba'caugh", "Ba'caughan", "Ba'cauins", "Ba'caukry", "Ba'caulan", "Ba'caule", "Ba'cauley", "Ba'cauliam", "Ba'caully", "Ba'caun", "Ba'caunin", "Ba'cauny", "Ba'cauppy", "Ba'caupsey", "Ba'caura", "Ba'cauroy", "Ba'caurrell", "Ba'caurroy", "Ba'caury", "Ba'caussey", "Ba'cautty", "Ba'cauty", "Ba'dadan", "Ba'daddy", "Ba'daer", "Ba'daffy", "Ba'dagan", "Ba'daggan", "Ba'dagh", "Ba'daghan", "Ba'dains", "Ba'dakry", "Ba'dalan", "Ba'dale", "Ba'daley", "Ba'daliam", "Ba'dally", "Ba'dan", "Ba'danin", "Ba'dany", "Ba'dappy", "Ba'dapsey", "Ba'dara", "Ba'dardan", "Ba'darddy", "Ba'darer", "Ba'darffy", "Ba'dargan", "Ba'darggan", "Ba'dargh", "Ba'darghan", "Ba'darins", "Ba'darkry", "Ba'darlan", "Ba'darle", "Ba'darley", "Ba'darliam", "Ba'darlly", "Ba'darn", "Ba'darnin", "Ba'darny", "Ba'daroy", "Ba'darppy", "Ba'darpsey", "Ba'darra", "Ba'darrell", "Ba'darroy", "Ba'darrrell", "Ba'darrroy", "Ba'darry", "Ba'darssey", "Ba'dartty", "Ba'darty", "Ba'dary", "Ba'dassey", "Ba'datty", "Ba'daty", "Ba'doydan", "Ba'doyddy", "Ba'doyer", "Ba'doyffy", "Ba'doygan", "Ba'doyggan", "Ba'doygh", "Ba'doyghan", "Ba'doyins", "Ba'doykry", "Ba'doylan", "Ba'doyle", "Ba'doyley", "Ba'doyliam", "Ba'doylly", "Ba'doyn", "Ba'doynin", "Ba'doyny", "Ba'doyppy", "Ba'doypsey", "Ba'doyra", "Ba'doyroy", "Ba'doyrrell", "Ba'doyrroy", "Ba'doyry", "Ba'doyssey", "Ba'doytty", "Ba'doyty", "Ba'dudan", "Ba'duddy", "Ba'duer", "Ba'duffy", "Ba'dugan", "Ba'duggan", "Ba'dugh", "Ba'dughan", "Ba'duins", "Ba'dukry", "Ba'dulan", "Ba'dule", "Ba'duley", "Ba'duliam", "Ba'dully", "Ba'dun", "Ba'dunin", "Ba'duny", "Ba'duppy", "Ba'dupsey", "Ba'dura", "Ba'duroy", "Ba'durrell", "Ba'durroy", "Ba'dury", "Ba'dussey", "Ba'dutty", "Ba'duty", "Ba'gadan", "Ba'gaddy", "Ba'gaer", "Ba'gaffy", "Ba'gagan", "Ba'gaggan", "Ba'gagh", "Ba'gaghan", "Ba'gains", "Ba'gakry", "Ba'galan", "Ba'gale", "Ba'galey", "Ba'galiam", "Ba'gally", "Ba'gan", "Ba'ganin", "Ba'gany", "Ba'gappy", "Ba'gapsey", "Ba'gara", "Ba'garoy", "Ba'garrell", "Ba'garroy", "Ba'gary", "Ba'gassey", "Ba'gatty", "Ba'gaty", "Ba'jordan", "Ba'jorddy", "Ba'jorer", "Ba'jorffy", "Ba'jorgan", "Ba'jorggan", "Ba'jorgh", "Ba'jorghan", "Ba'jorins", "Ba'jorkry", "Ba'jorlan", "Ba'jorle", "Ba'jorley", "Ba'jorliam", "Ba'jorlly", "Ba'jorn", "Ba'jornin", "Ba'jorny", "Ba'jorppy", "Ba'jorpsey", "Ba'jorra", "Ba'jorroy", "Ba'jorrrell", "Ba'jorrroy", "Ba'jorry", "Ba'jorssey", "Ba'jortty", "Ba'jorty", "Ba'keadan", "Ba'keaddy", "Ba'keaer", "Ba'keaffy", "Ba'keagan", "Ba'keaggan", "Ba'keagh", "Ba'keaghan", "Ba'keains", "Ba'keakry", "Ba'kealan", "Ba'keale", "Ba'kealey", "Ba'kealiam", "Ba'keally", "Ba'kean", "Ba'keanin", "Ba'keany", "Ba'keappy", "Ba'keapsey", "Ba'keara", "Ba'kearoy", "Ba'kearrell", "Ba'kearroy", "Ba'keary", "Ba'keassey", "Ba'keatty", "Ba'keaty", "Ba'keedan", "Ba'keeddy", "Ba'keeer", "Ba'keeffy", "Ba'keegan", "Ba'keeggan", "Ba'keegh", "Ba'keeghan", "Ba'keeins", "Ba'keekry", "Ba'keelan", "Ba'keele", "Ba'keeley", "Ba'keeliam", "Ba'keelly", "Ba'keen", "Ba'keenin", "Ba'keeny", "Ba'keeppy", "Ba'keepsey", "Ba'keera", "Ba'keeroy", "Ba'keerrell", "Ba'keerroy", "Ba'keery", "Ba'keessey", "Ba'keetty", "Ba'keety", "Ba'laudan", "Ba'lauddy", "Ba'lauer", "Ba'lauffy", "Ba'laugan", "Ba'lauggan", "Ba'laugh", "Ba'laughan", "Ba'lauins", "Ba'laukry", "Ba'laulan", "Ba'laule", "Ba'lauley", "Ba'lauliam", "Ba'laully", "Ba'laun", "Ba'launin", "Ba'launy", "Ba'lauppy", "Ba'laupsey", "Ba'laura", "Ba'lauroy", "Ba'laurrell", "Ba'laurroy", "Ba'laury", "Ba'laussey", "Ba'lautty", "Ba'lauty", "Ba'leadan", "Ba'leaddy", "Ba'leaer", "Ba'leaffy", "Ba'leagan", "Ba'leaggan", "Ba'leagh", "Ba'leaghan", "Ba'leains", "Ba'leakry", "Ba'lealan", "Ba'leale", "Ba'lealey", "Ba'lealiam", "Ba'leally", "Ba'lean", "Ba'leanin", "Ba'leany", "Ba'leappy", "Ba'leapsey", "Ba'leara", "Ba'learoy", "Ba'learrell", "Ba'learroy", "Ba'leary", "Ba'leassey", "Ba'leatty", "Ba'leaty", "Ba'ledan", "Ba'leddy", "Ba'leer", "Ba'leffy", "Ba'legan", "Ba'leggan", "Ba'legh", "Ba'leghan", "Ba'leidan", "Ba'leiddy", "Ba'leier", "Ba'leiffy", "Ba'leigan", "Ba'leiggan", "Ba'leigh", "Ba'leighan", "Ba'leiins", "Ba'leikry", "Ba'leilan", "Ba'leile", "Ba'leiley", "Ba'leiliam", "Ba'leilly", "Ba'lein", "Ba'leinin", "Ba'leins", "Ba'leiny", "Ba'leippy", "Ba'leipsey", "Ba'leira", "Ba'leiroy", "Ba'leirrell", "Ba'leirroy", "Ba'leiry", "Ba'leissey", "Ba'leitty", "Ba'leity", "Ba'lekry", "Ba'lelan", "Ba'lele", "Ba'leley", "Ba'leliam", "Ba'lelly", "Ba'len", "Ba'lenin", "Ba'leny", "Ba'leppy", "Ba'lepsey", "Ba'lera", "Ba'leroy", "Ba'lerrell", "Ba'lerroy", "Ba'lery", "Ba'lessey", "Ba'letty", "Ba'lety", "Ba'lodan", "Ba'loddy", "Ba'loer", "Ba'loffy", "Ba'logan", "Ba'loggan", "Ba'logh", "Ba'loghan", "Ba'loins", "Ba'lokry", "Ba'lolan", "Ba'lole", "Ba'loley", "Ba'loliam", "Ba'lolly", "Ba'lon", "Ba'lonin", "Ba'lony", "Ba'loppy", "Ba'lopsey", "Ba'lora", "Ba'loroy", "Ba'lorrell", "Ba'lorroy", "Ba'lory", "Ba'lossey", "Ba'lotty", "Ba'loty", "Ba'lyndan", "Ba'lynddy", "Ba'lyner", "Ba'lynffy", "Ba'lyngan", "Ba'lynggan", "Ba'lyngh", "Ba'lynghan", "Ba'lynins", "Ba'lynkry", "Ba'lynlan", "Ba'lynle", "Ba'lynley", "Ba'lynliam", "Ba'lynlly", "Ba'lynn", "Ba'lynnin", "Ba'lynny", "Ba'lynppy", "Ba'lynpsey", "Ba'lynra", "Ba'lynroy", "Ba'lynrrell", "Ba'lynrroy", "Ba'lynry", "Ba'lynssey", "Ba'lyntty", "Ba'lynty", "Ba'madan", "Ba'maddy", "Ba'maer", "Ba'maffy", "Ba'magan", "Ba'maggan", "Ba'magh", "Ba'maghan", "Ba'mains", "Ba'makry", "Ba'malan", "Ba'male", "Ba'maley", "Ba'maliam", "Ba'mally", "Ba'man", "Ba'manin", "Ba'many", "Ba'mappy", "Ba'mapsey", "Ba'mara", "Ba'maroy", "Ba'marrell", "Ba'marroy", "Ba'mary", "Ba'massey", "Ba'matty", "Ba'maty", "Ba'nadan", "Ba'naddy", "Ba'naer", "Ba'naffy", "Ba'nagan", "Ba'naggan", "Ba'nagh", "Ba'naghan", "Ba'nains", "Ba'nakry", "Ba'nalan", "Ba'nale", "Ba'naley", "Ba'naliam", "Ba'nally", "Ba'nan", "Ba'nanin", "Ba'nany", "Ba'nappy", "Ba'napsey", "Ba'nara", "Ba'naroy", "Ba'narrell", "Ba'narroy", "Ba'nary", "Ba'nassey", "Ba'natty", "Ba'naty", "Ba'nedan", "Ba'neddy", "Ba'neer", "Ba'neffy", "Ba'negan", "Ba'neggan", "Ba'negh", "Ba'neghan", "Ba'neins", "Ba'nekry", "Ba'nelan", "Ba'nele", "Ba'neley", "Ba'neliam", "Ba'nelly", "Ba'nen", "Ba'nenin", "Ba'neny", "Ba'neppy", "Ba'nepsey", "Ba'nera", "Ba'neroy", "Ba'nerrell", "Ba'nerroy", "Ba'nery", "Ba'nessey", "Ba'netty", "Ba'nety", "Ba'peadan", "Ba'peaddy", "Ba'peaer", "Ba'peaffy", "Ba'peagan", "Ba'peaggan", "Ba'peagh", "Ba'peaghan", "Ba'peains", "Ba'peakry", "Ba'pealan", "Ba'peale", "Ba'pealey", "Ba'pealiam", "Ba'peally", "Ba'pean", "Ba'peanin", "Ba'peany", "Ba'peappy", "Ba'peapsey", "Ba'peara", "Ba'pearoy", "Ba'pearrell", "Ba'pearroy", "Ba'peary", "Ba'peassey", "Ba'peatty", "Ba'peaty", "Ba'reidan", "Ba'reiddy", "Ba'reier", "Ba'reiffy", "Ba'reigan", "Ba'reiggan", "Ba'reigh", "Ba'reighan", "Ba'reiins", "Ba'reikry", "Ba'reilan", "Ba'reile", "Ba'reiley", "Ba'reiliam", "Ba'reilly", "Ba'rein", "Ba'reinin", "Ba'reiny", "Ba'reippy", "Ba'reipsey", "Ba'reira", "Ba'reiroy", "Ba'reirrell", "Ba'reirroy", "Ba'reiry", "Ba'reissey", "Ba'reitty", "Ba'reity", "Ba'ridan", "Ba'riddy", "Ba'rier", "Ba'riffy", "Ba'rigan", "Ba'riggan", "Ba'righ", "Ba'righan", "Ba'riins", "Ba'rikry", "Ba'rilan", "Ba'rile", "Ba'riley", "Ba'riliam", "Ba'rilly", "Ba'rin", "Ba'rinin", "Ba'riny", "Ba'ripdan", "Ba'ripddy", "Ba'riper", "Ba'ripffy", "Ba'ripgan", "Ba'ripggan", "Ba'ripgh", "Ba'ripghan", "Ba'ripins", "Ba'ripkry", "Ba'riplan", "Ba'riple", "Ba'ripley", "Ba'ripliam", "Ba'riplly", "Ba'ripn", "Ba'ripnin", "Ba'ripny", "Ba'ripppy", "Ba'rippsey", "Ba'rippy", "Ba'ripra", "Ba'riproy", "Ba'riprrell", "Ba'riprroy", "Ba'ripry", "Ba'ripsey", "Ba'ripssey", "Ba'riptty", "Ba'ripty", "Ba'rira", "Ba'riroy", "Ba'rirrell", "Ba'rirroy", "Ba'riry", "Ba'rissey", "Ba'ritty", "Ba'rity", "Ba'rodan", "Ba'roddy", "Ba'roer", "Ba'roffy", "Ba'rogan", "Ba'roggan", "Ba'rogh", "Ba'roghan", "Ba'roins", "Ba'rokry", "Ba'rolan", "Ba'role", "Ba'roley", "Ba'roliam", "Ba'rolly", "Ba'ron", "Ba'ronin", "Ba'rony", "Ba'roppy", "Ba'ropsey", "Ba'rora", "Ba'roroy", "Ba'rorrell", "Ba'rorroy", "Ba'rory", "Ba'rossey", "Ba'rotty", "Ba'roty", "Ba'sadan", "Ba'saddy", "Ba'saer", "Ba'saffy", "Ba'sagan", "Ba'saggan", "Ba'sagh", "Ba'saghan", "Ba'sains", "Ba'sakry", "Ba'salan", "Ba'sale", "Ba'saley", "Ba'saliam", "Ba'sally", "Ba'san", "Ba'sanin", "Ba'sany", "Ba'sappy", "Ba'sapsey", "Ba'sara", "Ba'saroy", "Ba'sarrell", "Ba'sarroy", "Ba'sary", "Ba'sassey", "Ba'satty", "Ba'saty", "Ba'shedan", "Ba'sheddy", "Ba'sheer", "Ba'sheffy", "Ba'shegan", "Ba'sheggan", "Ba'shegh", "Ba'sheghan", "Ba'sheins", "Ba'shekry", "Ba'shelan", "Ba'shele", "Ba'sheley", "Ba'sheliam", "Ba'shelly", "Ba'shen", "Ba'shenin", "Ba'sheny", "Ba'sheppy", "Ba'shepsey", "Ba'shera", "Ba'sheroy", "Ba'sherrell", "Ba'sherroy", "Ba'shery", "Ba'shessey", "Ba'shetty", "Ba'shety", "Ba'tedan", "Ba'teddy", "Ba'teer", "Ba'teffy", "Ba'tegan", "Ba'teggan", "Ba'tegh", "Ba'teghan", "Ba'teins", "Ba'tekry", "Ba'telan", "Ba'tele", "Ba'teley", "Ba'teliam", "Ba'telly", "Ba'ten", "Ba'tenin", "Ba'teny", "Ba'teppy", "Ba'tepsey", "Ba'tera", "Ba'teroy", "Ba'terrell", "Ba'terroy", "Ba'tery", "Ba'tessey", "Ba'tetty", "Ba'tety", "Ba'toodan", "Ba'tooddy", "Ba'tooer", "Ba'tooffy", "Ba'toogan", "Ba'tooggan", "Ba'toogh", "Ba'tooghan", "Ba'tooins", "Ba'tookry", "Ba'toolan", "Ba'toole", "Ba'tooley", "Ba'tooliam", "Ba'toolly", "Ba'toon", "Ba'toonin", "Ba'toony", "Ba'tooppy", "Ba'toopsey", "Ba'toora", "Ba'tooroy", "Ba'toorrell", "Ba'toorroy", "Ba'toory", "Ba'toossey", "Ba'tootty", "Ba'tooty", "Ba'widan", "Ba'widdy", "Ba'wier", "Ba'wiffy", "Ba'wigan", "Ba'wiggan", "Ba'wigh", "Ba'wighan", "Ba'wiins", "Ba'wikry", "Ba'wilan", "Ba'wile", "Ba'wiley", "Ba'wiliam", "Ba'willy", "Ba'win", "Ba'winin", "Ba'winy", "Ba'wippy", "Ba'wipsey", "Ba'wira", "Ba'wiroy", "Ba'wirrell", "Ba'wirroy", "Ba'wiry", "Ba'wissey", "Ba'witty", "Ba'wity", "Ba'ydan", "Ba'yddy", "Ba'yer", "Ba'yffy", "Ba'ygan", "Ba'yggan", "Ba'ygh", "Ba'yghan", "Ba'yins", "Ba'ykry", "Ba'ylan", "Ba'yle", "Ba'yley", "Ba'yliam", "Ba'ylly", "Ba'yn", "Ba'ynin", "Ba'yny", "Ba'yppy", "Ba'ypsey", "Ba'yra", "Ba'yroy", "Ba'yrrell", "Ba'yrroy", "Ba'yry", "Ba'yssey", "Ba'ytty", "Ba'yty", "Be'ardan", "Be'arddy", "Be'arer", "Be'arffy", "Be'argan", "Be'arggan", "Be'argh", "Be'arghan", "Be'arins", "Be'arkry", "Be'arlan", "Be'arle", "Be'arley", "Be'arliam", "Be'arlly", "Be'arn", "Be'arnin", "Be'arny", "Be'arppy", "Be'arpsey", "Be'arra", "Be'arroy", "Be'arrrell", "Be'arrroy", "Be'arry", "Be'arssey", "Be'artty", "Be'arty", "Be'bidan", "Be'biddy", "Be'bier", "Be'biffy", "Be'bigan", "Be'biggan", "Be'bigh", "Be'bighan", "Be'biins", "Be'bikry", "Be'bilan", "Be'bile", "Be'biley", "Be'biliam", "Be'billy", "Be'bin", "Be'binin", "Be'biny", "Be'bippy", "Be'bipsey", "Be'bira", "Be'biroy", "Be'birrell", "Be'birroy", "Be'biry", "Be'bissey", "Be'bitty", "Be'bity", "Be'caudan", "Be'cauddy", "Be'cauer", "Be'cauffy", "Be'caugan", "Be'cauggan", "Be'caugh", "Be'caughan", "Be'cauins", "Be'caukry", "Be'caulan", "Be'caule", "Be'cauley", "Be'cauliam", "Be'caully", "Be'caun", "Be'caunin", "Be'cauny", "Be'cauppy", "Be'caupsey", "Be'caura", "Be'cauroy", "Be'caurrell", "Be'caurroy", "Be'caury", "Be'caussey", "Be'cautty", "Be'cauty", "Be'dadan", "Be'daddy", "Be'daer", "Be'daffy", "Be'dagan", "Be'daggan", "Be'dagh", "Be'daghan", "Be'dains", "Be'dakry", "Be'dalan", "Be'dale", "Be'daley", "Be'daliam", "Be'dally", "Be'dan", "Be'danin", "Be'dany", "Be'dappy", "Be'dapsey", "Be'dara", "Be'dardan", "Be'darddy", "Be'darer", "Be'darffy", "Be'dargan", "Be'darggan", "Be'dargh", "Be'darghan", "Be'darins", "Be'darkry", "Be'darlan", "Be'darle", "Be'darley", "Be'darliam", "Be'darlly", "Be'darn", "Be'darnin", "Be'darny", "Be'daroy", "Be'darppy", "Be'darpsey", "Be'darra", "Be'darrell", "Be'darroy", "Be'darrrell", "Be'darrroy", "Be'darry", "Be'darssey", "Be'dartty", "Be'darty", "Be'dary", "Be'dassey", "Be'datty", "Be'daty", "Be'doydan", "Be'doyddy", "Be'doyer", "Be'doyffy", "Be'doygan", "Be'doyggan", "Be'doygh", "Be'doyghan", "Be'doyins", "Be'doykry", "Be'doylan", "Be'doyle", "Be'doyley", "Be'doyliam", "Be'doylly", "Be'doyn", "Be'doynin", "Be'doyny", "Be'doyppy", "Be'doypsey", "Be'doyra", "Be'doyroy", "Be'doyrrell", "Be'doyrroy", "Be'doyry", "Be'doyssey", "Be'doytty", "Be'doyty", "Be'dudan", "Be'duddy", "Be'duer", "Be'duffy", "Be'dugan", "Be'duggan", "Be'dugh", "Be'dughan", "Be'duins", "Be'dukry", "Be'dulan", "Be'dule", "Be'duley", "Be'duliam", "Be'dully", "Be'dun", "Be'dunin", "Be'duny", "Be'duppy", "Be'dupsey", "Be'dura", "Be'duroy", "Be'durrell", "Be'durroy", "Be'dury", "Be'dussey", "Be'dutty", "Be'duty", "Be'gadan", "Be'gaddy", "Be'gaer", "Be'gaffy", "Be'gagan", "Be'gaggan", "Be'gagh", "Be'gaghan", "Be'gains", "Be'gakry", "Be'galan", "Be'gale", "Be'galey", "Be'galiam", "Be'gally", "Be'gan", "Be'ganin", "Be'gany", "Be'gappy", "Be'gapsey", "Be'gara", "Be'garoy", "Be'garrell", "Be'garroy", "Be'gary", "Be'gassey", "Be'gatty", "Be'gaty", "Be'jordan", "Be'jorddy", "Be'jorer", "Be'jorffy", "Be'jorgan", "Be'jorggan", "Be'jorgh", "Be'jorghan", "Be'jorins", "Be'jorkry", "Be'jorlan", "Be'jorle", "Be'jorley", "Be'jorliam", "Be'jorlly", "Be'jorn", "Be'jornin", "Be'jorny", "Be'jorppy", "Be'jorpsey", "Be'jorra", "Be'jorroy", "Be'jorrrell", "Be'jorrroy", "Be'jorry", "Be'jorssey", "Be'jortty", "Be'jorty", "Be'keadan", "Be'keaddy", "Be'keaer", "Be'keaffy", "Be'keagan", "Be'keaggan", "Be'keagh", "Be'keaghan", "Be'keains", "Be'keakry", "Be'kealan", "Be'keale", "Be'kealey", "Be'kealiam", "Be'keally", "Be'kean", "Be'keanin", "Be'keany", "Be'keappy", "Be'keapsey", "Be'keara", "Be'kearoy", "Be'kearrell", "Be'kearroy", "Be'keary", "Be'keassey", "Be'keatty", "Be'keaty", "Be'keedan", "Be'keeddy", "Be'keeer", "Be'keeffy", "Be'keegan", "Be'keeggan", "Be'keegh", "Be'keeghan", "Be'keeins", "Be'keekry", "Be'keelan", "Be'keele", "Be'keeley", "Be'keeliam", "Be'keelly", "Be'keen", "Be'keenin", "Be'keeny", "Be'keeppy", "Be'keepsey", "Be'keera", "Be'keeroy", "Be'keerrell", "Be'keerroy", "Be'keery", "Be'keessey", "Be'keetty", "Be'keety", "Be'laudan", "Be'lauddy", "Be'lauer", "Be'lauffy", "Be'laugan", "Be'lauggan", "Be'laugh", "Be'laughan", "Be'lauins", "Be'laukry", "Be'laulan", "Be'laule", "Be'lauley", "Be'lauliam", "Be'laully", "Be'laun", "Be'launin", "Be'launy", "Be'lauppy", "Be'laupsey", "Be'laura", "Be'lauroy", "Be'laurrell", "Be'laurroy", "Be'laury", "Be'laussey", "Be'lautty", "Be'lauty", "Be'leadan", "Be'leaddy", "Be'leaer", "Be'leaffy", "Be'leagan", "Be'leaggan", "Be'leagh", "Be'leaghan", "Be'leains", "Be'leakry", "Be'lealan", "Be'leale", "Be'lealey", "Be'lealiam", "Be'leally", "Be'lean", "Be'leanin", "Be'leany", "Be'leappy", "Be'leapsey", "Be'leara", "Be'learoy", "Be'learrell", "Be'learroy", "Be'leary", "Be'leassey", "Be'leatty", "Be'leaty", "Be'ledan", "Be'leddy", "Be'leer", "Be'leffy", "Be'legan", "Be'leggan", "Be'legh", "Be'leghan", "Be'leidan", "Be'leiddy", "Be'leier", "Be'leiffy", "Be'leigan", "Be'leiggan", "Be'leigh", "Be'leighan", "Be'leiins", "Be'leikry", "Be'leilan", "Be'leile", "Be'leiley", "Be'leiliam", "Be'leilly", "Be'lein", "Be'leinin", "Be'leins", "Be'leiny", "Be'leippy", "Be'leipsey", "Be'leira", "Be'leiroy", "Be'leirrell", "Be'leirroy", "Be'leiry", "Be'leissey", "Be'leitty", "Be'leity", "Be'lekry", "Be'lelan", "Be'lele", "Be'leley", "Be'leliam", "Be'lelly", "Be'len", "Be'lenin", "Be'leny", "Be'leppy", "Be'lepsey", "Be'lera", "Be'leroy", "Be'lerrell", "Be'lerroy", "Be'lery", "Be'lessey", "Be'letty", "Be'lety", "Be'lodan", "Be'loddy", "Be'loer", "Be'loffy", "Be'logan", "Be'loggan", "Be'logh", "Be'loghan", "Be'loins", "Be'lokry", "Be'lolan", "Be'lole", "Be'loley", "Be'loliam", "Be'lolly", "Be'lon", "Be'lonin", "Be'lony", "Be'loppy", "Be'lopsey", "Be'lora", "Be'loroy", "Be'lorrell", "Be'lorroy", "Be'lory", "Be'lossey", "Be'lotty", "Be'loty", "Be'lyndan", "Be'lynddy", "Be'lyner", "Be'lynffy", "Be'lyngan", "Be'lynggan", "Be'lyngh", "Be'lynghan", "Be'lynins", "Be'lynkry", "Be'lynlan", "Be'lynle", "Be'lynley", "Be'lynliam", "Be'lynlly", "Be'lynn", "Be'lynnin", "Be'lynny", "Be'lynppy", "Be'lynpsey", "Be'lynra", "Be'lynroy", "Be'lynrrell", "Be'lynrroy", "Be'lynry", "Be'lynssey", "Be'lyntty", "Be'lynty", "Be'madan", "Be'maddy", "Be'maer", "Be'maffy", "Be'magan", "Be'maggan", "Be'magh", "Be'maghan", "Be'mains", "Be'makry", "Be'malan", "Be'male", "Be'maley", "Be'maliam", "Be'mally", "Be'man", "Be'manin", "Be'many", "Be'mappy", "Be'mapsey", "Be'mara", "Be'maroy", "Be'marrell", "Be'marroy", "Be'mary", "Be'massey", "Be'matty", "Be'maty", "Be'nadan", "Be'naddy", "Be'naer", "Be'naffy", "Be'nagan", "Be'naggan", "Be'nagh", "Be'naghan", "Be'nains", "Be'nakry", "Be'nalan", "Be'nale", "Be'naley", "Be'naliam", "Be'nally", "Be'nan", "Be'nanin", "Be'nany", "Be'nappy", "Be'napsey", "Be'nara", "Be'naroy", "Be'narrell", "Be'narroy", "Be'nary", "Be'nassey", "Be'natty", "Be'naty", "Be'nedan", "Be'neddy", "Be'neer", "Be'neffy", "Be'negan", "Be'neggan", "Be'negh", "Be'neghan", "Be'neins", "Be'nekry", "Be'nelan", "Be'nele", "Be'neley", "Be'neliam", "Be'nelly", "Be'nen", "Be'nenin", "Be'neny", "Be'neppy", "Be'nepsey", "Be'nera", "Be'neroy", "Be'nerrell", "Be'nerroy", "Be'nery", "Be'nessey", "Be'netty", "Be'nety", "Be'peadan", "Be'peaddy", "Be'peaer", "Be'peaffy", "Be'peagan", "Be'peaggan", "Be'peagh", "Be'peaghan", "Be'peains", "Be'peakry", "Be'pealan", "Be'peale", "Be'pealey", "Be'pealiam", "Be'peally", "Be'pean", "Be'peanin", "Be'peany", "Be'peappy", "Be'peapsey", "Be'peara", "Be'pearoy", "Be'pearrell", "Be'pearroy", "Be'peary", "Be'peassey", "Be'peatty", "Be'peaty", "Be'reidan", "Be'reiddy", "Be'reier", "Be'reiffy", "Be'reigan", "Be'reiggan", "Be'reigh", "Be'reighan", "Be'reiins", "Be'reikry", "Be'reilan", "Be'reile", "Be'reiley", "Be'reiliam", "Be'reilly", "Be'rein", "Be'reinin", "Be'reiny", "Be'reippy", "Be'reipsey", "Be'reira", "Be'reiroy", "Be'reirrell", "Be'reirroy", "Be'reiry", "Be'reissey", "Be'reitty", "Be'reity", "Be'ridan", "Be'riddy", "Be'rier", "Be'riffy", "Be'rigan", "Be'riggan", "Be'righ", "Be'righan", "Be'riins", "Be'rikry", "Be'rilan", "Be'rile", "Be'riley", "Be'riliam", "Be'rilly", "Be'rin", "Be'rinin", "Be'riny", "Be'ripdan", "Be'ripddy", "Be'riper", "Be'ripffy", "Be'ripgan", "Be'ripggan", "Be'ripgh", "Be'ripghan", "Be'ripins", "Be'ripkry", "Be'riplan", "Be'riple", "Be'ripley", "Be'ripliam", "Be'riplly", "Be'ripn", "Be'ripnin", "Be'ripny", "Be'ripppy", "Be'rippsey", "Be'rippy", "Be'ripra", "Be'riproy", "Be'riprrell", "Be'riprroy", "Be'ripry", "Be'ripsey", "Be'ripssey", "Be'riptty", "Be'ripty", "Be'rira", "Be'riroy", "Be'rirrell", "Be'rirroy", "Be'riry", "Be'rissey", "Be'ritty", "Be'rity", "Be'rodan", "Be'roddy", "Be'roer", "Be'roffy", "Be'rogan", "Be'roggan", "Be'rogh", "Be'roghan", "Be'roins", "Be'rokry", "Be'rolan", "Be'role", "Be'roley", "Be'roliam", "Be'rolly", "Be'ron", "Be'ronin", "Be'rony", "Be'roppy", "Be'ropsey", "Be'rora", "Be'roroy", "Be'rorrell", "Be'rorroy", "Be'rory", "Be'rossey", "Be'rotty", "Be'roty", "Be'sadan", "Be'saddy", "Be'saer", "Be'saffy", "Be'sagan", "Be'saggan", "Be'sagh", "Be'saghan", "Be'sains", "Be'sakry", "Be'salan", "Be'sale", "Be'saley", "Be'saliam", "Be'sally", "Be'san", "Be'sanin", "Be'sany", "Be'sappy", "Be'sapsey", "Be'sara", "Be'saroy", "Be'sarrell", "Be'sarroy", "Be'sary", "Be'sassey", "Be'satty", "Be'saty", "Be'shedan", "Be'sheddy", "Be'sheer", "Be'sheffy", "Be'shegan", "Be'sheggan", "Be'shegh", "Be'sheghan", "Be'sheins", "Be'shekry", "Be'shelan", "Be'shele", "Be'sheley", "Be'sheliam", "Be'shelly", "Be'shen", "Be'shenin", "Be'sheny", "Be'sheppy", "Be'shepsey", "Be'shera", "Be'sheroy", "Be'sherrell", "Be'sherroy", "Be'shery", "Be'shessey", "Be'shetty", "Be'shety", "Be'tedan", "Be'teddy", "Be'teer", "Be'teffy", "Be'tegan", "Be'teggan", "Be'tegh", "Be'teghan", "Be'teins", "Be'tekry", "Be'telan", "Be'tele", "Be'teley", "Be'teliam", "Be'telly", "Be'ten", "Be'tenin", "Be'teny", "Be'teppy", "Be'tepsey", "Be'tera", "Be'teroy", "Be'terrell", "Be'terroy", "Be'tery", "Be'tessey", "Be'tetty", "Be'tety", "Be'toodan", "Be'tooddy", "Be'tooer", "Be'tooffy", "Be'toogan", "Be'tooggan", "Be'toogh", "Be'tooghan", "Be'tooins", "Be'tookry", "Be'toolan", "Be'toole", "Be'tooley", "Be'tooliam", "Be'toolly", "Be'toon", "Be'toonin", "Be'toony", "Be'tooppy", "Be'toopsey", "Be'toora", "Be'tooroy", "Be'toorrell", "Be'toorroy", "Be'toory", "Be'toossey", "Be'tootty", "Be'tooty", "Be'widan", "Be'widdy", "Be'wier", "Be'wiffy", "Be'wigan", "Be'wiggan", "Be'wigh", "Be'wighan", "Be'wiins", "Be'wikry", "Be'wilan", "Be'wile", "Be'wiley", "Be'wiliam", "Be'willy", "Be'win", "Be'winin", "Be'winy", "Be'wippy", "Be'wipsey", "Be'wira", "Be'wiroy", "Be'wirrell", "Be'wirroy", "Be'wiry", "Be'wissey", "Be'witty", "Be'wity", "Be'ydan", "Be'yddy", "Be'yer", "Be'yffy", "Be'ygan", "Be'yggan", "Be'ygh", "Be'yghan", "Be'yins", "Be'ykry", "Be'ylan", "Be'yle", "Be'yley", "Be'yliam", "Be'ylly", "Be'yn", "Be'ynin", "Be'yny", "Be'yppy", "Be'ypsey", "Be'yra", "Be'yroy", "Be'yrrell", "Be'yrroy", "Be'yry", "Be'yssey", "Be'ytty", "Be'yty", "Bidan", "Biddy", "Bier", "Biffy", "Bigan", "Biggan", "Bigh", "Bighan", "Biins", "Bikry", "Bilan", "Bile", "Biley", "Biliam", "Billy", "Bin", "Binin", "Biny", "Bippy", "Bipsey", "Bira", "Biroy", "Birrell", "Birroy", "Biry", "Bissey", "Bitty", "Bity", "Caudan", "Cauddy", "Cauer", "Cauffy", "Caugan", "Cauggan", "Caugh", "Caughan", "Cauins", "Caukry", "Caulan", "Caule", "Cauley", "Cauliam", "Caully", "Caun", "Caunin", "Cauny", "Cauppy", "Caupsey", "Caura", "Cauroy", "Caurrell", "Caurroy", "Caury", "Caussey", "Cautty", "Cauty", "Dadan", "Daddy", "Daer", "Daffy", "Dagan", "Daggan", "Dagh", "Daghan", "Dains", "Dakry", "Dalan", "Dale", "Daley", "Daliam", "Dally", "Dan", "Danin", "Dany", "Dappy", "Dapsey", "Dara", "Dardan", "Darddy", "Darer", "Darffy", "Dargan", "Darggan", "Dargh", "Darghan", "Darins", "Darkry", "Darlan", "Darle", "Darley", "Darliam", "Darlly", "Darn", "Darnin", "Darny", "Daroy", "Darppy", "Darpsey", "Darra", "Darrell", "Darroy", "Darrrell", "Darrroy", "Darry", "Darssey", "Dartty", "Darty", "Dary", "Dassey", "Datty", "Daty", "Doydan", "Doyddy", "Doyer", "Doyffy", "Doygan", "Doyggan", "Doygh", "Doyghan", "Doyins", "Doykry", "Doylan", "Doyle", "Doyley", "Doyliam", "Doylly", "Doyn", "Doynin", "Doyny", "Doyppy", "Doypsey", "Doyra", "Doyroy", "Doyrrell", "Doyrroy", "Doyry", "Doyssey", "Doytty", "Doyty", "Dudan", "Duddy", "Duer", "Duffy", "Dugan", "Duggan", "Dugh", "Dughan", "Duins", "Dukry", "Dulan", "Dule", "Duley", "Duliam", "Dully", "Dun", "Dunin", "Duny", "Duppy", "Dupsey", "Dura", "Duroy", "Durrell", "Durroy", "Dury", "Dussey", "Dutty", "Duty", "Gadan", "Gaddy", "Gaer", "Gaffy", "Gagan", "Gaggan", "Gagh", "Gaghan", "Gains", "Gakry", "Galan", "Gale", "Galey", "Galiam", "Gally", "Gan", "Ganin", "Gany", "Gappy", "Gapsey", "Gara", "Garoy", "Garrell", "Garroy", "Gary", "Gassey", "Gatty", "Gaty", "Jordan", "Jorddy", "Jorer", "Jorffy", "Jorgan", "Jorggan", "Jorgh", "Jorghan", "Jorins", "Jorkry", "Jorlan", "Jorle", "Jorley", "Jorliam", "Jorlly", "Jorn", "Jornin", "Jorny", "Jorppy", "Jorpsey", "Jorra", "Jorroy", "Jorrrell", "Jorrroy", "Jorry", "Jorssey", "Jortty", "Jorty", "Keadan", "Keaddy", "Keaer", "Keaffy", "Keagan", "Keaggan", "Keagh", "Keaghan", "Keains", "Keakry", "Kealan", "Keale", "Kealey", "Kealiam", "Keally", "Kean", "Keanin", "Keany", "Keappy", "Keapsey", "Keara", "Kearoy", "Kearrell", "Kearroy", "Keary", "Keassey", "Keatty", "Keaty", "Keedan", "Keeddy", "Keeer", "Keeffy", "Keegan", "Keeggan", "Keegh", "Keeghan", "Keeins", "Keekry", "Keelan", "Keele", "Keeley", "Keeliam", "Keelly", "Keen", "Keenin", "Keeny", "Keeppy", "Keepsey", "Keera", "Keeroy", "Keerrell", "Keerroy", "Keery", "Keessey", "Keetty", "Keety", "Laudan", "Lauddy", "Lauer", "Lauffy", "Laugan", "Lauggan", "Laugh", "Laughan", "Lauins", "Laukry", "Laulan", "Laule", "Lauley", "Lauliam", "Laully", "Laun", "Launin", "Launy", "Lauppy", "Laupsey", "Laura", "Lauroy", "Laurrell", "Laurroy", "Laury", "Laussey", "Lautty", "Lauty", "Leadan", "Leaddy", "Leaer", "Leaffy", "Leagan", "Leaggan", "Leagh", "Leaghan", "Leains", "Leakry", "Lealan", "Leale", "Lealey", "Lealiam", "Leally", "Lean", "Leanin", "Leany", "Leappy", "Leapsey", "Leara", "Learoy", "Learrell", "Learroy", "Leary", "Leassey", "Leatty", "Leaty", "Ledan", "Leddy", "Leer", "Leffy", "Legan", "Leggan", "Legh", "Leghan", "Leidan", "Leiddy", "Leier", "Leiffy", "Leigan", "Leiggan", "Leigh", "Leighan", "Leiins", "Leikry", "Leilan", "Leile", "Leiley", "Leiliam", "Leilly", "Lein", "Leinin", "Leins", "Leiny", "Leippy", "Leipsey", "Leira", "Leiroy", "Leirrell", "Leirroy", "Leiry", "Leissey", "Leitty", "Leity", "Lekry", "Lelan", "Lele", "Leley", "Leliam", "Lelly", "Len", "Lenin", "Leny", "Leppy", "Lepsey", "Lera", "Leroy", "Lerrell", "Lerroy", "Lery", "Lessey", "Letty", "Lety", "Lodan", "Loddy", "Loer", "Loffy", "Logan", "Loggan", "Logh", "Loghan", "Loins", "Lokry", "Lolan", "Lole", "Loley", "Loliam", "Lolly", "Lon", "Lonin", "Lony", "Loppy", "Lopsey", "Lora", "Loroy", "Lorrell", "Lorroy", "Lory", "Lossey", "Lotty", "Loty", "Lyndan", "Lynddy", "Lyner", "Lynffy", "Lyngan", "Lynggan", "Lyngh", "Lynghan", "Lynins", "Lynkry", "Lynlan", "Lynle", "Lynley", "Lynliam", "Lynlly", "Lynn", "Lynnin", "Lynny", "Lynppy", "Lynpsey", "Lynra", "Lynroy", "Lynrrell", "Lynrroy", "Lynry", "Lynssey", "Lyntty", "Lynty", "Mac'ardan", "Mac'arddy", "Mac'arer", "Mac'arffy", "Mac'argan", "Mac'arggan", "Mac'argh", "Mac'arghan", "Mac'arins", "Mac'arkry", "Mac'arlan", "Mac'arle", "Mac'arley", "Mac'arliam", "Mac'arlly", "Mac'arn", "Mac'arnin", "Mac'arny", "Mac'arppy", "Mac'arpsey", "Mac'arra", "Mac'arroy", "Mac'arrrell", "Mac'arrroy", "Mac'arry", "Mac'arssey", "Mac'artty", "Mac'arty", "Mac'bidan", "Mac'biddy", "Mac'bier", "Mac'biffy", "Mac'bigan", "Mac'biggan", "Mac'bigh", "Mac'bighan", "Mac'biins", "Mac'bikry", "Mac'bilan", "Mac'bile", "Mac'biley", "Mac'biliam", "Mac'billy", "Mac'bin", "Mac'binin", "Mac'biny", "Mac'bippy", "Mac'bipsey", "Mac'bira", "Mac'biroy", "Mac'birrell", "Mac'birroy", "Mac'biry", "Mac'bissey", "Mac'bitty", "Mac'bity", "Mac'caudan", "Mac'cauddy", "Mac'cauer", "Mac'cauffy", "Mac'caugan", "Mac'cauggan", "Mac'caugh", "Mac'caughan", "Mac'cauins", "Mac'caukry", "Mac'caulan", "Mac'caule", "Mac'cauley", "Mac'cauliam", "Mac'caully", "Mac'caun", "Mac'caunin", "Mac'cauny", "Mac'cauppy", "Mac'caupsey", "Mac'caura", "Mac'cauroy", "Mac'caurrell", "Mac'caurroy", "Mac'caury", "Mac'caussey", "Mac'cautty", "Mac'cauty", "Mac'dadan", "Mac'daddy", "Mac'daer", "Mac'daffy", "Mac'dagan", "Mac'daggan", "Mac'dagh", "Mac'daghan", "Mac'dains", "Mac'dakry", "Mac'dalan", "Mac'dale", "Mac'daley", "Mac'daliam", "Mac'dally", "Mac'dan", "Mac'danin", "Mac'dany", "Mac'dappy", "Mac'dapsey", "Mac'dara", "Mac'dardan", "Mac'darddy", "Mac'darer", "Mac'darffy", "Mac'dargan", "Mac'darggan", "Mac'dargh", "Mac'darghan", "Mac'darins", "Mac'darkry", "Mac'darlan", "Mac'darle", "Mac'darley", "Mac'darliam", "Mac'darlly", "Mac'darn", "Mac'darnin", "Mac'darny", "Mac'daroy", "Mac'darppy", "Mac'darpsey", "Mac'darra", "Mac'darrell", "Mac'darroy", "Mac'darrrell", "Mac'darrroy", "Mac'darry", "Mac'darssey", "Mac'dartty", "Mac'darty", "Mac'dary", "Mac'dassey", "Mac'datty", "Mac'daty", "Mac'doydan", "Mac'doyddy", "Mac'doyer", "Mac'doyffy", "Mac'doygan", "Mac'doyggan", "Mac'doygh", "Mac'doyghan", "Mac'doyins", "Mac'doykry", "Mac'doylan", "Mac'doyle", "Mac'doyley", "Mac'doyliam", "Mac'doylly", "Mac'doyn", "Mac'doynin", "Mac'doyny", "Mac'doyppy", "Mac'doypsey", "Mac'doyra", "Mac'doyroy", "Mac'doyrrell", "Mac'doyrroy", "Mac'doyry", "Mac'doyssey", "Mac'doytty", "Mac'doyty", "Mac'dudan", "Mac'duddy", "Mac'duer", "Mac'duffy", "Mac'dugan", "Mac'duggan", "Mac'dugh", "Mac'dughan", "Mac'duins", "Mac'dukry", "Mac'dulan", "Mac'dule", "Mac'duley", "Mac'duliam", "Mac'dully", "Mac'dun", "Mac'dunin", "Mac'duny", "Mac'duppy", "Mac'dupsey", "Mac'dura", "Mac'duroy", "Mac'durrell", "Mac'durroy", "Mac'dury", "Mac'dussey", "Mac'dutty", "Mac'duty", "Mac'gadan", "Mac'gaddy", "Mac'gaer", "Mac'gaffy", "Mac'gagan", "Mac'gaggan", "Mac'gagh", "Mac'gaghan", "Mac'gains", "Mac'gakry", "Mac'galan", "Mac'gale", "Mac'galey", "Mac'galiam", "Mac'gally", "Mac'gan", "Mac'ganin", "Mac'gany", "Mac'gappy", "Mac'gapsey", "Mac'gara", "Mac'garoy", "Mac'garrell", "Mac'garroy", "Mac'gary", "Mac'gassey", "Mac'gatty", "Mac'gaty", "Mac'jordan", "Mac'jorddy", "Mac'jorer", "Mac'jorffy", "Mac'jorgan", "Mac'jorggan", "Mac'jorgh", "Mac'jorghan", "Mac'jorins", "Mac'jorkry", "Mac'jorlan", "Mac'jorle", "Mac'jorley", "Mac'jorliam", "Mac'jorlly", "Mac'jorn", "Mac'jornin", "Mac'jorny", "Mac'jorppy", "Mac'jorpsey", "Mac'jorra", "Mac'jorroy", "Mac'jorrrell", "Mac'jorrroy", "Mac'jorry", "Mac'jorssey", "Mac'jortty", "Mac'jorty", "Mac'keadan", "Mac'keaddy", "Mac'keaer", "Mac'keaffy", "Mac'keagan", "Mac'keaggan", "Mac'keagh", "Mac'keaghan", "Mac'keains", "Mac'keakry", "Mac'kealan", "Mac'keale", "Mac'kealey", "Mac'kealiam", "Mac'keally", "Mac'kean", "Mac'keanin", "Mac'keany", "Mac'keappy", "Mac'keapsey", "Mac'keara", "Mac'kearoy", "Mac'kearrell", "Mac'kearroy", "Mac'keary", "Mac'keassey", "Mac'keatty", "Mac'keaty", "Mac'keedan", "Mac'keeddy", "Mac'keeer", "Mac'keeffy", "Mac'keegan", "Mac'keeggan", "Mac'keegh", "Mac'keeghan", "Mac'keeins", "Mac'keekry", "Mac'keelan", "Mac'keele", "Mac'keeley", "Mac'keeliam", "Mac'keelly", "Mac'keen", "Mac'keenin", "Mac'keeny", "Mac'keeppy", "Mac'keepsey", "Mac'keera", "Mac'keeroy", "Mac'keerrell", "Mac'keerroy", "Mac'keery", "Mac'keessey", "Mac'keetty", "Mac'keety", "Mac'laudan", "Mac'lauddy", "Mac'lauer", "Mac'lauffy", "Mac'laugan", "Mac'lauggan", "Mac'laugh", "Mac'laughan", "Mac'lauins", "Mac'laukry", "Mac'laulan", "Mac'laule", "Mac'lauley", "Mac'lauliam", "Mac'laully", "Mac'laun", "Mac'launin", "Mac'launy", "Mac'lauppy", "Mac'laupsey", "Mac'laura", "Mac'lauroy", "Mac'laurrell", "Mac'laurroy", "Mac'laury", "Mac'laussey", "Mac'lautty", "Mac'lauty", "Mac'leadan", "Mac'leaddy", "Mac'leaer", "Mac'leaffy", "Mac'leagan", "Mac'leaggan", "Mac'leagh", "Mac'leaghan", "Mac'leains", "Mac'leakry", "Mac'lealan", "Mac'leale", "Mac'lealey", "Mac'lealiam", "Mac'leally", "Mac'lean", "Mac'leanin", "Mac'leany", "Mac'leappy", "Mac'leapsey", "Mac'leara", "Mac'learoy", "Mac'learrell", "Mac'learroy", "Mac'leary", "Mac'leassey", "Mac'leatty", "Mac'leaty", "Mac'ledan", "Mac'leddy", "Mac'leer", "Mac'leffy", "Mac'legan", "Mac'leggan", "Mac'legh", "Mac'leghan", "Mac'leidan", "Mac'leiddy", "Mac'leier", "Mac'leiffy", "Mac'leigan", "Mac'leiggan", "Mac'leigh", "Mac'leighan", "Mac'leiins", "Mac'leikry", "Mac'leilan", "Mac'leile", "Mac'leiley", "Mac'leiliam", "Mac'leilly", "Mac'lein", "Mac'leinin", "Mac'leins", "Mac'leiny", "Mac'leippy", "Mac'leipsey", "Mac'leira", "Mac'leiroy", "Mac'leirrell", "Mac'leirroy", "Mac'leiry", "Mac'leissey", "Mac'leitty", "Mac'leity", "Mac'lekry", "Mac'lelan", "Mac'lele", "Mac'leley", "Mac'leliam", "Mac'lelly", "Mac'len", "Mac'lenin", "Mac'leny", "Mac'leppy", "Mac'lepsey", "Mac'lera", "Mac'leroy", "Mac'lerrell", "Mac'lerroy", "Mac'lery", "Mac'lessey", "Mac'letty", "Mac'lety", "Mac'lodan", "Mac'loddy", "Mac'loer", "Mac'loffy", "Mac'logan", "Mac'loggan", "Mac'logh", "Mac'loghan", "Mac'loins", "Mac'lokry", "Mac'lolan", "Mac'lole", "Mac'loley", "Mac'loliam", "Mac'lolly", "Mac'lon", "Mac'lonin", "Mac'lony", "Mac'loppy", "Mac'lopsey", "Mac'lora", "Mac'loroy", "Mac'lorrell", "Mac'lorroy", "Mac'lory", "Mac'lossey", "Mac'lotty", "Mac'loty", "Mac'lyndan", "Mac'lynddy", "Mac'lyner", "Mac'lynffy", "Mac'lyngan", "Mac'lynggan", "Mac'lyngh", "Mac'lynghan", "Mac'lynins", "Mac'lynkry", "Mac'lynlan", "Mac'lynle", "Mac'lynley", "Mac'lynliam", "Mac'lynlly", "Mac'lynn", "Mac'lynnin", "Mac'lynny", "Mac'lynppy", "Mac'lynpsey", "Mac'lynra", "Mac'lynroy", "Mac'lynrrell", "Mac'lynrroy", "Mac'lynry", "Mac'lynssey", "Mac'lyntty", "Mac'lynty", "Mac'madan", "Mac'maddy", "Mac'maer", "Mac'maffy", "Mac'magan", "Mac'maggan", "Mac'magh", "Mac'maghan", "Mac'mains", "Mac'makry", "Mac'malan", "Mac'male", "Mac'maley", "Mac'maliam", "Mac'mally", "Mac'man", "Mac'manin", "Mac'many", "Mac'mappy", "Mac'mapsey", "Mac'mara", "Mac'maroy", "Mac'marrell", "Mac'marroy", "Mac'mary", "Mac'massey", "Mac'matty", "Mac'maty", "Mac'nadan", "Mac'naddy", "Mac'naer", "Mac'naffy", "Mac'nagan", "Mac'naggan", "Mac'nagh", "Mac'naghan", "Mac'nains", "Mac'nakry", "Mac'nalan", "Mac'nale", "Mac'naley", "Mac'naliam", "Mac'nally", "Mac'nan", "Mac'nanin", "Mac'nany", "Mac'nappy", "Mac'napsey", "Mac'nara", "Mac'naroy", "Mac'narrell", "Mac'narroy", "Mac'nary", "Mac'nassey", "Mac'natty", "Mac'naty", "Mac'nedan", "Mac'neddy", "Mac'neer", "Mac'neffy", "Mac'negan", "Mac'neggan", "Mac'negh", "Mac'neghan", "Mac'neins", "Mac'nekry", "Mac'nelan", "Mac'nele", "Mac'neley", "Mac'neliam", "Mac'nelly", "Mac'nen", "Mac'nenin", "Mac'neny", "Mac'neppy", "Mac'nepsey", "Mac'nera", "Mac'neroy", "Mac'nerrell", "Mac'nerroy", "Mac'nery", "Mac'nessey", "Mac'netty", "Mac'nety", "Mac'peadan", "Mac'peaddy", "Mac'peaer", "Mac'peaffy", "Mac'peagan", "Mac'peaggan", "Mac'peagh", "Mac'peaghan", "Mac'peains", "Mac'peakry", "Mac'pealan", "Mac'peale", "Mac'pealey", "Mac'pealiam", "Mac'peally", "Mac'pean", "Mac'peanin", "Mac'peany", "Mac'peappy", "Mac'peapsey", "Mac'peara", "Mac'pearoy", "Mac'pearrell", "Mac'pearroy", "Mac'peary", "Mac'peassey", "Mac'peatty", "Mac'peaty", "Mac'reidan", "Mac'reiddy", "Mac'reier", "Mac'reiffy", "Mac'reigan", "Mac'reiggan", "Mac'reigh", "Mac'reighan", "Mac'reiins", "Mac'reikry", "Mac'reilan", "Mac'reile", "Mac'reiley", "Mac'reiliam", "Mac'reilly", "Mac'rein", "Mac'reinin", "Mac'reiny", "Mac'reippy", "Mac'reipsey", "Mac'reira", "Mac'reiroy", "Mac'reirrell", "Mac'reirroy", "Mac'reiry", "Mac'reissey", "Mac'reitty", "Mac'reity", "Mac'ridan", "Mac'riddy", "Mac'rier", "Mac'riffy", "Mac'rigan", "Mac'riggan", "Mac'righ", "Mac'righan", "Mac'riins", "Mac'rikry", "Mac'rilan", "Mac'rile", "Mac'riley", "Mac'riliam", "Mac'rilly", "Mac'rin", "Mac'rinin", "Mac'riny", "Mac'ripdan", "Mac'ripddy", "Mac'riper", "Mac'ripffy", "Mac'ripgan", "Mac'ripggan", "Mac'ripgh", "Mac'ripghan", "Mac'ripins", "Mac'ripkry", "Mac'riplan", "Mac'riple", "Mac'ripley", "Mac'ripliam", "Mac'riplly", "Mac'ripn", "Mac'ripnin", "Mac'ripny", "Mac'ripppy", "Mac'rippsey", "Mac'rippy", "Mac'ripra", "Mac'riproy", "Mac'riprrell", "Mac'riprroy", "Mac'ripry", "Mac'ripsey", "Mac'ripssey", "Mac'riptty", "Mac'ripty", "Mac'rira", "Mac'riroy", "Mac'rirrell", "Mac'rirroy", "Mac'riry", "Mac'rissey", "Mac'ritty", "Mac'rity", "Mac'rodan", "Mac'roddy", "Mac'roer", "Mac'roffy", "Mac'rogan", "Mac'roggan", "Mac'rogh", "Mac'roghan", "Mac'roins", "Mac'rokry", "Mac'rolan", "Mac'role", "Mac'roley", "Mac'roliam", "Mac'rolly", "Mac'ron", "Mac'ronin", "Mac'rony", "Mac'roppy", "Mac'ropsey", "Mac'rora", "Mac'roroy", "Mac'rorrell", "Mac'rorroy", "Mac'rory", "Mac'rossey", "Mac'rotty", "Mac'roty", "Mac'sadan", "Mac'saddy", "Mac'saer", "Mac'saffy", "Mac'sagan", "Mac'saggan", "Mac'sagh", "Mac'saghan", "Mac'sains", "Mac'sakry", "Mac'salan", "Mac'sale", "Mac'saley", "Mac'saliam", "Mac'sally", "Mac'san", "Mac'sanin", "Mac'sany", "Mac'sappy", "Mac'sapsey", "Mac'sara", "Mac'saroy", "Mac'sarrell", "Mac'sarroy", "Mac'sary", "Mac'sassey", "Mac'satty", "Mac'saty", "Mac'shedan", "Mac'sheddy", "Mac'sheer", "Mac'sheffy", "Mac'shegan", "Mac'sheggan", "Mac'shegh", "Mac'sheghan", "Mac'sheins", "Mac'shekry", "Mac'shelan", "Mac'shele", "Mac'sheley", "Mac'sheliam", "Mac'shelly", "Mac'shen", "Mac'shenin", "Mac'sheny", "Mac'sheppy", "Mac'shepsey", "Mac'shera", "Mac'sheroy", "Mac'sherrell", "Mac'sherroy", "Mac'shery", "Mac'shessey", "Mac'shetty", "Mac'shety", "Mac'tedan", "Mac'teddy", "Mac'teer", "Mac'teffy", "Mac'tegan", "Mac'teggan", "Mac'tegh", "Mac'teghan", "Mac'teins", "Mac'tekry", "Mac'telan", "Mac'tele", "Mac'teley", "Mac'teliam", "Mac'telly", "Mac'ten", "Mac'tenin", "Mac'teny", "Mac'teppy", "Mac'tepsey", "Mac'tera", "Mac'teroy", "Mac'terrell", "Mac'terroy", "Mac'tery", "Mac'tessey", "Mac'tetty", "Mac'tety", "Mac'toodan", "Mac'tooddy", "Mac'tooer", "Mac'tooffy", "Mac'toogan", "Mac'tooggan", "Mac'toogh", "Mac'tooghan", "Mac'tooins", "Mac'tookry", "Mac'toolan", "Mac'toole", "Mac'tooley", "Mac'tooliam", "Mac'toolly", "Mac'toon", "Mac'toonin", "Mac'toony", "Mac'tooppy", "Mac'toopsey", "Mac'toora", "Mac'tooroy", "Mac'toorrell", "Mac'toorroy", "Mac'toory", "Mac'toossey", "Mac'tootty", "Mac'tooty", "Mac'widan", "Mac'widdy", "Mac'wier", "Mac'wiffy", "Mac'wigan", "Mac'wiggan", "Mac'wigh", "Mac'wighan", "Mac'wiins", "Mac'wikry", "Mac'wilan", "Mac'wile", "Mac'wiley", "Mac'wiliam", "Mac'willy", "Mac'win", "Mac'winin", "Mac'winy", "Mac'wippy", "Mac'wipsey", "Mac'wira", "Mac'wiroy", "Mac'wirrell", "Mac'wirroy", "Mac'wiry", "Mac'wissey", "Mac'witty", "Mac'wity", "Mac'ydan", "Mac'yddy", "Mac'yer", "Mac'yffy", "Mac'ygan", "Mac'yggan", "Mac'ygh", "Mac'yghan", "Mac'yins", "Mac'ykry", "Mac'ylan", "Mac'yle", "Mac'yley", "Mac'yliam", "Mac'ylly", "Mac'yn", "Mac'ynin", "Mac'yny", "Mac'yppy", "Mac'ypsey", "Mac'yra", "Mac'yroy", "Mac'yrrell", "Mac'yrroy", "Mac'yry", "Mac'yssey", "Mac'ytty", "Mac'yty", "Madan", "Maddy", "Maer", "Maffy", "Magan", "Maggan", "Magh", "Maghan", "Mains", "Makry", "Malan", "Male", "Maley", "Maliam", "Mally", "Man", "Manin", "Many", "Mappy", "Mapsey", "Mara", "Maroy", "Marrell", "Marroy", "Mary", "Massey", "Matty", "Maty", "Nadan", "Naddy", "Naer", "Naffy", "Nagan", "Naggan", "Nagh", "Naghan", "Nains", "Nakry", "Nalan", "Nale", "Naley", "Naliam", "Nally", "Nan", "Nanin", "Nany", "Nappy", "Napsey", "Nara", "Naroy", "Narrell", "Narroy", "Nary", "Nassey", "Natty", "Naty", "Nedan", "Neddy", "Neer", "Neffy", "Negan", "Neggan", "Negh", "Neghan", "Neins", "Nekry", "Nelan", "Nele", "Neley", "Neliam", "Nelly", "Nen", "Nenin", "Neny", "Neppy", "Nepsey", "Nera", "Neroy", "Nerrell", "Nerroy", "Nery", "Nessey", "Netty", "Nety", "O'ardan", "O'arddy", "O'arer", "O'arffy", "O'argan", "O'arggan", "O'argh", "O'arghan", "O'arins", "O'arkry", "O'arlan", "O'arle", "O'arley", "O'arliam", "O'arlly", "O'arn", "O'arnin", "O'arny", "O'arppy", "O'arpsey", "O'arra", "O'arroy", "O'arrrell", "O'arrroy", "O'arry", "O'arssey", "O'artty", "O'arty", "O'bidan", "O'biddy", "O'bier", "O'biffy", "O'bigan", "O'biggan", "O'bigh", "O'bighan", "O'biins", "O'bikry", "O'bilan", "O'bile", "O'biley", "O'biliam", "O'billy", "O'bin", "O'binin", "O'biny", "O'bippy", "O'bipsey", "O'bira", "O'biroy", "O'birrell", "O'birroy", "O'biry", "O'bissey", "O'bitty", "O'bity", "O'caudan", "O'cauddy", "O'cauer", "O'cauffy", "O'caugan", "O'cauggan", "O'caugh", "O'caughan", "O'cauins", "O'caukry", "O'caulan", "O'caule", "O'cauley", "O'cauliam", "O'caully", "O'caun", "O'caunin", "O'cauny", "O'cauppy", "O'caupsey", "O'caura", "O'cauroy", "O'caurrell", "O'caurroy", "O'caury", "O'caussey", "O'cautty", "O'cauty", "O'dadan", "O'daddy", "O'daer", "O'daffy", "O'dagan", "O'daggan", "O'dagh", "O'daghan", "O'dains", "O'dakry", "O'dalan", "O'dale", "O'daley", "O'daliam", "O'dally", "O'dan", "O'danin", "O'dany", "O'dappy", "O'dapsey", "O'dara", "O'dardan", "O'darddy", "O'darer", "O'darffy", "O'dargan", "O'darggan", "O'dargh", "O'darghan", "O'darins", "O'darkry", "O'darlan", "O'darle", "O'darley", "O'darliam", "O'darlly", "O'darn", "O'darnin", "O'darny", "O'daroy", "O'darppy", "O'darpsey", "O'darra", "O'darrell", "O'darroy", "O'darrrell", "O'darrroy", "O'darry", "O'darssey", "O'dartty", "O'darty", "O'dary", "O'dassey", "O'datty", "O'daty", "O'doydan", "O'doyddy", "O'doyer", "O'doyffy", "O'doygan", "O'doyggan", "O'doygh", "O'doyghan", "O'doyins", "O'doykry", "O'doylan", "O'doyle", "O'doyley", "O'doyliam", "O'doylly", "O'doyn", "O'doynin", "O'doyny", "O'doyppy", "O'doypsey", "O'doyra", "O'doyroy", "O'doyrrell", "O'doyrroy", "O'doyry", "O'doyssey", "O'doytty", "O'doyty", "O'dudan", "O'duddy", "O'duer", "O'duffy", "O'dugan", "O'duggan", "O'dugh", "O'dughan", "O'duins", "O'dukry", "O'dulan", "O'dule", "O'duley", "O'duliam", "O'dully", "O'dun", "O'dunin", "O'duny", "O'duppy", "O'dupsey", "O'dura", "O'duroy", "O'durrell", "O'durroy", "O'dury", "O'dussey", "O'dutty", "O'duty", "O'gadan", "O'gaddy", "O'gaer", "O'gaffy", "O'gagan", "O'gaggan", "O'gagh", "O'gaghan", "O'gains", "O'gakry", "O'galan", "O'gale", "O'galey", "O'galiam", "O'gally", "O'gan", "O'ganin", "O'gany", "O'gappy", "O'gapsey", "O'gara", "O'garoy", "O'garrell", "O'garroy", "O'gary", "O'gassey", "O'gatty", "O'gaty", "O'jordan", "O'jorddy", "O'jorer", "O'jorffy", "O'jorgan", "O'jorggan", "O'jorgh", "O'jorghan", "O'jorins", "O'jorkry", "O'jorlan", "O'jorle", "O'jorley", "O'jorliam", "O'jorlly", "O'jorn", "O'jornin", "O'jorny", "O'jorppy", "O'jorpsey", "O'jorra", "O'jorroy", "O'jorrrell", "O'jorrroy", "O'jorry", "O'jorssey", "O'jortty", "O'jorty", "O'keadan", "O'keaddy", "O'keaer", "O'keaffy", "O'keagan", "O'keaggan", "O'keagh", "O'keaghan", "O'keains", "O'keakry", "O'kealan", "O'keale", "O'kealey", "O'kealiam", "O'keally", "O'kean", "O'keanin", "O'keany", "O'keappy", "O'keapsey", "O'keara", "O'kearoy", "O'kearrell", "O'kearroy", "O'keary", "O'keassey", "O'keatty", "O'keaty", "O'keedan", "O'keeddy", "O'keeer", "O'keeffy", "O'keegan", "O'keeggan", "O'keegh", "O'keeghan", "O'keeins", "O'keekry", "O'keelan", "O'keele", "O'keeley", "O'keeliam", "O'keelly", "O'keen", "O'keenin", "O'keeny", "O'keeppy", "O'keepsey", "O'keera", "O'keeroy", "O'keerrell", "O'keerroy", "O'keery", "O'keessey", "O'keetty", "O'keety", "O'laudan", "O'lauddy", "O'lauer", "O'lauffy", "O'laugan", "O'lauggan", "O'laugh", "O'laughan", "O'lauins", "O'laukry", "O'laulan", "O'laule", "O'lauley", "O'lauliam", "O'laully", "O'laun", "O'launin", "O'launy", "O'lauppy", "O'laupsey", "O'laura", "O'lauroy", "O'laurrell", "O'laurroy", "O'laury", "O'laussey", "O'lautty", "O'lauty", "O'leadan", "O'leaddy", "O'leaer", "O'leaffy", "O'leagan", "O'leaggan", "O'leagh", "O'leaghan", "O'leains", "O'leakry", "O'lealan", "O'leale", "O'lealey", "O'lealiam", "O'leally", "O'lean", "O'leanin", "O'leany", "O'leappy", "O'leapsey", "O'leara", "O'learoy", "O'learrell", "O'learroy", "O'leary", "O'leassey", "O'leatty", "O'leaty", "O'ledan", "O'leddy", "O'leer", "O'leffy", "O'legan", "O'leggan", "O'legh", "O'leghan", "O'leidan", "O'leiddy", "O'leier", "O'leiffy", "O'leigan", "O'leiggan", "O'leigh", "O'leighan", "O'leiins", "O'leikry", "O'leilan", "O'leile", "O'leiley", "O'leiliam", "O'leilly", "O'lein", "O'leinin", "O'leins", "O'leiny", "O'leippy", "O'leipsey", "O'leira", "O'leiroy", "O'leirrell", "O'leirroy", "O'leiry", "O'leissey", "O'leitty", "O'leity", "O'lekry", "O'lelan", "O'lele", "O'leley", "O'leliam", "O'lelly", "O'len", "O'lenin", "O'leny", "O'leppy", "O'lepsey", "O'lera", "O'leroy", "O'lerrell", "O'lerroy", "O'lery", "O'lessey", "O'letty", "O'lety", "O'lodan", "O'loddy", "O'loer", "O'loffy", "O'logan", "O'loggan", "O'logh", "O'loghan", "O'loins", "O'lokry", "O'lolan", "O'lole", "O'loley", "O'loliam", "O'lolly", "O'lon", "O'lonin", "O'lony", "O'loppy", "O'lopsey", "O'lora", "O'loroy", "O'lorrell", "O'lorroy", "O'lory", "O'lossey", "O'lotty", "O'loty", "O'lyndan", "O'lynddy", "O'lyner", "O'lynffy", "O'lyngan", "O'lynggan", "O'lyngh", "O'lynghan", "O'lynins", "O'lynkry", "O'lynlan", "O'lynle", "O'lynley", "O'lynliam", "O'lynlly", "O'lynn", "O'lynnin", "O'lynny", "O'lynppy", "O'lynpsey", "O'lynra", "O'lynroy", "O'lynrrell", "O'lynrroy", "O'lynry", "O'lynssey", "O'lyntty", "O'lynty", "O'madan", "O'maddy", "O'maer", "O'maffy", "O'magan", "O'maggan", "O'magh", "O'maghan", "O'mains", "O'makry", "O'malan", "O'male", "O'maley", "O'maliam", "O'mally", "O'man", "O'manin", "O'many", "O'mappy", "O'mapsey", "O'mara", "O'maroy", "O'marrell", "O'marroy", "O'mary", "O'massey", "O'matty", "O'maty", "O'nadan", "O'naddy", "O'naer", "O'naffy", "O'nagan", "O'naggan", "O'nagh", "O'naghan", "O'nains", "O'nakry", "O'nalan", "O'nale", "O'naley", "O'naliam", "O'nally", "O'nan", "O'nanin", "O'nany", "O'nappy", "O'napsey", "O'nara", "O'naroy", "O'narrell", "O'narroy", "O'nary", "O'nassey", "O'natty", "O'naty", "O'nedan", "O'neddy", "O'neer", "O'neffy", "O'negan", "O'neggan", "O'negh", "O'neghan", "O'neins", "O'nekry", "O'nelan", "O'nele", "O'neley", "O'neliam", "O'nelly", "O'nen", "O'nenin", "O'neny", "O'neppy", "O'nepsey", "O'nera", "O'neroy", "O'nerrell", "O'nerroy", "O'nery", "O'nessey", "O'netty", "O'nety", "O'peadan", "O'peaddy", "O'peaer", "O'peaffy", "O'peagan", "O'peaggan", "O'peagh", "O'peaghan", "O'peains", "O'peakry", "O'pealan", "O'peale", "O'pealey", "O'pealiam", "O'peally", "O'pean", "O'peanin", "O'peany", "O'peappy", "O'peapsey", "O'peara", "O'pearoy", "O'pearrell", "O'pearroy", "O'peary", "O'peassey", "O'peatty", "O'peaty", "O'reidan", "O'reiddy", "O'reier", "O'reiffy", "O'reigan", "O'reiggan", "O'reigh", "O'reighan", "O'reiins", "O'reikry", "O'reilan", "O'reile", "O'reiley", "O'reiliam", "O'reilly", "O'rein", "O'reinin", "O'reiny", "O'reippy", "O'reipsey", "O'reira", "O'reiroy", "O'reirrell", "O'reirroy", "O'reiry", "O'reissey", "O'reitty", "O'reity", "O'ridan", "O'riddy", "O'rier", "O'riffy", "O'rigan", "O'riggan", "O'righ", "O'righan", "O'riins", "O'rikry", "O'rilan", "O'rile", "O'riley", "O'riliam", "O'rilly", "O'rin", "O'rinin", "O'riny", "O'ripdan", "O'ripddy", "O'riper", "O'ripffy", "O'ripgan", "O'ripggan", "O'ripgh", "O'ripghan", "O'ripins", "O'ripkry", "O'riplan", "O'riple", "O'ripley", "O'ripliam", "O'riplly", "O'ripn", "O'ripnin", "O'ripny", "O'ripppy", "O'rippsey", "O'rippy", "O'ripra", "O'riproy", "O'riprrell", "O'riprroy", "O'ripry", "O'ripsey", "O'ripssey", "O'riptty", "O'ripty", "O'rira", "O'riroy", "O'rirrell", "O'rirroy", "O'riry", "O'rissey", "O'ritty", "O'rity", "O'rodan", "O'roddy", "O'roer", "O'roffy", "O'rogan", "O'roggan", "O'rogh", "O'roghan", "O'roins", "O'rokry", "O'rolan", "O'role", "O'roley", "O'roliam", "O'rolly", "O'ron", "O'ronin", "O'rony", "O'roppy", "O'ropsey", "O'rora", "O'roroy", "O'rorrell", "O'rorroy", "O'rory", "O'rossey", "O'rotty", "O'roty", "O'sadan", "O'saddy", "O'saer", "O'saffy", "O'sagan", "O'saggan", "O'sagh", "O'saghan", "O'sains", "O'sakry", "O'salan", "O'sale", "O'saley", "O'saliam", "O'sally", "O'san", "O'sanin", "O'sany", "O'sappy", "O'sapsey", "O'sara", "O'saroy", "O'sarrell", "O'sarroy", "O'sary", "O'sassey", "O'satty", "O'saty", "O'shedan", "O'sheddy", "O'sheer", "O'sheffy", "O'shegan", "O'sheggan", "O'shegh", "O'sheghan", "O'sheins", "O'shekry", "O'shelan", "O'shele", "O'sheley", "O'sheliam", "O'shelly", "O'shen", "O'shenin", "O'sheny", "O'sheppy", "O'shepsey", "O'shera", "O'sheroy", "O'sherrell", "O'sherroy", "O'shery", "O'shessey", "O'shetty", "O'shety", "O'tedan", "O'teddy", "O'teer", "O'teffy", "O'tegan", "O'teggan", "O'tegh", "O'teghan", "O'teins", "O'tekry", "O'telan", "O'tele", "O'teley", "O'teliam", "O'telly", "O'ten", "O'tenin", "O'teny", "O'teppy", "O'tepsey", "O'tera", "O'teroy", "O'terrell", "O'terroy", "O'tery", "O'tessey", "O'tetty", "O'tety", "O'toodan", "O'tooddy", "O'tooer", "O'tooffy", "O'toogan", "O'tooggan", "O'toogh", "O'tooghan", "O'tooins", "O'tookry", "O'toolan", "O'toole", "O'tooley", "O'tooliam", "O'toolly", "O'toon", "O'toonin", "O'toony", "O'tooppy", "O'toopsey", "O'toora", "O'tooroy", "O'toorrell", "O'toorroy", "O'toory", "O'toossey", "O'tootty", "O'tooty", "O'widan", "O'widdy", "O'wier", "O'wiffy", "O'wigan", "O'wiggan", "O'wigh", "O'wighan", "O'wiins", "O'wikry", "O'wilan", "O'wile", "O'wiley", "O'wiliam", "O'willy", "O'win", "O'winin", "O'winy", "O'wippy", "O'wipsey", "O'wira", "O'wiroy", "O'wirrell", "O'wirroy", "O'wiry", "O'wissey", "O'witty", "O'wity", "O'ydan", "O'yddy", "O'yer", "O'yffy", "O'ygan", "O'yggan", "O'ygh", "O'yghan", "O'yins", "O'ykry", "O'ylan", "O'yle", "O'yley", "O'yliam", "O'ylly", "O'yn", "O'ynin", "O'yny", "O'yppy", "O'ypsey", "O'yra", "O'yroy", "O'yrrell", "O'yrroy", "O'yry", "O'yssey", "O'ytty", "O'yty", "Peadan", "Peaddy", "Peaer", "Peaffy", "Peagan", "Peaggan", "Peagh", "Peaghan", "Peains", "Peakry", "Pealan", "Peale", "Pealey", "Pealiam", "Peally", "Pean", "Peanin", "Peany", "Peappy", "Peapsey", "Peara", "Pearoy", "Pearrell", "Pearroy", "Peary", "Peassey", "Peatty", "Peaty", "Reidan", "Reiddy", "Reier", "Reiffy", "Reigan", "Reiggan", "Reigh", "Reighan", "Reiins", "Reikry", "Reilan", "Reile", "Reiley", "Reiliam", "Reilly", "Rein", "Reinin", "Reiny", "Reippy", "Reipsey", "Reira", "Reiroy", "Reirrell", "Reirroy", "Reiry", "Reissey", "Reitty", "Reity", "Ridan", "Riddy", "Rier", "Riffy", "Rigan", "Riggan", "Righ", "Righan", "Riins", "Rikry", "Rilan", "Rile", "Riley", "Riliam", "Rilly", "Rin", "Rinin", "Riny", "Ripdan", "Ripddy", "Riper", "Ripffy", "Ripgan", "Ripggan", "Ripgh", "Ripghan", "Ripins", "Ripkry", "Riplan", "Riple", "Ripley", "Ripliam", "Riplly", "Ripn", "Ripnin", "Ripny", "Ripppy", "Rippsey", "Rippy", "Ripra", "Riproy", "Riprrell", "Riprroy", "Ripry", "Ripsey", "Ripssey", "Riptty", "Ripty", "Rira", "Riroy", "Rirrell", "Rirroy", "Riry", "Rissey", "Ritty", "Rity", "Rodan", "Roddy", "Roer", "Roffy", "Rogan", "Roggan", "Rogh", "Roghan", "Roins", "Rokry", "Rolan", "Role", "Roley", "Roliam", "Rolly", "Ron", "Ronin", "Rony", "Roppy", "Ropsey", "Rora", "Roroy", "Rorrell", "Rorroy", "Rory", "Rossey", "Rotty", "Roty", "Sadan", "Saddy", "Saer", "Saffy", "Sagan", "Saggan", "Sagh", "Saghan", "Sains", "Sakry", "Salan", "Sale", "Saley", "Saliam", "Sally", "San", "Sanin", "Sany", "Sappy", "Sapsey", "Sara", "Saroy", "Sarrell", "Sarroy", "Sary", "Sassey", "Satty", "Saty", "Shedan", "Sheddy", "Sheer", "Sheffy", "Shegan", "Sheggan", "Shegh", "Sheghan", "Sheins", "Shekry", "Shelan", "Shele", "Sheley", "Sheliam", "Shelly", "Shen", "Shenin", "Sheny", "Sheppy", "Shepsey", "Shera", "Sheroy", "Sherrell", "Sherroy", "Shery", "Shessey", "Shetty", "Shety", "Tedan", "Teddy", "Teer", "Teffy", "Tegan", "Teggan", "Tegh", "Teghan", "Teins", "Tekry", "Telan", "Tele", "Teley", "Teliam", "Telly", "Ten", "Tenin", "Teny", "Teppy", "Tepsey", "Tera", "Teroy", "Terrell", "Terroy", "Tery", "Tessey", "Tetty", "Tety", "Toodan", "Tooddy", "Tooer", "Tooffy", "Toogan", "Tooggan", "Toogh", "Tooghan", "Tooins", "Tookry", "Toolan", "Toole", "Tooley", "Tooliam", "Toolly", "Toon", "Toonin", "Toony", "Tooppy", "Toopsey", "Toora", "Tooroy", "Toorrell", "Toorroy", "Toory", "Toossey", "Tootty", "Tooty", "Widan", "Widdy", "Wier", "Wiffy", "Wigan", "Wiggan", "Wigh", "Wighan", "Wiins", "Wikry", "Wilan", "Wile", "Wiley", "Wiliam", "Willy", "Win", "Winin", "Winy", "Wippy", "Wipsey", "Wira", "Wiroy", "Wirrell", "Wirroy", "Wiry", "Wissey", "Witty", "Wity", "Ydan", "Yddy", "Yer", "Yffy", "Ygan", "Yggan", "Ygh", "Yghan", "Yins", "Ykry", "Ylan", "Yle", "Yley", "Yliam", "Ylly", "Yn", "Ynin", "Yny", "Yppy", "Ypsey", "Yra", "Yroy", "Yrrell", "Yrroy", "Yry", "Yssey", "Ytty", "Yty"} \ No newline at end of file +trykerLastNames = {"Ardan", "Arddy", "Arer", "Arffy", "Argan", "Arggan", "Argh", "Arghan", "Arins", "Arkry", "Arlan", "Arle", "Arley", "Arliam", "Arlly", "Arn", "Arnin", "Arny", "Arppy", "Arpsey", "Arra", "Arroy", "Arrrell", "Arrroy", "Arry", "Arssey", "Artty", "Arty", "Ba'ardan", "Ba'arddy", "Ba'arer", "Ba'arffy", "Ba'argan", "Ba'arggan", "Ba'argh", "Ba'arghan", "Ba'arins", "Ba'arkry", "Ba'arlan", "Ba'arle", "Ba'arley", "Ba'arliam", "Ba'arlly", "Ba'arn", "Ba'arnin", "Ba'arny", "Ba'arppy", "Ba'arpsey", "Ba'arra", "Ba'arroy", "Ba'arrrell", "Ba'arrroy", "Ba'arry", "Ba'arssey", "Ba'artty", "Ba'arty", "Ba'bidan", "Ba'biddy", "Ba'bier", "Ba'biffy", "Ba'bigan", "Ba'biggan", "Ba'bigh", "Ba'bighan", "Ba'biins", "Ba'bikry", "Ba'bilan", "Ba'bile", "Ba'biley", "Ba'biliam", "Ba'billy", "Ba'bin", "Ba'binin", "Ba'biny", "Ba'bippy", "Ba'bipsey", "Ba'bira", "Ba'biroy", "Ba'birrell", "Ba'birroy", "Ba'biry", "Ba'bissey", "Ba'bitty", "Ba'bity", "Ba'caudan", "Ba'cauddy", "Ba'cauer", "Ba'cauffy", "Ba'caugan", "Ba'cauggan", "Ba'caugh", "Ba'caughan", "Ba'cauins", "Ba'caukry", "Ba'caulan", "Ba'caule", "Ba'cauley", "Ba'cauliam", "Ba'caully", "Ba'caun", "Ba'caunin", "Ba'cauny", "Ba'cauppy", "Ba'caupsey", "Ba'caura", "Ba'cauroy", "Ba'caurrell", "Ba'caurroy", "Ba'caury", "Ba'caussey", "Ba'cautty", "Ba'cauty", "Ba'dadan", "Ba'daddy", "Ba'daer", "Ba'daffy", "Ba'dagan", "Ba'daggan", "Ba'dagh", "Ba'daghan", "Ba'dains", "Ba'dakry", "Ba'dalan", "Ba'dale", "Ba'daley", "Ba'daliam", "Ba'dally", "Ba'dan", "Ba'danin", "Ba'dany", "Ba'dappy", "Ba'dapsey", "Ba'dara", "Ba'dardan", "Ba'darddy", "Ba'darer", "Ba'darffy", "Ba'dargan", "Ba'darggan", "Ba'dargh", "Ba'darghan", "Ba'darins", "Ba'darkry", "Ba'darlan", "Ba'darle", "Ba'darley", "Ba'darliam", "Ba'darlly", "Ba'darn", "Ba'darnin", "Ba'darny", "Ba'daroy", "Ba'darppy", "Ba'darpsey", "Ba'darra", "Ba'darrell", "Ba'darroy", "Ba'darrrell", "Ba'darrroy", "Ba'darry", "Ba'darssey", "Ba'dartty", "Ba'darty", "Ba'dary", "Ba'dassey", "Ba'datty", "Ba'daty", "Ba'doydan", "Ba'doyddy", "Ba'doyer", "Ba'doyffy", "Ba'doygan", "Ba'doyggan", "Ba'doygh", "Ba'doyghan", "Ba'doyins", "Ba'doykry", "Ba'doylan", "Ba'doyle", "Ba'doyley", "Ba'doyliam", "Ba'doylly", "Ba'doyn", "Ba'doynin", "Ba'doyny", "Ba'doyppy", "Ba'doypsey", "Ba'doyra", "Ba'doyroy", "Ba'doyrrell", "Ba'doyrroy", "Ba'doyry", "Ba'doyssey", "Ba'doytty", "Ba'doyty", "Ba'dudan", "Ba'duddy", "Ba'duer", "Ba'duffy", "Ba'dugan", "Ba'duggan", "Ba'dugh", "Ba'dughan", "Ba'duins", "Ba'dukry", "Ba'dulan", "Ba'dule", "Ba'duley", "Ba'duliam", "Ba'dully", "Ba'dun", "Ba'dunin", "Ba'duny", "Ba'duppy", "Ba'dupsey", "Ba'dura", "Ba'duroy", "Ba'durrell", "Ba'durroy", "Ba'dury", "Ba'dussey", "Ba'dutty", "Ba'duty", "Ba'gadan", "Ba'gaddy", "Ba'gaer", "Ba'gaffy", "Ba'gagan", "Ba'gaggan", "Ba'gagh", "Ba'gaghan", "Ba'gains", "Ba'gakry", "Ba'galan", "Ba'gale", "Ba'galey", "Ba'galiam", "Ba'gally", "Ba'gan", "Ba'ganin", "Ba'gany", "Ba'gappy", "Ba'gapsey", "Ba'gara", "Ba'garoy", "Ba'garrell", "Ba'garroy", "Ba'gary", "Ba'gassey", "Ba'gatty", "Ba'gaty", "Ba'jordan", "Ba'jorddy", "Ba'jorer", "Ba'jorffy", "Ba'jorgan", "Ba'jorggan", "Ba'jorgh", "Ba'jorghan", "Ba'jorins", "Ba'jorkry", "Ba'jorlan", "Ba'jorle", "Ba'jorley", "Ba'jorliam", "Ba'jorlly", "Ba'jorn", "Ba'jornin", "Ba'jorny", "Ba'jorppy", "Ba'jorpsey", "Ba'jorra", "Ba'jorroy", "Ba'jorrrell", "Ba'jorrroy", "Ba'jorry", "Ba'jorssey", "Ba'jortty", "Ba'jorty", "Ba'keadan", "Ba'keaddy", "Ba'keaer", "Ba'keaffy", "Ba'keagan", "Ba'keaggan", "Ba'keagh", "Ba'keaghan", "Ba'keains", "Ba'keakry", "Ba'kealan", "Ba'keale", "Ba'kealey", "Ba'kealiam", "Ba'keally", "Ba'kean", "Ba'keanin", "Ba'keany", "Ba'keappy", "Ba'keapsey", "Ba'keara", "Ba'kearoy", "Ba'kearrell", "Ba'kearroy", "Ba'keary", "Ba'keassey", "Ba'keatty", "Ba'keaty", "Ba'keedan", "Ba'keeddy", "Ba'keeer", "Ba'keeffy", "Ba'keegan", "Ba'keeggan", "Ba'keegh", "Ba'keeghan", "Ba'keeins", "Ba'keekry", "Ba'keelan", "Ba'keele", "Ba'keeley", "Ba'keeliam", "Ba'keelly", "Ba'keen", "Ba'keenin", "Ba'keeny", "Ba'keeppy", "Ba'keepsey", "Ba'keera", "Ba'keeroy", "Ba'keerrell", "Ba'keerroy", "Ba'keery", "Ba'keessey", "Ba'keetty", "Ba'keety", "Ba'laudan", "Ba'lauddy", "Ba'lauer", "Ba'lauffy", "Ba'laugan", "Ba'lauggan", "Ba'laugh", "Ba'laughan", "Ba'lauins", "Ba'laukry", "Ba'laulan", "Ba'laule", "Ba'lauley", "Ba'lauliam", "Ba'laully", "Ba'laun", "Ba'launin", "Ba'launy", "Ba'lauppy", "Ba'laupsey", "Ba'laura", "Ba'lauroy", "Ba'laurrell", "Ba'laurroy", "Ba'laury", "Ba'laussey", "Ba'lautty", "Ba'lauty", "Ba'leadan", "Ba'leaddy", "Ba'leaer", "Ba'leaffy", "Ba'leagan", "Ba'leaggan", "Ba'leagh", "Ba'leaghan", "Ba'leains", "Ba'leakry", "Ba'lealan", "Ba'leale", "Ba'lealey", "Ba'lealiam", "Ba'leally", "Ba'lean", "Ba'leanin", "Ba'leany", "Ba'leappy", "Ba'leapsey", "Ba'leara", "Ba'learoy", "Ba'learrell", "Ba'learroy", "Ba'leary", "Ba'leassey", "Ba'leatty", "Ba'leaty", "Ba'ledan", "Ba'leddy", "Ba'leer", "Ba'leffy", "Ba'legan", "Ba'leggan", "Ba'legh", "Ba'leghan", "Ba'leidan", "Ba'leiddy", "Ba'leier", "Ba'leiffy", "Ba'leigan", "Ba'leiggan", "Ba'leigh", "Ba'leighan", "Ba'leiins", "Ba'leikry", "Ba'leilan", "Ba'leile", "Ba'leiley", "Ba'leiliam", "Ba'leilly", "Ba'lein", "Ba'leinin", "Ba'leins", "Ba'leiny", "Ba'leippy", "Ba'leipsey", "Ba'leira", "Ba'leiroy", "Ba'leirrell", "Ba'leirroy", "Ba'leiry", "Ba'leissey", "Ba'leitty", "Ba'leity", "Ba'lekry", "Ba'lelan", "Ba'lele", "Ba'leley", "Ba'leliam", "Ba'lelly", "Ba'len", "Ba'lenin", "Ba'leny", "Ba'leppy", "Ba'lepsey", "Ba'lera", "Ba'leroy", "Ba'lerrell", "Ba'lerroy", "Ba'lery", "Ba'lessey", "Ba'letty", "Ba'lety", "Ba'lodan", "Ba'loddy", "Ba'loer", "Ba'loffy", "Ba'logan", "Ba'loggan", "Ba'logh", "Ba'loghan", "Ba'loins", "Ba'lokry", "Ba'lolan", "Ba'lole", "Ba'loley", "Ba'loliam", "Ba'lolly", "Ba'lon", "Ba'lonin", "Ba'lony", "Ba'loppy", "Ba'lopsey", "Ba'lora", "Ba'loroy", "Ba'lorrell", "Ba'lorroy", "Ba'lory", "Ba'lossey", "Ba'lotty", "Ba'loty", "Ba'lyndan", "Ba'lynddy", "Ba'lyner", "Ba'lynffy", "Ba'lyngan", "Ba'lynggan", "Ba'lyngh", "Ba'lynghan", "Ba'lynins", "Ba'lynkry", "Ba'lynlan", "Ba'lynle", "Ba'lynley", "Ba'lynliam", "Ba'lynlly", "Ba'lynn", "Ba'lynnin", "Ba'lynny", "Ba'lynppy", "Ba'lynpsey", "Ba'lynra", "Ba'lynroy", "Ba'lynrrell", "Ba'lynrroy", "Ba'lynry", "Ba'lynssey", "Ba'lyntty", "Ba'lynty", "Ba'madan", "Ba'maddy", "Ba'maer", "Ba'maffy", "Ba'magan", "Ba'maggan", "Ba'magh", "Ba'maghan", "Ba'mains", "Ba'makry", "Ba'malan", "Ba'male", "Ba'maley", "Ba'maliam", "Ba'mally", "Ba'man", "Ba'manin", "Ba'many", "Ba'mappy", "Ba'mapsey", "Ba'mara", "Ba'maroy", "Ba'marrell", "Ba'marroy", "Ba'mary", "Ba'massey", "Ba'matty", "Ba'maty", "Ba'nadan", "Ba'naddy", "Ba'naer", "Ba'naffy", "Ba'nagan", "Ba'naggan", "Ba'nagh", "Ba'naghan", "Ba'nains", "Ba'nakry", "Ba'nalan", "Ba'nale", "Ba'naley", "Ba'naliam", "Ba'nally", "Ba'nan", "Ba'nanin", "Ba'nany", "Ba'nappy", "Ba'napsey", "Ba'nara", "Ba'naroy", "Ba'narrell", "Ba'narroy", "Ba'nary", "Ba'nassey", "Ba'natty", "Ba'naty", "Ba'nedan", "Ba'neddy", "Ba'neer", "Ba'neffy", "Ba'negan", "Ba'neggan", "Ba'negh", "Ba'neghan", "Ba'neins", "Ba'nekry", "Ba'nelan", "Ba'nele", "Ba'neley", "Ba'neliam", "Ba'nelly", "Ba'nen", "Ba'nenin", "Ba'neny", "Ba'neppy", "Ba'nepsey", "Ba'nera", "Ba'neroy", "Ba'nerrell", "Ba'nerroy", "Ba'nery", "Ba'nessey", "Ba'netty", "Ba'nety", "Ba'peadan", "Ba'peaddy", "Ba'peaer", "Ba'peaffy", "Ba'peagan", "Ba'peaggan", "Ba'peagh", "Ba'peaghan", "Ba'peains", "Ba'peakry", "Ba'pealan", "Ba'peale", "Ba'pealey", "Ba'pealiam", "Ba'peally", "Ba'pean", "Ba'peanin", "Ba'peany", "Ba'peappy", "Ba'peapsey", "Ba'peara", "Ba'pearoy", "Ba'pearrell", "Ba'pearroy", "Ba'peary", "Ba'peassey", "Ba'peatty", "Ba'peaty", "Ba'reidan", "Ba'reiddy", "Ba'reier", "Ba'reiffy", "Ba'reigan", "Ba'reiggan", "Ba'reigh", "Ba'reighan", "Ba'reiins", "Ba'reikry", "Ba'reilan", "Ba'reile", "Ba'reiley", "Ba'reiliam", "Ba'reilly", "Ba'rein", "Ba'reinin", "Ba'reiny", "Ba'reippy", "Ba'reipsey", "Ba'reira", "Ba'reiroy", "Ba'reirrell", "Ba'reirroy", "Ba'reiry", "Ba'reissey", "Ba'reitty", "Ba'reity", "Ba'ridan", "Ba'riddy", "Ba'rier", "Ba'riffy", "Ba'rigan", "Ba'riggan", "Ba'righ", "Ba'righan", "Ba'riins", "Ba'rikry", "Ba'rilan", "Ba'rile", "Ba'riley", "Ba'riliam", "Ba'rilly", "Ba'rin", "Ba'rinin", "Ba'riny", "Ba'ripdan", "Ba'ripddy", "Ba'riper", "Ba'ripffy", "Ba'ripgan", "Ba'ripggan", "Ba'ripgh", "Ba'ripghan", "Ba'ripins", "Ba'ripkry", "Ba'riplan", "Ba'riple", "Ba'ripley", "Ba'ripliam", "Ba'riplly", "Ba'ripn", "Ba'ripnin", "Ba'ripny", "Ba'ripppy", "Ba'rippsey", "Ba'rippy", "Ba'ripra", "Ba'riproy", "Ba'riprrell", "Ba'riprroy", "Ba'ripry", "Ba'ripsey", "Ba'ripssey", "Ba'riptty", "Ba'ripty", "Ba'rira", "Ba'riroy", "Ba'rirrell", "Ba'rirroy", "Ba'riry", "Ba'rissey", "Ba'ritty", "Ba'rity", "Ba'rodan", "Ba'roddy", "Ba'roer", "Ba'roffy", "Ba'rogan", "Ba'roggan", "Ba'rogh", "Ba'roghan", "Ba'roins", "Ba'rokry", "Ba'rolan", "Ba'role", "Ba'roley", "Ba'roliam", "Ba'rolly", "Ba'ron", "Ba'ronin", "Ba'rony", "Ba'roppy", "Ba'ropsey", "Ba'rora", "Ba'roroy", "Ba'rorrell", "Ba'rorroy", "Ba'rory", "Ba'rossey", "Ba'rotty", "Ba'roty", "Ba'sadan", "Ba'saddy", "Ba'saer", "Ba'saffy", "Ba'sagan", "Ba'saggan", "Ba'sagh", "Ba'saghan", "Ba'sains", "Ba'sakry", "Ba'salan", "Ba'sale", "Ba'saley", "Ba'saliam", "Ba'sally", "Ba'san", "Ba'sanin", "Ba'sany", "Ba'sappy", "Ba'sapsey", "Ba'sara", "Ba'saroy", "Ba'sarrell", "Ba'sarroy", "Ba'sary", "Ba'sassey", "Ba'satty", "Ba'saty", "Ba'shedan", "Ba'sheddy", "Ba'sheer", "Ba'sheffy", "Ba'shegan", "Ba'sheggan", "Ba'shegh", "Ba'sheghan", "Ba'sheins", "Ba'shekry", "Ba'shelan", "Ba'shele", "Ba'sheley", "Ba'sheliam", "Ba'shelly", "Ba'shen", "Ba'shenin", "Ba'sheny", "Ba'sheppy", "Ba'shepsey", "Ba'shera", "Ba'sheroy", "Ba'sherrell", "Ba'sherroy", "Ba'shery", "Ba'shessey", "Ba'shetty", "Ba'shety", "Ba'tedan", "Ba'teddy", "Ba'teer", "Ba'teffy", "Ba'tegan", "Ba'teggan", "Ba'tegh", "Ba'teghan", "Ba'teins", "Ba'tekry", "Ba'telan", "Ba'tele", "Ba'teley", "Ba'teliam", "Ba'telly", "Ba'ten", "Ba'tenin", "Ba'teny", "Ba'teppy", "Ba'tepsey", "Ba'tera", "Ba'teroy", "Ba'terrell", "Ba'terroy", "Ba'tery", "Ba'tessey", "Ba'tetty", "Ba'tety", "Ba'toodan", "Ba'tooddy", "Ba'tooer", "Ba'tooffy", "Ba'toogan", "Ba'tooggan", "Ba'toogh", "Ba'tooghan", "Ba'tooins", "Ba'tookry", "Ba'toolan", "Ba'toole", "Ba'tooley", "Ba'tooliam", "Ba'toolly", "Ba'toon", "Ba'toonin", "Ba'toony", "Ba'tooppy", "Ba'toopsey", "Ba'toora", "Ba'tooroy", "Ba'toorrell", "Ba'toorroy", "Ba'toory", "Ba'toossey", "Ba'tootty", "Ba'tooty", "Ba'widan", "Ba'widdy", "Ba'wier", "Ba'wiffy", "Ba'wigan", "Ba'wiggan", "Ba'wigh", "Ba'wighan", "Ba'wiins", "Ba'wikry", "Ba'wilan", "Ba'wile", "Ba'wiley", "Ba'wiliam", "Ba'willy", "Ba'win", "Ba'winin", "Ba'winy", "Ba'wippy", "Ba'wipsey", "Ba'wira", "Ba'wiroy", "Ba'wirrell", "Ba'wirroy", "Ba'wiry", "Ba'wissey", "Ba'witty", "Ba'wity", "Ba'ydan", "Ba'yddy", "Ba'yer", "Ba'yffy", "Ba'ygan", "Ba'yggan", "Ba'ygh", "Ba'yghan", "Ba'yins", "Ba'ykry", "Ba'ylan", "Ba'yle", "Ba'yley", "Ba'yliam", "Ba'ylly", "Ba'yn", "Ba'ynin", "Ba'yny", "Ba'yppy", "Ba'ypsey", "Ba'yra", "Ba'yroy", "Ba'yrrell", "Ba'yrroy", "Ba'yry", "Ba'yssey", "Ba'ytty", "Ba'yty", "Be'ardan", "Be'arddy", "Be'arer", "Be'arffy", "Be'argan", "Be'arggan", "Be'argh", "Be'arghan", "Be'arins", "Be'arkry", "Be'arlan", "Be'arle", "Be'arley", "Be'arliam", "Be'arlly", "Be'arn", "Be'arnin", "Be'arny", "Be'arppy", "Be'arpsey", "Be'arra", "Be'arroy", "Be'arrrell", "Be'arrroy", "Be'arry", "Be'arssey", "Be'artty", "Be'arty", "Be'bidan", "Be'biddy", "Be'bier", "Be'biffy", "Be'bigan", "Be'biggan", "Be'bigh", "Be'bighan", "Be'biins", "Be'bikry", "Be'bilan", "Be'bile", "Be'biley", "Be'biliam", "Be'billy", "Be'bin", "Be'binin", "Be'biny", "Be'bippy", "Be'bipsey", "Be'bira", "Be'biroy", "Be'birrell", "Be'birroy", "Be'biry", "Be'bissey", "Be'bitty", "Be'bity", "Be'caudan", "Be'cauddy", "Be'cauer", "Be'cauffy", "Be'caugan", "Be'cauggan", "Be'caugh", "Be'caughan", "Be'cauins", "Be'caukry", "Be'caulan", "Be'caule", "Be'cauley", "Be'cauliam", "Be'caully", "Be'caun", "Be'caunin", "Be'cauny", "Be'cauppy", "Be'caupsey", "Be'caura", "Be'cauroy", "Be'caurrell", "Be'caurroy", "Be'caury", "Be'caussey", "Be'cautty", "Be'cauty", "Be'dadan", "Be'daddy", "Be'daer", "Be'daffy", "Be'dagan", "Be'daggan", "Be'dagh", "Be'daghan", "Be'dains", "Be'dakry", "Be'dalan", "Be'dale", "Be'daley", "Be'daliam", "Be'dally", "Be'dan", "Be'danin", "Be'dany", "Be'dappy", "Be'dapsey", "Be'dara", "Be'dardan", "Be'darddy", "Be'darer", "Be'darffy", "Be'dargan", "Be'darggan", "Be'dargh", "Be'darghan", "Be'darins", "Be'darkry", "Be'darlan", "Be'darle", "Be'darley", "Be'darliam", "Be'darlly", "Be'darn", "Be'darnin", "Be'darny", "Be'daroy", "Be'darppy", "Be'darpsey", "Be'darra", "Be'darrell", "Be'darroy", "Be'darrrell", "Be'darrroy", "Be'darry", "Be'darssey", "Be'dartty", "Be'darty", "Be'dary", "Be'dassey", "Be'datty", "Be'daty", "Be'doydan", "Be'doyddy", "Be'doyer", "Be'doyffy", "Be'doygan", "Be'doyggan", "Be'doygh", "Be'doyghan", "Be'doyins", "Be'doykry", "Be'doylan", "Be'doyle", "Be'doyley", "Be'doyliam", "Be'doylly", "Be'doyn", "Be'doynin", "Be'doyny", "Be'doyppy", "Be'doypsey", "Be'doyra", "Be'doyroy", "Be'doyrrell", "Be'doyrroy", "Be'doyry", "Be'doyssey", "Be'doytty", "Be'doyty", "Be'dudan", "Be'duddy", "Be'duer", "Be'duffy", "Be'dugan", "Be'duggan", "Be'dugh", "Be'dughan", "Be'duins", "Be'dukry", "Be'dulan", "Be'dule", "Be'duley", "Be'duliam", "Be'dully", "Be'dun", "Be'dunin", "Be'duny", "Be'duppy", "Be'dupsey", "Be'dura", "Be'duroy", "Be'durrell", "Be'durroy", "Be'dury", "Be'dussey", "Be'dutty", "Be'duty", "Be'gadan", "Be'gaddy", "Be'gaer", "Be'gaffy", "Be'gagan", "Be'gaggan", "Be'gagh", "Be'gaghan", "Be'gains", "Be'gakry", "Be'galan", "Be'gale", "Be'galey", "Be'galiam", "Be'gally", "Be'gan", "Be'ganin", "Be'gany", "Be'gappy", "Be'gapsey", "Be'gara", "Be'garoy", "Be'garrell", "Be'garroy", "Be'gary", "Be'gassey", "Be'gatty", "Be'gaty", "Be'jordan", "Be'jorddy", "Be'jorer", "Be'jorffy", "Be'jorgan", "Be'jorggan", "Be'jorgh", "Be'jorghan", "Be'jorins", "Be'jorkry", "Be'jorlan", "Be'jorle", "Be'jorley", "Be'jorliam", "Be'jorlly", "Be'jorn", "Be'jornin", "Be'jorny", "Be'jorppy", "Be'jorpsey", "Be'jorra", "Be'jorroy", "Be'jorrrell", "Be'jorrroy", "Be'jorry", "Be'jorssey", "Be'jortty", "Be'jorty", "Be'keadan", "Be'keaddy", "Be'keaer", "Be'keaffy", "Be'keagan", "Be'keaggan", "Be'keagh", "Be'keaghan", "Be'keains", "Be'keakry", "Be'kealan", "Be'keale", "Be'kealey", "Be'kealiam", "Be'keally", "Be'kean", "Be'keanin", "Be'keany", "Be'keappy", "Be'keapsey", "Be'keara", "Be'kearoy", "Be'kearrell", "Be'kearroy", "Be'keary", "Be'keassey", "Be'keatty", "Be'keaty", "Be'keedan", "Be'keeddy", "Be'keeer", "Be'keeffy", "Be'keegan", "Be'keeggan", "Be'keegh", "Be'keeghan", "Be'keeins", "Be'keekry", "Be'keelan", "Be'keele", "Be'keeley", "Be'keeliam", "Be'keelly", "Be'keen", "Be'keenin", "Be'keeny", "Be'keeppy", "Be'keepsey", "Be'keera", "Be'keeroy", "Be'keerrell", "Be'keerroy", "Be'keery", "Be'keessey", "Be'keetty", "Be'keety", "Be'laudan", "Be'lauddy", "Be'lauer", "Be'lauffy", "Be'laugan", "Be'lauggan", "Be'laugh", "Be'laughan", "Be'lauins", "Be'laukry", "Be'laulan", "Be'laule", "Be'lauley", "Be'lauliam", "Be'laully", "Be'laun", "Be'launin", "Be'launy", "Be'lauppy", "Be'laupsey", "Be'laura", "Be'lauroy", "Be'laurrell", "Be'laurroy", "Be'laury", "Be'laussey", "Be'lautty", "Be'lauty", "Be'leadan", "Be'leaddy", "Be'leaer", "Be'leaffy", "Be'leagan", "Be'leaggan", "Be'leagh", "Be'leaghan", "Be'leains", "Be'leakry", "Be'lealan", "Be'leale", "Be'lealey", "Be'lealiam", "Be'leally", "Be'lean", "Be'leanin", "Be'leany", "Be'leappy", "Be'leapsey", "Be'leara", "Be'learoy", "Be'learrell", "Be'learroy", "Be'leary", "Be'leassey", "Be'leatty", "Be'leaty", "Be'ledan", "Be'leddy", "Be'leer", "Be'leffy", "Be'legan", "Be'leggan", "Be'legh", "Be'leghan", "Be'leidan", "Be'leiddy", "Be'leier", "Be'leiffy", "Be'leigan", "Be'leiggan", "Be'leigh", "Be'leighan", "Be'leiins", "Be'leikry", "Be'leilan", "Be'leile", "Be'leiley", "Be'leiliam", "Be'leilly", "Be'lein", "Be'leinin", "Be'leins", "Be'leiny", "Be'leippy", "Be'leipsey", "Be'leira", "Be'leiroy", "Be'leirrell", "Be'leirroy", "Be'leiry", "Be'leissey", "Be'leitty", "Be'leity", "Be'lekry", "Be'lelan", "Be'lele", "Be'leley", "Be'leliam", "Be'lelly", "Be'len", "Be'lenin", "Be'leny", "Be'leppy", "Be'lepsey", "Be'lera", "Be'leroy", "Be'lerrell", "Be'lerroy", "Be'lery", "Be'lessey", "Be'letty", "Be'lety", "Be'lodan", "Be'loddy", "Be'loer", "Be'loffy", "Be'logan", "Be'loggan", "Be'logh", "Be'loghan", "Be'loins", "Be'lokry", "Be'lolan", "Be'lole", "Be'loley", "Be'loliam", "Be'lolly", "Be'lon", "Be'lonin", "Be'lony", "Be'loppy", "Be'lopsey", "Be'lora", "Be'loroy", "Be'lorrell", "Be'lorroy", "Be'lory", "Be'lossey", "Be'lotty", "Be'loty", "Be'lyndan", "Be'lynddy", "Be'lyner", "Be'lynffy", "Be'lyngan", "Be'lynggan", "Be'lyngh", "Be'lynghan", "Be'lynins", "Be'lynkry", "Be'lynlan", "Be'lynle", "Be'lynley", "Be'lynliam", "Be'lynlly", "Be'lynn", "Be'lynnin", "Be'lynny", "Be'lynppy", "Be'lynpsey", "Be'lynra", "Be'lynroy", "Be'lynrrell", "Be'lynrroy", "Be'lynry", "Be'lynssey", "Be'lyntty", "Be'lynty", "Be'madan", "Be'maddy", "Be'maer", "Be'maffy", "Be'magan", "Be'maggan", "Be'magh", "Be'maghan", "Be'mains", "Be'makry", "Be'malan", "Be'male", "Be'maley", "Be'maliam", "Be'mally", "Be'man", "Be'manin", "Be'many", "Be'mappy", "Be'mapsey", "Be'mara", "Be'maroy", "Be'marrell", "Be'marroy", "Be'mary", "Be'massey", "Be'matty", "Be'maty", "Be'nadan", "Be'naddy", "Be'naer", "Be'naffy", "Be'nagan", "Be'naggan", "Be'nagh", "Be'naghan", "Be'nains", "Be'nakry", "Be'nalan", "Be'nale", "Be'naley", "Be'naliam", "Be'nally", "Be'nan", "Be'nanin", "Be'nany", "Be'nappy", "Be'napsey", "Be'nara", "Be'naroy", "Be'narrell", "Be'narroy", "Be'nary", "Be'nassey", "Be'natty", "Be'naty", "Be'nedan", "Be'neddy", "Be'neer", "Be'neffy", "Be'negan", "Be'neggan", "Be'negh", "Be'neghan", "Be'neins", "Be'nekry", "Be'nelan", "Be'nele", "Be'neley", "Be'neliam", "Be'nelly", "Be'nen", "Be'nenin", "Be'neny", "Be'neppy", "Be'nepsey", "Be'nera", "Be'neroy", "Be'nerrell", "Be'nerroy", "Be'nery", "Be'nessey", "Be'netty", "Be'nety", "Be'peadan", "Be'peaddy", "Be'peaer", "Be'peaffy", "Be'peagan", "Be'peaggan", "Be'peagh", "Be'peaghan", "Be'peains", "Be'peakry", "Be'pealan", "Be'peale", "Be'pealey", "Be'pealiam", "Be'peally", "Be'pean", "Be'peanin", "Be'peany", "Be'peappy", "Be'peapsey", "Be'peara", "Be'pearoy", "Be'pearrell", "Be'pearroy", "Be'peary", "Be'peassey", "Be'peatty", "Be'peaty", "Be'reidan", "Be'reiddy", "Be'reier", "Be'reiffy", "Be'reigan", "Be'reiggan", "Be'reigh", "Be'reighan", "Be'reiins", "Be'reikry", "Be'reilan", "Be'reile", "Be'reiley", "Be'reiliam", "Be'reilly", "Be'rein", "Be'reinin", "Be'reiny", "Be'reippy", "Be'reipsey", "Be'reira", "Be'reiroy", "Be'reirrell", "Be'reirroy", "Be'reiry", "Be'reissey", "Be'reitty", "Be'reity", "Be'ridan", "Be'riddy", "Be'rier", "Be'riffy", "Be'rigan", "Be'riggan", "Be'righ", "Be'righan", "Be'riins", "Be'rikry", "Be'rilan", "Be'rile", "Be'riley", "Be'riliam", "Be'rilly", "Be'rin", "Be'rinin", "Be'riny", "Be'ripdan", "Be'ripddy", "Be'riper", "Be'ripffy", "Be'ripgan", "Be'ripggan", "Be'ripgh", "Be'ripghan", "Be'ripins", "Be'ripkry", "Be'riplan", "Be'riple", "Be'ripley", "Be'ripliam", "Be'riplly", "Be'ripn", "Be'ripnin", "Be'ripny", "Be'ripppy", "Be'rippsey", "Be'rippy", "Be'ripra", "Be'riproy", "Be'riprrell", "Be'riprroy", "Be'ripry", "Be'ripsey", "Be'ripssey", "Be'riptty", "Be'ripty", "Be'rira", "Be'riroy", "Be'rirrell", "Be'rirroy", "Be'riry", "Be'rissey", "Be'ritty", "Be'rity", "Be'rodan", "Be'roddy", "Be'roer", "Be'roffy", "Be'rogan", "Be'roggan", "Be'rogh", "Be'roghan", "Be'roins", "Be'rokry", "Be'rolan", "Be'role", "Be'roley", "Be'roliam", "Be'rolly", "Be'ron", "Be'ronin", "Be'rony", "Be'roppy", "Be'ropsey", "Be'rora", "Be'roroy", "Be'rorrell", "Be'rorroy", "Be'rory", "Be'rossey", "Be'rotty", "Be'roty", "Be'sadan", "Be'saddy", "Be'saer", "Be'saffy", "Be'sagan", "Be'saggan", "Be'sagh", "Be'saghan", "Be'sains", "Be'sakry", "Be'salan", "Be'sale", "Be'saley", "Be'saliam", "Be'sally", "Be'san", "Be'sanin", "Be'sany", "Be'sappy", "Be'sapsey", "Be'sara", "Be'saroy", "Be'sarrell", "Be'sarroy", "Be'sary", "Be'sassey", "Be'satty", "Be'saty", "Be'shedan", "Be'sheddy", "Be'sheer", "Be'sheffy", "Be'shegan", "Be'sheggan", "Be'shegh", "Be'sheghan", "Be'sheins", "Be'shekry", "Be'shelan", "Be'shele", "Be'sheley", "Be'sheliam", "Be'shelly", "Be'shen", "Be'shenin", "Be'sheny", "Be'sheppy", "Be'shepsey", "Be'shera", "Be'sheroy", "Be'sherrell", "Be'sherroy", "Be'shery", "Be'shessey", "Be'shetty", "Be'shety", "Be'tedan", "Be'teddy", "Be'teer", "Be'teffy", "Be'tegan", "Be'teggan", "Be'tegh", "Be'teghan", "Be'teins", "Be'tekry", "Be'telan", "Be'tele", "Be'teley", "Be'teliam", "Be'telly", "Be'ten", "Be'tenin", "Be'teny", "Be'teppy", "Be'tepsey", "Be'tera", "Be'teroy", "Be'terrell", "Be'terroy", "Be'tery", "Be'tessey", "Be'tetty", "Be'tety", "Be'toodan", "Be'tooddy", "Be'tooer", "Be'tooffy", "Be'toogan", "Be'tooggan", "Be'toogh", "Be'tooghan", "Be'tooins", "Be'tookry", "Be'toolan", "Be'toole", "Be'tooley", "Be'tooliam", "Be'toolly", "Be'toon", "Be'toonin", "Be'toony", "Be'tooppy", "Be'toopsey", "Be'toora", "Be'tooroy", "Be'toorrell", "Be'toorroy", "Be'toory", "Be'toossey", "Be'tootty", "Be'tooty", "Be'widan", "Be'widdy", "Be'wier", "Be'wiffy", "Be'wigan", "Be'wiggan", "Be'wigh", "Be'wighan", "Be'wiins", "Be'wikry", "Be'wilan", "Be'wile", "Be'wiley", "Be'wiliam", "Be'willy", "Be'win", "Be'winin", "Be'winy", "Be'wippy", "Be'wipsey", "Be'wira", "Be'wiroy", "Be'wirrell", "Be'wirroy", "Be'wiry", "Be'wissey", "Be'witty", "Be'wity", "Be'ydan", "Be'yddy", "Be'yer", "Be'yffy", "Be'ygan", "Be'yggan", "Be'ygh", "Be'yghan", "Be'yins", "Be'ykry", "Be'ylan", "Be'yle", "Be'yley", "Be'yliam", "Be'ylly", "Be'yn", "Be'ynin", "Be'yny", "Be'yppy", "Be'ypsey", "Be'yra", "Be'yroy", "Be'yrrell", "Be'yrroy", "Be'yry", "Be'yssey", "Be'ytty", "Be'yty", "Bidan", "Biddy", "Bier", "Biffy", "Bigan", "Biggan", "Bigh", "Bighan", "Biins", "Bikry", "Bilan", "Bile", "Biley", "Biliam", "Billy", "Bin", "Binin", "Biny", "Bippy", "Bipsey", "Bira", "Biroy", "Birrell", "Birroy", "Biry", "Bissey", "Bitty", "Bity", "Caudan", "Cauddy", "Cauer", "Cauffy", "Caugan", "Cauggan", "Caugh", "Caughan", "Cauins", "Caukry", "Caulan", "Caule", "Cauley", "Cauliam", "Caully", "Caun", "Caunin", "Cauny", "Cauppy", "Caupsey", "Caura", "Cauroy", "Caurrell", "Caurroy", "Caury", "Caussey", "Cautty", "Cauty", "Dadan", "Daddy", "Daer", "Daffy", "Dagan", "Daggan", "Dagh", "Daghan", "Dains", "Dakry", "Dalan", "Dale", "Daley", "Daliam", "Dally", "Dan", "Danin", "Dany", "Dappy", "Dapsey", "Dara", "Dardan", "Darddy", "Darer", "Darffy", "Dargan", "Darggan", "Dargh", "Darghan", "Darins", "Darkry", "Darlan", "Darle", "Darley", "Darliam", "Darlly", "Darn", "Darnin", "Darny", "Daroy", "Darppy", "Darpsey", "Darra", "Darrell", "Darroy", "Darrrell", "Darrroy", "Darry", "Darssey", "Dartty", "Darty", "Dary", "Dassey", "Datty", "Daty", "Doydan", "Doyddy", "Doyer", "Doyffy", "Doygan", "Doyggan", "Doygh", "Doyghan", "Doyins", "Doykry", "Doylan", "Doyle", "Doyley", "Doyliam", "Doylly", "Doyn", "Doynin", "Doyny", "Doyppy", "Doypsey", "Doyra", "Doyroy", "Doyrrell", "Doyrroy", "Doyry", "Doyssey", "Doytty", "Doyty", "Dudan", "Duddy", "Duer", "Duffy", "Dugan", "Duggan", "Dugh", "Dughan", "Duins", "Dukry", "Dulan", "Dule", "Duley", "Duliam", "Dully", "Dun", "Dunin", "Duny", "Duppy", "Dupsey", "Dura", "Duroy", "Durrell", "Durroy", "Dury", "Dussey", "Dutty", "Duty", "Gadan", "Gaddy", "Gaer", "Gaffy", "Gagan", "Gaggan", "Gagh", "Gaghan", "Gains", "Gakry", "Galan", "Gale", "Galey", "Galiam", "Gally", "Gan", "Ganin", "Gany", "Gappy", "Gapsey", "Gara", "Garoy", "Garrell", "Garroy", "Gary", "Gassey", "Gatty", "Gaty", "Jordan", "Jorddy", "Jorer", "Jorffy", "Jorgan", "Jorggan", "Jorgh", "Jorghan", "Jorins", "Jorkry", "Jorlan", "Jorle", "Jorley", "Jorliam", "Jorlly", "Jorn", "Jornin", "Jorny", "Jorppy", "Jorpsey", "Jorra", "Jorroy", "Jorrrell", "Jorrroy", "Jorry", "Jorssey", "Jortty", "Jorty", "Keadan", "Keaddy", "Keaer", "Keaffy", "Keagan", "Keaggan", "Keagh", "Keaghan", "Keains", "Keakry", "Kealan", "Keale", "Kealey", "Kealiam", "Keally", "Kean", "Keanin", "Keany", "Keappy", "Keapsey", "Keara", "Kearoy", "Kearrell", "Kearroy", "Keary", "Keassey", "Keatty", "Keaty", "Keedan", "Keeddy", "Keeer", "Keeffy", "Keegan", "Keeggan", "Keegh", "Keeghan", "Keeins", "Keekry", "Keelan", "Keele", "Keeley", "Keeliam", "Keelly", "Keen", "Keenin", "Keeny", "Keeppy", "Keepsey", "Keera", "Keeroy", "Keerrell", "Keerroy", "Keery", "Keessey", "Keetty", "Keety", "Laudan", "Lauddy", "Lauer", "Lauffy", "Laugan", "Lauggan", "Laugh", "Laughan", "Lauins", "Laukry", "Laulan", "Laule", "Lauley", "Lauliam", "Laully", "Laun", "Launin", "Launy", "Lauppy", "Laupsey", "Laura", "Lauroy", "Laurrell", "Laurroy", "Laury", "Laussey", "Lautty", "Lauty", "Leadan", "Leaddy", "Leaer", "Leaffy", "Leagan", "Leaggan", "Leagh", "Leaghan", "Leains", "Leakry", "Lealan", "Leale", "Lealey", "Lealiam", "Leally", "Lean", "Leanin", "Leany", "Leappy", "Leapsey", "Leara", "Learoy", "Learrell", "Learroy", "Leary", "Leassey", "Leatty", "Leaty", "Ledan", "Leddy", "Leer", "Leffy", "Legan", "Leggan", "Legh", "Leghan", "Leidan", "Leiddy", "Leier", "Leiffy", "Leigan", "Leiggan", "Leigh", "Leighan", "Leiins", "Leikry", "Leilan", "Leile", "Leiley", "Leiliam", "Leilly", "Lein", "Leinin", "Leins", "Leiny", "Leippy", "Leipsey", "Leira", "Leiroy", "Leirrell", "Leirroy", "Leiry", "Leissey", "Leitty", "Leity", "Lekry", "Lelan", "Lele", "Leley", "Leliam", "Lelly", "Len", "Lenin", "Leny", "Leppy", "Lepsey", "Lera", "Leroy", "Lerrell", "Lerroy", "Lery", "Lessey", "Letty", "Lety", "Lodan", "Loddy", "Loer", "Loffy", "Logan", "Loggan", "Logh", "Loghan", "Loins", "Lokry", "Lolan", "Lole", "Loley", "Loliam", "Lolly", "Lon", "Lonin", "Lony", "Loppy", "Lopsey", "Lora", "Loroy", "Lorrell", "Lorroy", "Lory", "Lossey", "Lotty", "Loty", "Lyndan", "Lynddy", "Lyner", "Lynffy", "Lyngan", "Lynggan", "Lyngh", "Lynghan", "Lynins", "Lynkry", "Lynlan", "Lynle", "Lynley", "Lynliam", "Lynlly", "Lynn", "Lynnin", "Lynny", "Lynppy", "Lynpsey", "Lynra", "Lynroy", "Lynrrell", "Lynrroy", "Lynry", "Lynssey", "Lyntty", "Lynty", "Mac'ardan", "Mac'arddy", "Mac'arer", "Mac'arffy", "Mac'argan", "Mac'arggan", "Mac'argh", "Mac'arghan", "Mac'arins", "Mac'arkry", "Mac'arlan", "Mac'arle", "Mac'arley", "Mac'arliam", "Mac'arlly", "Mac'arn", "Mac'arnin", "Mac'arny", "Mac'arppy", "Mac'arpsey", "Mac'arra", "Mac'arroy", "Mac'arrrell", "Mac'arrroy", "Mac'arry", "Mac'arssey", "Mac'artty", "Mac'arty", "Mac'bidan", "Mac'biddy", "Mac'bier", "Mac'biffy", "Mac'bigan", "Mac'biggan", "Mac'bigh", "Mac'bighan", "Mac'biins", "Mac'bikry", "Mac'bilan", "Mac'bile", "Mac'biley", "Mac'biliam", "Mac'billy", "Mac'bin", "Mac'binin", "Mac'biny", "Mac'bippy", "Mac'bipsey", "Mac'bira", "Mac'biroy", "Mac'birrell", "Mac'birroy", "Mac'biry", "Mac'bissey", "Mac'bitty", "Mac'bity", "Mac'caudan", "Mac'cauddy", "Mac'cauer", "Mac'cauffy", "Mac'caugan", "Mac'cauggan", "Mac'caugh", "Mac'caughan", "Mac'cauins", "Mac'caukry", "Mac'caulan", "Mac'caule", "Mac'cauley", "Mac'cauliam", "Mac'caully", "Mac'caun", "Mac'caunin", "Mac'cauny", "Mac'cauppy", "Mac'caupsey", "Mac'caura", "Mac'cauroy", "Mac'caurrell", "Mac'caurroy", "Mac'caury", "Mac'caussey", "Mac'cautty", "Mac'cauty", "Mac'dadan", "Mac'daddy", "Mac'daer", "Mac'daffy", "Mac'dagan", "Mac'daggan", "Mac'dagh", "Mac'daghan", "Mac'dains", "Mac'dakry", "Mac'dalan", "Mac'dale", "Mac'daley", "Mac'daliam", "Mac'dally", "Mac'dan", "Mac'danin", "Mac'dany", "Mac'dappy", "Mac'dapsey", "Mac'dara", "Mac'dardan", "Mac'darddy", "Mac'darer", "Mac'darffy", "Mac'dargan", "Mac'darggan", "Mac'dargh", "Mac'darghan", "Mac'darins", "Mac'darkry", "Mac'darlan", "Mac'darle", "Mac'darley", "Mac'darliam", "Mac'darlly", "Mac'darn", "Mac'darnin", "Mac'darny", "Mac'daroy", "Mac'darppy", "Mac'darpsey", "Mac'darra", "Mac'darrell", "Mac'darroy", "Mac'darrrell", "Mac'darrroy", "Mac'darry", "Mac'darssey", "Mac'dartty", "Mac'darty", "Mac'dary", "Mac'dassey", "Mac'datty", "Mac'daty", "Mac'doydan", "Mac'doyddy", "Mac'doyer", "Mac'doyffy", "Mac'doygan", "Mac'doyggan", "Mac'doygh", "Mac'doyghan", "Mac'doyins", "Mac'doykry", "Mac'doylan", "Mac'doyle", "Mac'doyley", "Mac'doyliam", "Mac'doylly", "Mac'doyn", "Mac'doynin", "Mac'doyny", "Mac'doyppy", "Mac'doypsey", "Mac'doyra", "Mac'doyroy", "Mac'doyrrell", "Mac'doyrroy", "Mac'doyry", "Mac'doyssey", "Mac'doytty", "Mac'doyty", "Mac'dudan", "Mac'duddy", "Mac'duer", "Mac'duffy", "Mac'dugan", "Mac'duggan", "Mac'dugh", "Mac'dughan", "Mac'duins", "Mac'dukry", "Mac'dulan", "Mac'dule", "Mac'duley", "Mac'duliam", "Mac'dully", "Mac'dun", "Mac'dunin", "Mac'duny", "Mac'duppy", "Mac'dupsey", "Mac'dura", "Mac'duroy", "Mac'durrell", "Mac'durroy", "Mac'dury", "Mac'dussey", "Mac'dutty", "Mac'duty", "Mac'gadan", "Mac'gaddy", "Mac'gaer", "Mac'gaffy", "Mac'gagan", "Mac'gaggan", "Mac'gagh", "Mac'gaghan", "Mac'gains", "Mac'gakry", "Mac'galan", "Mac'gale", "Mac'galey", "Mac'galiam", "Mac'gally", "Mac'gan", "Mac'ganin", "Mac'gany", "Mac'gappy", "Mac'gapsey", "Mac'gara", "Mac'garoy", "Mac'garrell", "Mac'garroy", "Mac'gary", "Mac'gassey", "Mac'gatty", "Mac'gaty", "Mac'jordan", "Mac'jorddy", "Mac'jorer", "Mac'jorffy", "Mac'jorgan", "Mac'jorggan", "Mac'jorgh", "Mac'jorghan", "Mac'jorins", "Mac'jorkry", "Mac'jorlan", "Mac'jorle", "Mac'jorley", "Mac'jorliam", "Mac'jorlly", "Mac'jorn", "Mac'jornin", "Mac'jorny", "Mac'jorppy", "Mac'jorpsey", "Mac'jorra", "Mac'jorroy", "Mac'jorrrell", "Mac'jorrroy", "Mac'jorry", "Mac'jorssey", "Mac'jortty", "Mac'jorty", "Mac'keadan", "Mac'keaddy", "Mac'keaer", "Mac'keaffy", "Mac'keagan", "Mac'keaggan", "Mac'keagh", "Mac'keaghan", "Mac'keains", "Mac'keakry", "Mac'kealan", "Mac'keale", "Mac'kealey", "Mac'kealiam", "Mac'keally", "Mac'kean", "Mac'keanin", "Mac'keany", "Mac'keappy", "Mac'keapsey", "Mac'keara", "Mac'kearoy", "Mac'kearrell", "Mac'kearroy", "Mac'keary", "Mac'keassey", "Mac'keatty", "Mac'keaty", "Mac'keedan", "Mac'keeddy", "Mac'keeer", "Mac'keeffy", "Mac'keegan", "Mac'keeggan", "Mac'keegh", "Mac'keeghan", "Mac'keeins", "Mac'keekry", "Mac'keelan", "Mac'keele", "Mac'keeley", "Mac'keeliam", "Mac'keelly", "Mac'keen", "Mac'keenin", "Mac'keeny", "Mac'keeppy", "Mac'keepsey", "Mac'keera", "Mac'keeroy", "Mac'keerrell", "Mac'keerroy", "Mac'keery", "Mac'keessey", "Mac'keetty", "Mac'keety", "Mac'laudan", "Mac'lauddy", "Mac'lauer", "Mac'lauffy", "Mac'laugan", "Mac'lauggan", "Mac'laugh", "Mac'laughan", "Mac'lauins", "Mac'laukry", "Mac'laulan", "Mac'laule", "Mac'lauley", "Mac'lauliam", "Mac'laully", "Mac'laun", "Mac'launin", "Mac'launy", "Mac'lauppy", "Mac'laupsey", "Mac'laura", "Mac'lauroy", "Mac'laurrell", "Mac'laurroy", "Mac'laury", "Mac'laussey", "Mac'lautty", "Mac'lauty", "Mac'leadan", "Mac'leaddy", "Mac'leaer", "Mac'leaffy", "Mac'leagan", "Mac'leaggan", "Mac'leagh", "Mac'leaghan", "Mac'leains", "Mac'leakry", "Mac'lealan", "Mac'leale", "Mac'lealey", "Mac'lealiam", "Mac'leally", "Mac'lean", "Mac'leanin", "Mac'leany", "Mac'leappy", "Mac'leapsey", "Mac'leara", "Mac'learoy", "Mac'learrell", "Mac'learroy", "Mac'leary", "Mac'leassey", "Mac'leatty", "Mac'leaty", "Mac'ledan", "Mac'leddy", "Mac'leer", "Mac'leffy", "Mac'legan", "Mac'leggan", "Mac'legh", "Mac'leghan", "Mac'leidan", "Mac'leiddy", "Mac'leier", "Mac'leiffy", "Mac'leigan", "Mac'leiggan", "Mac'leigh", "Mac'leighan", "Mac'leiins", "Mac'leikry", "Mac'leilan", "Mac'leile", "Mac'leiley", "Mac'leiliam", "Mac'leilly", "Mac'lein", "Mac'leinin", "Mac'leins", "Mac'leiny", "Mac'leippy", "Mac'leipsey", "Mac'leira", "Mac'leiroy", "Mac'leirrell", "Mac'leirroy", "Mac'leiry", "Mac'leissey", "Mac'leitty", "Mac'leity", "Mac'lekry", "Mac'lelan", "Mac'lele", "Mac'leley", "Mac'leliam", "Mac'lelly", "Mac'len", "Mac'lenin", "Mac'leny", "Mac'leppy", "Mac'lepsey", "Mac'lera", "Mac'leroy", "Mac'lerrell", "Mac'lerroy", "Mac'lery", "Mac'lessey", "Mac'letty", "Mac'lety", "Mac'lodan", "Mac'loddy", "Mac'loer", "Mac'loffy", "Mac'logan", "Mac'loggan", "Mac'logh", "Mac'loghan", "Mac'loins", "Mac'lokry", "Mac'lolan", "Mac'lole", "Mac'loley", "Mac'loliam", "Mac'lolly", "Mac'lon", "Mac'lonin", "Mac'lony", "Mac'loppy", "Mac'lopsey", "Mac'lora", "Mac'loroy", "Mac'lorrell", "Mac'lorroy", "Mac'lory", "Mac'lossey", "Mac'lotty", "Mac'loty", "Mac'lyndan", "Mac'lynddy", "Mac'lyner", "Mac'lynffy", "Mac'lyngan", "Mac'lynggan", "Mac'lyngh", "Mac'lynghan", "Mac'lynins", "Mac'lynkry", "Mac'lynlan", "Mac'lynle", "Mac'lynley", "Mac'lynliam", "Mac'lynlly", "Mac'lynn", "Mac'lynnin", "Mac'lynny", "Mac'lynppy", "Mac'lynpsey", "Mac'lynra", "Mac'lynroy", "Mac'lynrrell", "Mac'lynrroy", "Mac'lynry", "Mac'lynssey", "Mac'lyntty", "Mac'lynty", "Mac'madan", "Mac'maddy", "Mac'maer", "Mac'maffy", "Mac'magan", "Mac'maggan", "Mac'magh", "Mac'maghan", "Mac'mains", "Mac'makry", "Mac'malan", "Mac'male", "Mac'maley", "Mac'maliam", "Mac'mally", "Mac'man", "Mac'manin", "Mac'many", "Mac'mappy", "Mac'mapsey", "Mac'mara", "Mac'maroy", "Mac'marrell", "Mac'marroy", "Mac'mary", "Mac'massey", "Mac'matty", "Mac'maty", "Mac'nadan", "Mac'naddy", "Mac'naer", "Mac'naffy", "Mac'nagan", "Mac'naggan", "Mac'nagh", "Mac'naghan", "Mac'nains", "Mac'nakry", "Mac'nalan", "Mac'nale", "Mac'naley", "Mac'naliam", "Mac'nally", "Mac'nan", "Mac'nanin", "Mac'nany", "Mac'nappy", "Mac'napsey", "Mac'nara", "Mac'naroy", "Mac'narrell", "Mac'narroy", "Mac'nary", "Mac'nassey", "Mac'natty", "Mac'naty", "Mac'nedan", "Mac'neddy", "Mac'neer", "Mac'neffy", "Mac'negan", "Mac'neggan", "Mac'negh", "Mac'neghan", "Mac'neins", "Mac'nekry", "Mac'nelan", "Mac'nele", "Mac'neley", "Mac'neliam", "Mac'nelly", "Mac'nen", "Mac'nenin", "Mac'neny", "Mac'neppy", "Mac'nepsey", "Mac'nera", "Mac'neroy", "Mac'nerrell", "Mac'nerroy", "Mac'nery", "Mac'nessey", "Mac'netty", "Mac'nety", "Mac'peadan", "Mac'peaddy", "Mac'peaer", "Mac'peaffy", "Mac'peagan", "Mac'peaggan", "Mac'peagh", "Mac'peaghan", "Mac'peains", "Mac'peakry", "Mac'pealan", "Mac'peale", "Mac'pealey", "Mac'pealiam", "Mac'peally", "Mac'pean", "Mac'peanin", "Mac'peany", "Mac'peappy", "Mac'peapsey", "Mac'peara", "Mac'pearoy", "Mac'pearrell", "Mac'pearroy", "Mac'peary", "Mac'peassey", "Mac'peatty", "Mac'peaty", "Mac'reidan", "Mac'reiddy", "Mac'reier", "Mac'reiffy", "Mac'reigan", "Mac'reiggan", "Mac'reigh", "Mac'reighan", "Mac'reiins", "Mac'reikry", "Mac'reilan", "Mac'reile", "Mac'reiley", "Mac'reiliam", "Mac'reilly", "Mac'rein", "Mac'reinin", "Mac'reiny", "Mac'reippy", "Mac'reipsey", "Mac'reira", "Mac'reiroy", "Mac'reirrell", "Mac'reirroy", "Mac'reiry", "Mac'reissey", "Mac'reitty", "Mac'reity", "Mac'ridan", "Mac'riddy", "Mac'rier", "Mac'riffy", "Mac'rigan", "Mac'riggan", "Mac'righ", "Mac'righan", "Mac'riins", "Mac'rikry", "Mac'rilan", "Mac'rile", "Mac'riley", "Mac'riliam", "Mac'rilly", "Mac'rin", "Mac'rinin", "Mac'riny", "Mac'ripdan", "Mac'ripddy", "Mac'riper", "Mac'ripffy", "Mac'ripgan", "Mac'ripggan", "Mac'ripgh", "Mac'ripghan", "Mac'ripins", "Mac'ripkry", "Mac'riplan", "Mac'riple", "Mac'ripley", "Mac'ripliam", "Mac'riplly", "Mac'ripn", "Mac'ripnin", "Mac'ripny", "Mac'ripppy", "Mac'rippsey", "Mac'rippy", "Mac'ripra", "Mac'riproy", "Mac'riprrell", "Mac'riprroy", "Mac'ripry", "Mac'ripsey", "Mac'ripssey", "Mac'riptty", "Mac'ripty", "Mac'rira", "Mac'riroy", "Mac'rirrell", "Mac'rirroy", "Mac'riry", "Mac'rissey", "Mac'ritty", "Mac'rity", "Mac'rodan", "Mac'roddy", "Mac'roer", "Mac'roffy", "Mac'rogan", "Mac'roggan", "Mac'rogh", "Mac'roghan", "Mac'roins", "Mac'rokry", "Mac'rolan", "Mac'role", "Mac'roley", "Mac'roliam", "Mac'rolly", "Mac'ron", "Mac'ronin", "Mac'rony", "Mac'roppy", "Mac'ropsey", "Mac'rora", "Mac'roroy", "Mac'rorrell", "Mac'rorroy", "Mac'rory", "Mac'rossey", "Mac'rotty", "Mac'roty", "Mac'sadan", "Mac'saddy", "Mac'saer", "Mac'saffy", "Mac'sagan", "Mac'saggan", "Mac'sagh", "Mac'saghan", "Mac'sains", "Mac'sakry", "Mac'salan", "Mac'sale", "Mac'saley", "Mac'saliam", "Mac'sally", "Mac'san", "Mac'sanin", "Mac'sany", "Mac'sappy", "Mac'sapsey", "Mac'sara", "Mac'saroy", "Mac'sarrell", "Mac'sarroy", "Mac'sary", "Mac'sassey", "Mac'satty", "Mac'saty", "Mac'shedan", "Mac'sheddy", "Mac'sheer", "Mac'sheffy", "Mac'shegan", "Mac'sheggan", "Mac'shegh", "Mac'sheghan", "Mac'sheins", "Mac'shekry", "Mac'shelan", "Mac'shele", "Mac'sheley", "Mac'sheliam", "Mac'shelly", "Mac'shen", "Mac'shenin", "Mac'sheny", "Mac'sheppy", "Mac'shepsey", "Mac'shera", "Mac'sheroy", "Mac'sherrell", "Mac'sherroy", "Mac'shery", "Mac'shessey", "Mac'shetty", "Mac'shety", "Mac'tedan", "Mac'teddy", "Mac'teer", "Mac'teffy", "Mac'tegan", "Mac'teggan", "Mac'tegh", "Mac'teghan", "Mac'teins", "Mac'tekry", "Mac'telan", "Mac'tele", "Mac'teley", "Mac'teliam", "Mac'telly", "Mac'ten", "Mac'tenin", "Mac'teny", "Mac'teppy", "Mac'tepsey", "Mac'tera", "Mac'teroy", "Mac'terrell", "Mac'terroy", "Mac'tery", "Mac'tessey", "Mac'tetty", "Mac'tety", "Mac'toodan", "Mac'tooddy", "Mac'tooer", "Mac'tooffy", "Mac'toogan", "Mac'tooggan", "Mac'toogh", "Mac'tooghan", "Mac'tooins", "Mac'tookry", "Mac'toolan", "Mac'toole", "Mac'tooley", "Mac'tooliam", "Mac'toolly", "Mac'toon", "Mac'toonin", "Mac'toony", "Mac'tooppy", "Mac'toopsey", "Mac'toora", "Mac'tooroy", "Mac'toorrell", "Mac'toorroy", "Mac'toory", "Mac'toossey", "Mac'tootty", "Mac'tooty", "Mac'widan", "Mac'widdy", "Mac'wier", "Mac'wiffy", "Mac'wigan", "Mac'wiggan", "Mac'wigh", "Mac'wighan", "Mac'wiins", "Mac'wikry", "Mac'wilan", "Mac'wile", "Mac'wiley", "Mac'wiliam", "Mac'willy", "Mac'win", "Mac'winin", "Mac'winy", "Mac'wippy", "Mac'wipsey", "Mac'wira", "Mac'wiroy", "Mac'wirrell", "Mac'wirroy", "Mac'wiry", "Mac'wissey", "Mac'witty", "Mac'wity", "Mac'ydan", "Mac'yddy", "Mac'yer", "Mac'yffy", "Mac'ygan", "Mac'yggan", "Mac'ygh", "Mac'yghan", "Mac'yins", "Mac'ykry", "Mac'ylan", "Mac'yle", "Mac'yley", "Mac'yliam", "Mac'ylly", "Mac'yn", "Mac'ynin", "Mac'yny", "Mac'yppy", "Mac'ypsey", "Mac'yra", "Mac'yroy", "Mac'yrrell", "Mac'yrroy", "Mac'yry", "Mac'yssey", "Mac'ytty", "Mac'yty", "Madan", "Maddy", "Maer", "Maffy", "Magan", "Maggan", "Magh", "Maghan", "Mains", "Makry", "Malan", "Male", "Maley", "Maliam", "Mally", "Man", "Manin", "Many", "Mappy", "Mapsey", "Mara", "Maroy", "Marrell", "Marroy", "Mary", "Massey", "Matty", "Maty", "Nadan", "Naddy", "Naer", "Naffy", "Nagan", "Naggan", "Nagh", "Naghan", "Nains", "Nakry", "Nalan", "Nale", "Naley", "Naliam", "Nally", "Nan", "Nanin", "Nany", "Nappy", "Napsey", "Nara", "Naroy", "Narrell", "Narroy", "Nary", "Nassey", "Natty", "Naty", "Nedan", "Neddy", "Neer", "Neffy", "Negan", "Neggan", "Negh", "Neghan", "Neins", "Nekry", "Nelan", "Nele", "Neley", "Neliam", "Nelly", "Nen", "Nenin", "Neny", "Neppy", "Nepsey", "Nera", "Neroy", "Nerrell", "Nerroy", "Nery", "Nessey", "Netty", "Nety", "O'ardan", "O'arddy", "O'arer", "O'arffy", "O'argan", "O'arggan", "O'argh", "O'arghan", "O'arins", "O'arkry", "O'arlan", "O'arle", "O'arley", "O'arliam", "O'arlly", "O'arn", "O'arnin", "O'arny", "O'arppy", "O'arpsey", "O'arra", "O'arroy", "O'arrrell", "O'arrroy", "O'arry", "O'arssey", "O'artty", "O'arty", "O'bidan", "O'biddy", "O'bier", "O'biffy", "O'bigan", "O'biggan", "O'bigh", "O'bighan", "O'biins", "O'bikry", "O'bilan", "O'bile", "O'biley", "O'biliam", "O'billy", "O'bin", "O'binin", "O'biny", "O'bippy", "O'bipsey", "O'bira", "O'biroy", "O'birrell", "O'birroy", "O'biry", "O'bissey", "O'bitty", "O'bity", "O'caudan", "O'cauddy", "O'cauer", "O'cauffy", "O'caugan", "O'cauggan", "O'caugh", "O'caughan", "O'cauins", "O'caukry", "O'caulan", "O'caule", "O'cauley", "O'cauliam", "O'caully", "O'caun", "O'caunin", "O'cauny", "O'cauppy", "O'caupsey", "O'caura", "O'cauroy", "O'caurrell", "O'caurroy", "O'caury", "O'caussey", "O'cautty", "O'cauty", "O'dadan", "O'daddy", "O'daer", "O'daffy", "O'dagan", "O'daggan", "O'dagh", "O'daghan", "O'dains", "O'dakry", "O'dalan", "O'dale", "O'daley", "O'daliam", "O'dally", "O'dan", "O'danin", "O'dany", "O'dappy", "O'dapsey", "O'dara", "O'dardan", "O'darddy", "O'darer", "O'darffy", "O'dargan", "O'darggan", "O'dargh", "O'darghan", "O'darins", "O'darkry", "O'darlan", "O'darle", "O'darley", "O'darliam", "O'darlly", "O'darn", "O'darnin", "O'darny", "O'daroy", "O'darppy", "O'darpsey", "O'darra", "O'darrell", "O'darroy", "O'darrrell", "O'darrroy", "O'darry", "O'darssey", "O'dartty", "O'darty", "O'dary", "O'dassey", "O'datty", "O'daty", "O'doydan", "O'doyddy", "O'doyer", "O'doyffy", "O'doygan", "O'doyggan", "O'doygh", "O'doyghan", "O'doyins", "O'doykry", "O'doylan", "O'doyle", "O'doyley", "O'doyliam", "O'doylly", "O'doyn", "O'doynin", "O'doyny", "O'doyppy", "O'doypsey", "O'doyra", "O'doyroy", "O'doyrrell", "O'doyrroy", "O'doyry", "O'doyssey", "O'doytty", "O'doyty", "O'dudan", "O'duddy", "O'duer", "O'duffy", "O'dugan", "O'duggan", "O'dugh", "O'dughan", "O'duins", "O'dukry", "O'dulan", "O'dule", "O'duley", "O'duliam", "O'dully", "O'dun", "O'dunin", "O'duny", "O'duppy", "O'dupsey", "O'dura", "O'duroy", "O'durrell", "O'durroy", "O'dury", "O'dussey", "O'dutty", "O'duty", "O'gadan", "O'gaddy", "O'gaer", "O'gaffy", "O'gagan", "O'gaggan", "O'gagh", "O'gaghan", "O'gains", "O'gakry", "O'galan", "O'gale", "O'galey", "O'galiam", "O'gally", "O'gan", "O'ganin", "O'gany", "O'gappy", "O'gapsey", "O'gara", "O'garoy", "O'garrell", "O'garroy", "O'gary", "O'gassey", "O'gatty", "O'gaty", "O'jordan", "O'jorddy", "O'jorer", "O'jorffy", "O'jorgan", "O'jorggan", "O'jorgh", "O'jorghan", "O'jorins", "O'jorkry", "O'jorlan", "O'jorle", "O'jorley", "O'jorliam", "O'jorlly", "O'jorn", "O'jornin", "O'jorny", "O'jorppy", "O'jorpsey", "O'jorra", "O'jorroy", "O'jorrrell", "O'jorrroy", "O'jorry", "O'jorssey", "O'jortty", "O'jorty", "O'keadan", "O'keaddy", "O'keaer", "O'keaffy", "O'keagan", "O'keaggan", "O'keagh", "O'keaghan", "O'keains", "O'keakry", "O'kealan", "O'keale", "O'kealey", "O'kealiam", "O'keally", "O'kean", "O'keanin", "O'keany", "O'keappy", "O'keapsey", "O'keara", "O'kearoy", "O'kearrell", "O'kearroy", "O'keary", "O'keassey", "O'keatty", "O'keaty", "O'keedan", "O'keeddy", "O'keeer", "O'keeffy", "O'keegan", "O'keeggan", "O'keegh", "O'keeghan", "O'keeins", "O'keekry", "O'keelan", "O'keele", "O'keeley", "O'keeliam", "O'keelly", "O'keen", "O'keenin", "O'keeny", "O'keeppy", "O'keepsey", "O'keera", "O'keeroy", "O'keerrell", "O'keerroy", "O'keery", "O'keessey", "O'keetty", "O'keety", "O'laudan", "O'lauddy", "O'lauer", "O'lauffy", "O'laugan", "O'lauggan", "O'laugh", "O'laughan", "O'lauins", "O'laukry", "O'laulan", "O'laule", "O'lauley", "O'lauliam", "O'laully", "O'laun", "O'launin", "O'launy", "O'lauppy", "O'laupsey", "O'laura", "O'lauroy", "O'laurrell", "O'laurroy", "O'laury", "O'laussey", "O'lautty", "O'lauty", "O'leadan", "O'leaddy", "O'leaer", "O'leaffy", "O'leagan", "O'leaggan", "O'leagh", "O'leaghan", "O'leains", "O'leakry", "O'lealan", "O'leale", "O'lealey", "O'lealiam", "O'leally", "O'lean", "O'leanin", "O'leany", "O'leappy", "O'leapsey", "O'leara", "O'learoy", "O'learrell", "O'learroy", "O'leary", "O'leassey", "O'leatty", "O'leaty", "O'ledan", "O'leddy", "O'leer", "O'leffy", "O'legan", "O'leggan", "O'legh", "O'leghan", "O'leidan", "O'leiddy", "O'leier", "O'leiffy", "O'leigan", "O'leiggan", "O'leigh", "O'leighan", "O'leiins", "O'leikry", "O'leilan", "O'leile", "O'leiley", "O'leiliam", "O'leilly", "O'lein", "O'leinin", "O'leins", "O'leiny", "O'leippy", "O'leipsey", "O'leira", "O'leiroy", "O'leirrell", "O'leirroy", "O'leiry", "O'leissey", "O'leitty", "O'leity", "O'lekry", "O'lelan", "O'lele", "O'leley", "O'leliam", "O'lelly", "O'len", "O'lenin", "O'leny", "O'leppy", "O'lepsey", "O'lera", "O'leroy", "O'lerrell", "O'lerroy", "O'lery", "O'lessey", "O'letty", "O'lety", "O'lodan", "O'loddy", "O'loer", "O'loffy", "O'logan", "O'loggan", "O'logh", "O'loghan", "O'loins", "O'lokry", "O'lolan", "O'lole", "O'loley", "O'loliam", "O'lolly", "O'lon", "O'lonin", "O'lony", "O'loppy", "O'lopsey", "O'lora", "O'loroy", "O'lorrell", "O'lorroy", "O'lory", "O'lossey", "O'lotty", "O'loty", "O'lyndan", "O'lynddy", "O'lyner", "O'lynffy", "O'lyngan", "O'lynggan", "O'lyngh", "O'lynghan", "O'lynins", "O'lynkry", "O'lynlan", "O'lynle", "O'lynley", "O'lynliam", "O'lynlly", "O'lynn", "O'lynnin", "O'lynny", "O'lynppy", "O'lynpsey", "O'lynra", "O'lynroy", "O'lynrrell", "O'lynrroy", "O'lynry", "O'lynssey", "O'lyntty", "O'lynty", "O'madan", "O'maddy", "O'maer", "O'maffy", "O'magan", "O'maggan", "O'magh", "O'maghan", "O'mains", "O'makry", "O'malan", "O'male", "O'maley", "O'maliam", "O'mally", "O'man", "O'manin", "O'many", "O'mappy", "O'mapsey", "O'mara", "O'maroy", "O'marrell", "O'marroy", "O'mary", "O'massey", "O'matty", "O'maty", "O'nadan", "O'naddy", "O'naer", "O'naffy", "O'nagan", "O'naggan", "O'nagh", "O'naghan", "O'nains", "O'nakry", "O'nalan", "O'nale", "O'naley", "O'naliam", "O'nally", "O'nan", "O'nanin", "O'nany", "O'nappy", "O'napsey", "O'nara", "O'naroy", "O'narrell", "O'narroy", "O'nary", "O'nassey", "O'natty", "O'naty", "O'nedan", "O'neddy", "O'neer", "O'neffy", "O'negan", "O'neggan", "O'negh", "O'neghan", "O'neins", "O'nekry", "O'nelan", "O'nele", "O'neley", "O'neliam", "O'nelly", "O'nen", "O'nenin", "O'neny", "O'neppy", "O'nepsey", "O'nera", "O'neroy", "O'nerrell", "O'nerroy", "O'nery", "O'nessey", "O'netty", "O'nety", "O'peadan", "O'peaddy", "O'peaer", "O'peaffy", "O'peagan", "O'peaggan", "O'peagh", "O'peaghan", "O'peains", "O'peakry", "O'pealan", "O'peale", "O'pealey", "O'pealiam", "O'peally", "O'pean", "O'peanin", "O'peany", "O'peappy", "O'peapsey", "O'peara", "O'pearoy", "O'pearrell", "O'pearroy", "O'peary", "O'peassey", "O'peatty", "O'peaty", "O'reidan", "O'reiddy", "O'reier", "O'reiffy", "O'reigan", "O'reiggan", "O'reigh", "O'reighan", "O'reiins", "O'reikry", "O'reilan", "O'reile", "O'reiley", "O'reiliam", "O'reilly", "O'rein", "O'reinin", "O'reiny", "O'reippy", "O'reipsey", "O'reira", "O'reiroy", "O'reirrell", "O'reirroy", "O'reiry", "O'reissey", "O'reitty", "O'reity", "O'ridan", "O'riddy", "O'rier", "O'riffy", "O'rigan", "O'riggan", "O'righ", "O'righan", "O'riins", "O'rikry", "O'rilan", "O'rile", "O'riley", "O'riliam", "O'rilly", "O'rin", "O'rinin", "O'riny", "O'ripdan", "O'ripddy", "O'riper", "O'ripffy", "O'ripgan", "O'ripggan", "O'ripgh", "O'ripghan", "O'ripins", "O'ripkry", "O'riplan", "O'riple", "O'ripley", "O'ripliam", "O'riplly", "O'ripn", "O'ripnin", "O'ripny", "O'ripppy", "O'rippsey", "O'rippy", "O'ripra", "O'riproy", "O'riprrell", "O'riprroy", "O'ripry", "O'ripsey", "O'ripssey", "O'riptty", "O'ripty", "O'rira", "O'riroy", "O'rirrell", "O'rirroy", "O'riry", "O'rissey", "O'ritty", "O'rity", "O'rodan", "O'roddy", "O'roer", "O'roffy", "O'rogan", "O'roggan", "O'rogh", "O'roghan", "O'roins", "O'rokry", "O'rolan", "O'role", "O'roley", "O'roliam", "O'rolly", "O'ron", "O'ronin", "O'rony", "O'roppy", "O'ropsey", "O'rora", "O'roroy", "O'rorrell", "O'rorroy", "O'rory", "O'rossey", "O'rotty", "O'roty", "O'sadan", "O'saddy", "O'saer", "O'saffy", "O'sagan", "O'saggan", "O'sagh", "O'saghan", "O'sains", "O'sakry", "O'salan", "O'sale", "O'saley", "O'saliam", "O'sally", "O'san", "O'sanin", "O'sany", "O'sappy", "O'sapsey", "O'sara", "O'saroy", "O'sarrell", "O'sarroy", "O'sary", "O'sassey", "O'satty", "O'saty", "O'shedan", "O'sheddy", "O'sheer", "O'sheffy", "O'shegan", "O'sheggan", "O'shegh", "O'sheghan", "O'sheins", "O'shekry", "O'shelan", "O'shele", "O'sheley", "O'sheliam", "O'shelly", "O'shen", "O'shenin", "O'sheny", "O'sheppy", "O'shepsey", "O'shera", "O'sheroy", "O'sherrell", "O'sherroy", "O'shery", "O'shessey", "O'shetty", "O'shety", "O'tedan", "O'teddy", "O'teer", "O'teffy", "O'tegan", "O'teggan", "O'tegh", "O'teghan", "O'teins", "O'tekry", "O'telan", "O'tele", "O'teley", "O'teliam", "O'telly", "O'ten", "O'tenin", "O'teny", "O'teppy", "O'tepsey", "O'tera", "O'teroy", "O'terrell", "O'terroy", "O'tery", "O'tessey", "O'tetty", "O'tety", "O'toodan", "O'tooddy", "O'tooer", "O'tooffy", "O'toogan", "O'tooggan", "O'toogh", "O'tooghan", "O'tooins", "O'tookry", "O'toolan", "O'toole", "O'tooley", "O'tooliam", "O'toolly", "O'toon", "O'toonin", "O'toony", "O'tooppy", "O'toopsey", "O'toora", "O'tooroy", "O'toorrell", "O'toorroy", "O'toory", "O'toossey", "O'tootty", "O'tooty", "O'widan", "O'widdy", "O'wier", "O'wiffy", "O'wigan", "O'wiggan", "O'wigh", "O'wighan", "O'wiins", "O'wikry", "O'wilan", "O'wile", "O'wiley", "O'wiliam", "O'willy", "O'win", "O'winin", "O'winy", "O'wippy", "O'wipsey", "O'wira", "O'wiroy", "O'wirrell", "O'wirroy", "O'wiry", "O'wissey", "O'witty", "O'wity", "O'ydan", "O'yddy", "O'yer", "O'yffy", "O'ygan", "O'yggan", "O'ygh", "O'yghan", "O'yins", "O'ykry", "O'ylan", "O'yle", "O'yley", "O'yliam", "O'ylly", "O'yn", "O'ynin", "O'yny", "O'yppy", "O'ypsey", "O'yra", "O'yroy", "O'yrrell", "O'yrroy", "O'yry", "O'yssey", "O'ytty", "O'yty", "Peadan", "Peaddy", "Peaer", "Peaffy", "Peagan", "Peaggan", "Peagh", "Peaghan", "Peains", "Peakry", "Pealan", "Peale", "Pealey", "Pealiam", "Peally", "Pean", "Peanin", "Peany", "Peappy", "Peapsey", "Peara", "Pearoy", "Pearrell", "Pearroy", "Peary", "Peassey", "Peatty", "Peaty", "Reidan", "Reiddy", "Reier", "Reiffy", "Reigan", "Reiggan", "Reigh", "Reighan", "Reiins", "Reikry", "Reilan", "Reile", "Reiley", "Reiliam", "Reilly", "Rein", "Reinin", "Reiny", "Reippy", "Reipsey", "Reira", "Reiroy", "Reirrell", "Reirroy", "Reiry", "Reissey", "Reitty", "Reity", "Ridan", "Riddy", "Rier", "Riffy", "Rigan", "Riggan", "Righ", "Righan", "Riins", "Rikry", "Rilan", "Rile", "Riley", "Riliam", "Rilly", "Rin", "Rinin", "Riny", "Ripdan", "Ripddy", "Riper", "Ripffy", "Ripgan", "Ripggan", "Ripgh", "Ripghan", "Ripins", "Ripkry", "Riplan", "Riple", "Ripley", "Ripliam", "Riplly", "Ripn", "Ripnin", "Ripny", "Ripppy", "Rippsey", "Rippy", "Ripra", "Riproy", "Riprrell", "Riprroy", "Ripry", "Ripsey", "Ripssey", "Riptty", "Ripty", "Rira", "Riroy", "Rirrell", "Rirroy", "Riry", "Rissey", "Ritty", "Rity", "Rodan", "Roddy", "Roer", "Roffy", "Rogan", "Roggan", "Rogh", "Roghan", "Roins", "Rokry", "Rolan", "Role", "Roley", "Roliam", "Rolly", "Ron", "Ronin", "Rony", "Roppy", "Ropsey", "Rora", "Roroy", "Rorrell", "Rorroy", "Rory", "Rossey", "Rotty", "Roty", "Sadan", "Saddy", "Saer", "Saffy", "Sagan", "Saggan", "Sagh", "Saghan", "Sains", "Sakry", "Salan", "Sale", "Saley", "Saliam", "Sally", "San", "Sanin", "Sany", "Sappy", "Sapsey", "Sara", "Saroy", "Sarrell", "Sarroy", "Sary", "Sassey", "Satty", "Saty", "Shedan", "Sheddy", "Sheer", "Sheffy", "Shegan", "Sheggan", "Shegh", "Sheghan", "Sheins", "Shekry", "Shelan", "Shele", "Sheley", "Sheliam", "Shelly", "Shen", "Shenin", "Sheny", "Sheppy", "Shepsey", "Shera", "Sheroy", "Sherrell", "Sherroy", "Shery", "Shessey", "Shetty", "Shety", "Tedan", "Teddy", "Teer", "Teffy", "Tegan", "Teggan", "Tegh", "Teghan", "Teins", "Tekry", "Telan", "Tele", "Teley", "Teliam", "Telly", "Ten", "Tenin", "Teny", "Teppy", "Tepsey", "Tera", "Teroy", "Terrell", "Terroy", "Tery", "Tessey", "Tetty", "Tety", "Toodan", "Tooddy", "Tooer", "Tooffy", "Toogan", "Tooggan", "Toogh", "Tooghan", "Tooins", "Tookry", "Toolan", "Toole", "Tooley", "Tooliam", "Toolly", "Toon", "Toonin", "Toony", "Tooppy", "Toopsey", "Toora", "Tooroy", "Toorrell", "Toorroy", "Toory", "Toossey", "Tootty", "Tooty", "Widan", "Widdy", "Wier", "Wiffy", "Wigan", "Wiggan", "Wigh", "Wighan", "Wiins", "Wikry", "Wilan", "Wile", "Wiley", "Wiliam", "Willy", "Win", "Winin", "Winy", "Wippy", "Wipsey", "Wira", "Wiroy", "Wirrell", "Wirroy", "Wiry", "Wissey", "Witty", "Wity", "Ydan", "Yddy", "Yer", "Yffy", "Ygan", "Yggan", "Ygh", "Yghan", "Yins", "Ykry", "Ylan", "Yle", "Yley", "Yliam", "Ylly", "Yn", "Ynin", "Yny", "Yppy", "Ypsey", "Yra", "Yroy", "Yrrell", "Yrroy", "Yry", "Yssey", "Ytty", "Yty"} +-- VERSION -- +RYZOM_NAMES_TRYKER_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/names_zorai.lua b/ryzom/client/data/gamedev/interfaces_v3/names_zorai.lua index be0d2d2c64..8cdb80123c 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/names_zorai.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/names_zorai.lua @@ -3,3 +3,6 @@ zoraiFirstNamesOne = {"Ba", "Bai", "Be", "Bei", "Bi", "Bia", "Biai", "Bii", "Bo" zoraiFirstNamesTwo = {"Ba", "Ban", "Bang", "Bao", "Be", "Ben", "Beng", "Beo", "Bi", "Bia", "Bian", "Biang", "Biao", "Bin", "Bing", "Bio", "Bo", "Bon", "Bong", "Boo", "Bu", "Bua", "Buan", "Buang", "Buao", "Bun", "Bung", "Buo", "Ca", "Can", "Cang", "Cao", "Ce", "Cen", "Ceng", "Ceo", "Cha", "Chan", "Chang", "Chao", "Che", "Chen", "Cheng", "Cheo", "Chi", "Chia", "Chian", "Chiang", "Chiao", "Chin", "Ching", "Chio", "Cho", "Chon", "Chong", "Choo", "Chu", "Chua", "Chuan", "Chuang", "Chuao", "Chun", "Chung", "Chuo", "Ci", "Cia", "Cian", "Ciang", "Ciao", "Cin", "Cing", "Cio", "Co", "Con", "Cong", "Coo", "Cu", "Cua", "Cuan", "Cuang", "Cuao", "Cun", "Cung", "Cuo", "Da", "Dan", "Dang", "Dao", "De", "Den", "Deng", "Deo", "Di", "Dia", "Dian", "Diang", "Diao", "Din", "Ding", "Dio", "Do", "Don", "Dong", "Doo", "Du", "Dua", "Duan", "Duang", "Duao", "Dun", "Dung", "Duo", "Fa", "Fan", "Fang", "Fao", "Fe", "Fen", "Feng", "Feo", "Fi", "Fia", "Fian", "Fiang", "Fiao", "Fin", "Fing", "Fio", "Fo", "Fon", "Fong", "Foo", "Fu", "Fua", "Fuan", "Fuang", "Fuao", "Fun", "Fung", "Fuo", "Ga", "Gan", "Gang", "Gao", "Ge", "Gen", "Geng", "Geo", "Gi", "Gia", "Gian", "Giang", "Giao", "Gin", "Ging", "Gio", "Go", "Gon", "Gong", "Goo", "Gu", "Gua", "Guan", "Guang", "Guao", "Gun", "Gung", "Guo", "Ha", "Han", "Hang", "Hao", "He", "Hen", "Heng", "Heo", "Hi", "Hia", "Hian", "Hiang", "Hiao", "Hin", "Hing", "Hio", "Ho", "Hon", "Hong", "Hoo", "Hu", "Hua", "Huan", "Huang", "Huao", "Hun", "Hung", "Huo", "Ja", "Jan", "Jang", "Jao", "Je", "Jen", "Jeng", "Jeo", "Ji", "Jia", "Jian", "Jiang", "Jiao", "Jin", "Jing", "Jio", "Jo", "Jon", "Jong", "Joo", "Ju", "Jua", "Juan", "Juang", "Juao", "Jun", "Jung", "Juo", "Ka", "Kan", "Kang", "Kao", "Ke", "Ken", "Keng", "Keo", "Ki", "Kia", "Kian", "Kiang", "Kiao", "Kin", "King", "Kio", "Ko", "Kon", "Kong", "Koo", "Ku", "Kua", "Kuan", "Kuang", "Kuao", "Kun", "Kung", "Kuo", "La", "Lan", "Lang", "Lao", "Le", "Len", "Leng", "Leo", "Li", "Lia", "Lian", "Liang", "Liao", "Lin", "Ling", "Lio", "Lo", "Lon", "Long", "Loo", "Lu", "Lua", "Luan", "Luang", "Luao", "Lun", "Lung", "Luo", "Ma", "Man", "Mang", "Mao", "Me", "Men", "Meng", "Meo", "Mi", "Mia", "Mian", "Miang", "Miao", "Min", "Ming", "Mio", "Mo", "Mon", "Mong", "Moo", "Mu", "Mua", "Muan", "Muang", "Muao", "Mun", "Mung", "Muo", "Na", "Nan", "Nang", "Nao", "Ne", "Nen", "Neng", "Neo", "Ni", "Nia", "Nian", "Niang", "Niao", "Nin", "Ning", "Nio", "No", "Non", "Nong", "Noo", "Nu", "Nua", "Nuan", "Nuang", "Nuao", "Nun", "Nung", "Nuo", "Pa", "Pan", "Pang", "Pao", "Pe", "Pen", "Peng", "Peo", "Pi", "Pia", "Pian", "Piang", "Piao", "Pin", "Ping", "Pio", "Po", "Pon", "Pong", "Poo", "Pu", "Pua", "Puan", "Puang", "Puao", "Pun", "Pung", "Puo", "Qa", "Qan", "Qang", "Qao", "Qe", "Qen", "Qeng", "Qeo", "Qi", "Qia", "Qian", "Qiang", "Qiao", "Qin", "Qing", "Qio", "Qo", "Qon", "Qong", "Qoo", "Qu", "Qua", "Quan", "Quang", "Quao", "Qun", "Qung", "Quo", "Sa", "San", "Sang", "Sao", "Se", "Sen", "Seng", "Seo", "Sha", "Shan", "Shang", "Shao", "She", "Shen", "Sheng", "Sheo", "Shi", "Shia", "Shian", "Shiang", "Shiao", "Shin", "Shing", "Shio", "Sho", "Shon", "Shong", "Shoo", "Shu", "Shua", "Shuan", "Shuang", "Shuao", "Shun", "Shung", "Shuo", "Si", "Sia", "Sian", "Siang", "Siao", "Sin", "Sing", "Sio", "So", "Son", "Song", "Soo", "Su", "Sua", "Suan", "Suang", "Suao", "Sun", "Sung", "Suo", "Ta", "Tan", "Tang", "Tao", "Te", "Ten", "Teng", "Teo", "Ti", "Tia", "Tian", "Tiang", "Tiao", "Tin", "Ting", "Tio", "To", "Ton", "Tong", "Too", "Tu", "Tua", "Tuan", "Tuang", "Tuao", "Tun", "Tung", "Tuo", "Va", "Van", "Vang", "Vao", "Ve", "Ven", "Veng", "Veo", "Vi", "Via", "Vian", "Viang", "Viao", "Vin", "Ving", "Vio", "Vo", "Von", "Vong", "Voo", "Vu", "Vua", "Vuan", "Vuang", "Vuao", "Vun", "Vung", "Vuo", "Wa", "Wan", "Wang", "Wao", "We", "Wen", "Weng", "Weo", "Wi", "Wia", "Wian", "Wiang", "Wiao", "Win", "Wing", "Wio", "Wo", "Won", "Wong", "Woo", "Wu", "Wua", "Wuan", "Wuang", "Wuao", "Wun", "Wung", "Wuo", "Xa", "Xan", "Xang", "Xao", "Xe", "Xen", "Xeng", "Xeo", "Xi", "Xia", "Xian", "Xiang", "Xiao", "Xin", "Xing", "Xio", "Xo", "Xon", "Xong", "Xoo", "Xu", "Xua", "Xuan", "Xuang", "Xuao", "Xun", "Xung", "Xuo", "Ya", "Yan", "Yang", "Yao", "Ye", "Yen", "Yeng", "Yeo", "Yi", "Yia", "Yian", "Yiang", "Yiao", "Yin", "Ying", "Yio", "Yo", "Yon", "Yong", "Yoo", "Yu", "Yua", "Yuan", "Yuang", "Yuao", "Yun", "Yung", "You", "Za", "Zan", "Zang", "Zao", "Ze", "Zen", "Zeng", "Zeo", "Zha", "Zhan", "Zhang", "Zhao", "Zhe", "Zhen", "Zheng", "Zheo", "Zhi", "Zhia", "Zhian", "Zhiang", "Zhiao", "Zhin", "Zhing", "Zhio", "Zho", "Zhon", "Zhong", "Zhoo", "Zhu", "Zhua", "Zhuan", "Zhuang", "Zhuao", "Zhun", "Zhung", "Zhuo", "Zi", "Zia", "Zian", "Ziang", "Ziao", "Zin", "Zing", "Zio", "Zo", "Zon", "Zong", "Zoo", "Zu", "Zua", "Zuan", "Zuang", "Zuao", "Zun", "Zung", "Zuo"} zoraiLastNames = {"Ba", "Bai", "Ban", "Bang", "Bangi", "Bani", "Bao", "Baoi", "Be", "Bei", "Ben", "Beng", "Bengi", "Beni", "Beo", "Beoi", "Bi", "Bia", "Biai", "Bian", "Biang", "Biangi", "Biani", "Biao", "Biaoi", "Bii", "Bin", "Bing", "Bingi", "Bini", "Bio", "Bioi", "Bo", "Boi", "Bon", "Bong", "Bongi", "Boni", "Boo", "Booi", "Bu", "Bua", "Buai", "Buan", "Buang", "Buangi", "Buani", "Buao", "Buaoi", "Bui", "Bun", "Bung", "Bungi", "Buni", "Buo", "Buoi", "Ca", "Cai", "Can", "Cang", "Cangi", "Cani", "Cao", "Caoi", "Ce", "Cei", "Cen", "Ceng", "Cengi", "Ceni", "Ceo", "Ceoi", "Cha", "Chai", "Chan", "Chang", "Changi", "Chani", "Chao", "Chaoi", "Che", "Chei", "Chen", "Cheng", "Chengi", "Cheni", "Cheo", "Cheoi", "Chi", "Chia", "Chiai", "Chian", "Chiang", "Chiangi", "Chiani", "Chiao", "Chiaoi", "Chii", "Chin", "Ching", "Chingi", "Chini", "Chio", "Chioi", "Cho", "Choi", "Chon", "Chong", "Chongi", "Choni", "Choo", "Chooi", "Chu", "Chua", "Chuai", "Chuan", "Chuang", "Chuangi", "Chuani", "Chuao", "Chuaoi", "Chui", "Chun", "Chung", "Chungi", "Chuni", "Chuo", "Chuoi", "Ci", "Cia", "Ciai", "Cian", "Ciang", "Ciangi", "Ciani", "Ciao", "Ciaoi", "Cii", "Cin", "Cing", "Cingi", "Cini", "Cio", "Cioi", "Co", "Coi", "Con", "Cong", "Congi", "Coni", "Coo", "Cooi", "Cu", "Cua", "Cuai", "Cuan", "Cuang", "Cuangi", "Cuani", "Cuao", "Cuaoi", "Cui", "Cun", "Cung", "Cungi", "Cuni", "Cuo", "Cuoi", "Da", "Dai", "Dan", "Dang", "Dangi", "Dani", "Dao", "Daoi", "De", "Dei", "Den", "Deng", "Dengi", "Deni", "Deo", "Deoi", "Di", "Dia", "Diai", "Dian", "Diang", "Diangi", "Diani", "Diao", "Diaoi", "Dii", "Din", "Ding", "Dingi", "Dini", "Dio", "Dioi", "Do", "Doi", "Don", "Dong", "Dongi", "Doni", "Doo", "Dooi", "Du", "Dua", "Duai", "Duan", "Duang", "Duangi", "Duani", "Duao", "Duaoi", "Dui", "Dun", "Dung", "Dungi", "Duni", "Duo", "Duoi", "Fa", "Fai", "Fan", "Fang", "Fangi", "Fani", "Fao", "Faoi", "Fe", "Fei", "Fen", "Feng", "Fengi", "Feni", "Feo", "Feoi", "Fi", "Fia", "Fiai", "Fian", "Fiang", "Fiangi", "Fiani", "Fiao", "Fiaoi", "Fii", "Fin", "Fing", "Fingi", "Fini", "Fio", "Fioi", "Fo", "Foi", "Fon", "Fong", "Fongi", "Foni", "Foo", "Fooi", "Fu", "Fua", "Fuai", "Fuan", "Fuang", "Fuangi", "Fuani", "Fuao", "Fuaoi", "Fui", "Fun", "Fung", "Fungi", "Funi", "Fuo", "Fuoi", "Ga", "Gai", "Gan", "Gang", "Gangi", "Gani", "Gao", "Gaoi", "Ge", "Gei", "Gen", "Geng", "Gengi", "Geni", "Geo", "Geoi", "Gi", "Gia", "Giai", "Gian", "Giang", "Giangi", "Giani", "Giao", "Giaoi", "Gii", "Gin", "Ging", "Gingi", "Gini", "Gio", "Gioi", "Go", "Goi", "Gon", "Gong", "Gongi", "Goni", "Goo", "Gooi", "Gu", "Gua", "Guai", "Guan", "Guang", "Guangi", "Guani", "Guao", "Guaoi", "Gui", "Gun", "Gung", "Gungi", "Guni", "Guo", "Guoi", "Ha", "Hai", "Han", "Hang", "Hangi", "Hani", "Hao", "Haoi", "He", "Hei", "Hen", "Heng", "Hengi", "Heni", "Heo", "Heoi", "Hi", "Hia", "Hiai", "Hian", "Hiang", "Hiangi", "Hiani", "Hiao", "Hiaoi", "Hii", "Hin", "Hing", "Hingi", "Hini", "Hio", "Hioi", "Ho", "Hoi", "Hon", "Hong", "Hongi", "Honi", "Hoo", "Hooi", "Hu", "Hua", "Huai", "Huan", "Huang", "Huangi", "Huani", "Huao", "Huaoi", "Hui", "Hun", "Hung", "Hungi", "Huni", "Huo", "Huoi", "Ja", "Jai", "Jan", "Jang", "Jangi", "Jani", "Jao", "Jaoi", "Je", "Jei", "Jen", "Jeng", "Jengi", "Jeni", "Jeo", "Jeoi", "Ji", "Jia", "Jiai", "Jian", "Jiang", "Jiangi", "Jiani", "Jiao", "Jiaoi", "Jii", "Jin", "Jing", "Jingi", "Jini", "Jio", "Jioi", "Jo", "Joi", "Jon", "Jong", "Jongi", "Joni", "Joo", "Jooi", "Ju", "Jua", "Juai", "Juan", "Juang", "Juangi", "Juani", "Juao", "Juaoi", "Jui", "Jun", "Jung", "Jungi", "Juni", "Juo", "Juoi", "Ka", "Kai", "Kan", "Kang", "Kangi", "Kani", "Kao", "Kaoi", "Ke", "Kei", "Ken", "Keng", "Kengi", "Keni", "Keo", "Keoi", "Ki", "Kia", "Kiai", "Kian", "Kiang", "Kiangi", "Kiani", "Kiao", "Kiaoi", "Kii", "Kin", "King", "Kingi", "Kini", "Kio", "Kioi", "Ko", "Koi", "Kon", "Kong", "Kongi", "Koni", "Koo", "Kooi", "Ku", "Kua", "Kuai", "Kuan", "Kuang", "Kuangi", "Kuani", "Kuao", "Kuaoi", "Kui", "Kun", "Kung", "Kungi", "Kuni", "Kuo", "Kuoi", "La", "Lai", "Lan", "Lang", "Langi", "Lani", "Lao", "Laoi", "Le", "Lei", "Len", "Leng", "Lengi", "Leni", "Leo", "Leoi", "Li", "Lia", "Liai", "Lian", "Liang", "Liangi", "Liani", "Liao", "Liaoi", "Lii", "Lin", "Ling", "Lingi", "Lini", "Lio", "Lioi", "Lo", "Loi", "Lon", "Long", "Longi", "Loni", "Loo", "Looi", "Lu", "Lua", "Luai", "Luan", "Luang", "Luangi", "Luani", "Luao", "Luaoi", "Lui", "Lun", "Lung", "Lungi", "Luni", "Luo", "Luoi", "Ma", "Mai", "Man", "Mang", "Mangi", "Mani", "Mao", "Maoi", "Me", "Mei", "Men", "Meng", "Mengi", "Meni", "Meo", "Meoi", "Mi", "Mia", "Miai", "Mian", "Miang", "Miangi", "Miani", "Miao", "Miaoi", "Mii", "Min", "Ming", "Mingi", "Mini", "Mio", "Mioi", "Mo", "Moi", "Mon", "Mong", "Mongi", "Moni", "Moo", "Mooi", "Mu", "Mua", "Muai", "Muan", "Muang", "Muangi", "Muani", "Muao", "Muaoi", "Mui", "Mun", "Mung", "Mungi", "Muni", "Muo", "Muoi", "Na", "Nai", "Nan", "Nang", "Nangi", "Nani", "Nao", "Naoi", "Ne", "Nei", "Nen", "Neng", "Nengi", "Neni", "Neo", "Neoi", "Ni", "Nia", "Niai", "Nian", "Niang", "Niangi", "Niani", "Niao", "Niaoi", "Nii", "Nin", "Ning", "Ningi", "Nini", "Nio", "Nioi", "No", "Noi", "Non", "Nong", "Nongi", "Noni", "Noo", "Nooi", "Nu", "Nua", "Nuai", "Nuan", "Nuang", "Nuangi", "Nuani", "Nuao", "Nuaoi", "Nui", "Nun", "Nung", "Nungi", "Nuni", "Nuo", "Nuoi", "Pa", "Pai", "Pan", "Pang", "Pangi", "Pani", "Pao", "Paoi", "Pe", "Pei", "Pen", "Peng", "Pengi", "Peni", "Peo", "Peoi", "Pi", "Pia", "Piai", "Pian", "Piang", "Piangi", "Piani", "Piao", "Piaoi", "Pii", "Pin", "Ping", "Pingi", "Pini", "Pio", "Pioi", "Po", "Poi", "Pon", "Pong", "Pongi", "Poni", "Poo", "Pooi", "Pu", "Pua", "Puai", "Puan", "Puang", "Puangi", "Puani", "Puao", "Puaoi", "Pui", "Pun", "Pung", "Pungi", "Puni", "Puo", "Puoi", "Qa", "Qai", "Qan", "Qang", "Qangi", "Qani", "Qao", "Qaoi", "Qe", "Qei", "Qen", "Qeng", "Qengi", "Qeni", "Qeo", "Qeoi", "Qi", "Qia", "Qiai", "Qian", "Qiang", "Qiangi", "Qiani", "Qiao", "Qiaoi", "Qii", "Qin", "Qing", "Qingi", "Qini", "Qio", "Qioi", "Qo", "Qoi", "Qon", "Qong", "Qongi", "Qoni", "Qoo", "Qooi", "Qu", "Qua", "Quai", "Quan", "Quang", "Quangi", "Quani", "Quao", "Quaoi", "Qui", "Qun", "Qung", "Qungi", "Quni", "Quo", "Sa", "Sai", "San", "Sang", "Sangi", "Sani", "Sao", "Saoi", "Se", "Sei", "Sen", "Seng", "Sengi", "Seni", "Seo", "Seoi", "Sha", "Shai", "Shan", "Shang", "Shangi", "Shani", "Shao", "Shaoi", "She", "Shei", "Shen", "Sheng", "Shengi", "Sheni", "Sheo", "Sheoi", "Shi", "Shia", "Shiai", "Shian", "Shiang", "Shiangi", "Shiani", "Shiao", "Shiaoi", "Shii", "Shin", "Shing", "Shingi", "Shini", "Shio", "Shioi", "Sho", "Shoi", "Shon", "Shong", "Shongi", "Shoni", "Shoo", "Shooi", "Shu", "Shua", "Shuai", "Shuan", "Shuang", "Shuangi", "Shuani", "Shuao", "Shuaoi", "Shui", "Shun", "Shung", "Shungi", "Shuni", "Shuo", "Shuoi", "Si", "Sia", "Siai", "Sian", "Siang", "Siangi", "Siani", "Siao", "Siaoi", "Sii", "Sin", "Sing", "Singi", "Sini", "Sio", "Sioi", "So", "Soi", "Son", "Song", "Songi", "Soni", "Soo", "Sooi", "Su", "Sua", "Suai", "Suan", "Suang", "Suangi", "Suani", "Suao", "Suaoi", "Sui", "Sun", "Sung", "Sungi", "Suni", "Suo", "Suoi", "Ta", "Tai", "Tan", "Tang", "Tangi", "Tani", "Tao", "Taoi", "Te", "Tei", "Ten", "Teng", "Tengi", "Teni", "Teo", "Teoi", "Ti", "Tia", "Tiai", "Tian", "Tiang", "Tiangi", "Tiani", "Tiao", "Tiaoi", "Tii", "Tin", "Ting", "Tingi", "Tini", "Tio", "Tioi", "To", "Toi", "Ton", "Tong", "Tongi", "Toni", "Too", "Tooi", "Tu", "Tua", "Tuai", "Tuan", "Tuang", "Tuangi", "Tuani", "Tuao", "Tuaoi", "Tui", "Tun", "Tung", "Tungi", "Tuni", "Tuo", "Tuoi", "Va", "Vai", "Van", "Vang", "Vangi", "Vani", "Vao", "Vaoi", "Ve", "Vei", "Ven", "Veng", "Vengi", "Veni", "Veo", "Veoi", "Vi", "Via", "Viai", "Vian", "Viang", "Viangi", "Viani", "Viao", "Viaoi", "Vii", "Vin", "Ving", "Vingi", "Vini", "Vio", "Vioi", "Vo", "Voi", "Von", "Vong", "Vongi", "Voni", "Voo", "Vooi", "Vu", "Vua", "Vuai", "Vuan", "Vuang", "Vuangi", "Vuani", "Vuao", "Vuaoi", "Vui", "Vun", "Vung", "Vungi", "Vuni", "Vuo", "Vuoi", "Wa", "Wai", "Wan", "Wang", "Wangi", "Wani", "Wao", "Waoi", "We", "Wei", "Wen", "Weng", "Wengi", "Weni", "Weo", "Weoi", "Wi", "Wia", "Wiai", "Wian", "Wiang", "Wiangi", "Wiani", "Wiao", "Wiaoi", "Wii", "Win", "Wing", "Wingi", "Wini", "Wio", "Wioi", "Wo", "Woi", "Won", "Wong", "Wongi", "Woni", "Woo", "Wooi", "Wu", "Wua", "Wuai", "Wuan", "Wuang", "Wuangi", "Wuani", "Wuao", "Wuaoi", "Wui", "Wun", "Wung", "Wungi", "Wuni", "Wuo", "Wuoi", "Xa", "Xai", "Xan", "Xang", "Xangi", "Xani", "Xao", "Xaoi", "Xe", "Xei", "Xen", "Xeng", "Xengi", "Xeni", "Xeo", "Xeoi", "Xi", "Xia", "Xiai", "Xian", "Xiang", "Xiangi", "Xiani", "Xiao", "Xiaoi", "Xii", "Xin", "Xing", "Xingi", "Xini", "Xio", "Xioi", "Xo", "Xoi", "Xon", "Xong", "Xongi", "Xoni", "Xoo", "Xooi", "Xu", "Xua", "Xuai", "Xuan", "Xuang", "Xuangi", "Xuani", "Xuao", "Xuaoi", "Xui", "Xun", "Xung", "Xungi", "Xuni", "Xuo", "Xuoi", "Ya", "Yai", "Yan", "Yang", "Yangi", "Yani", "Yao", "Yaoi", "Ye", "Yei", "Yen", "Yeng", "Yengi", "Yeni", "Yeo", "Yeoi", "Yi", "Yia", "Yiai", "Yian", "Yiang", "Yiangi", "Yiani", "Yiao", "Yiaoi", "Yii", "Yin", "Ying", "Yingi", "Yini", "Yio", "Yioi", "Yo", "Yoi", "Yon", "Yong", "Yongi", "Yoni", "Yoo", "Yooi", "Yu", "Yua", "Yuai", "Yuan", "Yuang", "Yuangi", "Yuani", "Yuao", "Yuaoi", "Yui", "Yun", "Yung", "Yungi", "Yuni", "Yuo", "Yuoi", "Za", "Zai", "Zan", "Zang", "Zangi", "Zani", "Zao", "Zaoi", "Ze", "Zei", "Zen", "Zeng", "Zengi", "Zeni", "Zeo", "Zeoi", "Zha", "Zhai", "Zhan", "Zhang", "Zhangi", "Zhani", "Zhao", "Zhaoi", "Zhe", "Zhei", "Zhen", "Zheng", "Zhengi", "Zheni", "Zheo", "Zheoi", "Zhi", "Zhia", "Zhiai", "Zhian", "Zhiang", "Zhiangi", "Zhiani", "Zhiao", "Zhiaoi", "Zhii", "Zhin", "Zhing", "Zhingi", "Zhini", "Zhio", "Zhioi", "Zho", "Zhoi", "Zhon", "Zhong", "Zhongi", "Zhoni", "Zhoo", "Zhooi", "Zhu", "Zhua", "Zhuai", "Zhuan", "Zhuang", "Zhuangi", "Zhuani", "Zhuao", "Zhuaoi", "Zhui", "Zhun", "Zhung", "Zhungi", "Zhuni", "Zhuo", "Zhuoi", "Zi", "Zia", "Ziai", "Zian", "Ziang", "Ziangi", "Ziani", "Ziao", "Ziaoi", "Zii", "Zin", "Zing", "Zingi", "Zini", "Zio", "Zioi", "Zo", "Zoi", "Zon", "Zong", "Zongi", "Zoni", "Zoo", "Zooi", "Zu", "Zua", "Zuai", "Zuan", "Zuang", "Zuangi", "Zuani", "Zuao", "Zuaoi", "Zui", "Zun", "Zung", "Zungi", "Zuni", "Zuo", "Zuoi"} + +-- VERSION -- +RYZOM_NAMES_ZORAI_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua b/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua index 198e9bdd2f..ddc8dd721b 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua @@ -438,3 +438,6 @@ function outgame:loadRPBGPage() getUI("ui:outgame:appear:job_options:rpbg:html"):browse("https://app.ryzom.com/app_arcc/outgame_rpbg.php?lang="..lang.."&slot="..tostring(slot).."&sex="..sex.."&key="..rpbg_key) getUI("https://app.ryzom.com/app_arcc/outgame_rpbg.php?lang="..lang.."&slot="..tostring(slot).."&sex="..sex.."&key="..rpbg_key) end + +-- VERSION -- +RYZOM_OUT_V2_APPEAR_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_select.lua b/ryzom/client/data/gamedev/interfaces_v3/out_v2_select.lua index 7e35b5a438..2e22ea2fe1 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_select.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_select.lua @@ -42,3 +42,6 @@ function game:procCharselClickSlot() local value = getDbProp('UI:SELECTED_SLOT') runAH(nil, "proc", "proc_charsel_clickslot|"..value) end + +-- VERSION -- +RYZOM_OUT_V2_SELECT_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/outpost.lua b/ryzom/client/data/gamedev/interfaces_v3/outpost.lua index 67fb214af5..5ba4f4066b 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/outpost.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/outpost.lua @@ -665,3 +665,6 @@ function game:outpostInitPvpJoinTimer() setOnDraw(uiGroup, 'game:outpostPvpJoinTimerOnDraw()'); end + +-- VERSION -- +RYZOM_OUTPOST_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/player.lua b/ryzom/client/data/gamedev/interfaces_v3/player.lua index b2eee2aa44..f32838dce0 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/player.lua @@ -1030,3 +1030,6 @@ function game:fixVpx(vpx) local nvpx = vpx1:sub(1, string.len(vpx1)-6)..vpx2:sub(string.len(vpx2)-5, string.len(vpx2)) return nvpx end + +-- VERSION -- +RYZOM_PLAYER_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/player_trade.lua b/ryzom/client/data/gamedev/interfaces_v3/player_trade.lua index f80911a100..f29f6ca55a 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/player_trade.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/player_trade.lua @@ -30,3 +30,6 @@ function getBulk(inventory) local bulk = runExpr("getItemsBulk('LOCAL:EXCHANGE:"..inventory.."', 0," .. slots .. ")"); return math.floor(bulk * 100) / 100; end + +-- VERSION -- +RYZOM_PLAYER_TRADE_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/ring_access_point.lua b/ryzom/client/data/gamedev/interfaces_v3/ring_access_point.lua index ca04561f1e..0799c8447f 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ring_access_point.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ring_access_point.lua @@ -942,3 +942,6 @@ function RingAccessPoint:newScenario() end end + +-- VERSION -- +RYZOM_RING_ACCESS_POINT_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/ring_access_point_filter.lua b/ryzom/client/data/gamedev/interfaces_v3/ring_access_point_filter.lua index 44a0451d75..a9f56fb95d 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ring_access_point_filter.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ring_access_point_filter.lua @@ -119,3 +119,6 @@ function game.RingAccessPointFilter:validate() end + +-- VERSION -- +RYZOM_RING_ACCESS_POINT_FILTER_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/ring_window.lua b/ryzom/client/data/gamedev/interfaces_v3/ring_window.lua index dfec3edc4b..bad00bf25e 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ring_window.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ring_window.lua @@ -15,3 +15,6 @@ function onRingWindowShown() firstBrowseDone = true end end + +-- VERSION -- +RYZOM_RING_WINDOW_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/ryzhome_toolbar.lua b/ryzom/client/data/gamedev/interfaces_v3/ryzhome_toolbar.lua index 5fd43364ba..906a3421f9 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ryzhome_toolbar.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ryzhome_toolbar.lua @@ -234,3 +234,6 @@ function RyzhomePlace:close() --runAH(nil, "remove_shapes", "") getUI("ui:interface:webig_ryzhome_place_item").active=false end + +-- VERSION -- +RYZOM_RYZHOME_TOOLBAR_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua b/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua index 78d02648ca..ea155fbfdc 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua @@ -624,3 +624,6 @@ function SceneEditor:get_html(message, message_bg) end end + +-- VERSION -- +RYZOM_SCENEEDIT_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/taskbar.lua b/ryzom/client/data/gamedev/interfaces_v3/taskbar.lua index 635025f0ee..043d6f8f5a 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/taskbar.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/taskbar.lua @@ -94,3 +94,6 @@ function game:updateMilkoKey(key, status) game:resizeMilkoPad() end + +-- VERSION -- +RYZOM_TASKBAR_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/tp_interface.lua b/ryzom/client/data/gamedev/interfaces_v3/tp_interface.lua index b9ee004710..fef2fda33b 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/tp_interface.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/tp_interface.lua @@ -836,3 +836,6 @@ function artefact:startInterface(cult) end -- -- + +-- VERSION -- +RYZOM_TP_INTERFACE_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua b/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua index 77f9585551..1845df8c79 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua @@ -130,3 +130,6 @@ if WebQueue.doinit then addOnDbChange(getUI("ui:interface:webqueue"), "@UI:VARIABLES:CURRENT_SERVER_TICK", "WebQueue:loop()") end + +-- VERSION -- +RYZOM_WEB_QUEUE_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/webbrowser.lua b/ryzom/client/data/gamedev/interfaces_v3/webbrowser.lua index 22bedb1ba0..fdb36c76c6 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/webbrowser.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/webbrowser.lua @@ -243,3 +243,6 @@ function WebBrowser:onClickHome() html:browse("home") end end + +-- VERSION -- +RYZOM_WEBBROWSER_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/webig.lua b/ryzom/client/data/gamedev/interfaces_v3/webig.lua index 52d5a8f268..d34fb372e9 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/webig.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/webig.lua @@ -248,3 +248,6 @@ end + +-- VERSION -- +RYZOM_WEBIG_VERSION = 10469 \ No newline at end of file From eda519bf8ddba4503daef902413967212bbdf001 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Wed, 7 Jun 2023 17:25:11 +0200 Subject: [PATCH 045/194] Fix lua version --- ryzom/client/data/gamedev/interfaces_v3/appzone.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/ark.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/base64.lua | 4 ---- ryzom/client/data/gamedev/interfaces_v3/bg_downloader.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/bot_chat_v4.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/compass.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/game_config.lua | 2 +- .../client/data/gamedev/interfaces_v3/game_r2_loading.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/guild.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/help.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/info_player.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/info_player.xml | 8 ++++---- ryzom/client/data/gamedev/interfaces_v3/interaction.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/interaction.xml | 2 +- ryzom/client/data/gamedev/interfaces_v3/inventory.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/json.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/map.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/misc.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/names_fyros.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/names_matis.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/names_tryker.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/names_zorai.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/out_v2_select.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/outpost.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/player.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/player_trade.lua | 2 +- .../data/gamedev/interfaces_v3/ring_access_point.lua | 2 +- .../gamedev/interfaces_v3/ring_access_point_filter.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/ring_window.lua | 2 +- .../client/data/gamedev/interfaces_v3/ryzhome_toolbar.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/taskbar.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/tp_interface.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/web_queue.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/webbrowser.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/webig.lua | 2 +- 38 files changed, 40 insertions(+), 44 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/appzone.lua b/ryzom/client/data/gamedev/interfaces_v3/appzone.lua index 878ea0a7b3..b04472d307 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/appzone.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/appzone.lua @@ -192,4 +192,4 @@ function AppZone:handle(cmd) end -- VERSION -- -RYZOM_APPZONE_VERSION = 10469 \ No newline at end of file +RYZOM_APPZONE_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark.lua b/ryzom/client/data/gamedev/interfaces_v3/ark.lua index ac32ba43eb..fc9ba53d7c 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark.lua @@ -623,4 +623,4 @@ end -- VERSION -- -RYZOM_ARK_VERSION = 10469 \ No newline at end of file +RYZOM_ARK_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua b/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua index 59a0541822..a222e416f0 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark_lessons.lua @@ -421,4 +421,4 @@ end -- VERSION -- -RYZOM_ARK_LESSONS_VERSION = 10469 \ No newline at end of file +RYZOM_ARK_LESSONS_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/base64.lua b/ryzom/client/data/gamedev/interfaces_v3/base64.lua index 60aab44bed..c5fa529d46 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/base64.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/base64.lua @@ -199,7 +199,3 @@ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------ --]] - - --- VERSION -- -RYZOM_BASE64_VERSION = 10469 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/bg_downloader.lua b/ryzom/client/data/gamedev/interfaces_v3/bg_downloader.lua index 2264e48246..8a0789da9f 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/bg_downloader.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/bg_downloader.lua @@ -180,4 +180,4 @@ function bgdownloader:inGamePatchUncompleteWarning() displaySystemInfo(i18n.get("uiBGD_InGamePatchIncompleteBC"), "BC") end -- VERSION -- -RYZOM_BG_DOWNLOADER_VERSION = 10469 \ No newline at end of file +RYZOM_BG_DOWNLOADER_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/bot_chat_v4.lua b/ryzom/client/data/gamedev/interfaces_v3/bot_chat_v4.lua index ab145ecff8..1398b33e8c 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/bot_chat_v4.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/bot_chat_v4.lua @@ -64,4 +64,4 @@ function game:bcMissionsUpdate() end -- VERSION -- -RYZOM_BOT_CHAT_V4_VERSION = 10469 \ No newline at end of file +RYZOM_BOT_CHAT_V4_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/compass.lua b/ryzom/client/data/gamedev/interfaces_v3/compass.lua index df4727b1c9..9772d4083c 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/compass.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/compass.lua @@ -50,4 +50,4 @@ end setOnDraw(getUI("ui:interface:compass"), "game:updateCompass()") -- VERSION -- -RYZOM_COMPASS_VERSION = 10469 \ No newline at end of file +RYZOM_COMPASS_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/game_config.lua b/ryzom/client/data/gamedev/interfaces_v3/game_config.lua index c33e62fd6b..4e699cdb7c 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/game_config.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/game_config.lua @@ -200,4 +200,4 @@ function game:configInit() end -- VERSION -- -RYZOM_GAME_CONFIG_VERSION = 10469 \ No newline at end of file +RYZOM_GAME_CONFIG_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/game_r2_loading.lua b/ryzom/client/data/gamedev/interfaces_v3/game_r2_loading.lua index 2ad99629ec..d698e2c4ea 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/game_r2_loading.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/game_r2_loading.lua @@ -638,4 +638,4 @@ end -- VERSION -- -RYZOM_GAME_R2_LOADING_VERSION = 10469 \ No newline at end of file +RYZOM_GAME_R2_LOADING_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/guild.lua b/ryzom/client/data/gamedev/interfaces_v3/guild.lua index 2d33203486..e37e5f1862 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/guild.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/guild.lua @@ -98,4 +98,4 @@ function game:guildDeactive() end -- VERSION -- -RYZOM_GUILD_VERSION = 10469 \ No newline at end of file +RYZOM_GUILD_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/help.lua b/ryzom/client/data/gamedev/interfaces_v3/help.lua index 9d3d437531..e5279ccac1 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/help.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/help.lua @@ -142,4 +142,4 @@ end -- VERSION -- -RYZOM_HELP_VERSION = 10469 \ No newline at end of file +RYZOM_HELP_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/info_player.lua b/ryzom/client/data/gamedev/interfaces_v3/info_player.lua index 3073321a45..7cfe901eca 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/info_player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/info_player.lua @@ -2198,4 +2198,4 @@ end -- VERSION -- -RYZOM_INFO_PLAYER_VERSION = 10469 \ No newline at end of file +RYZOM_INFO_PLAYER_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/info_player.xml b/ryzom/client/data/gamedev/interfaces_v3/info_player.xml index 0b5af31f3e..b5036babf0 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/info_player.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/info_player.xml @@ -847,13 +847,13 @@ </group> <tree node="npc_web_browser" /> - <template name="ark_mission" w="45" h="45" ctrl_h="44" keep="true" icon="blank.tga" tooltip="" text1="" text2="" text3="" text1_color="255 255 255 255" text2_color="255 255 255 255" text3_color="255 255 255 255" color="0 0 0 0" color_over="255 255 255 50" shadow="true" bg="w_slot_item.tga" params_l="" params_r="" tx_over="blank.tga" icon_x="0" icon_y="0" text_x="4" text_y="0"> + <template name="ark_mission" w="45" h="45" ctrl_h="44" keep="true" icon="blank.tga" tooltip="" text1="" text2="" text3="" text1_color="255 255 255 255" text2_color="255 255 255 255" text3_color="255 255 255 255" color="0 0 0 0" color_over="255 255 255 50" shadow="true" bg="w_slot_item.tga" params_l="" params_r="" tx_over="blank.tga" icon_x="0" icon_y="0" text_x="4" text_y="0" font_size="10"> <group id="#id" posref="MM MM" w="0" h="#h" x="0" y="0" sizeref="w"> <view type="bitmap" id="back" posref="ML ML" x="0" y="0" h="#h" w="#w" scale="true" texture="#bg" color="#color" global_color="false" /> <view type="bitmap" id="icon" posref="ML ML" w="40" h="40" scale="true" x="4" y="0" render_layer="3" posparent="back" texture="#icon" global_color="false" /> - <view type="text" id="text1" x="#text_x" y="#text_y" w="0" sizeref="w" posparent="icon" posref="TR TL" color="#text1_color" shadow="#shadow" fontsize="10" hardtext="#text1" global_color="false" multi_line="true" /> - <view type="text" id="text2" x="0" y="0" w="0" sizeref="w" posparent="text1" color="#text2_color" posref="BL TL" shadow="#shadow" fontsize="10" hardtext="#text2" global_color="false" multi_line_space="0" multi_line="true" /> - <view type="text" id="text3" x="0" y="0" w="0" sizeref="w" posparent="text2" color="#text3_color" posref="BL TL" shadow="#shadow" fontsize="10" hardtext="#text3" global_color="false" multi_line="false" /> + <view type="text" id="text1" x="#text_x" y="#text_y" w="0" sizeref="w" posparent="icon" posref="TR TL" color="#text1_color" format_taged="true" shadow="#shadow" fontsize="#font_size" hardtext="#text1" global_color="false" multi_line="true" /> + <view type="text" id="text2" x="0" y="0" w="0" sizeref="w" posparent="text1" color="#text2_color" posref="BL TL" format_taged="true" shadow="#shadow" fontsize="#font_size" hardtext="#text2" global_color="false" multi_line_space="2" multi_line="true" /> + <view type="text" id="text3" x="0" y="0" w="0" sizeref="w" posparent="text2" color="#text3_color" posref="BL TL" format_taged="true" shadow="#shadow" fontsize="#font_size" hardtext="#text3" global_color="false" multi_line="false" /> <ctrl type="button" id="ctrl" button_type="push_button" global_color_normal="false" posref="ML ML" w="-6" x="1" y="0" tx_normal="#tx_over" tx_pushed="#bg" tx_over="#tx_over" scale="true" sizeref="w" h="#ctrl_h" tooltip="#tooltip" color="#color" col_over="#color_over" col_pushed="255 255 255 0" onclick_l="lua" params_l="#params_l" onclick_r="lua" params_r="#params_r" /> </group> </template> diff --git a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua index 2c351f90b2..8a281d924d 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua @@ -1290,4 +1290,4 @@ function arkNpcShop:Buy(id) end -- VERSION -- -RYZOM_INTERACTION_VERSION = 10469 \ No newline at end of file +RYZOM_INTERACTION_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/interaction.xml b/ryzom/client/data/gamedev/interfaces_v3/interaction.xml index 53af8d1117..ab219f874f 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/interaction.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/interaction.xml @@ -3341,7 +3341,7 @@ <group id="#id" posref="MM MM" w="#w" h="45" x="#x" y="#y" sizeref="" render_layer="#render_layer1"> <ctrl type="sheet" tooltip="#text" onclick_r="open_help_auto" active="#usesheet" id="sheet" value="#sheetdb" posref="MR MR" y="0" x="0" render_layer="#render_layer3" use_quality="true" use_quantity="true" /> <view type="bitmap" id="back" posref="ML ML" h="40" w="40" scale="true" x="0" y="0" render_layer="#render_layer1" texture="points_atys.tga" global_color="false" /> - <view type="bitmap" id="back2" posref="MM MM" posparent="back" h="40" w="40" scale="false" x="0" y="0" render_layer="#render_layer2" texture="https://app.ryzom.com/app_arcc/data/app/Scripts//1/5/0/4/assets/mission_elyps.png" global_color="false" /> + <view type="bitmap" id="back2" posref="MM MM" posparent="back" h="40" w="40" scale="false" x="0" y="0" render_layer="#render_layer2" texture="mission_elyps.tga" global_color="false" /> <view type="text" id="text1" posref="TR TL" posparent="back" x="5" y="1" format_taged="true" fontsize="8" hardtext="#text" color="#color1" shadow="true" global_color="#gc1" /> <view type="text" id="text2" posref="BL TL" posparent="text1" x="0" y="2" format_taged="true" fontsize="#fontsize" hardtext="#text2" color="#color2" shadow="true" global_color="#gc2" /> <ctrl type="button" id="ctrl" button_type="push_button" global_color_normal="false" posref="ML ML" x="1" y="0" tx_normal="blank.tga" tx_pushed="blank.tga" tx_over="blank.tga" scale="true" w="#w" h="40" color="#ctrlcolor" col_over="#colover" col_pushed="#colover" render_layer="#render_layer2" onclick_l="lua" params_l="#params_l" onclick_r="lua" params_r="#params_r" /> diff --git a/ryzom/client/data/gamedev/interfaces_v3/inventory.lua b/ryzom/client/data/gamedev/interfaces_v3/inventory.lua index b2f3b82c39..47ccd49f5f 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/inventory.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/inventory.lua @@ -76,4 +76,4 @@ function game:updateEquipOnResize(base, force) end end -- VERSION -- -RYZOM_INVENTORY_VERSION = 10469 \ No newline at end of file +RYZOM_INVENTORY_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/json.lua b/ryzom/client/data/gamedev/interfaces_v3/json.lua index 5de24111cc..02410d78f6 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/json.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/json.lua @@ -376,4 +376,4 @@ function Json.decode(str) end -- VERSION -- -RYZOM_JSON_VERSION = 10469 \ No newline at end of file +RYZOM_JSON_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/map.lua b/ryzom/client/data/gamedev/interfaces_v3/map.lua index 54f4a27855..c06b363120 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/map.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/map.lua @@ -271,4 +271,4 @@ game:addMapArkPoint("Vip", 4154, -3305, "vip_allegory", "", "allegory_16.tga", " -- game:setAltMap("fyros_map.tga", "fyros_map_sp.tga") -- VERSION -- -RYZOM_MAP_VERSION = 10469 \ No newline at end of file +RYZOM_MAP_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/misc.lua b/ryzom/client/data/gamedev/interfaces_v3/misc.lua index ac920e5912..6effaa6866 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/misc.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/misc.lua @@ -136,4 +136,4 @@ function misc:initInvObserver( end -- VERSION -- -RYZOM_MISC_VERSION = 10469 \ No newline at end of file +RYZOM_MISC_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/names_fyros.lua b/ryzom/client/data/gamedev/interfaces_v3/names_fyros.lua index d6e0cbf2cf..da40220d2c 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/names_fyros.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/names_fyros.lua @@ -295,4 +295,4 @@ fyrosLastNames = {"Abyan", "Abybus", "Abycaon", "Abycus", "Abydix", "Abydon", "A , "Dethus", "Detis", "Deton", "Deuan", "Deubus", "Deucaon", "Deucus", "Deudix", "Deudon", "Deudos", "Deuion", "Deukos", "Deula", "Deulaus", "Deulion", "Deullo", "Deulus", "Deumus", "Deun", "Deunix", "Deups", "Deurius", "Deuron", "Deuros", "Deurus", "Deuseus", "Deusse", "Deutheus", "Deuthus", "Deutis", "Deuton", "Deuxius", "Dexius", "Dioan", "Diobus", "Diocaon", "Diocus", "Diodix", "Diodon", "Diodos", "Dioion", "Diokos", "Diola", "Diolaus", "Diolion", "Diollo", "Diolus", "Diomus", "Dion", "Dionix", "Diops", "Diorius", "Dioron", "Dioros", "Diorus", "Dioseus", "Diosse", "Diotheus", "Diothus", "Diotis", "Dioton", "Dioxius", "Dyan", "Dybus", "Dycaon", "Dycus", "Dydix", "Dydon", "Dydos", "Dyion", "Dykos", "Dyla", "Dylaus", "Dylion", "Dyllo", "Dylus", "Dymus", "Dyn", "Dynix", "Dyps", "Dyrius", "Dyron", "Dyros", "Dyrus", "Dyseus", "Dysse", "Dytheus", "Dythus", "Dytis", "Dyton", "Dyxius", "Euan", "Eubus", "Eucaon", "Eucus", "Eudix", "Eudon", "Eudos", "Euion", "Eukos", "Eula", "Eulaus", "Eulion", "Eullo", "Eulus", "Eumus", "Eun", "Eunix", "Eups", "Eurius", "Euron", "Euros", "Eurus", "Euseus", "Eusse", "Eutheus", "Euthus", "Eutis", "Euton", "Euxius", "Gaan", "Gabus", "Gacaon", "Gacus", "Gadix", "Gadon", "Gados", "Gaion", "Gakos", "Gala", "Galaus", "Galion", "Gallo", "Galus", "Gamus", "Gan", "Ganix", "Gaps", "Garius", "Garon", "Garos", "Garus", "Gaseus", "Gasse", "Gatheus", "Gathus", "Gatis", "Gaton", "Gaxius", "Ibian", "Ibibus", "Ibicaon", "Ibicus", "Ibidix", "Ibidon", "Ibidos", "Ibiion", "Ibikos", "Ibila", "Ibilaus", "Ibilion", "Ibillo", "Ibilus", "Ibimus", "Ibin", "Ibinix", "Ibips", "Ibirius", "Ibiron", "Ibiros", "Ibirus", "Ibiseus", "Ibisse", "Ibitheus", "Ibithus", "Ibitis", "Ibiton", "Ibixius", "Icaan", "Icabus", "Icacaon", "Icacus", "Icadix", "Icadon", "Icados", "Icaion", "Icakos", "Icala", "Icalaus", "Icalion", "Icallo", "Icalus", "Icamus", "Ican", "Icanix", "Icaps", "Icarius", "Icaron", "Icaros", "Icarus", "Icaseus", "Icasse", "Icatheus", "Icathus", "Icatis", "Icaton", "Icaxius", "Ioan", "Iobus", "Iocaon", "Iocus", "Iodix", "Iodon", "Iodos", "Ioion", "Iokos", "Iola", "Iolaus", "Iolion", "Iollo", "Iolus", "Iomus", "Ion", "Ionix", "Iops", "Iorius", "Ioron", "Ioros", "Iorus", "Ioseus", "Iosse", "Iotheus", "Iothus", "Iotis", "Ioton", "Ioxius", "Krian", "Kribus", "Kricaon", "Kricus", "Kridix", "Kridon", "Kridos", "Kriion", "Krikos", "Krila", "Krilaus", "Krilion", "Krillo", "Krilus", "Krimus", "Krin", "Krinix", "Krips", "Kririus", "Kriron", "Kriros", "Krirus", "Kriseus", "Krisse", "Kritheus", "Krithus", "Kritis", "Kriton", "Krixius", "Kyan", "Kybus", "Kycaon", "Kycus", "Kydix", "Kydon", "Kydos", "Kyion", "Kykos", "Kyla", "Kylaus", "Kylion", "Kyllo", "Kylus", "Kymus", "Kyn", "Kynix", "Kyps", "Kyrius", "Kyron", "Kyros", "Kyrus", "Kyseus", "Kysse", "Kytheus", "Kythus", "Kytis", "Kyton", "Kyxius", "Lyan", "Lybus", "Lycaon", "Lycus", "Lydix", "Lydon", "Lydos", "Lyion", "Lykos", "Lyla", "Lylaus", "Lylion", "Lyllo", "Lylus", "Lymus", "Lyn", "Lynix", "Lyps", "Lyrius", "Lyron", "Lyros", "Lyrus", "Lyseus", "Lysse", "Lytheus", "Lythus", "Lytis", "Lyton", "Lyxius", "Mean", "Mebus", "Mecaon", "Mecus", "Medix", "Medon", "Medos", "Meion", "Mekos", "Mela", "Melaus", "Melion", "Mello", "Melus", "Memus", "Men", "Menix", "Meps", "Merius", "Meron", "Meros", "Merus", "Meseus", "Messe", "Metheus", "Methus", "Metis", "Meton", "Mexius", "Mian", "Mibus", "Micaon", "Micus", "Midix", "Midon", "Midos", "Miion", "Mikos", "Mila", "Milaus", "Milion", "Millo", "Milus", "Mimus", "Min", "Minix", "Mips", "Mirius", "Miron", "Miros", "Mirus", "Miseus", "Misse", "Mitheus", "Mithus", "Mitis", "Miton", "Mixius", "Pean", "Pebus", "Pecaon", "Pecus", "Pedix", "Pedon", "Pedos", "Peion", "Pekos", "Pela", "Pelaus", "Pelion", "Pello", "Pelus", "Pemus", "Pen", "Penix", "Peps", "Perius", "Peron", "Peros", "Perus", "Peseus", "Pesse", "Petheus", "Pethus", "Petis", "Peton", "Pexius", "Pian", "Pibus", "Picaon", "Picus", "Pidix", "Pidon", "Pidos", "Piion", "Pikos", "Pila", "Pilaus", "Pilion", "Pillo", "Pilus", "Pimus", "Pin", "Pinix", "Pips", "Pirius", "Piron", "Piros", "Pirus", "Piseus", "Pisse", "Pitheus", "Pithus", "Pitis", "Piton", "Pixius", "Plean", "Plebus", "Plecaon", "Plecus", "Pledix", "Pledon", "Pledos", "Pleion", "Plekos", "Plela", "Plelaus", "Plelion", "Plello", "Plelus", "Plemus", "Plen", "Plenix", "Pleps", "Plerius", "Pleron", "Pleros", "Plerus", "Pleseus", "Plesse", "Pletheus", "Plethus", "Pletis", "Pleton", "Plexius", "Pyan", "Pybus", "Pycaon", "Pycus", "Pydix", "Pydon", "Pydos", "Pyion", "Pykos", "Pyla", "Pylaus", "Pylion", "Pyllo", "Pylus", "Pymus", "Pyn", "Pynix", "Pyps", "Pyrius", "Pyron", "Pyros", "Pyrus", "Pyseus", "Pysse", "Pytheus", "Pythus", "Pytis", "Pyton", "Pyxius", "Thean", "Thebus", "Thecaon", "Thecus", "Thedix", "Thedon", "Thedos", "Theion", "Thekos", "Thela", "Thelaus", "Thelion", "Thello", "Thelus", "Themus", "Then", "Thenix", "Theps", "Therius", "Theron", "Theros", "Therus", "Theseus", "Thesse", "Thetheus", "Thethus", "Thetis", "Theton", "Thexius", "Tian", "Tibus", "Ticaon", "Ticus", "Tidix", "Tidon", "Tidos", "Tiion", "Tikos", "Tila", "Tilaus", "Tilion", "Tillo", "Tilus", "Timus", "Tin", "Tinix", "Tips", "Tirius", "Tiron", "Tiros", "Tirus", "Tiseus", "Tisse", "Titheus", "Tithus", "Titis", "Titon", "Tixius", "Ulyan", "Ulybus", "Ulycaon", "Ulycus", "Ulydix", "Ulydon", "Ulydos", "Ulyion", "Ulykos", "Ulyla", "Ulylaus", "Ulylion", "Ulyllo", "Ulylus", "Ulymus", "Ulyn", "Ulynix", "Ulyps", "Ulyrius", "Ulyron", "Ulyros", "Ulyrus", "Ulyseus", "Ulysse", "Ulytheus", "Ulythus", "Ulytis", "Ulyton", "Ulyxius", "Xaan", "Xabus", "Xacaon", "Xacus", "Xadix", "Xadon", "Xados", "Xaion", "Xakos", "Xala", "Xalaus", "Xalion", "Xallo", "Xalus", "Xamus", "Xan", "Xanix", "Xaps", "Xarius", "Xaron", "Xaros", "Xarus", "Xaseus", "Xasse", "Xatheus", "Xathus", "Xatis", "Xaton", "Xaxius", "Xyan", "Xybus", "Xycaon", "Xycus", "Xydix", "Xydon", "Xydos", "Xyion", "Xykos", "Xyla", "Xylaus", "Xylion", "Xyllo", "Xylus", "Xymus", "Xyn", "Xynix", "Xyps", "Xyrius", "Xyron", "Xyros", "Xyrus", "Xyseus", "Xysse", "Xytheus", "Xythus", "Xytis", "Xyton", "Xyxius", "Zean", "Zebus", "Zecaon", "Zecus", "Zedix", "Zedon", "Zedos", "Zeion", "Zekos", "Zela", "Zelaus", "Zelion", "Zello", "Zelus", "Zemus", "Zen", "Zenix", "Zeps", "Zerius", "Zeron", "Zeros", "Zerus", "Zeseus", "Zesse", "Zetheus", "Zethus", "Zetis", "Zeton", "Zexius"} -- VERSION -- -RYZOM_NAMES_FYROS_VERSION = 10469 \ No newline at end of file +RYZOM_NAMES_FYROS_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/names_matis.lua b/ryzom/client/data/gamedev/interfaces_v3/names_matis.lua index f0c1954e79..0be4791390 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/names_matis.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/names_matis.lua @@ -3,4 +3,4 @@ matisFemaleFirstNames = {"Anibi", "Anichi", "Anichini", "Anidi", "Anilli", "Anin matisMaleFirstNames = {"Anibre", "Aniccio", "Anicco", "Anichio", "Anicho", "Aniero", "Anigio", "Anigno", "Anillo", "Anilo", "Anine", "Aninio", "Anino", "Anirgio", "Aniro", "Anisse", "Anivaldo", "Anizzo", "Antobre", "Antoccio", "Antocco", "Antochio", "Antocho", "Antoero", "Antogio", "Antogno", "Antollo", "Antolo", "Antone", "Antonio", "Antono", "Antorgio", "Antoro", "Antosse", "Antovaldo", "Antozzo", "Bebre", "Beccio", "Becco", "Bechio", "Becho", "Beero", "Begio", "Begno", "Bello", "Belo", "Bene", "Benio", "Beno", "Bergio", "Bero", "Besse", "Bevaldo", "Bezzo", "Chiabre", "Chiaccio", "Chiacco", "Chiachio", "Chiacho", "Chiaero", "Chiagio", "Chiagno", "Chiallo", "Chialo", "Chiane", "Chianio", "Chiano", "Chiargio", "Chiaro", "Chiasse", "Chiavaldo", "Chiazzo", "Cibre", "Ciccio", "Cicco", "Cichio", "Cicho", "Ciero", "Cigio", "Cigno", "Cillo", "Cilo", "Cine", "Cinio", "Cino", "Ciobre", "Cioccio", "Ciocco", "Ciochio", "Ciocho", "Cioero", "Ciogio", "Ciogno", "Ciollo", "Ciolo", "Cione", "Cionio", "Ciono", "Ciorgio", "Cioro", "Ciosse", "Ciovaldo", "Ciozzo", "Cirgio", "Ciro", "Cisse", "Civaldo", "Cizzo", "Cuibre", "Cuiccio", "Cuicco", "Cuichio", "Cuiero", "Cuigio", "Cuigno", "Cuillo", "Cuilo", "Cuine", "Cuinio", "Cuino", "Cuirgio", "Cuiro", "Cuisse", "Cuivaldo", "Cuizzo", "Frebre", "Freccio", "Frecco", "Frechio", "Frecho", "Freero", "Fregio", "Fregno", "Frello", "Frelo", "Frene", "Frenio", "Freno", "Frergio", "Frero", "Fresse", "Frevaldo", "Frezzo", "Gibre", "Giccio", "Gicco", "Gichio", "Gicho", "Giero", "Gigio", "Gigno", "Gillo", "Gilo", "Gine", "Ginio", "Gino", "Girgio", "Giro", "Gisse", "Givaldo", "Gizzo", "Libre", "Liccio", "Licco", "Lichio", "Licho", "Liero", "Ligio", "Ligno", "Lillo", "Lilo", "Line", "Linio", "Lino", "Lirgio", "Liro", "Lisse", "Livaldo", "Lizzo", "Miabre", "Miaccio", "Miacco", "Miachio", "Miacho", "Miaero", "Miagio", "Miagno", "Miallo", "Mialo", "Miane", "Mianio", "Miano", "Miargio", "Miaro", "Miasse", "Miavaldo", "Miazzo", "Nibre", "Niccio", "Nicco", "Nichio", "Nicho", "Niero", "Nigio", "Nigno", "Nillo", "Nilo", "Nine", "Ninio", "Nino", "Nirgio", "Niro", "Nisse", "Nivaldo", "Nizzo", "Pebre", "Peccio", "Pecco", "Pechio", "Pecho", "Peero", "Pegio", "Pegno", "Pello", "Pelo", "Pene", "Penio", "Peno", "Pergio", "Pero", "Pesse", "Pevaldo", "Pezzo", "Pibre", "Piccio", "Picco", "Pichio", "Picho", "Piero", "Pigio", "Pigno", "Pillo", "Pilo", "Pine", "Pinio", "Pino", "Pirgio", "Piro", "Pisse", "Pivaldo", "Pizzo", "Robre", "Roccio", "Rocco", "Rochio", "Rocho", "Roero", "Rogio", "Rogno", "Rollo", "Rolo", "Rone", "Ronio", "Rono", "Rorgio", "Roro", "Rosibre", "Rosiccio", "Rosicco", "Rosichio", "Rosicho", "Rosiero", "Rosigio", "Rosigno", "Rosillo", "Rosilo", "Rosine", "Rosinio", "Rosino", "Rosirgio", "Rosiro", "Rosisse", "Rosivaldo", "Rosizzo", "Rosse", "Rovaldo", "Rozzo", "Sibre", "Siccio", "Sicco", "Sichio", "Sicho", "Siero", "Sigio", "Signo", "Sillo", "Silo", "Sine", "Sinio", "Sino", "Sirgio", "Siro", "Sisse", "Sivaldo", "Sizzo", "Stabre", "Staccio", "Stacco", "Stachio", "Stacho", "Staero", "Stagio", "Stagno", "Stallo", "Stalo", "Stane", "Stanio", "Stano", "Stargio", "Staro", "Stasse", "Stavaldo", "Stazzo", "Tinabre", "Tinaccio", "Tinacco", "Tinachio", "Tinacho", "Tinaero", "Tinagio", "Tinagno", "Tinallo", "Tinalo", "Tinane", "Tinanio", "Tinano", "Tinargio", "Tinaro", "Tinasse", "Tinavaldo", "Tinazzo", "Tribre", "Triccio", "Tricco", "Trichio", "Tricho", "Triero", "Trigio", "Trigno", "Trillo", "Trilo", "Trine", "Trinio", "Trino", "Trirgio", "Triro", "Trisse", "Trivaldo", "Trizzo", "Vabre", "Vaccio", "Vacco", "Vachio", "Vacho", "Vaero", "Vagio", "Vagno", "Vallo", "Valo", "Vane", "Vanio", "Vano", "Vargio", "Varo", "Vasse", "Vavaldo", "Vazzo", "Vibre", "Viccio", "Vicco", "Vichio", "Vicho", "Viero", "Vigio", "Vigno", "Villo", "Vilo", "Vine", "Vinio", "Vino", "Virgio", "Viro", "Visse", "Vivaldo", "Vizzo", "Zabre", "Zaccio", "Zacco", "Zachio", "Zacho", "Zaero", "Zagio", "Zagno", "Zallo", "Zalo", "Zane", "Zanio", "Zano", "Zargio", "Zaro", "Zasse", "Zavaldo", "Zazzo", "Andrea", "Chiabre", "Aninne", "Gibre", "Fresse", "Liche", "Nirni", "Pechi"} -- VERSION -- -RYZOM_NAMES_MATIS_VERSION = 10469 \ No newline at end of file +RYZOM_NAMES_MATIS_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/names_tryker.lua b/ryzom/client/data/gamedev/interfaces_v3/names_tryker.lua index d3aa20da5f..686fe220bf 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/names_tryker.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/names_tryker.lua @@ -2,4 +2,4 @@ trykerFirstNames = {"Abban", "Abben", "Abber", "Abbie", "Abby", "Achan", "Achen" trykerLastNames = {"Ardan", "Arddy", "Arer", "Arffy", "Argan", "Arggan", "Argh", "Arghan", "Arins", "Arkry", "Arlan", "Arle", "Arley", "Arliam", "Arlly", "Arn", "Arnin", "Arny", "Arppy", "Arpsey", "Arra", "Arroy", "Arrrell", "Arrroy", "Arry", "Arssey", "Artty", "Arty", "Ba'ardan", "Ba'arddy", "Ba'arer", "Ba'arffy", "Ba'argan", "Ba'arggan", "Ba'argh", "Ba'arghan", "Ba'arins", "Ba'arkry", "Ba'arlan", "Ba'arle", "Ba'arley", "Ba'arliam", "Ba'arlly", "Ba'arn", "Ba'arnin", "Ba'arny", "Ba'arppy", "Ba'arpsey", "Ba'arra", "Ba'arroy", "Ba'arrrell", "Ba'arrroy", "Ba'arry", "Ba'arssey", "Ba'artty", "Ba'arty", "Ba'bidan", "Ba'biddy", "Ba'bier", "Ba'biffy", "Ba'bigan", "Ba'biggan", "Ba'bigh", "Ba'bighan", "Ba'biins", "Ba'bikry", "Ba'bilan", "Ba'bile", "Ba'biley", "Ba'biliam", "Ba'billy", "Ba'bin", "Ba'binin", "Ba'biny", "Ba'bippy", "Ba'bipsey", "Ba'bira", "Ba'biroy", "Ba'birrell", "Ba'birroy", "Ba'biry", "Ba'bissey", "Ba'bitty", "Ba'bity", "Ba'caudan", "Ba'cauddy", "Ba'cauer", "Ba'cauffy", "Ba'caugan", "Ba'cauggan", "Ba'caugh", "Ba'caughan", "Ba'cauins", "Ba'caukry", "Ba'caulan", "Ba'caule", "Ba'cauley", "Ba'cauliam", "Ba'caully", "Ba'caun", "Ba'caunin", "Ba'cauny", "Ba'cauppy", "Ba'caupsey", "Ba'caura", "Ba'cauroy", "Ba'caurrell", "Ba'caurroy", "Ba'caury", "Ba'caussey", "Ba'cautty", "Ba'cauty", "Ba'dadan", "Ba'daddy", "Ba'daer", "Ba'daffy", "Ba'dagan", "Ba'daggan", "Ba'dagh", "Ba'daghan", "Ba'dains", "Ba'dakry", "Ba'dalan", "Ba'dale", "Ba'daley", "Ba'daliam", "Ba'dally", "Ba'dan", "Ba'danin", "Ba'dany", "Ba'dappy", "Ba'dapsey", "Ba'dara", "Ba'dardan", "Ba'darddy", "Ba'darer", "Ba'darffy", "Ba'dargan", "Ba'darggan", "Ba'dargh", "Ba'darghan", "Ba'darins", "Ba'darkry", "Ba'darlan", "Ba'darle", "Ba'darley", "Ba'darliam", "Ba'darlly", "Ba'darn", "Ba'darnin", "Ba'darny", "Ba'daroy", "Ba'darppy", "Ba'darpsey", "Ba'darra", "Ba'darrell", "Ba'darroy", "Ba'darrrell", "Ba'darrroy", "Ba'darry", "Ba'darssey", "Ba'dartty", "Ba'darty", "Ba'dary", "Ba'dassey", "Ba'datty", "Ba'daty", "Ba'doydan", "Ba'doyddy", "Ba'doyer", "Ba'doyffy", "Ba'doygan", "Ba'doyggan", "Ba'doygh", "Ba'doyghan", "Ba'doyins", "Ba'doykry", "Ba'doylan", "Ba'doyle", "Ba'doyley", "Ba'doyliam", "Ba'doylly", "Ba'doyn", "Ba'doynin", "Ba'doyny", "Ba'doyppy", "Ba'doypsey", "Ba'doyra", "Ba'doyroy", "Ba'doyrrell", "Ba'doyrroy", "Ba'doyry", "Ba'doyssey", "Ba'doytty", "Ba'doyty", "Ba'dudan", "Ba'duddy", "Ba'duer", "Ba'duffy", "Ba'dugan", "Ba'duggan", "Ba'dugh", "Ba'dughan", "Ba'duins", "Ba'dukry", "Ba'dulan", "Ba'dule", "Ba'duley", "Ba'duliam", "Ba'dully", "Ba'dun", "Ba'dunin", "Ba'duny", "Ba'duppy", "Ba'dupsey", "Ba'dura", "Ba'duroy", "Ba'durrell", "Ba'durroy", "Ba'dury", "Ba'dussey", "Ba'dutty", "Ba'duty", "Ba'gadan", "Ba'gaddy", "Ba'gaer", "Ba'gaffy", "Ba'gagan", "Ba'gaggan", "Ba'gagh", "Ba'gaghan", "Ba'gains", "Ba'gakry", "Ba'galan", "Ba'gale", "Ba'galey", "Ba'galiam", "Ba'gally", "Ba'gan", "Ba'ganin", "Ba'gany", "Ba'gappy", "Ba'gapsey", "Ba'gara", "Ba'garoy", "Ba'garrell", "Ba'garroy", "Ba'gary", "Ba'gassey", "Ba'gatty", "Ba'gaty", "Ba'jordan", "Ba'jorddy", "Ba'jorer", "Ba'jorffy", "Ba'jorgan", "Ba'jorggan", "Ba'jorgh", "Ba'jorghan", "Ba'jorins", "Ba'jorkry", "Ba'jorlan", "Ba'jorle", "Ba'jorley", "Ba'jorliam", "Ba'jorlly", "Ba'jorn", "Ba'jornin", "Ba'jorny", "Ba'jorppy", "Ba'jorpsey", "Ba'jorra", "Ba'jorroy", "Ba'jorrrell", "Ba'jorrroy", "Ba'jorry", "Ba'jorssey", "Ba'jortty", "Ba'jorty", "Ba'keadan", "Ba'keaddy", "Ba'keaer", "Ba'keaffy", "Ba'keagan", "Ba'keaggan", "Ba'keagh", "Ba'keaghan", "Ba'keains", "Ba'keakry", "Ba'kealan", "Ba'keale", "Ba'kealey", "Ba'kealiam", "Ba'keally", "Ba'kean", "Ba'keanin", "Ba'keany", "Ba'keappy", "Ba'keapsey", "Ba'keara", "Ba'kearoy", "Ba'kearrell", "Ba'kearroy", "Ba'keary", "Ba'keassey", "Ba'keatty", "Ba'keaty", "Ba'keedan", "Ba'keeddy", "Ba'keeer", "Ba'keeffy", "Ba'keegan", "Ba'keeggan", "Ba'keegh", "Ba'keeghan", "Ba'keeins", "Ba'keekry", "Ba'keelan", "Ba'keele", "Ba'keeley", "Ba'keeliam", "Ba'keelly", "Ba'keen", "Ba'keenin", "Ba'keeny", "Ba'keeppy", "Ba'keepsey", "Ba'keera", "Ba'keeroy", "Ba'keerrell", "Ba'keerroy", "Ba'keery", "Ba'keessey", "Ba'keetty", "Ba'keety", "Ba'laudan", "Ba'lauddy", "Ba'lauer", "Ba'lauffy", "Ba'laugan", "Ba'lauggan", "Ba'laugh", "Ba'laughan", "Ba'lauins", "Ba'laukry", "Ba'laulan", "Ba'laule", "Ba'lauley", "Ba'lauliam", "Ba'laully", "Ba'laun", "Ba'launin", "Ba'launy", "Ba'lauppy", "Ba'laupsey", "Ba'laura", "Ba'lauroy", "Ba'laurrell", "Ba'laurroy", "Ba'laury", "Ba'laussey", "Ba'lautty", "Ba'lauty", "Ba'leadan", "Ba'leaddy", "Ba'leaer", "Ba'leaffy", "Ba'leagan", "Ba'leaggan", "Ba'leagh", "Ba'leaghan", "Ba'leains", "Ba'leakry", "Ba'lealan", "Ba'leale", "Ba'lealey", "Ba'lealiam", "Ba'leally", "Ba'lean", "Ba'leanin", "Ba'leany", "Ba'leappy", "Ba'leapsey", "Ba'leara", "Ba'learoy", "Ba'learrell", "Ba'learroy", "Ba'leary", "Ba'leassey", "Ba'leatty", "Ba'leaty", "Ba'ledan", "Ba'leddy", "Ba'leer", "Ba'leffy", "Ba'legan", "Ba'leggan", "Ba'legh", "Ba'leghan", "Ba'leidan", "Ba'leiddy", "Ba'leier", "Ba'leiffy", "Ba'leigan", "Ba'leiggan", "Ba'leigh", "Ba'leighan", "Ba'leiins", "Ba'leikry", "Ba'leilan", "Ba'leile", "Ba'leiley", "Ba'leiliam", "Ba'leilly", "Ba'lein", "Ba'leinin", "Ba'leins", "Ba'leiny", "Ba'leippy", "Ba'leipsey", "Ba'leira", "Ba'leiroy", "Ba'leirrell", "Ba'leirroy", "Ba'leiry", "Ba'leissey", "Ba'leitty", "Ba'leity", "Ba'lekry", "Ba'lelan", "Ba'lele", "Ba'leley", "Ba'leliam", "Ba'lelly", "Ba'len", "Ba'lenin", "Ba'leny", "Ba'leppy", "Ba'lepsey", "Ba'lera", "Ba'leroy", "Ba'lerrell", "Ba'lerroy", "Ba'lery", "Ba'lessey", "Ba'letty", "Ba'lety", "Ba'lodan", "Ba'loddy", "Ba'loer", "Ba'loffy", "Ba'logan", "Ba'loggan", "Ba'logh", "Ba'loghan", "Ba'loins", "Ba'lokry", "Ba'lolan", "Ba'lole", "Ba'loley", "Ba'loliam", "Ba'lolly", "Ba'lon", "Ba'lonin", "Ba'lony", "Ba'loppy", "Ba'lopsey", "Ba'lora", "Ba'loroy", "Ba'lorrell", "Ba'lorroy", "Ba'lory", "Ba'lossey", "Ba'lotty", "Ba'loty", "Ba'lyndan", "Ba'lynddy", "Ba'lyner", "Ba'lynffy", "Ba'lyngan", "Ba'lynggan", "Ba'lyngh", "Ba'lynghan", "Ba'lynins", "Ba'lynkry", "Ba'lynlan", "Ba'lynle", "Ba'lynley", "Ba'lynliam", "Ba'lynlly", "Ba'lynn", "Ba'lynnin", "Ba'lynny", "Ba'lynppy", "Ba'lynpsey", "Ba'lynra", "Ba'lynroy", "Ba'lynrrell", "Ba'lynrroy", "Ba'lynry", "Ba'lynssey", "Ba'lyntty", "Ba'lynty", "Ba'madan", "Ba'maddy", "Ba'maer", "Ba'maffy", "Ba'magan", "Ba'maggan", "Ba'magh", "Ba'maghan", "Ba'mains", "Ba'makry", "Ba'malan", "Ba'male", "Ba'maley", "Ba'maliam", "Ba'mally", "Ba'man", "Ba'manin", "Ba'many", "Ba'mappy", "Ba'mapsey", "Ba'mara", "Ba'maroy", "Ba'marrell", "Ba'marroy", "Ba'mary", "Ba'massey", "Ba'matty", "Ba'maty", "Ba'nadan", "Ba'naddy", "Ba'naer", "Ba'naffy", "Ba'nagan", "Ba'naggan", "Ba'nagh", "Ba'naghan", "Ba'nains", "Ba'nakry", "Ba'nalan", "Ba'nale", "Ba'naley", "Ba'naliam", "Ba'nally", "Ba'nan", "Ba'nanin", "Ba'nany", "Ba'nappy", "Ba'napsey", "Ba'nara", "Ba'naroy", "Ba'narrell", "Ba'narroy", "Ba'nary", "Ba'nassey", "Ba'natty", "Ba'naty", "Ba'nedan", "Ba'neddy", "Ba'neer", "Ba'neffy", "Ba'negan", "Ba'neggan", "Ba'negh", "Ba'neghan", "Ba'neins", "Ba'nekry", "Ba'nelan", "Ba'nele", "Ba'neley", "Ba'neliam", "Ba'nelly", "Ba'nen", "Ba'nenin", "Ba'neny", "Ba'neppy", "Ba'nepsey", "Ba'nera", "Ba'neroy", "Ba'nerrell", "Ba'nerroy", "Ba'nery", "Ba'nessey", "Ba'netty", "Ba'nety", "Ba'peadan", "Ba'peaddy", "Ba'peaer", "Ba'peaffy", "Ba'peagan", "Ba'peaggan", "Ba'peagh", "Ba'peaghan", "Ba'peains", "Ba'peakry", "Ba'pealan", "Ba'peale", "Ba'pealey", "Ba'pealiam", "Ba'peally", "Ba'pean", "Ba'peanin", "Ba'peany", "Ba'peappy", "Ba'peapsey", "Ba'peara", "Ba'pearoy", "Ba'pearrell", "Ba'pearroy", "Ba'peary", "Ba'peassey", "Ba'peatty", "Ba'peaty", "Ba'reidan", "Ba'reiddy", "Ba'reier", "Ba'reiffy", "Ba'reigan", "Ba'reiggan", "Ba'reigh", "Ba'reighan", "Ba'reiins", "Ba'reikry", "Ba'reilan", "Ba'reile", "Ba'reiley", "Ba'reiliam", "Ba'reilly", "Ba'rein", "Ba'reinin", "Ba'reiny", "Ba'reippy", "Ba'reipsey", "Ba'reira", "Ba'reiroy", "Ba'reirrell", "Ba'reirroy", "Ba'reiry", "Ba'reissey", "Ba'reitty", "Ba'reity", "Ba'ridan", "Ba'riddy", "Ba'rier", "Ba'riffy", "Ba'rigan", "Ba'riggan", "Ba'righ", "Ba'righan", "Ba'riins", "Ba'rikry", "Ba'rilan", "Ba'rile", "Ba'riley", "Ba'riliam", "Ba'rilly", "Ba'rin", "Ba'rinin", "Ba'riny", "Ba'ripdan", "Ba'ripddy", "Ba'riper", "Ba'ripffy", "Ba'ripgan", "Ba'ripggan", "Ba'ripgh", "Ba'ripghan", "Ba'ripins", "Ba'ripkry", "Ba'riplan", "Ba'riple", "Ba'ripley", "Ba'ripliam", "Ba'riplly", "Ba'ripn", "Ba'ripnin", "Ba'ripny", "Ba'ripppy", "Ba'rippsey", "Ba'rippy", "Ba'ripra", "Ba'riproy", "Ba'riprrell", "Ba'riprroy", "Ba'ripry", "Ba'ripsey", "Ba'ripssey", "Ba'riptty", "Ba'ripty", "Ba'rira", "Ba'riroy", "Ba'rirrell", "Ba'rirroy", "Ba'riry", "Ba'rissey", "Ba'ritty", "Ba'rity", "Ba'rodan", "Ba'roddy", "Ba'roer", "Ba'roffy", "Ba'rogan", "Ba'roggan", "Ba'rogh", "Ba'roghan", "Ba'roins", "Ba'rokry", "Ba'rolan", "Ba'role", "Ba'roley", "Ba'roliam", "Ba'rolly", "Ba'ron", "Ba'ronin", "Ba'rony", "Ba'roppy", "Ba'ropsey", "Ba'rora", "Ba'roroy", "Ba'rorrell", "Ba'rorroy", "Ba'rory", "Ba'rossey", "Ba'rotty", "Ba'roty", "Ba'sadan", "Ba'saddy", "Ba'saer", "Ba'saffy", "Ba'sagan", "Ba'saggan", "Ba'sagh", "Ba'saghan", "Ba'sains", "Ba'sakry", "Ba'salan", "Ba'sale", "Ba'saley", "Ba'saliam", "Ba'sally", "Ba'san", "Ba'sanin", "Ba'sany", "Ba'sappy", "Ba'sapsey", "Ba'sara", "Ba'saroy", "Ba'sarrell", "Ba'sarroy", "Ba'sary", "Ba'sassey", "Ba'satty", "Ba'saty", "Ba'shedan", "Ba'sheddy", "Ba'sheer", "Ba'sheffy", "Ba'shegan", "Ba'sheggan", "Ba'shegh", "Ba'sheghan", "Ba'sheins", "Ba'shekry", "Ba'shelan", "Ba'shele", "Ba'sheley", "Ba'sheliam", "Ba'shelly", "Ba'shen", "Ba'shenin", "Ba'sheny", "Ba'sheppy", "Ba'shepsey", "Ba'shera", "Ba'sheroy", "Ba'sherrell", "Ba'sherroy", "Ba'shery", "Ba'shessey", "Ba'shetty", "Ba'shety", "Ba'tedan", "Ba'teddy", "Ba'teer", "Ba'teffy", "Ba'tegan", "Ba'teggan", "Ba'tegh", "Ba'teghan", "Ba'teins", "Ba'tekry", "Ba'telan", "Ba'tele", "Ba'teley", "Ba'teliam", "Ba'telly", "Ba'ten", "Ba'tenin", "Ba'teny", "Ba'teppy", "Ba'tepsey", "Ba'tera", "Ba'teroy", "Ba'terrell", "Ba'terroy", "Ba'tery", "Ba'tessey", "Ba'tetty", "Ba'tety", "Ba'toodan", "Ba'tooddy", "Ba'tooer", "Ba'tooffy", "Ba'toogan", "Ba'tooggan", "Ba'toogh", "Ba'tooghan", "Ba'tooins", "Ba'tookry", "Ba'toolan", "Ba'toole", "Ba'tooley", "Ba'tooliam", "Ba'toolly", "Ba'toon", "Ba'toonin", "Ba'toony", "Ba'tooppy", "Ba'toopsey", "Ba'toora", "Ba'tooroy", "Ba'toorrell", "Ba'toorroy", "Ba'toory", "Ba'toossey", "Ba'tootty", "Ba'tooty", "Ba'widan", "Ba'widdy", "Ba'wier", "Ba'wiffy", "Ba'wigan", "Ba'wiggan", "Ba'wigh", "Ba'wighan", "Ba'wiins", "Ba'wikry", "Ba'wilan", "Ba'wile", "Ba'wiley", "Ba'wiliam", "Ba'willy", "Ba'win", "Ba'winin", "Ba'winy", "Ba'wippy", "Ba'wipsey", "Ba'wira", "Ba'wiroy", "Ba'wirrell", "Ba'wirroy", "Ba'wiry", "Ba'wissey", "Ba'witty", "Ba'wity", "Ba'ydan", "Ba'yddy", "Ba'yer", "Ba'yffy", "Ba'ygan", "Ba'yggan", "Ba'ygh", "Ba'yghan", "Ba'yins", "Ba'ykry", "Ba'ylan", "Ba'yle", "Ba'yley", "Ba'yliam", "Ba'ylly", "Ba'yn", "Ba'ynin", "Ba'yny", "Ba'yppy", "Ba'ypsey", "Ba'yra", "Ba'yroy", "Ba'yrrell", "Ba'yrroy", "Ba'yry", "Ba'yssey", "Ba'ytty", "Ba'yty", "Be'ardan", "Be'arddy", "Be'arer", "Be'arffy", "Be'argan", "Be'arggan", "Be'argh", "Be'arghan", "Be'arins", "Be'arkry", "Be'arlan", "Be'arle", "Be'arley", "Be'arliam", "Be'arlly", "Be'arn", "Be'arnin", "Be'arny", "Be'arppy", "Be'arpsey", "Be'arra", "Be'arroy", "Be'arrrell", "Be'arrroy", "Be'arry", "Be'arssey", "Be'artty", "Be'arty", "Be'bidan", "Be'biddy", "Be'bier", "Be'biffy", "Be'bigan", "Be'biggan", "Be'bigh", "Be'bighan", "Be'biins", "Be'bikry", "Be'bilan", "Be'bile", "Be'biley", "Be'biliam", "Be'billy", "Be'bin", "Be'binin", "Be'biny", "Be'bippy", "Be'bipsey", "Be'bira", "Be'biroy", "Be'birrell", "Be'birroy", "Be'biry", "Be'bissey", "Be'bitty", "Be'bity", "Be'caudan", "Be'cauddy", "Be'cauer", "Be'cauffy", "Be'caugan", "Be'cauggan", "Be'caugh", "Be'caughan", "Be'cauins", "Be'caukry", "Be'caulan", "Be'caule", "Be'cauley", "Be'cauliam", "Be'caully", "Be'caun", "Be'caunin", "Be'cauny", "Be'cauppy", "Be'caupsey", "Be'caura", "Be'cauroy", "Be'caurrell", "Be'caurroy", "Be'caury", "Be'caussey", "Be'cautty", "Be'cauty", "Be'dadan", "Be'daddy", "Be'daer", "Be'daffy", "Be'dagan", "Be'daggan", "Be'dagh", "Be'daghan", "Be'dains", "Be'dakry", "Be'dalan", "Be'dale", "Be'daley", "Be'daliam", "Be'dally", "Be'dan", "Be'danin", "Be'dany", "Be'dappy", "Be'dapsey", "Be'dara", "Be'dardan", "Be'darddy", "Be'darer", "Be'darffy", "Be'dargan", "Be'darggan", "Be'dargh", "Be'darghan", "Be'darins", "Be'darkry", "Be'darlan", "Be'darle", "Be'darley", "Be'darliam", "Be'darlly", "Be'darn", "Be'darnin", "Be'darny", "Be'daroy", "Be'darppy", "Be'darpsey", "Be'darra", "Be'darrell", "Be'darroy", "Be'darrrell", "Be'darrroy", "Be'darry", "Be'darssey", "Be'dartty", "Be'darty", "Be'dary", "Be'dassey", "Be'datty", "Be'daty", "Be'doydan", "Be'doyddy", "Be'doyer", "Be'doyffy", "Be'doygan", "Be'doyggan", "Be'doygh", "Be'doyghan", "Be'doyins", "Be'doykry", "Be'doylan", "Be'doyle", "Be'doyley", "Be'doyliam", "Be'doylly", "Be'doyn", "Be'doynin", "Be'doyny", "Be'doyppy", "Be'doypsey", "Be'doyra", "Be'doyroy", "Be'doyrrell", "Be'doyrroy", "Be'doyry", "Be'doyssey", "Be'doytty", "Be'doyty", "Be'dudan", "Be'duddy", "Be'duer", "Be'duffy", "Be'dugan", "Be'duggan", "Be'dugh", "Be'dughan", "Be'duins", "Be'dukry", "Be'dulan", "Be'dule", "Be'duley", "Be'duliam", "Be'dully", "Be'dun", "Be'dunin", "Be'duny", "Be'duppy", "Be'dupsey", "Be'dura", "Be'duroy", "Be'durrell", "Be'durroy", "Be'dury", "Be'dussey", "Be'dutty", "Be'duty", "Be'gadan", "Be'gaddy", "Be'gaer", "Be'gaffy", "Be'gagan", "Be'gaggan", "Be'gagh", "Be'gaghan", "Be'gains", "Be'gakry", "Be'galan", "Be'gale", "Be'galey", "Be'galiam", "Be'gally", "Be'gan", "Be'ganin", "Be'gany", "Be'gappy", "Be'gapsey", "Be'gara", "Be'garoy", "Be'garrell", "Be'garroy", "Be'gary", "Be'gassey", "Be'gatty", "Be'gaty", "Be'jordan", "Be'jorddy", "Be'jorer", "Be'jorffy", "Be'jorgan", "Be'jorggan", "Be'jorgh", "Be'jorghan", "Be'jorins", "Be'jorkry", "Be'jorlan", "Be'jorle", "Be'jorley", "Be'jorliam", "Be'jorlly", "Be'jorn", "Be'jornin", "Be'jorny", "Be'jorppy", "Be'jorpsey", "Be'jorra", "Be'jorroy", "Be'jorrrell", "Be'jorrroy", "Be'jorry", "Be'jorssey", "Be'jortty", "Be'jorty", "Be'keadan", "Be'keaddy", "Be'keaer", "Be'keaffy", "Be'keagan", "Be'keaggan", "Be'keagh", "Be'keaghan", "Be'keains", "Be'keakry", "Be'kealan", "Be'keale", "Be'kealey", "Be'kealiam", "Be'keally", "Be'kean", "Be'keanin", "Be'keany", "Be'keappy", "Be'keapsey", "Be'keara", "Be'kearoy", "Be'kearrell", "Be'kearroy", "Be'keary", "Be'keassey", "Be'keatty", "Be'keaty", "Be'keedan", "Be'keeddy", "Be'keeer", "Be'keeffy", "Be'keegan", "Be'keeggan", "Be'keegh", "Be'keeghan", "Be'keeins", "Be'keekry", "Be'keelan", "Be'keele", "Be'keeley", "Be'keeliam", "Be'keelly", "Be'keen", "Be'keenin", "Be'keeny", "Be'keeppy", "Be'keepsey", "Be'keera", "Be'keeroy", "Be'keerrell", "Be'keerroy", "Be'keery", "Be'keessey", "Be'keetty", "Be'keety", "Be'laudan", "Be'lauddy", "Be'lauer", "Be'lauffy", "Be'laugan", "Be'lauggan", "Be'laugh", "Be'laughan", "Be'lauins", "Be'laukry", "Be'laulan", "Be'laule", "Be'lauley", "Be'lauliam", "Be'laully", "Be'laun", "Be'launin", "Be'launy", "Be'lauppy", "Be'laupsey", "Be'laura", "Be'lauroy", "Be'laurrell", "Be'laurroy", "Be'laury", "Be'laussey", "Be'lautty", "Be'lauty", "Be'leadan", "Be'leaddy", "Be'leaer", "Be'leaffy", "Be'leagan", "Be'leaggan", "Be'leagh", "Be'leaghan", "Be'leains", "Be'leakry", "Be'lealan", "Be'leale", "Be'lealey", "Be'lealiam", "Be'leally", "Be'lean", "Be'leanin", "Be'leany", "Be'leappy", "Be'leapsey", "Be'leara", "Be'learoy", "Be'learrell", "Be'learroy", "Be'leary", "Be'leassey", "Be'leatty", "Be'leaty", "Be'ledan", "Be'leddy", "Be'leer", "Be'leffy", "Be'legan", "Be'leggan", "Be'legh", "Be'leghan", "Be'leidan", "Be'leiddy", "Be'leier", "Be'leiffy", "Be'leigan", "Be'leiggan", "Be'leigh", "Be'leighan", "Be'leiins", "Be'leikry", "Be'leilan", "Be'leile", "Be'leiley", "Be'leiliam", "Be'leilly", "Be'lein", "Be'leinin", "Be'leins", "Be'leiny", "Be'leippy", "Be'leipsey", "Be'leira", "Be'leiroy", "Be'leirrell", "Be'leirroy", "Be'leiry", "Be'leissey", "Be'leitty", "Be'leity", "Be'lekry", "Be'lelan", "Be'lele", "Be'leley", "Be'leliam", "Be'lelly", "Be'len", "Be'lenin", "Be'leny", "Be'leppy", "Be'lepsey", "Be'lera", "Be'leroy", "Be'lerrell", "Be'lerroy", "Be'lery", "Be'lessey", "Be'letty", "Be'lety", "Be'lodan", "Be'loddy", "Be'loer", "Be'loffy", "Be'logan", "Be'loggan", "Be'logh", "Be'loghan", "Be'loins", "Be'lokry", "Be'lolan", "Be'lole", "Be'loley", "Be'loliam", "Be'lolly", "Be'lon", "Be'lonin", "Be'lony", "Be'loppy", "Be'lopsey", "Be'lora", "Be'loroy", "Be'lorrell", "Be'lorroy", "Be'lory", "Be'lossey", "Be'lotty", "Be'loty", "Be'lyndan", "Be'lynddy", "Be'lyner", "Be'lynffy", "Be'lyngan", "Be'lynggan", "Be'lyngh", "Be'lynghan", "Be'lynins", "Be'lynkry", "Be'lynlan", "Be'lynle", "Be'lynley", "Be'lynliam", "Be'lynlly", "Be'lynn", "Be'lynnin", "Be'lynny", "Be'lynppy", "Be'lynpsey", "Be'lynra", "Be'lynroy", "Be'lynrrell", "Be'lynrroy", "Be'lynry", "Be'lynssey", "Be'lyntty", "Be'lynty", "Be'madan", "Be'maddy", "Be'maer", "Be'maffy", "Be'magan", "Be'maggan", "Be'magh", "Be'maghan", "Be'mains", "Be'makry", "Be'malan", "Be'male", "Be'maley", "Be'maliam", "Be'mally", "Be'man", "Be'manin", "Be'many", "Be'mappy", "Be'mapsey", "Be'mara", "Be'maroy", "Be'marrell", "Be'marroy", "Be'mary", "Be'massey", "Be'matty", "Be'maty", "Be'nadan", "Be'naddy", "Be'naer", "Be'naffy", "Be'nagan", "Be'naggan", "Be'nagh", "Be'naghan", "Be'nains", "Be'nakry", "Be'nalan", "Be'nale", "Be'naley", "Be'naliam", "Be'nally", "Be'nan", "Be'nanin", "Be'nany", "Be'nappy", "Be'napsey", "Be'nara", "Be'naroy", "Be'narrell", "Be'narroy", "Be'nary", "Be'nassey", "Be'natty", "Be'naty", "Be'nedan", "Be'neddy", "Be'neer", "Be'neffy", "Be'negan", "Be'neggan", "Be'negh", "Be'neghan", "Be'neins", "Be'nekry", "Be'nelan", "Be'nele", "Be'neley", "Be'neliam", "Be'nelly", "Be'nen", "Be'nenin", "Be'neny", "Be'neppy", "Be'nepsey", "Be'nera", "Be'neroy", "Be'nerrell", "Be'nerroy", "Be'nery", "Be'nessey", "Be'netty", "Be'nety", "Be'peadan", "Be'peaddy", "Be'peaer", "Be'peaffy", "Be'peagan", "Be'peaggan", "Be'peagh", "Be'peaghan", "Be'peains", "Be'peakry", "Be'pealan", "Be'peale", "Be'pealey", "Be'pealiam", "Be'peally", "Be'pean", "Be'peanin", "Be'peany", "Be'peappy", "Be'peapsey", "Be'peara", "Be'pearoy", "Be'pearrell", "Be'pearroy", "Be'peary", "Be'peassey", "Be'peatty", "Be'peaty", "Be'reidan", "Be'reiddy", "Be'reier", "Be'reiffy", "Be'reigan", "Be'reiggan", "Be'reigh", "Be'reighan", "Be'reiins", "Be'reikry", "Be'reilan", "Be'reile", "Be'reiley", "Be'reiliam", "Be'reilly", "Be'rein", "Be'reinin", "Be'reiny", "Be'reippy", "Be'reipsey", "Be'reira", "Be'reiroy", "Be'reirrell", "Be'reirroy", "Be'reiry", "Be'reissey", "Be'reitty", "Be'reity", "Be'ridan", "Be'riddy", "Be'rier", "Be'riffy", "Be'rigan", "Be'riggan", "Be'righ", "Be'righan", "Be'riins", "Be'rikry", "Be'rilan", "Be'rile", "Be'riley", "Be'riliam", "Be'rilly", "Be'rin", "Be'rinin", "Be'riny", "Be'ripdan", "Be'ripddy", "Be'riper", "Be'ripffy", "Be'ripgan", "Be'ripggan", "Be'ripgh", "Be'ripghan", "Be'ripins", "Be'ripkry", "Be'riplan", "Be'riple", "Be'ripley", "Be'ripliam", "Be'riplly", "Be'ripn", "Be'ripnin", "Be'ripny", "Be'ripppy", "Be'rippsey", "Be'rippy", "Be'ripra", "Be'riproy", "Be'riprrell", "Be'riprroy", "Be'ripry", "Be'ripsey", "Be'ripssey", "Be'riptty", "Be'ripty", "Be'rira", "Be'riroy", "Be'rirrell", "Be'rirroy", "Be'riry", "Be'rissey", "Be'ritty", "Be'rity", "Be'rodan", "Be'roddy", "Be'roer", "Be'roffy", "Be'rogan", "Be'roggan", "Be'rogh", "Be'roghan", "Be'roins", "Be'rokry", "Be'rolan", "Be'role", "Be'roley", "Be'roliam", "Be'rolly", "Be'ron", "Be'ronin", "Be'rony", "Be'roppy", "Be'ropsey", "Be'rora", "Be'roroy", "Be'rorrell", "Be'rorroy", "Be'rory", "Be'rossey", "Be'rotty", "Be'roty", "Be'sadan", "Be'saddy", "Be'saer", "Be'saffy", "Be'sagan", "Be'saggan", "Be'sagh", "Be'saghan", "Be'sains", "Be'sakry", "Be'salan", "Be'sale", "Be'saley", "Be'saliam", "Be'sally", "Be'san", "Be'sanin", "Be'sany", "Be'sappy", "Be'sapsey", "Be'sara", "Be'saroy", "Be'sarrell", "Be'sarroy", "Be'sary", "Be'sassey", "Be'satty", "Be'saty", "Be'shedan", "Be'sheddy", "Be'sheer", "Be'sheffy", "Be'shegan", "Be'sheggan", "Be'shegh", "Be'sheghan", "Be'sheins", "Be'shekry", "Be'shelan", "Be'shele", "Be'sheley", "Be'sheliam", "Be'shelly", "Be'shen", "Be'shenin", "Be'sheny", "Be'sheppy", "Be'shepsey", "Be'shera", "Be'sheroy", "Be'sherrell", "Be'sherroy", "Be'shery", "Be'shessey", "Be'shetty", "Be'shety", "Be'tedan", "Be'teddy", "Be'teer", "Be'teffy", "Be'tegan", "Be'teggan", "Be'tegh", "Be'teghan", "Be'teins", "Be'tekry", "Be'telan", "Be'tele", "Be'teley", "Be'teliam", "Be'telly", "Be'ten", "Be'tenin", "Be'teny", "Be'teppy", "Be'tepsey", "Be'tera", "Be'teroy", "Be'terrell", "Be'terroy", "Be'tery", "Be'tessey", "Be'tetty", "Be'tety", "Be'toodan", "Be'tooddy", "Be'tooer", "Be'tooffy", "Be'toogan", "Be'tooggan", "Be'toogh", "Be'tooghan", "Be'tooins", "Be'tookry", "Be'toolan", "Be'toole", "Be'tooley", "Be'tooliam", "Be'toolly", "Be'toon", "Be'toonin", "Be'toony", "Be'tooppy", "Be'toopsey", "Be'toora", "Be'tooroy", "Be'toorrell", "Be'toorroy", "Be'toory", "Be'toossey", "Be'tootty", "Be'tooty", "Be'widan", "Be'widdy", "Be'wier", "Be'wiffy", "Be'wigan", "Be'wiggan", "Be'wigh", "Be'wighan", "Be'wiins", "Be'wikry", "Be'wilan", "Be'wile", "Be'wiley", "Be'wiliam", "Be'willy", "Be'win", "Be'winin", "Be'winy", "Be'wippy", "Be'wipsey", "Be'wira", "Be'wiroy", "Be'wirrell", "Be'wirroy", "Be'wiry", "Be'wissey", "Be'witty", "Be'wity", "Be'ydan", "Be'yddy", "Be'yer", "Be'yffy", "Be'ygan", "Be'yggan", "Be'ygh", "Be'yghan", "Be'yins", "Be'ykry", "Be'ylan", "Be'yle", "Be'yley", "Be'yliam", "Be'ylly", "Be'yn", "Be'ynin", "Be'yny", "Be'yppy", "Be'ypsey", "Be'yra", "Be'yroy", "Be'yrrell", "Be'yrroy", "Be'yry", "Be'yssey", "Be'ytty", "Be'yty", "Bidan", "Biddy", "Bier", "Biffy", "Bigan", "Biggan", "Bigh", "Bighan", "Biins", "Bikry", "Bilan", "Bile", "Biley", "Biliam", "Billy", "Bin", "Binin", "Biny", "Bippy", "Bipsey", "Bira", "Biroy", "Birrell", "Birroy", "Biry", "Bissey", "Bitty", "Bity", "Caudan", "Cauddy", "Cauer", "Cauffy", "Caugan", "Cauggan", "Caugh", "Caughan", "Cauins", "Caukry", "Caulan", "Caule", "Cauley", "Cauliam", "Caully", "Caun", "Caunin", "Cauny", "Cauppy", "Caupsey", "Caura", "Cauroy", "Caurrell", "Caurroy", "Caury", "Caussey", "Cautty", "Cauty", "Dadan", "Daddy", "Daer", "Daffy", "Dagan", "Daggan", "Dagh", "Daghan", "Dains", "Dakry", "Dalan", "Dale", "Daley", "Daliam", "Dally", "Dan", "Danin", "Dany", "Dappy", "Dapsey", "Dara", "Dardan", "Darddy", "Darer", "Darffy", "Dargan", "Darggan", "Dargh", "Darghan", "Darins", "Darkry", "Darlan", "Darle", "Darley", "Darliam", "Darlly", "Darn", "Darnin", "Darny", "Daroy", "Darppy", "Darpsey", "Darra", "Darrell", "Darroy", "Darrrell", "Darrroy", "Darry", "Darssey", "Dartty", "Darty", "Dary", "Dassey", "Datty", "Daty", "Doydan", "Doyddy", "Doyer", "Doyffy", "Doygan", "Doyggan", "Doygh", "Doyghan", "Doyins", "Doykry", "Doylan", "Doyle", "Doyley", "Doyliam", "Doylly", "Doyn", "Doynin", "Doyny", "Doyppy", "Doypsey", "Doyra", "Doyroy", "Doyrrell", "Doyrroy", "Doyry", "Doyssey", "Doytty", "Doyty", "Dudan", "Duddy", "Duer", "Duffy", "Dugan", "Duggan", "Dugh", "Dughan", "Duins", "Dukry", "Dulan", "Dule", "Duley", "Duliam", "Dully", "Dun", "Dunin", "Duny", "Duppy", "Dupsey", "Dura", "Duroy", "Durrell", "Durroy", "Dury", "Dussey", "Dutty", "Duty", "Gadan", "Gaddy", "Gaer", "Gaffy", "Gagan", "Gaggan", "Gagh", "Gaghan", "Gains", "Gakry", "Galan", "Gale", "Galey", "Galiam", "Gally", "Gan", "Ganin", "Gany", "Gappy", "Gapsey", "Gara", "Garoy", "Garrell", "Garroy", "Gary", "Gassey", "Gatty", "Gaty", "Jordan", "Jorddy", "Jorer", "Jorffy", "Jorgan", "Jorggan", "Jorgh", "Jorghan", "Jorins", "Jorkry", "Jorlan", "Jorle", "Jorley", "Jorliam", "Jorlly", "Jorn", "Jornin", "Jorny", "Jorppy", "Jorpsey", "Jorra", "Jorroy", "Jorrrell", "Jorrroy", "Jorry", "Jorssey", "Jortty", "Jorty", "Keadan", "Keaddy", "Keaer", "Keaffy", "Keagan", "Keaggan", "Keagh", "Keaghan", "Keains", "Keakry", "Kealan", "Keale", "Kealey", "Kealiam", "Keally", "Kean", "Keanin", "Keany", "Keappy", "Keapsey", "Keara", "Kearoy", "Kearrell", "Kearroy", "Keary", "Keassey", "Keatty", "Keaty", "Keedan", "Keeddy", "Keeer", "Keeffy", "Keegan", "Keeggan", "Keegh", "Keeghan", "Keeins", "Keekry", "Keelan", "Keele", "Keeley", "Keeliam", "Keelly", "Keen", "Keenin", "Keeny", "Keeppy", "Keepsey", "Keera", "Keeroy", "Keerrell", "Keerroy", "Keery", "Keessey", "Keetty", "Keety", "Laudan", "Lauddy", "Lauer", "Lauffy", "Laugan", "Lauggan", "Laugh", "Laughan", "Lauins", "Laukry", "Laulan", "Laule", "Lauley", "Lauliam", "Laully", "Laun", "Launin", "Launy", "Lauppy", "Laupsey", "Laura", "Lauroy", "Laurrell", "Laurroy", "Laury", "Laussey", "Lautty", "Lauty", "Leadan", "Leaddy", "Leaer", "Leaffy", "Leagan", "Leaggan", "Leagh", "Leaghan", "Leains", "Leakry", "Lealan", "Leale", "Lealey", "Lealiam", "Leally", "Lean", "Leanin", "Leany", "Leappy", "Leapsey", "Leara", "Learoy", "Learrell", "Learroy", "Leary", "Leassey", "Leatty", "Leaty", "Ledan", "Leddy", "Leer", "Leffy", "Legan", "Leggan", "Legh", "Leghan", "Leidan", "Leiddy", "Leier", "Leiffy", "Leigan", "Leiggan", "Leigh", "Leighan", "Leiins", "Leikry", "Leilan", "Leile", "Leiley", "Leiliam", "Leilly", "Lein", "Leinin", "Leins", "Leiny", "Leippy", "Leipsey", "Leira", "Leiroy", "Leirrell", "Leirroy", "Leiry", "Leissey", "Leitty", "Leity", "Lekry", "Lelan", "Lele", "Leley", "Leliam", "Lelly", "Len", "Lenin", "Leny", "Leppy", "Lepsey", "Lera", "Leroy", "Lerrell", "Lerroy", "Lery", "Lessey", "Letty", "Lety", "Lodan", "Loddy", "Loer", "Loffy", "Logan", "Loggan", "Logh", "Loghan", "Loins", "Lokry", "Lolan", "Lole", "Loley", "Loliam", "Lolly", "Lon", "Lonin", "Lony", "Loppy", "Lopsey", "Lora", "Loroy", "Lorrell", "Lorroy", "Lory", "Lossey", "Lotty", "Loty", "Lyndan", "Lynddy", "Lyner", "Lynffy", "Lyngan", "Lynggan", "Lyngh", "Lynghan", "Lynins", "Lynkry", "Lynlan", "Lynle", "Lynley", "Lynliam", "Lynlly", "Lynn", "Lynnin", "Lynny", "Lynppy", "Lynpsey", "Lynra", "Lynroy", "Lynrrell", "Lynrroy", "Lynry", "Lynssey", "Lyntty", "Lynty", "Mac'ardan", "Mac'arddy", "Mac'arer", "Mac'arffy", "Mac'argan", "Mac'arggan", "Mac'argh", "Mac'arghan", "Mac'arins", "Mac'arkry", "Mac'arlan", "Mac'arle", "Mac'arley", "Mac'arliam", "Mac'arlly", "Mac'arn", "Mac'arnin", "Mac'arny", "Mac'arppy", "Mac'arpsey", "Mac'arra", "Mac'arroy", "Mac'arrrell", "Mac'arrroy", "Mac'arry", "Mac'arssey", "Mac'artty", "Mac'arty", "Mac'bidan", "Mac'biddy", "Mac'bier", "Mac'biffy", "Mac'bigan", "Mac'biggan", "Mac'bigh", "Mac'bighan", "Mac'biins", "Mac'bikry", "Mac'bilan", "Mac'bile", "Mac'biley", "Mac'biliam", "Mac'billy", "Mac'bin", "Mac'binin", "Mac'biny", "Mac'bippy", "Mac'bipsey", "Mac'bira", "Mac'biroy", "Mac'birrell", "Mac'birroy", "Mac'biry", "Mac'bissey", "Mac'bitty", "Mac'bity", "Mac'caudan", "Mac'cauddy", "Mac'cauer", "Mac'cauffy", "Mac'caugan", "Mac'cauggan", "Mac'caugh", "Mac'caughan", "Mac'cauins", "Mac'caukry", "Mac'caulan", "Mac'caule", "Mac'cauley", "Mac'cauliam", "Mac'caully", "Mac'caun", "Mac'caunin", "Mac'cauny", "Mac'cauppy", "Mac'caupsey", "Mac'caura", "Mac'cauroy", "Mac'caurrell", "Mac'caurroy", "Mac'caury", "Mac'caussey", "Mac'cautty", "Mac'cauty", "Mac'dadan", "Mac'daddy", "Mac'daer", "Mac'daffy", "Mac'dagan", "Mac'daggan", "Mac'dagh", "Mac'daghan", "Mac'dains", "Mac'dakry", "Mac'dalan", "Mac'dale", "Mac'daley", "Mac'daliam", "Mac'dally", "Mac'dan", "Mac'danin", "Mac'dany", "Mac'dappy", "Mac'dapsey", "Mac'dara", "Mac'dardan", "Mac'darddy", "Mac'darer", "Mac'darffy", "Mac'dargan", "Mac'darggan", "Mac'dargh", "Mac'darghan", "Mac'darins", "Mac'darkry", "Mac'darlan", "Mac'darle", "Mac'darley", "Mac'darliam", "Mac'darlly", "Mac'darn", "Mac'darnin", "Mac'darny", "Mac'daroy", "Mac'darppy", "Mac'darpsey", "Mac'darra", "Mac'darrell", "Mac'darroy", "Mac'darrrell", "Mac'darrroy", "Mac'darry", "Mac'darssey", "Mac'dartty", "Mac'darty", "Mac'dary", "Mac'dassey", "Mac'datty", "Mac'daty", "Mac'doydan", "Mac'doyddy", "Mac'doyer", "Mac'doyffy", "Mac'doygan", "Mac'doyggan", "Mac'doygh", "Mac'doyghan", "Mac'doyins", "Mac'doykry", "Mac'doylan", "Mac'doyle", "Mac'doyley", "Mac'doyliam", "Mac'doylly", "Mac'doyn", "Mac'doynin", "Mac'doyny", "Mac'doyppy", "Mac'doypsey", "Mac'doyra", "Mac'doyroy", "Mac'doyrrell", "Mac'doyrroy", "Mac'doyry", "Mac'doyssey", "Mac'doytty", "Mac'doyty", "Mac'dudan", "Mac'duddy", "Mac'duer", "Mac'duffy", "Mac'dugan", "Mac'duggan", "Mac'dugh", "Mac'dughan", "Mac'duins", "Mac'dukry", "Mac'dulan", "Mac'dule", "Mac'duley", "Mac'duliam", "Mac'dully", "Mac'dun", "Mac'dunin", "Mac'duny", "Mac'duppy", "Mac'dupsey", "Mac'dura", "Mac'duroy", "Mac'durrell", "Mac'durroy", "Mac'dury", "Mac'dussey", "Mac'dutty", "Mac'duty", "Mac'gadan", "Mac'gaddy", "Mac'gaer", "Mac'gaffy", "Mac'gagan", "Mac'gaggan", "Mac'gagh", "Mac'gaghan", "Mac'gains", "Mac'gakry", "Mac'galan", "Mac'gale", "Mac'galey", "Mac'galiam", "Mac'gally", "Mac'gan", "Mac'ganin", "Mac'gany", "Mac'gappy", "Mac'gapsey", "Mac'gara", "Mac'garoy", "Mac'garrell", "Mac'garroy", "Mac'gary", "Mac'gassey", "Mac'gatty", "Mac'gaty", "Mac'jordan", "Mac'jorddy", "Mac'jorer", "Mac'jorffy", "Mac'jorgan", "Mac'jorggan", "Mac'jorgh", "Mac'jorghan", "Mac'jorins", "Mac'jorkry", "Mac'jorlan", "Mac'jorle", "Mac'jorley", "Mac'jorliam", "Mac'jorlly", "Mac'jorn", "Mac'jornin", "Mac'jorny", "Mac'jorppy", "Mac'jorpsey", "Mac'jorra", "Mac'jorroy", "Mac'jorrrell", "Mac'jorrroy", "Mac'jorry", "Mac'jorssey", "Mac'jortty", "Mac'jorty", "Mac'keadan", "Mac'keaddy", "Mac'keaer", "Mac'keaffy", "Mac'keagan", "Mac'keaggan", "Mac'keagh", "Mac'keaghan", "Mac'keains", "Mac'keakry", "Mac'kealan", "Mac'keale", "Mac'kealey", "Mac'kealiam", "Mac'keally", "Mac'kean", "Mac'keanin", "Mac'keany", "Mac'keappy", "Mac'keapsey", "Mac'keara", "Mac'kearoy", "Mac'kearrell", "Mac'kearroy", "Mac'keary", "Mac'keassey", "Mac'keatty", "Mac'keaty", "Mac'keedan", "Mac'keeddy", "Mac'keeer", "Mac'keeffy", "Mac'keegan", "Mac'keeggan", "Mac'keegh", "Mac'keeghan", "Mac'keeins", "Mac'keekry", "Mac'keelan", "Mac'keele", "Mac'keeley", "Mac'keeliam", "Mac'keelly", "Mac'keen", "Mac'keenin", "Mac'keeny", "Mac'keeppy", "Mac'keepsey", "Mac'keera", "Mac'keeroy", "Mac'keerrell", "Mac'keerroy", "Mac'keery", "Mac'keessey", "Mac'keetty", "Mac'keety", "Mac'laudan", "Mac'lauddy", "Mac'lauer", "Mac'lauffy", "Mac'laugan", "Mac'lauggan", "Mac'laugh", "Mac'laughan", "Mac'lauins", "Mac'laukry", "Mac'laulan", "Mac'laule", "Mac'lauley", "Mac'lauliam", "Mac'laully", "Mac'laun", "Mac'launin", "Mac'launy", "Mac'lauppy", "Mac'laupsey", "Mac'laura", "Mac'lauroy", "Mac'laurrell", "Mac'laurroy", "Mac'laury", "Mac'laussey", "Mac'lautty", "Mac'lauty", "Mac'leadan", "Mac'leaddy", "Mac'leaer", "Mac'leaffy", "Mac'leagan", "Mac'leaggan", "Mac'leagh", "Mac'leaghan", "Mac'leains", "Mac'leakry", "Mac'lealan", "Mac'leale", "Mac'lealey", "Mac'lealiam", "Mac'leally", "Mac'lean", "Mac'leanin", "Mac'leany", "Mac'leappy", "Mac'leapsey", "Mac'leara", "Mac'learoy", "Mac'learrell", "Mac'learroy", "Mac'leary", "Mac'leassey", "Mac'leatty", "Mac'leaty", "Mac'ledan", "Mac'leddy", "Mac'leer", "Mac'leffy", "Mac'legan", "Mac'leggan", "Mac'legh", "Mac'leghan", "Mac'leidan", "Mac'leiddy", "Mac'leier", "Mac'leiffy", "Mac'leigan", "Mac'leiggan", "Mac'leigh", "Mac'leighan", "Mac'leiins", "Mac'leikry", "Mac'leilan", "Mac'leile", "Mac'leiley", "Mac'leiliam", "Mac'leilly", "Mac'lein", "Mac'leinin", "Mac'leins", "Mac'leiny", "Mac'leippy", "Mac'leipsey", "Mac'leira", "Mac'leiroy", "Mac'leirrell", "Mac'leirroy", "Mac'leiry", "Mac'leissey", "Mac'leitty", "Mac'leity", "Mac'lekry", "Mac'lelan", "Mac'lele", "Mac'leley", "Mac'leliam", "Mac'lelly", "Mac'len", "Mac'lenin", "Mac'leny", "Mac'leppy", "Mac'lepsey", "Mac'lera", "Mac'leroy", "Mac'lerrell", "Mac'lerroy", "Mac'lery", "Mac'lessey", "Mac'letty", "Mac'lety", "Mac'lodan", "Mac'loddy", "Mac'loer", "Mac'loffy", "Mac'logan", "Mac'loggan", "Mac'logh", "Mac'loghan", "Mac'loins", "Mac'lokry", "Mac'lolan", "Mac'lole", "Mac'loley", "Mac'loliam", "Mac'lolly", "Mac'lon", "Mac'lonin", "Mac'lony", "Mac'loppy", "Mac'lopsey", "Mac'lora", "Mac'loroy", "Mac'lorrell", "Mac'lorroy", "Mac'lory", "Mac'lossey", "Mac'lotty", "Mac'loty", "Mac'lyndan", "Mac'lynddy", "Mac'lyner", "Mac'lynffy", "Mac'lyngan", "Mac'lynggan", "Mac'lyngh", "Mac'lynghan", "Mac'lynins", "Mac'lynkry", "Mac'lynlan", "Mac'lynle", "Mac'lynley", "Mac'lynliam", "Mac'lynlly", "Mac'lynn", "Mac'lynnin", "Mac'lynny", "Mac'lynppy", "Mac'lynpsey", "Mac'lynra", "Mac'lynroy", "Mac'lynrrell", "Mac'lynrroy", "Mac'lynry", "Mac'lynssey", "Mac'lyntty", "Mac'lynty", "Mac'madan", "Mac'maddy", "Mac'maer", "Mac'maffy", "Mac'magan", "Mac'maggan", "Mac'magh", "Mac'maghan", "Mac'mains", "Mac'makry", "Mac'malan", "Mac'male", "Mac'maley", "Mac'maliam", "Mac'mally", "Mac'man", "Mac'manin", "Mac'many", "Mac'mappy", "Mac'mapsey", "Mac'mara", "Mac'maroy", "Mac'marrell", "Mac'marroy", "Mac'mary", "Mac'massey", "Mac'matty", "Mac'maty", "Mac'nadan", "Mac'naddy", "Mac'naer", "Mac'naffy", "Mac'nagan", "Mac'naggan", "Mac'nagh", "Mac'naghan", "Mac'nains", "Mac'nakry", "Mac'nalan", "Mac'nale", "Mac'naley", "Mac'naliam", "Mac'nally", "Mac'nan", "Mac'nanin", "Mac'nany", "Mac'nappy", "Mac'napsey", "Mac'nara", "Mac'naroy", "Mac'narrell", "Mac'narroy", "Mac'nary", "Mac'nassey", "Mac'natty", "Mac'naty", "Mac'nedan", "Mac'neddy", "Mac'neer", "Mac'neffy", "Mac'negan", "Mac'neggan", "Mac'negh", "Mac'neghan", "Mac'neins", "Mac'nekry", "Mac'nelan", "Mac'nele", "Mac'neley", "Mac'neliam", "Mac'nelly", "Mac'nen", "Mac'nenin", "Mac'neny", "Mac'neppy", "Mac'nepsey", "Mac'nera", "Mac'neroy", "Mac'nerrell", "Mac'nerroy", "Mac'nery", "Mac'nessey", "Mac'netty", "Mac'nety", "Mac'peadan", "Mac'peaddy", "Mac'peaer", "Mac'peaffy", "Mac'peagan", "Mac'peaggan", "Mac'peagh", "Mac'peaghan", "Mac'peains", "Mac'peakry", "Mac'pealan", "Mac'peale", "Mac'pealey", "Mac'pealiam", "Mac'peally", "Mac'pean", "Mac'peanin", "Mac'peany", "Mac'peappy", "Mac'peapsey", "Mac'peara", "Mac'pearoy", "Mac'pearrell", "Mac'pearroy", "Mac'peary", "Mac'peassey", "Mac'peatty", "Mac'peaty", "Mac'reidan", "Mac'reiddy", "Mac'reier", "Mac'reiffy", "Mac'reigan", "Mac'reiggan", "Mac'reigh", "Mac'reighan", "Mac'reiins", "Mac'reikry", "Mac'reilan", "Mac'reile", "Mac'reiley", "Mac'reiliam", "Mac'reilly", "Mac'rein", "Mac'reinin", "Mac'reiny", "Mac'reippy", "Mac'reipsey", "Mac'reira", "Mac'reiroy", "Mac'reirrell", "Mac'reirroy", "Mac'reiry", "Mac'reissey", "Mac'reitty", "Mac'reity", "Mac'ridan", "Mac'riddy", "Mac'rier", "Mac'riffy", "Mac'rigan", "Mac'riggan", "Mac'righ", "Mac'righan", "Mac'riins", "Mac'rikry", "Mac'rilan", "Mac'rile", "Mac'riley", "Mac'riliam", "Mac'rilly", "Mac'rin", "Mac'rinin", "Mac'riny", "Mac'ripdan", "Mac'ripddy", "Mac'riper", "Mac'ripffy", "Mac'ripgan", "Mac'ripggan", "Mac'ripgh", "Mac'ripghan", "Mac'ripins", "Mac'ripkry", "Mac'riplan", "Mac'riple", "Mac'ripley", "Mac'ripliam", "Mac'riplly", "Mac'ripn", "Mac'ripnin", "Mac'ripny", "Mac'ripppy", "Mac'rippsey", "Mac'rippy", "Mac'ripra", "Mac'riproy", "Mac'riprrell", "Mac'riprroy", "Mac'ripry", "Mac'ripsey", "Mac'ripssey", "Mac'riptty", "Mac'ripty", "Mac'rira", "Mac'riroy", "Mac'rirrell", "Mac'rirroy", "Mac'riry", "Mac'rissey", "Mac'ritty", "Mac'rity", "Mac'rodan", "Mac'roddy", "Mac'roer", "Mac'roffy", "Mac'rogan", "Mac'roggan", "Mac'rogh", "Mac'roghan", "Mac'roins", "Mac'rokry", "Mac'rolan", "Mac'role", "Mac'roley", "Mac'roliam", "Mac'rolly", "Mac'ron", "Mac'ronin", "Mac'rony", "Mac'roppy", "Mac'ropsey", "Mac'rora", "Mac'roroy", "Mac'rorrell", "Mac'rorroy", "Mac'rory", "Mac'rossey", "Mac'rotty", "Mac'roty", "Mac'sadan", "Mac'saddy", "Mac'saer", "Mac'saffy", "Mac'sagan", "Mac'saggan", "Mac'sagh", "Mac'saghan", "Mac'sains", "Mac'sakry", "Mac'salan", "Mac'sale", "Mac'saley", "Mac'saliam", "Mac'sally", "Mac'san", "Mac'sanin", "Mac'sany", "Mac'sappy", "Mac'sapsey", "Mac'sara", "Mac'saroy", "Mac'sarrell", "Mac'sarroy", "Mac'sary", "Mac'sassey", "Mac'satty", "Mac'saty", "Mac'shedan", "Mac'sheddy", "Mac'sheer", "Mac'sheffy", "Mac'shegan", "Mac'sheggan", "Mac'shegh", "Mac'sheghan", "Mac'sheins", "Mac'shekry", "Mac'shelan", "Mac'shele", "Mac'sheley", "Mac'sheliam", "Mac'shelly", "Mac'shen", "Mac'shenin", "Mac'sheny", "Mac'sheppy", "Mac'shepsey", "Mac'shera", "Mac'sheroy", "Mac'sherrell", "Mac'sherroy", "Mac'shery", "Mac'shessey", "Mac'shetty", "Mac'shety", "Mac'tedan", "Mac'teddy", "Mac'teer", "Mac'teffy", "Mac'tegan", "Mac'teggan", "Mac'tegh", "Mac'teghan", "Mac'teins", "Mac'tekry", "Mac'telan", "Mac'tele", "Mac'teley", "Mac'teliam", "Mac'telly", "Mac'ten", "Mac'tenin", "Mac'teny", "Mac'teppy", "Mac'tepsey", "Mac'tera", "Mac'teroy", "Mac'terrell", "Mac'terroy", "Mac'tery", "Mac'tessey", "Mac'tetty", "Mac'tety", "Mac'toodan", "Mac'tooddy", "Mac'tooer", "Mac'tooffy", "Mac'toogan", "Mac'tooggan", "Mac'toogh", "Mac'tooghan", "Mac'tooins", "Mac'tookry", "Mac'toolan", "Mac'toole", "Mac'tooley", "Mac'tooliam", "Mac'toolly", "Mac'toon", "Mac'toonin", "Mac'toony", "Mac'tooppy", "Mac'toopsey", "Mac'toora", "Mac'tooroy", "Mac'toorrell", "Mac'toorroy", "Mac'toory", "Mac'toossey", "Mac'tootty", "Mac'tooty", "Mac'widan", "Mac'widdy", "Mac'wier", "Mac'wiffy", "Mac'wigan", "Mac'wiggan", "Mac'wigh", "Mac'wighan", "Mac'wiins", "Mac'wikry", "Mac'wilan", "Mac'wile", "Mac'wiley", "Mac'wiliam", "Mac'willy", "Mac'win", "Mac'winin", "Mac'winy", "Mac'wippy", "Mac'wipsey", "Mac'wira", "Mac'wiroy", "Mac'wirrell", "Mac'wirroy", "Mac'wiry", "Mac'wissey", "Mac'witty", "Mac'wity", "Mac'ydan", "Mac'yddy", "Mac'yer", "Mac'yffy", "Mac'ygan", "Mac'yggan", "Mac'ygh", "Mac'yghan", "Mac'yins", "Mac'ykry", "Mac'ylan", "Mac'yle", "Mac'yley", "Mac'yliam", "Mac'ylly", "Mac'yn", "Mac'ynin", "Mac'yny", "Mac'yppy", "Mac'ypsey", "Mac'yra", "Mac'yroy", "Mac'yrrell", "Mac'yrroy", "Mac'yry", "Mac'yssey", "Mac'ytty", "Mac'yty", "Madan", "Maddy", "Maer", "Maffy", "Magan", "Maggan", "Magh", "Maghan", "Mains", "Makry", "Malan", "Male", "Maley", "Maliam", "Mally", "Man", "Manin", "Many", "Mappy", "Mapsey", "Mara", "Maroy", "Marrell", "Marroy", "Mary", "Massey", "Matty", "Maty", "Nadan", "Naddy", "Naer", "Naffy", "Nagan", "Naggan", "Nagh", "Naghan", "Nains", "Nakry", "Nalan", "Nale", "Naley", "Naliam", "Nally", "Nan", "Nanin", "Nany", "Nappy", "Napsey", "Nara", "Naroy", "Narrell", "Narroy", "Nary", "Nassey", "Natty", "Naty", "Nedan", "Neddy", "Neer", "Neffy", "Negan", "Neggan", "Negh", "Neghan", "Neins", "Nekry", "Nelan", "Nele", "Neley", "Neliam", "Nelly", "Nen", "Nenin", "Neny", "Neppy", "Nepsey", "Nera", "Neroy", "Nerrell", "Nerroy", "Nery", "Nessey", "Netty", "Nety", "O'ardan", "O'arddy", "O'arer", "O'arffy", "O'argan", "O'arggan", "O'argh", "O'arghan", "O'arins", "O'arkry", "O'arlan", "O'arle", "O'arley", "O'arliam", "O'arlly", "O'arn", "O'arnin", "O'arny", "O'arppy", "O'arpsey", "O'arra", "O'arroy", "O'arrrell", "O'arrroy", "O'arry", "O'arssey", "O'artty", "O'arty", "O'bidan", "O'biddy", "O'bier", "O'biffy", "O'bigan", "O'biggan", "O'bigh", "O'bighan", "O'biins", "O'bikry", "O'bilan", "O'bile", "O'biley", "O'biliam", "O'billy", "O'bin", "O'binin", "O'biny", "O'bippy", "O'bipsey", "O'bira", "O'biroy", "O'birrell", "O'birroy", "O'biry", "O'bissey", "O'bitty", "O'bity", "O'caudan", "O'cauddy", "O'cauer", "O'cauffy", "O'caugan", "O'cauggan", "O'caugh", "O'caughan", "O'cauins", "O'caukry", "O'caulan", "O'caule", "O'cauley", "O'cauliam", "O'caully", "O'caun", "O'caunin", "O'cauny", "O'cauppy", "O'caupsey", "O'caura", "O'cauroy", "O'caurrell", "O'caurroy", "O'caury", "O'caussey", "O'cautty", "O'cauty", "O'dadan", "O'daddy", "O'daer", "O'daffy", "O'dagan", "O'daggan", "O'dagh", "O'daghan", "O'dains", "O'dakry", "O'dalan", "O'dale", "O'daley", "O'daliam", "O'dally", "O'dan", "O'danin", "O'dany", "O'dappy", "O'dapsey", "O'dara", "O'dardan", "O'darddy", "O'darer", "O'darffy", "O'dargan", "O'darggan", "O'dargh", "O'darghan", "O'darins", "O'darkry", "O'darlan", "O'darle", "O'darley", "O'darliam", "O'darlly", "O'darn", "O'darnin", "O'darny", "O'daroy", "O'darppy", "O'darpsey", "O'darra", "O'darrell", "O'darroy", "O'darrrell", "O'darrroy", "O'darry", "O'darssey", "O'dartty", "O'darty", "O'dary", "O'dassey", "O'datty", "O'daty", "O'doydan", "O'doyddy", "O'doyer", "O'doyffy", "O'doygan", "O'doyggan", "O'doygh", "O'doyghan", "O'doyins", "O'doykry", "O'doylan", "O'doyle", "O'doyley", "O'doyliam", "O'doylly", "O'doyn", "O'doynin", "O'doyny", "O'doyppy", "O'doypsey", "O'doyra", "O'doyroy", "O'doyrrell", "O'doyrroy", "O'doyry", "O'doyssey", "O'doytty", "O'doyty", "O'dudan", "O'duddy", "O'duer", "O'duffy", "O'dugan", "O'duggan", "O'dugh", "O'dughan", "O'duins", "O'dukry", "O'dulan", "O'dule", "O'duley", "O'duliam", "O'dully", "O'dun", "O'dunin", "O'duny", "O'duppy", "O'dupsey", "O'dura", "O'duroy", "O'durrell", "O'durroy", "O'dury", "O'dussey", "O'dutty", "O'duty", "O'gadan", "O'gaddy", "O'gaer", "O'gaffy", "O'gagan", "O'gaggan", "O'gagh", "O'gaghan", "O'gains", "O'gakry", "O'galan", "O'gale", "O'galey", "O'galiam", "O'gally", "O'gan", "O'ganin", "O'gany", "O'gappy", "O'gapsey", "O'gara", "O'garoy", "O'garrell", "O'garroy", "O'gary", "O'gassey", "O'gatty", "O'gaty", "O'jordan", "O'jorddy", "O'jorer", "O'jorffy", "O'jorgan", "O'jorggan", "O'jorgh", "O'jorghan", "O'jorins", "O'jorkry", "O'jorlan", "O'jorle", "O'jorley", "O'jorliam", "O'jorlly", "O'jorn", "O'jornin", "O'jorny", "O'jorppy", "O'jorpsey", "O'jorra", "O'jorroy", "O'jorrrell", "O'jorrroy", "O'jorry", "O'jorssey", "O'jortty", "O'jorty", "O'keadan", "O'keaddy", "O'keaer", "O'keaffy", "O'keagan", "O'keaggan", "O'keagh", "O'keaghan", "O'keains", "O'keakry", "O'kealan", "O'keale", "O'kealey", "O'kealiam", "O'keally", "O'kean", "O'keanin", "O'keany", "O'keappy", "O'keapsey", "O'keara", "O'kearoy", "O'kearrell", "O'kearroy", "O'keary", "O'keassey", "O'keatty", "O'keaty", "O'keedan", "O'keeddy", "O'keeer", "O'keeffy", "O'keegan", "O'keeggan", "O'keegh", "O'keeghan", "O'keeins", "O'keekry", "O'keelan", "O'keele", "O'keeley", "O'keeliam", "O'keelly", "O'keen", "O'keenin", "O'keeny", "O'keeppy", "O'keepsey", "O'keera", "O'keeroy", "O'keerrell", "O'keerroy", "O'keery", "O'keessey", "O'keetty", "O'keety", "O'laudan", "O'lauddy", "O'lauer", "O'lauffy", "O'laugan", "O'lauggan", "O'laugh", "O'laughan", "O'lauins", "O'laukry", "O'laulan", "O'laule", "O'lauley", "O'lauliam", "O'laully", "O'laun", "O'launin", "O'launy", "O'lauppy", "O'laupsey", "O'laura", "O'lauroy", "O'laurrell", "O'laurroy", "O'laury", "O'laussey", "O'lautty", "O'lauty", "O'leadan", "O'leaddy", "O'leaer", "O'leaffy", "O'leagan", "O'leaggan", "O'leagh", "O'leaghan", "O'leains", "O'leakry", "O'lealan", "O'leale", "O'lealey", "O'lealiam", "O'leally", "O'lean", "O'leanin", "O'leany", "O'leappy", "O'leapsey", "O'leara", "O'learoy", "O'learrell", "O'learroy", "O'leary", "O'leassey", "O'leatty", "O'leaty", "O'ledan", "O'leddy", "O'leer", "O'leffy", "O'legan", "O'leggan", "O'legh", "O'leghan", "O'leidan", "O'leiddy", "O'leier", "O'leiffy", "O'leigan", "O'leiggan", "O'leigh", "O'leighan", "O'leiins", "O'leikry", "O'leilan", "O'leile", "O'leiley", "O'leiliam", "O'leilly", "O'lein", "O'leinin", "O'leins", "O'leiny", "O'leippy", "O'leipsey", "O'leira", "O'leiroy", "O'leirrell", "O'leirroy", "O'leiry", "O'leissey", "O'leitty", "O'leity", "O'lekry", "O'lelan", "O'lele", "O'leley", "O'leliam", "O'lelly", "O'len", "O'lenin", "O'leny", "O'leppy", "O'lepsey", "O'lera", "O'leroy", "O'lerrell", "O'lerroy", "O'lery", "O'lessey", "O'letty", "O'lety", "O'lodan", "O'loddy", "O'loer", "O'loffy", "O'logan", "O'loggan", "O'logh", "O'loghan", "O'loins", "O'lokry", "O'lolan", "O'lole", "O'loley", "O'loliam", "O'lolly", "O'lon", "O'lonin", "O'lony", "O'loppy", "O'lopsey", "O'lora", "O'loroy", "O'lorrell", "O'lorroy", "O'lory", "O'lossey", "O'lotty", "O'loty", "O'lyndan", "O'lynddy", "O'lyner", "O'lynffy", "O'lyngan", "O'lynggan", "O'lyngh", "O'lynghan", "O'lynins", "O'lynkry", "O'lynlan", "O'lynle", "O'lynley", "O'lynliam", "O'lynlly", "O'lynn", "O'lynnin", "O'lynny", "O'lynppy", "O'lynpsey", "O'lynra", "O'lynroy", "O'lynrrell", "O'lynrroy", "O'lynry", "O'lynssey", "O'lyntty", "O'lynty", "O'madan", "O'maddy", "O'maer", "O'maffy", "O'magan", "O'maggan", "O'magh", "O'maghan", "O'mains", "O'makry", "O'malan", "O'male", "O'maley", "O'maliam", "O'mally", "O'man", "O'manin", "O'many", "O'mappy", "O'mapsey", "O'mara", "O'maroy", "O'marrell", "O'marroy", "O'mary", "O'massey", "O'matty", "O'maty", "O'nadan", "O'naddy", "O'naer", "O'naffy", "O'nagan", "O'naggan", "O'nagh", "O'naghan", "O'nains", "O'nakry", "O'nalan", "O'nale", "O'naley", "O'naliam", "O'nally", "O'nan", "O'nanin", "O'nany", "O'nappy", "O'napsey", "O'nara", "O'naroy", "O'narrell", "O'narroy", "O'nary", "O'nassey", "O'natty", "O'naty", "O'nedan", "O'neddy", "O'neer", "O'neffy", "O'negan", "O'neggan", "O'negh", "O'neghan", "O'neins", "O'nekry", "O'nelan", "O'nele", "O'neley", "O'neliam", "O'nelly", "O'nen", "O'nenin", "O'neny", "O'neppy", "O'nepsey", "O'nera", "O'neroy", "O'nerrell", "O'nerroy", "O'nery", "O'nessey", "O'netty", "O'nety", "O'peadan", "O'peaddy", "O'peaer", "O'peaffy", "O'peagan", "O'peaggan", "O'peagh", "O'peaghan", "O'peains", "O'peakry", "O'pealan", "O'peale", "O'pealey", "O'pealiam", "O'peally", "O'pean", "O'peanin", "O'peany", "O'peappy", "O'peapsey", "O'peara", "O'pearoy", "O'pearrell", "O'pearroy", "O'peary", "O'peassey", "O'peatty", "O'peaty", "O'reidan", "O'reiddy", "O'reier", "O'reiffy", "O'reigan", "O'reiggan", "O'reigh", "O'reighan", "O'reiins", "O'reikry", "O'reilan", "O'reile", "O'reiley", "O'reiliam", "O'reilly", "O'rein", "O'reinin", "O'reiny", "O'reippy", "O'reipsey", "O'reira", "O'reiroy", "O'reirrell", "O'reirroy", "O'reiry", "O'reissey", "O'reitty", "O'reity", "O'ridan", "O'riddy", "O'rier", "O'riffy", "O'rigan", "O'riggan", "O'righ", "O'righan", "O'riins", "O'rikry", "O'rilan", "O'rile", "O'riley", "O'riliam", "O'rilly", "O'rin", "O'rinin", "O'riny", "O'ripdan", "O'ripddy", "O'riper", "O'ripffy", "O'ripgan", "O'ripggan", "O'ripgh", "O'ripghan", "O'ripins", "O'ripkry", "O'riplan", "O'riple", "O'ripley", "O'ripliam", "O'riplly", "O'ripn", "O'ripnin", "O'ripny", "O'ripppy", "O'rippsey", "O'rippy", "O'ripra", "O'riproy", "O'riprrell", "O'riprroy", "O'ripry", "O'ripsey", "O'ripssey", "O'riptty", "O'ripty", "O'rira", "O'riroy", "O'rirrell", "O'rirroy", "O'riry", "O'rissey", "O'ritty", "O'rity", "O'rodan", "O'roddy", "O'roer", "O'roffy", "O'rogan", "O'roggan", "O'rogh", "O'roghan", "O'roins", "O'rokry", "O'rolan", "O'role", "O'roley", "O'roliam", "O'rolly", "O'ron", "O'ronin", "O'rony", "O'roppy", "O'ropsey", "O'rora", "O'roroy", "O'rorrell", "O'rorroy", "O'rory", "O'rossey", "O'rotty", "O'roty", "O'sadan", "O'saddy", "O'saer", "O'saffy", "O'sagan", "O'saggan", "O'sagh", "O'saghan", "O'sains", "O'sakry", "O'salan", "O'sale", "O'saley", "O'saliam", "O'sally", "O'san", "O'sanin", "O'sany", "O'sappy", "O'sapsey", "O'sara", "O'saroy", "O'sarrell", "O'sarroy", "O'sary", "O'sassey", "O'satty", "O'saty", "O'shedan", "O'sheddy", "O'sheer", "O'sheffy", "O'shegan", "O'sheggan", "O'shegh", "O'sheghan", "O'sheins", "O'shekry", "O'shelan", "O'shele", "O'sheley", "O'sheliam", "O'shelly", "O'shen", "O'shenin", "O'sheny", "O'sheppy", "O'shepsey", "O'shera", "O'sheroy", "O'sherrell", "O'sherroy", "O'shery", "O'shessey", "O'shetty", "O'shety", "O'tedan", "O'teddy", "O'teer", "O'teffy", "O'tegan", "O'teggan", "O'tegh", "O'teghan", "O'teins", "O'tekry", "O'telan", "O'tele", "O'teley", "O'teliam", "O'telly", "O'ten", "O'tenin", "O'teny", "O'teppy", "O'tepsey", "O'tera", "O'teroy", "O'terrell", "O'terroy", "O'tery", "O'tessey", "O'tetty", "O'tety", "O'toodan", "O'tooddy", "O'tooer", "O'tooffy", "O'toogan", "O'tooggan", "O'toogh", "O'tooghan", "O'tooins", "O'tookry", "O'toolan", "O'toole", "O'tooley", "O'tooliam", "O'toolly", "O'toon", "O'toonin", "O'toony", "O'tooppy", "O'toopsey", "O'toora", "O'tooroy", "O'toorrell", "O'toorroy", "O'toory", "O'toossey", "O'tootty", "O'tooty", "O'widan", "O'widdy", "O'wier", "O'wiffy", "O'wigan", "O'wiggan", "O'wigh", "O'wighan", "O'wiins", "O'wikry", "O'wilan", "O'wile", "O'wiley", "O'wiliam", "O'willy", "O'win", "O'winin", "O'winy", "O'wippy", "O'wipsey", "O'wira", "O'wiroy", "O'wirrell", "O'wirroy", "O'wiry", "O'wissey", "O'witty", "O'wity", "O'ydan", "O'yddy", "O'yer", "O'yffy", "O'ygan", "O'yggan", "O'ygh", "O'yghan", "O'yins", "O'ykry", "O'ylan", "O'yle", "O'yley", "O'yliam", "O'ylly", "O'yn", "O'ynin", "O'yny", "O'yppy", "O'ypsey", "O'yra", "O'yroy", "O'yrrell", "O'yrroy", "O'yry", "O'yssey", "O'ytty", "O'yty", "Peadan", "Peaddy", "Peaer", "Peaffy", "Peagan", "Peaggan", "Peagh", "Peaghan", "Peains", "Peakry", "Pealan", "Peale", "Pealey", "Pealiam", "Peally", "Pean", "Peanin", "Peany", "Peappy", "Peapsey", "Peara", "Pearoy", "Pearrell", "Pearroy", "Peary", "Peassey", "Peatty", "Peaty", "Reidan", "Reiddy", "Reier", "Reiffy", "Reigan", "Reiggan", "Reigh", "Reighan", "Reiins", "Reikry", "Reilan", "Reile", "Reiley", "Reiliam", "Reilly", "Rein", "Reinin", "Reiny", "Reippy", "Reipsey", "Reira", "Reiroy", "Reirrell", "Reirroy", "Reiry", "Reissey", "Reitty", "Reity", "Ridan", "Riddy", "Rier", "Riffy", "Rigan", "Riggan", "Righ", "Righan", "Riins", "Rikry", "Rilan", "Rile", "Riley", "Riliam", "Rilly", "Rin", "Rinin", "Riny", "Ripdan", "Ripddy", "Riper", "Ripffy", "Ripgan", "Ripggan", "Ripgh", "Ripghan", "Ripins", "Ripkry", "Riplan", "Riple", "Ripley", "Ripliam", "Riplly", "Ripn", "Ripnin", "Ripny", "Ripppy", "Rippsey", "Rippy", "Ripra", "Riproy", "Riprrell", "Riprroy", "Ripry", "Ripsey", "Ripssey", "Riptty", "Ripty", "Rira", "Riroy", "Rirrell", "Rirroy", "Riry", "Rissey", "Ritty", "Rity", "Rodan", "Roddy", "Roer", "Roffy", "Rogan", "Roggan", "Rogh", "Roghan", "Roins", "Rokry", "Rolan", "Role", "Roley", "Roliam", "Rolly", "Ron", "Ronin", "Rony", "Roppy", "Ropsey", "Rora", "Roroy", "Rorrell", "Rorroy", "Rory", "Rossey", "Rotty", "Roty", "Sadan", "Saddy", "Saer", "Saffy", "Sagan", "Saggan", "Sagh", "Saghan", "Sains", "Sakry", "Salan", "Sale", "Saley", "Saliam", "Sally", "San", "Sanin", "Sany", "Sappy", "Sapsey", "Sara", "Saroy", "Sarrell", "Sarroy", "Sary", "Sassey", "Satty", "Saty", "Shedan", "Sheddy", "Sheer", "Sheffy", "Shegan", "Sheggan", "Shegh", "Sheghan", "Sheins", "Shekry", "Shelan", "Shele", "Sheley", "Sheliam", "Shelly", "Shen", "Shenin", "Sheny", "Sheppy", "Shepsey", "Shera", "Sheroy", "Sherrell", "Sherroy", "Shery", "Shessey", "Shetty", "Shety", "Tedan", "Teddy", "Teer", "Teffy", "Tegan", "Teggan", "Tegh", "Teghan", "Teins", "Tekry", "Telan", "Tele", "Teley", "Teliam", "Telly", "Ten", "Tenin", "Teny", "Teppy", "Tepsey", "Tera", "Teroy", "Terrell", "Terroy", "Tery", "Tessey", "Tetty", "Tety", "Toodan", "Tooddy", "Tooer", "Tooffy", "Toogan", "Tooggan", "Toogh", "Tooghan", "Tooins", "Tookry", "Toolan", "Toole", "Tooley", "Tooliam", "Toolly", "Toon", "Toonin", "Toony", "Tooppy", "Toopsey", "Toora", "Tooroy", "Toorrell", "Toorroy", "Toory", "Toossey", "Tootty", "Tooty", "Widan", "Widdy", "Wier", "Wiffy", "Wigan", "Wiggan", "Wigh", "Wighan", "Wiins", "Wikry", "Wilan", "Wile", "Wiley", "Wiliam", "Willy", "Win", "Winin", "Winy", "Wippy", "Wipsey", "Wira", "Wiroy", "Wirrell", "Wirroy", "Wiry", "Wissey", "Witty", "Wity", "Ydan", "Yddy", "Yer", "Yffy", "Ygan", "Yggan", "Ygh", "Yghan", "Yins", "Ykry", "Ylan", "Yle", "Yley", "Yliam", "Ylly", "Yn", "Ynin", "Yny", "Yppy", "Ypsey", "Yra", "Yroy", "Yrrell", "Yrroy", "Yry", "Yssey", "Ytty", "Yty"} -- VERSION -- -RYZOM_NAMES_TRYKER_VERSION = 10469 \ No newline at end of file +RYZOM_NAMES_TRYKER_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/names_zorai.lua b/ryzom/client/data/gamedev/interfaces_v3/names_zorai.lua index 8cdb80123c..30f371551b 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/names_zorai.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/names_zorai.lua @@ -5,4 +5,4 @@ zoraiFirstNamesTwo = {"Ba", "Ban", "Bang", "Bao", "Be", "Ben", "Beng", "Beo", "B zoraiLastNames = {"Ba", "Bai", "Ban", "Bang", "Bangi", "Bani", "Bao", "Baoi", "Be", "Bei", "Ben", "Beng", "Bengi", "Beni", "Beo", "Beoi", "Bi", "Bia", "Biai", "Bian", "Biang", "Biangi", "Biani", "Biao", "Biaoi", "Bii", "Bin", "Bing", "Bingi", "Bini", "Bio", "Bioi", "Bo", "Boi", "Bon", "Bong", "Bongi", "Boni", "Boo", "Booi", "Bu", "Bua", "Buai", "Buan", "Buang", "Buangi", "Buani", "Buao", "Buaoi", "Bui", "Bun", "Bung", "Bungi", "Buni", "Buo", "Buoi", "Ca", "Cai", "Can", "Cang", "Cangi", "Cani", "Cao", "Caoi", "Ce", "Cei", "Cen", "Ceng", "Cengi", "Ceni", "Ceo", "Ceoi", "Cha", "Chai", "Chan", "Chang", "Changi", "Chani", "Chao", "Chaoi", "Che", "Chei", "Chen", "Cheng", "Chengi", "Cheni", "Cheo", "Cheoi", "Chi", "Chia", "Chiai", "Chian", "Chiang", "Chiangi", "Chiani", "Chiao", "Chiaoi", "Chii", "Chin", "Ching", "Chingi", "Chini", "Chio", "Chioi", "Cho", "Choi", "Chon", "Chong", "Chongi", "Choni", "Choo", "Chooi", "Chu", "Chua", "Chuai", "Chuan", "Chuang", "Chuangi", "Chuani", "Chuao", "Chuaoi", "Chui", "Chun", "Chung", "Chungi", "Chuni", "Chuo", "Chuoi", "Ci", "Cia", "Ciai", "Cian", "Ciang", "Ciangi", "Ciani", "Ciao", "Ciaoi", "Cii", "Cin", "Cing", "Cingi", "Cini", "Cio", "Cioi", "Co", "Coi", "Con", "Cong", "Congi", "Coni", "Coo", "Cooi", "Cu", "Cua", "Cuai", "Cuan", "Cuang", "Cuangi", "Cuani", "Cuao", "Cuaoi", "Cui", "Cun", "Cung", "Cungi", "Cuni", "Cuo", "Cuoi", "Da", "Dai", "Dan", "Dang", "Dangi", "Dani", "Dao", "Daoi", "De", "Dei", "Den", "Deng", "Dengi", "Deni", "Deo", "Deoi", "Di", "Dia", "Diai", "Dian", "Diang", "Diangi", "Diani", "Diao", "Diaoi", "Dii", "Din", "Ding", "Dingi", "Dini", "Dio", "Dioi", "Do", "Doi", "Don", "Dong", "Dongi", "Doni", "Doo", "Dooi", "Du", "Dua", "Duai", "Duan", "Duang", "Duangi", "Duani", "Duao", "Duaoi", "Dui", "Dun", "Dung", "Dungi", "Duni", "Duo", "Duoi", "Fa", "Fai", "Fan", "Fang", "Fangi", "Fani", "Fao", "Faoi", "Fe", "Fei", "Fen", "Feng", "Fengi", "Feni", "Feo", "Feoi", "Fi", "Fia", "Fiai", "Fian", "Fiang", "Fiangi", "Fiani", "Fiao", "Fiaoi", "Fii", "Fin", "Fing", "Fingi", "Fini", "Fio", "Fioi", "Fo", "Foi", "Fon", "Fong", "Fongi", "Foni", "Foo", "Fooi", "Fu", "Fua", "Fuai", "Fuan", "Fuang", "Fuangi", "Fuani", "Fuao", "Fuaoi", "Fui", "Fun", "Fung", "Fungi", "Funi", "Fuo", "Fuoi", "Ga", "Gai", "Gan", "Gang", "Gangi", "Gani", "Gao", "Gaoi", "Ge", "Gei", "Gen", "Geng", "Gengi", "Geni", "Geo", "Geoi", "Gi", "Gia", "Giai", "Gian", "Giang", "Giangi", "Giani", "Giao", "Giaoi", "Gii", "Gin", "Ging", "Gingi", "Gini", "Gio", "Gioi", "Go", "Goi", "Gon", "Gong", "Gongi", "Goni", "Goo", "Gooi", "Gu", "Gua", "Guai", "Guan", "Guang", "Guangi", "Guani", "Guao", "Guaoi", "Gui", "Gun", "Gung", "Gungi", "Guni", "Guo", "Guoi", "Ha", "Hai", "Han", "Hang", "Hangi", "Hani", "Hao", "Haoi", "He", "Hei", "Hen", "Heng", "Hengi", "Heni", "Heo", "Heoi", "Hi", "Hia", "Hiai", "Hian", "Hiang", "Hiangi", "Hiani", "Hiao", "Hiaoi", "Hii", "Hin", "Hing", "Hingi", "Hini", "Hio", "Hioi", "Ho", "Hoi", "Hon", "Hong", "Hongi", "Honi", "Hoo", "Hooi", "Hu", "Hua", "Huai", "Huan", "Huang", "Huangi", "Huani", "Huao", "Huaoi", "Hui", "Hun", "Hung", "Hungi", "Huni", "Huo", "Huoi", "Ja", "Jai", "Jan", "Jang", "Jangi", "Jani", "Jao", "Jaoi", "Je", "Jei", "Jen", "Jeng", "Jengi", "Jeni", "Jeo", "Jeoi", "Ji", "Jia", "Jiai", "Jian", "Jiang", "Jiangi", "Jiani", "Jiao", "Jiaoi", "Jii", "Jin", "Jing", "Jingi", "Jini", "Jio", "Jioi", "Jo", "Joi", "Jon", "Jong", "Jongi", "Joni", "Joo", "Jooi", "Ju", "Jua", "Juai", "Juan", "Juang", "Juangi", "Juani", "Juao", "Juaoi", "Jui", "Jun", "Jung", "Jungi", "Juni", "Juo", "Juoi", "Ka", "Kai", "Kan", "Kang", "Kangi", "Kani", "Kao", "Kaoi", "Ke", "Kei", "Ken", "Keng", "Kengi", "Keni", "Keo", "Keoi", "Ki", "Kia", "Kiai", "Kian", "Kiang", "Kiangi", "Kiani", "Kiao", "Kiaoi", "Kii", "Kin", "King", "Kingi", "Kini", "Kio", "Kioi", "Ko", "Koi", "Kon", "Kong", "Kongi", "Koni", "Koo", "Kooi", "Ku", "Kua", "Kuai", "Kuan", "Kuang", "Kuangi", "Kuani", "Kuao", "Kuaoi", "Kui", "Kun", "Kung", "Kungi", "Kuni", "Kuo", "Kuoi", "La", "Lai", "Lan", "Lang", "Langi", "Lani", "Lao", "Laoi", "Le", "Lei", "Len", "Leng", "Lengi", "Leni", "Leo", "Leoi", "Li", "Lia", "Liai", "Lian", "Liang", "Liangi", "Liani", "Liao", "Liaoi", "Lii", "Lin", "Ling", "Lingi", "Lini", "Lio", "Lioi", "Lo", "Loi", "Lon", "Long", "Longi", "Loni", "Loo", "Looi", "Lu", "Lua", "Luai", "Luan", "Luang", "Luangi", "Luani", "Luao", "Luaoi", "Lui", "Lun", "Lung", "Lungi", "Luni", "Luo", "Luoi", "Ma", "Mai", "Man", "Mang", "Mangi", "Mani", "Mao", "Maoi", "Me", "Mei", "Men", "Meng", "Mengi", "Meni", "Meo", "Meoi", "Mi", "Mia", "Miai", "Mian", "Miang", "Miangi", "Miani", "Miao", "Miaoi", "Mii", "Min", "Ming", "Mingi", "Mini", "Mio", "Mioi", "Mo", "Moi", "Mon", "Mong", "Mongi", "Moni", "Moo", "Mooi", "Mu", "Mua", "Muai", "Muan", "Muang", "Muangi", "Muani", "Muao", "Muaoi", "Mui", "Mun", "Mung", "Mungi", "Muni", "Muo", "Muoi", "Na", "Nai", "Nan", "Nang", "Nangi", "Nani", "Nao", "Naoi", "Ne", "Nei", "Nen", "Neng", "Nengi", "Neni", "Neo", "Neoi", "Ni", "Nia", "Niai", "Nian", "Niang", "Niangi", "Niani", "Niao", "Niaoi", "Nii", "Nin", "Ning", "Ningi", "Nini", "Nio", "Nioi", "No", "Noi", "Non", "Nong", "Nongi", "Noni", "Noo", "Nooi", "Nu", "Nua", "Nuai", "Nuan", "Nuang", "Nuangi", "Nuani", "Nuao", "Nuaoi", "Nui", "Nun", "Nung", "Nungi", "Nuni", "Nuo", "Nuoi", "Pa", "Pai", "Pan", "Pang", "Pangi", "Pani", "Pao", "Paoi", "Pe", "Pei", "Pen", "Peng", "Pengi", "Peni", "Peo", "Peoi", "Pi", "Pia", "Piai", "Pian", "Piang", "Piangi", "Piani", "Piao", "Piaoi", "Pii", "Pin", "Ping", "Pingi", "Pini", "Pio", "Pioi", "Po", "Poi", "Pon", "Pong", "Pongi", "Poni", "Poo", "Pooi", "Pu", "Pua", "Puai", "Puan", "Puang", "Puangi", "Puani", "Puao", "Puaoi", "Pui", "Pun", "Pung", "Pungi", "Puni", "Puo", "Puoi", "Qa", "Qai", "Qan", "Qang", "Qangi", "Qani", "Qao", "Qaoi", "Qe", "Qei", "Qen", "Qeng", "Qengi", "Qeni", "Qeo", "Qeoi", "Qi", "Qia", "Qiai", "Qian", "Qiang", "Qiangi", "Qiani", "Qiao", "Qiaoi", "Qii", "Qin", "Qing", "Qingi", "Qini", "Qio", "Qioi", "Qo", "Qoi", "Qon", "Qong", "Qongi", "Qoni", "Qoo", "Qooi", "Qu", "Qua", "Quai", "Quan", "Quang", "Quangi", "Quani", "Quao", "Quaoi", "Qui", "Qun", "Qung", "Qungi", "Quni", "Quo", "Sa", "Sai", "San", "Sang", "Sangi", "Sani", "Sao", "Saoi", "Se", "Sei", "Sen", "Seng", "Sengi", "Seni", "Seo", "Seoi", "Sha", "Shai", "Shan", "Shang", "Shangi", "Shani", "Shao", "Shaoi", "She", "Shei", "Shen", "Sheng", "Shengi", "Sheni", "Sheo", "Sheoi", "Shi", "Shia", "Shiai", "Shian", "Shiang", "Shiangi", "Shiani", "Shiao", "Shiaoi", "Shii", "Shin", "Shing", "Shingi", "Shini", "Shio", "Shioi", "Sho", "Shoi", "Shon", "Shong", "Shongi", "Shoni", "Shoo", "Shooi", "Shu", "Shua", "Shuai", "Shuan", "Shuang", "Shuangi", "Shuani", "Shuao", "Shuaoi", "Shui", "Shun", "Shung", "Shungi", "Shuni", "Shuo", "Shuoi", "Si", "Sia", "Siai", "Sian", "Siang", "Siangi", "Siani", "Siao", "Siaoi", "Sii", "Sin", "Sing", "Singi", "Sini", "Sio", "Sioi", "So", "Soi", "Son", "Song", "Songi", "Soni", "Soo", "Sooi", "Su", "Sua", "Suai", "Suan", "Suang", "Suangi", "Suani", "Suao", "Suaoi", "Sui", "Sun", "Sung", "Sungi", "Suni", "Suo", "Suoi", "Ta", "Tai", "Tan", "Tang", "Tangi", "Tani", "Tao", "Taoi", "Te", "Tei", "Ten", "Teng", "Tengi", "Teni", "Teo", "Teoi", "Ti", "Tia", "Tiai", "Tian", "Tiang", "Tiangi", "Tiani", "Tiao", "Tiaoi", "Tii", "Tin", "Ting", "Tingi", "Tini", "Tio", "Tioi", "To", "Toi", "Ton", "Tong", "Tongi", "Toni", "Too", "Tooi", "Tu", "Tua", "Tuai", "Tuan", "Tuang", "Tuangi", "Tuani", "Tuao", "Tuaoi", "Tui", "Tun", "Tung", "Tungi", "Tuni", "Tuo", "Tuoi", "Va", "Vai", "Van", "Vang", "Vangi", "Vani", "Vao", "Vaoi", "Ve", "Vei", "Ven", "Veng", "Vengi", "Veni", "Veo", "Veoi", "Vi", "Via", "Viai", "Vian", "Viang", "Viangi", "Viani", "Viao", "Viaoi", "Vii", "Vin", "Ving", "Vingi", "Vini", "Vio", "Vioi", "Vo", "Voi", "Von", "Vong", "Vongi", "Voni", "Voo", "Vooi", "Vu", "Vua", "Vuai", "Vuan", "Vuang", "Vuangi", "Vuani", "Vuao", "Vuaoi", "Vui", "Vun", "Vung", "Vungi", "Vuni", "Vuo", "Vuoi", "Wa", "Wai", "Wan", "Wang", "Wangi", "Wani", "Wao", "Waoi", "We", "Wei", "Wen", "Weng", "Wengi", "Weni", "Weo", "Weoi", "Wi", "Wia", "Wiai", "Wian", "Wiang", "Wiangi", "Wiani", "Wiao", "Wiaoi", "Wii", "Win", "Wing", "Wingi", "Wini", "Wio", "Wioi", "Wo", "Woi", "Won", "Wong", "Wongi", "Woni", "Woo", "Wooi", "Wu", "Wua", "Wuai", "Wuan", "Wuang", "Wuangi", "Wuani", "Wuao", "Wuaoi", "Wui", "Wun", "Wung", "Wungi", "Wuni", "Wuo", "Wuoi", "Xa", "Xai", "Xan", "Xang", "Xangi", "Xani", "Xao", "Xaoi", "Xe", "Xei", "Xen", "Xeng", "Xengi", "Xeni", "Xeo", "Xeoi", "Xi", "Xia", "Xiai", "Xian", "Xiang", "Xiangi", "Xiani", "Xiao", "Xiaoi", "Xii", "Xin", "Xing", "Xingi", "Xini", "Xio", "Xioi", "Xo", "Xoi", "Xon", "Xong", "Xongi", "Xoni", "Xoo", "Xooi", "Xu", "Xua", "Xuai", "Xuan", "Xuang", "Xuangi", "Xuani", "Xuao", "Xuaoi", "Xui", "Xun", "Xung", "Xungi", "Xuni", "Xuo", "Xuoi", "Ya", "Yai", "Yan", "Yang", "Yangi", "Yani", "Yao", "Yaoi", "Ye", "Yei", "Yen", "Yeng", "Yengi", "Yeni", "Yeo", "Yeoi", "Yi", "Yia", "Yiai", "Yian", "Yiang", "Yiangi", "Yiani", "Yiao", "Yiaoi", "Yii", "Yin", "Ying", "Yingi", "Yini", "Yio", "Yioi", "Yo", "Yoi", "Yon", "Yong", "Yongi", "Yoni", "Yoo", "Yooi", "Yu", "Yua", "Yuai", "Yuan", "Yuang", "Yuangi", "Yuani", "Yuao", "Yuaoi", "Yui", "Yun", "Yung", "Yungi", "Yuni", "Yuo", "Yuoi", "Za", "Zai", "Zan", "Zang", "Zangi", "Zani", "Zao", "Zaoi", "Ze", "Zei", "Zen", "Zeng", "Zengi", "Zeni", "Zeo", "Zeoi", "Zha", "Zhai", "Zhan", "Zhang", "Zhangi", "Zhani", "Zhao", "Zhaoi", "Zhe", "Zhei", "Zhen", "Zheng", "Zhengi", "Zheni", "Zheo", "Zheoi", "Zhi", "Zhia", "Zhiai", "Zhian", "Zhiang", "Zhiangi", "Zhiani", "Zhiao", "Zhiaoi", "Zhii", "Zhin", "Zhing", "Zhingi", "Zhini", "Zhio", "Zhioi", "Zho", "Zhoi", "Zhon", "Zhong", "Zhongi", "Zhoni", "Zhoo", "Zhooi", "Zhu", "Zhua", "Zhuai", "Zhuan", "Zhuang", "Zhuangi", "Zhuani", "Zhuao", "Zhuaoi", "Zhui", "Zhun", "Zhung", "Zhungi", "Zhuni", "Zhuo", "Zhuoi", "Zi", "Zia", "Ziai", "Zian", "Ziang", "Ziangi", "Ziani", "Ziao", "Ziaoi", "Zii", "Zin", "Zing", "Zingi", "Zini", "Zio", "Zioi", "Zo", "Zoi", "Zon", "Zong", "Zongi", "Zoni", "Zoo", "Zooi", "Zu", "Zua", "Zuai", "Zuan", "Zuang", "Zuangi", "Zuani", "Zuao", "Zuaoi", "Zui", "Zun", "Zung", "Zungi", "Zuni", "Zuo", "Zuoi"} -- VERSION -- -RYZOM_NAMES_ZORAI_VERSION = 10469 \ No newline at end of file +RYZOM_NAMES_ZORAI_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua b/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua index ddc8dd721b..016bb1d2ee 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua @@ -440,4 +440,4 @@ function outgame:loadRPBGPage() end -- VERSION -- -RYZOM_OUT_V2_APPEAR_VERSION = 10469 \ No newline at end of file +RYZOM_OUT_V2_APPEAR_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_select.lua b/ryzom/client/data/gamedev/interfaces_v3/out_v2_select.lua index 2e22ea2fe1..afd737f895 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_select.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_select.lua @@ -44,4 +44,4 @@ function game:procCharselClickSlot() end -- VERSION -- -RYZOM_OUT_V2_SELECT_VERSION = 10469 \ No newline at end of file +RYZOM_OUT_V2_SELECT_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/outpost.lua b/ryzom/client/data/gamedev/interfaces_v3/outpost.lua index 5ba4f4066b..fba2ce3adb 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/outpost.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/outpost.lua @@ -667,4 +667,4 @@ end -- VERSION -- -RYZOM_OUTPOST_VERSION = 10469 \ No newline at end of file +RYZOM_OUTPOST_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/player.lua b/ryzom/client/data/gamedev/interfaces_v3/player.lua index f32838dce0..c9a1553bf3 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/player.lua @@ -1032,4 +1032,4 @@ function game:fixVpx(vpx) end -- VERSION -- -RYZOM_PLAYER_VERSION = 10469 \ No newline at end of file +RYZOM_PLAYER_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/player_trade.lua b/ryzom/client/data/gamedev/interfaces_v3/player_trade.lua index f29f6ca55a..7af1084601 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/player_trade.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/player_trade.lua @@ -32,4 +32,4 @@ function getBulk(inventory) end -- VERSION -- -RYZOM_PLAYER_TRADE_VERSION = 10469 \ No newline at end of file +RYZOM_PLAYER_TRADE_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/ring_access_point.lua b/ryzom/client/data/gamedev/interfaces_v3/ring_access_point.lua index 0799c8447f..16df6010c5 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ring_access_point.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ring_access_point.lua @@ -944,4 +944,4 @@ end -- VERSION -- -RYZOM_RING_ACCESS_POINT_VERSION = 10469 \ No newline at end of file +RYZOM_RING_ACCESS_POINT_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/ring_access_point_filter.lua b/ryzom/client/data/gamedev/interfaces_v3/ring_access_point_filter.lua index a9f56fb95d..9eb909358e 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ring_access_point_filter.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ring_access_point_filter.lua @@ -121,4 +121,4 @@ end -- VERSION -- -RYZOM_RING_ACCESS_POINT_FILTER_VERSION = 10469 \ No newline at end of file +RYZOM_RING_ACCESS_POINT_FILTER_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/ring_window.lua b/ryzom/client/data/gamedev/interfaces_v3/ring_window.lua index bad00bf25e..59ed3c745e 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ring_window.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ring_window.lua @@ -17,4 +17,4 @@ function onRingWindowShown() end -- VERSION -- -RYZOM_RING_WINDOW_VERSION = 10469 \ No newline at end of file +RYZOM_RING_WINDOW_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/ryzhome_toolbar.lua b/ryzom/client/data/gamedev/interfaces_v3/ryzhome_toolbar.lua index 906a3421f9..9ece89fdbb 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ryzhome_toolbar.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ryzhome_toolbar.lua @@ -236,4 +236,4 @@ function RyzhomePlace:close() end -- VERSION -- -RYZOM_RYZHOME_TOOLBAR_VERSION = 10469 \ No newline at end of file +RYZOM_RYZHOME_TOOLBAR_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua b/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua index ea155fbfdc..50ef780562 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua @@ -626,4 +626,4 @@ end -- VERSION -- -RYZOM_SCENEEDIT_VERSION = 10469 \ No newline at end of file +RYZOM_SCENEEDIT_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/taskbar.lua b/ryzom/client/data/gamedev/interfaces_v3/taskbar.lua index 043d6f8f5a..4d70cf8462 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/taskbar.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/taskbar.lua @@ -96,4 +96,4 @@ end -- VERSION -- -RYZOM_TASKBAR_VERSION = 10469 \ No newline at end of file +RYZOM_TASKBAR_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/tp_interface.lua b/ryzom/client/data/gamedev/interfaces_v3/tp_interface.lua index fef2fda33b..4cda37d227 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/tp_interface.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/tp_interface.lua @@ -838,4 +838,4 @@ end -- -- VERSION -- -RYZOM_TP_INTERFACE_VERSION = 10469 \ No newline at end of file +RYZOM_TP_INTERFACE_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua b/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua index 1845df8c79..f3d1fcfa67 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua @@ -132,4 +132,4 @@ end -- VERSION -- -RYZOM_WEB_QUEUE_VERSION = 10469 \ No newline at end of file +RYZOM_WEB_QUEUE_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/webbrowser.lua b/ryzom/client/data/gamedev/interfaces_v3/webbrowser.lua index fdb36c76c6..79c4cac295 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/webbrowser.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/webbrowser.lua @@ -245,4 +245,4 @@ function WebBrowser:onClickHome() end -- VERSION -- -RYZOM_WEBBROWSER_VERSION = 10469 \ No newline at end of file +RYZOM_WEBBROWSER_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/webig.lua b/ryzom/client/data/gamedev/interfaces_v3/webig.lua index d34fb372e9..623e9e1562 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/webig.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/webig.lua @@ -250,4 +250,4 @@ end -- VERSION -- -RYZOM_WEBIG_VERSION = 10469 \ No newline at end of file +RYZOM_WEBIG_VERSION = 324 \ No newline at end of file From ee18058b28961dd7303e5fd342356b09ed522dd5 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Wed, 14 Jun 2023 14:30:16 +0200 Subject: [PATCH 046/194] Fixes --- .../client/data/gamedev/interfaces_v3/map.lua | 11 +- .../data/gamedev/interfaces_v3/player.lua | 36 +++++ .../data/gamedev/interfaces_v3/sceneedit.lua | 125 ++++++++++++------ 3 files changed, 131 insertions(+), 41 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/map.lua b/ryzom/client/data/gamedev/interfaces_v3/map.lua index 83dbd304a6..9cdfa0c2d3 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/map.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/map.lua @@ -51,7 +51,9 @@ function game:addMapArkPoint(section, x, y, name, title, texture, url, h) end function game:delMapArkPoint(section, name) - game.mapArkPoints[section][name] = nil + if game.mapArkPoints[section] ~= nil then + game.mapArkPoints[section][name] = nil + end end function game:delMapArkSection(section) @@ -236,14 +238,16 @@ function game:doSpawnShapesByZone(continent) if game.spawnShapesByZone[continent] then for name, shape in pairs(game.spawnShapesByZone[continent]) do if shape[9] then + if shape[9] ~= nil and shape[9] > 0 then deleteShape(shape[9]) end if shape[10] then + if shape[10] ~= nil and shape[9] > 0then deleteShape(shape[10]) end local setup = shape[8] - game.spawnShapesByZone[continent][name][9] = SceneEditor:doSpawnShape(shape[1]..".shape", setup, shape[2], shape[3], shape[4], shape[5], shape[6], shape[7], "user", 1, true, setup["action"], setup["url"], false, false, setup["textures"], "", false) + game.spawnShapesByZone[continent][name][9] = SceneEditor:doSpawnShape(shape[1]..".shape", setup, shape[2], shape[3], shape[4], shape[5], shape[6], shape[7], "user", 1, false, setup["action"], setup["url"], false, false, setup["textures"], "", false) if shape[11] == 0 then game.spawnShapesByZone[continent][name][10] = SceneEditor:doSpawnShape("ge_mission_evenement.ps", setup, shape[2], shape[3], shape[4]+0.35, shape[5], shape[6], shape[7], "user", 1, false, setup["action"], setup["url"], false, false, setup["textures"], "", false) else @@ -269,3 +273,6 @@ game:addMapArkPoint("Vip", 4154, -3305, "vip_allegory", "", "allegory_16.tga", " -- register map overrride -- game:setAltMap("fyros_map.tga", "fyros_map_sp.tga") + +-- VERSION -- +RYZOM_MAP_VERSION = 324 diff --git a/ryzom/client/data/gamedev/interfaces_v3/player.lua b/ryzom/client/data/gamedev/interfaces_v3/player.lua index b2eee2aa44..6efbc1a6fe 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/player.lua @@ -42,6 +42,39 @@ if (game.BonusMalus == nil) then game.BonusMalus.MalusAHList= {}; end +game.wantedScriptPlaces = {} +game.latestValidScriptPlace = "" + +function game:addScriptPlace(modname, place, id) + if game.wantedScriptPlaces[modname] == nil then + game.wantedScriptPlaces[modname] = {} + end + game.wantedScriptPlaces[modname][place] = id +end + + +function game:checkScriptPlace(place) + for modname, vals in pairs(game.wantedScriptPlaces) do + if vals[place] ~= nil and game.latestValidScriptPlace ~= place then + game.latestValidScriptPlace = place + openArkScript(vals[place], nil, "place="..place) + end + end +end + + +function game:CheckPosition() + local x,y,z = getPlayerPos() + local sx = tostring(math.floor(x/10)) + local sy = tostring(math.floor(y/10)) + game:checkRpItemsPosition(sx, sy) + local cont, region, places = getPositionInfos() + game:checkScriptPlace(cont) + game:checkScriptPlace(region) + for place, typ in pairs(places) do + game:checkScriptPlace(place) + end +end ------------------------------------------------------------------------------------------------------------ -- Update player bars in function of what we wants to display (we can hide each one of the 3 bars : sap,stamina and focus) @@ -1030,3 +1063,6 @@ function game:fixVpx(vpx) local nvpx = vpx1:sub(1, string.len(vpx1)-6)..vpx2:sub(string.len(vpx2)-5, string.len(vpx2)) return nvpx end + +-- VERSION -- +RYZOM_PLAYER_VERSION = 324 diff --git a/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua b/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua index 78d02648ca..739977e57a 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua @@ -52,57 +52,57 @@ function SceneEditor:launch_menu(id) menu:updateCoords() menu = menu:getRootMenu() menu:reset() - menu:addLine(ucstring("-- SHAPE EDITION --"), "", "", "shape_header") - menu:addLine(ucstring("Move"), "", "", "shape_move") + menu:addLine(getUCtf8("-- SHAPE EDITION --"), "", "", "shape_header") + menu:addLine(getUCtf8("Move"), "", "", "shape_move") menu:addSubMenu(1) local subMenu = menu:getSubMenu(1) - subMenu:addIconLine(ucstring("Axe X"), "lua", "setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:move_x()')", "shape_move_x", "ark_move_x.tga") - subMenu:addIconLine(ucstring("Axe Y"), "lua", "setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:move_y()')", "shape_move_y", "ark_move_y.tga") - subMenu:addIconLine(ucstring("Axe Z"), "lua", "x, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:move_z()')", "shape_move_z", "ark_move_z.tga") - subMenu:addIconLine(ucstring("Axes X & Y"), "lua", "setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:move_xy()')", "shape_move_xy", "ark_move_xy.tga") - subMenu:addIconLine(ucstring("Axes X & Y Snap to ground"), "lua", "setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:move_xysnap()')", "shape_move_xy_snap", "ark_move_xysnap.tga") + subMenu:addIconLine(getUCtf8("Axe X"), "lua", "setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:move_x()\')", "shape_move_x", "ark_move_x.tga") + subMenu:addIconLine(getUCtf8("Axe Y"), "lua", "setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:move_y()\')", "shape_move_y", "ark_move_y.tga") + subMenu:addIconLine(getUCtf8("Axe Z"), "lua", "x, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:move_z()\')", "shape_move_z", "ark_move_z.tga") + subMenu:addIconLine(getUCtf8("Axes X & Y"), "lua", "setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:move_xy()\')", "shape_move_xy", "ark_move_xy.tga") + subMenu:addIconLine(getUCtf8("Axes X & Y Snap to ground      "), "lua", "setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:move_xysnap()\')", "shape_move_xy_snap", "ark_move_xysnap.tga") subMenu:addSeparator() - subMenu:addIconLine(ucstring("Move to player"), "lua", "SceneEditor:move_player()", "shape_move_player", "ark_move_player.tga") + subMenu:addIconLine(getUCtf8("Move to player      "), "lua", "SceneEditor:move_player()", "shape_move_player", "ark_move_player.tga") - menu:addLine(ucstring("Rotate"), "", "", "shape_rotate") + menu:addLine(getUCtf8("Rotate"), "", "", "shape_rotate") menu:addSubMenu(2) subMenu = menu:getSubMenu(2) - subMenu:addIconLine(ucstring("Axe X"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:rotate(SelectedInstanceId, \"x\")')", "shape_rotate_x", "ark_rotate_x.tga") - subMenu:addIconLine(ucstring("Axe Y"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:rotate(SelectedInstanceId, \"y\")')", "shape_rotate_y", "ark_rotate_y.tga") - subMenu:addIconLine(ucstring("Axe Z"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:rotate(SelectedInstanceId, \"z\")')", "shape_rotate_z", "ark_rotate_z.tga") + subMenu:addIconLine(getUCtf8("Axe X"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:rotate(SelectedInstanceId, \"x\")\')", "shape_rotate_x", "ark_rotate_x.tga") + subMenu:addIconLine(getUCtf8("Axe Y"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:rotate(SelectedInstanceId, \"y\")\')", "shape_rotate_y", "ark_rotate_y.tga") + subMenu:addIconLine(getUCtf8("Axe Z      "), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:rotate(SelectedInstanceId, \"z\")\')", "shape_rotate_z", "ark_rotate_z.tga") - menu:addLine(ucstring("Scale"), "", "", "shape_scale") + menu:addLine(getUCtf8("Scale"), "", "", "shape_scale") menu:addSubMenu(3) subMenu = menu:getSubMenu(3) - subMenu:addIconLine(ucstring("Axe X"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:scale(SelectedInstanceId, \"x\")')", "shape_scale_x", "ark_scale_x.tga") - subMenu:addIconLine(ucstring("Axe Y"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:scale(SelectedInstanceId, \"y\")')", "shape_scale_y", "ark_scale_y.tga") - subMenu:addIconLine(ucstring("Axe Z"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:scale(SelectedInstanceId, \"z\")')", "shape_scale_z", "ark_scale_z.tga") - subMenu:addIconLine(ucstring("Axes X & Y & Z"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:scale(SelectedInstanceId, \"xyz\")')", "shape_scale_xyz", "ark_scale_xyz.tga") + subMenu:addIconLine(getUCtf8("Axe X"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:scale(SelectedInstanceId, \"x\")\')", "shape_scale_x", "ark_scale_x.tga") + subMenu:addIconLine(getUCtf8("Axe Y"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:scale(SelectedInstanceId, \"y\")\')", "shape_scale_y", "ark_scale_y.tga") + subMenu:addIconLine(getUCtf8("Axe Z"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:scale(SelectedInstanceId, \"z\")\')", "shape_scale_z", "ark_scale_z.tga") + subMenu:addIconLine(getUCtf8("Axes X & Y & Z      "), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:scale(SelectedInstanceId, \"xyz\")\')", "shape_scale_xyz", "ark_scale_xyz.tga") - menu:addLine(ucstring("-- COLLISION EDITION --"), "", "", "col_header") - menu:addLine(ucstring("Move"), "", "", "col_move") + menu:addLine(getUCtf8("-- COLLISION EDITION --"), "", "", "col_header") + menu:addLine(getUCtf8("Move"), "", "", "col_move") menu:addSubMenu(5) subMenu = menu:getSubMenu(5) - subMenu:addIconLine(ucstring("Axe X"), "lua", "setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:col_move_x()')", "col_move_x", "ark_move_x.tga") - subMenu:addIconLine(ucstring("Axe Y"), "lua", "setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:col_move_y()')", "col_move_y", "ark_move_y.tga") - subMenu:addIconLine(ucstring("Axe Z"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:col_move_z()')", "col_move_z", "ark_move_xy.tga") - subMenu:addIconLine(ucstring("Axe X & Y"), "lua", "setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:col_move_xy()')", "col_move_xy", "ark_move_xy.tga") + subMenu:addIconLine(getUCtf8("Axe X"), "lua", "setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:col_move_x()\')", "col_move_x", "ark_move_x.tga") + subMenu:addIconLine(getUCtf8("Axe Y"), "lua", "setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:col_move_y()\')", "col_move_y", "ark_move_y.tga") + subMenu:addIconLine(getUCtf8("Axe Z"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:col_move_z()\')", "col_move_z", "ark_move_xy.tga") + subMenu:addIconLine(getUCtf8("Axe X & Y      "), "lua", "setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:col_move_xy()\')", "col_move_xy", "ark_move_xy.tga") subMenu:addSeparator() - subMenu:addIconLine(ucstring("Move to Shape"), "lua", "SceneEditor:col_move_to_shape()", "col_move_to_shape", "ark_move_player.tga") + subMenu:addIconLine(getUCtf8("Move to Shape      "), "lua", "SceneEditor:col_move_to_shape()", "col_move_to_shape", "ark_move_player.tga") - menu:addIconLine(ucstring("Rotate"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:col_rotate(SelectedInstanceId, \"x\")')", "col_rotate_x", "ark_rotate_x.tga") + menu:addIconLine(getUCtf8("Rotate"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:col_rotate(SelectedInstanceId, \"x\")\')", "col_rotate_x", "ark_rotate_x.tga") - menu:addLine(ucstring("Scale"), "", "", "col_scale") + menu:addLine(getUCtf8("Scale"), "", "", "col_scale") menu:addSubMenu(7) subMenu = menu:getSubMenu(7) - subMenu:addIconLine(ucstring("Axe X"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:col_scale(SelectedInstanceId, \"x\")')", "col_scale_x", "ark_scale_x.tga") - subMenu:addIconLine(ucstring("Axe Y"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:col_scale(SelectedInstanceId, \"y\")')", "col_scale_y", "ark_scale_y.tga") - subMenu:addIconLine(ucstring("Axe Z"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI('ui:interface:ark_scene_editor'), 'SceneEditor:col_scale(SelectedInstanceId, \"z\")')", "col_scale_z", "ark_scale_z.tga") + subMenu:addIconLine(getUCtf8("Axe X"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:col_scale(SelectedInstanceId, \"x\")\')", "col_scale_x", "ark_scale_x.tga") + subMenu:addIconLine(getUCtf8("Axe Y"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:col_scale(SelectedInstanceId, \"y\")\')", "col_scale_y", "ark_scale_y.tga") + subMenu:addIconLine(getUCtf8("Axe Z"), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:col_scale(SelectedInstanceId, \"z\")\')", "col_scale_z", "ark_scale_z.tga") + subMenu:addIconLine(getUCtf8("Axe X & Y      "), "lua", "ARK_SHAPE_LATEST_X, ARK_SHAPE_LATEST_Y = getMousePos(); setOnDraw(getUI(\'ui:interface:ark_scene_editor\'), \'SceneEditor:col_scale(SelectedInstanceId, \"xy\")\')", "col_scale_xy", "ark_scale_xyz.tga") launchContextMenuInGame("ui:interface:ark_scene_editor_edit_menu") end - function arcc_tools_check_rclick() root = getUI("ui:interface") local rx, ry = getMousePos() @@ -263,8 +263,8 @@ function SceneEditor:col_scale(id, axe) else mx, my = getMousePos() local setup = {} - if axe == "x" then setup["col size x"]="+"..tostring((mx-ARK_SHAPE_LATEST_X)/100) end - if axe == "y" then setup["col size y"]="+"..tostring((mx-ARK_SHAPE_LATEST_X)/100) end + if axe == "x" or axe == "xy" then setup["col size x"]="+"..tostring((mx-ARK_SHAPE_LATEST_X)/100) end + if axe == "y" or axe == "xy" then setup["col size y"]="+"..tostring((mx-ARK_SHAPE_LATEST_X)/100) end if axe == "z" then setup["col size z"]="+"..tostring((my-ARK_SHAPE_LATEST_Y)/100) end setupShape(id, setup) ARK_SHAPE_LATEST_X = mx @@ -274,9 +274,27 @@ end function SceneEditor:set_modified(id) - self.Groups[self.Shapes[id].group].props.modified=true - self.Shapes[id].modified = "modified" + if self.Shapes[id] then + self.Groups[self.Shapes[id].group].props.modified=true + self.Shapes[id].modified = "modified" + end self.HaveUpdate = true + if self.repeatAdd ~= nil then + local d, mx, my = getMouseRightDown() + if d == false then + self.hideMenu = true + self:add(self.repeatAdd) + self.repeatAdd = nil + end + else + getUI("ui:interface:arkpowo_preview_shape:content:scene3d").active=1 + local framewin = getUI("ui:interface:arkpowo_preview_shape") + framewin.opened=true + if self.hideMenu then + setOnDraw(getUI("ui:interface:game_context_menu"), "SceneEditor:setTopWindowShapeList()") + setOnDraw(getUI("ui:interface:ark_scene_editor_edit_menu"), "SceneEditor:setTopWindowShapeList()") + end + end end @@ -316,7 +334,7 @@ end function SceneEditor:add(shape) if self.LastEditedGroup == nil then - self:get_html('<font color="#aa00000">'..self.T["no_selected_group"]..'</font>', '000000') + self:get_html("<font color=\"#aa00000\">"..self.T["no_selected_group"].."</font>\", \"000000\"") end local new_shape = {} new_shape.file = shape @@ -324,11 +342,17 @@ function SceneEditor:add(shape) self.Groups[new_shape.group].props.modified=true new_shape.db_id = self.Groups[new_shape.group].props.count + 1 new_shape.modified = "added" - new_shape_id = addShape(shape, 0, 0, 0, "user", 1, true, "", "SceneEditor:show_menu()") + new_shape_id = addShape(shape, 0, 0, 0, "user", 1, true, "", "SceneEditor:show_menu()", false, false, "", "", false) table.insert(self.Groups[new_shape.group], new_shape_id) self.Groups[new_shape.group].props.count = self.Groups[new_shape.group].props.count + 1 self.Shapes[new_shape_id] = new_shape self:get_html("Added") + + self.move_timer = nltime.getLocalTime() + 60 + getUI("ui:interface:arkpowo_preview_shape:content:scene3d").active=false + local framewin = getUI("ui:interface:arkpowo_preview_shape") + framewin.opened=false + setOnDraw(framewin, "SceneEditor:moveTimerUpdate( \'"..shape.."\', "..tostring(new_shape_id)..")") end @@ -373,16 +397,36 @@ function SceneEditor:editGroup(group) end function SceneEditor:addFromDb(group, db_id, json_shape, edit) - shape = Json.decode(json_shape) + local shape = Json.decode(json_shape) shape.db_id = db_id shape.group = group shape.modified = "" + + if shape.setup["textures"] ~= nil then + textures = shape.setup["textures"] + else + textures = "" + end + + if shape.setup["context"] ~= nil then + context = shape.setup["context"] + else + context = "" + end + + if shape.setup["url"] ~= nil then + url = shape.setup["url"] + else + url = "" + end + if edit then - shape_id = addShape(shape.file, shape.pos[1], shape.pos[2], shape.pos[3], "user", 1, true, "", "SceneEditor:show_menu()") + shape_id = addShape(shape.file, shape.pos[1], shape.pos[2], shape.pos[3], "user", 1, true, "", "SceneEditor:show_menu()", false, false, textures, "", false) else - shape_id = addShape(shape.file, shape.pos[1], shape.pos[2], shape.pos[3], "user", 1, true, "", "") + shape_id = addShape(shape.file, shape.pos[1], shape.pos[2], shape.pos[3], "user", 1, true, context, url, false, false, textures, "", false) end + rotateShape(shape_id, tostring(shape.rot[1]), tostring(shape.rot[2]), tostring(shape.rot[3])) setupShape(shape_id, shape.setup) self.Shapes[shape_id] = shape @@ -624,3 +668,6 @@ function SceneEditor:get_html(message, message_bg) end end + +-- VERSION -- +RYZOM_SCENEEDIT_VERSION = 324 From c0ab8aa2c78264d5b2ffd561b8c8e3857e17f144 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Wed, 14 Jun 2023 14:31:45 +0200 Subject: [PATCH 047/194] Added test --- ryzom/common/src/game_share/continent.cpp | 1 + ryzom/common/src/game_share/continent.h | 1 + .../player_manager/character_respawn_points.cpp | 13 ++++++++----- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/ryzom/common/src/game_share/continent.cpp b/ryzom/common/src/game_share/continent.cpp index 0176eadb53..61febf9db1 100644 --- a/ryzom/common/src/game_share/continent.cpp +++ b/ryzom/common/src/game_share/continent.cpp @@ -56,6 +56,7 @@ namespace CONTINENT NL_STRING_CONVERSION_TABLE_ENTRY(R2_JUNGLE) NL_STRING_CONVERSION_TABLE_ENTRY(CORRUPTED_MOOR) NL_STRING_CONVERSION_TABLE_ENTRY(KITINIERE) + NL_STRING_CONVERSION_TABLE_ENTRY(UNDERNEXUS) NL_STRING_CONVERSION_TABLE_ENTRY(UNKNOWN) NL_END_STRING_CONVERSION_TABLE(TContinent, ContinentConversion, UNKNOWN) diff --git a/ryzom/common/src/game_share/continent.h b/ryzom/common/src/game_share/continent.h index d6b0bd854e..6831aee431 100644 --- a/ryzom/common/src/game_share/continent.h +++ b/ryzom/common/src/game_share/continent.h @@ -52,6 +52,7 @@ namespace CONTINENT R2_JUNGLE, CORRUPTED_MOOR, KITINIERE, + UNDERNEXUS, UNKNOWN, // NB_RESPAWN_POINT_TYPE = UNKNOWN, diff --git a/ryzom/server/src/entities_game_service/player_manager/character_respawn_points.cpp b/ryzom/server/src/entities_game_service/player_manager/character_respawn_points.cpp index e3de367026..ede41a1f4b 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character_respawn_points.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character_respawn_points.cpp @@ -153,6 +153,9 @@ void CCharacterRespawnPoints::addDefaultRespawnPoint(CONTINENT::TContinent conti case CONTINENT::KITINIERE: defaultPlaceName = "kitiniere_entrance"; break; + case CONTINENT::UNDERNEXUS: + defaultPlaceName = "place_respawn_undernexus"; + break; default: defaultPlaceName = "newbie_start_point"; } @@ -242,11 +245,11 @@ void CCharacterRespawnPoints::clearRingRespawnpoint() //----------------------------------------------------------------------------- bool CCharacterRespawnPoints::inR2Island() const { - + CContinent * cont = CZoneManager::getInstance().getContinent( _Char.getX(), _Char.getY() ); if( cont == 0 ) return false; - + CONTINENT::TContinent continent = (CONTINENT::TContinent)cont->getId(); return (continent == CONTINENT::R2_ROOTS || continent == CONTINENT::R2_FOREST || @@ -323,7 +326,7 @@ CONTINENT::TRespawnPointCounters CCharacterRespawnPoints::buildRingPoints() cons const TRespawnPoint &rp = _RegularRespawnPoints[i]; const CTpSpawnZone *tsz = CZoneManager::getInstance().getTpSpawnZone(rp); - if (tsz != NULL + if (tsz != NULL /*&& (tsz->getType() == RESPAWN_POINT::KAMI || tsz->getType() == RESPAWN_POINT::KARAVAN)*/) { ret[tsz->getContinent()]++; @@ -408,7 +411,7 @@ bool CCharacterRespawnPoints::isUsableRegularRespawnPoint(CONTINENT::TContinent { return false; } - + return CPVPManager2::getInstance()->isRespawnValid( &_Char, respawnPoint ); } @@ -584,6 +587,6 @@ void CCharacterRespawnPoints::dumpRespawnPoints(NLMISC::CLog & log) const // { // // ensure we won't try to save in old format anymore // nlassertex(false, ("<RESPAWN_POINT> you should not save in old format anymore!!!") ); -// } +// } //} From 612db39598b4880df268ae38d55eeb9e50444a38 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Wed, 14 Jun 2023 14:32:38 +0200 Subject: [PATCH 048/194] undef HALF_FREQUENCY_SENDING_TO_CLIENT --- ryzom/common/src/game_share/entity_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/common/src/game_share/entity_types.h b/ryzom/common/src/game_share/entity_types.h index 7645c28a99..cd38a514c0 100644 --- a/ryzom/common/src/game_share/entity_types.h +++ b/ryzom/common/src/game_share/entity_types.h @@ -44,7 +44,7 @@ namespace CLFECOMMON { * Defined -> one send every two cycles (usually 5 Hz). * Don't forget to adjust the variable ClientBandwidth in frontend_service.cfg. */ -#define HALF_FREQUENCY_SENDING_TO_CLIENT +#undef HALF_FREQUENCY_SENDING_TO_CLIENT /* From 11a22698a9595d446cfddc440a8a170f98f89f40 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Thu, 15 Jun 2023 12:00:47 +0200 Subject: [PATCH 049/194] Fix --- ryzom/client/data/gamedev/interfaces_v3/map.lua | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/map.lua b/ryzom/client/data/gamedev/interfaces_v3/map.lua index 9cdfa0c2d3..8938047501 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/map.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/map.lua @@ -51,8 +51,8 @@ function game:addMapArkPoint(section, x, y, name, title, texture, url, h) end function game:delMapArkPoint(section, name) - if game.mapArkPoints[section] ~= nil then - game.mapArkPoints[section][name] = nil + if game.mapArkPoints[section] ~= nil then + game.mapArkPoints[section][name] = nil end end @@ -241,7 +241,6 @@ function game:doSpawnShapesByZone(continent) if shape[9] ~= nil and shape[9] > 0 then deleteShape(shape[9]) end - if shape[10] then if shape[10] ~= nil and shape[9] > 0then deleteShape(shape[10]) end From 3e9207cd17b923ef9525b1295ee16a8b0152a346 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Thu, 15 Jun 2023 12:19:32 +0200 Subject: [PATCH 050/194] Fix --- ryzom/client/data/gamedev/interfaces_v3/map.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/map.lua b/ryzom/client/data/gamedev/interfaces_v3/map.lua index 8938047501..6b731a64c2 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/map.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/map.lua @@ -202,8 +202,7 @@ function game:addSpawnShapesByZone(zone, continent, name, displayIcon, setup, fi local id1 = -1 local id2 = -1 - if game.spawnShapesByZone[continent] == nil - then + if game.spawnShapesByZone[continent] == nil then game.spawnShapesByZone[continent] = {} end @@ -230,17 +229,18 @@ function game:addSpawnShapesByZone(zone, continent, name, displayIcon, setup, fi if displayIcon == 1 then game:addMapArkPoint(zone, setup[2], setup[3], setup[1], text, icon..".tga") else - game:delMapArkPoint(zone, setup[1]) + game:delMapArkPoint(zone, setup[1]) end end function game:doSpawnShapesByZone(continent) if game.spawnShapesByZone[continent] then for name, shape in pairs(game.spawnShapesByZone[continent]) do - if shape[9] then + if shape[9] ~= nil and shape[9] > 0 then deleteShape(shape[9]) end + if shape[10] ~= nil and shape[9] > 0then deleteShape(shape[10]) end From 2001fbaf5fbb83ce90db28fe6e2ea3951026d554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <ulukyn@ryzom.com> Date: Sat, 17 Jun 2023 01:12:43 +0200 Subject: [PATCH 051/194] Updates --- .../entities_game_service/database_guild.cpp | 13 +---- .../entities_game_service/database_guild.h | 20 ++----- .../entities_game_service/database_plr.cpp | 13 +---- .../src/entities_game_service/database_plr.h | 20 ++----- .../guild_manager/guild_unifier_itf.cpp | 32 +++++------ .../shard_unifier_service/database_mapping.h | 55 +++++++++++-------- ryzom/server/tools/shard.screen.rc | 2 +- ryzom/tools/pd_parser/cpp_output.h | 2 +- 8 files changed, 63 insertions(+), 94 deletions(-) diff --git a/ryzom/server/src/entities_game_service/database_guild.cpp b/ryzom/server/src/entities_game_service/database_guild.cpp index 90014e7e2c..cc4c36c817 100644 --- a/ryzom/server/src/entities_game_service/database_guild.cpp +++ b/ryzom/server/src/entities_game_service/database_guild.cpp @@ -16,18 +16,7 @@ // along with this program. If not, see <http://www.gnu.org/licenses/>. ///////////////////////////////////////////////////////////////// -// -// -// -// -// -// WARNING : this is a generated file, don't change it ! -// -// -// -// -// -// +// WARNING : this is a generated file, don't change it ! ///////////////////////////////////////////////////////////////// #include "stdpch.h" diff --git a/ryzom/server/src/entities_game_service/database_guild.h b/ryzom/server/src/entities_game_service/database_guild.h index fb8611cf5c..4c51f81f72 100644 --- a/ryzom/server/src/entities_game_service/database_guild.h +++ b/ryzom/server/src/entities_game_service/database_guild.h @@ -1,7 +1,5 @@ -#ifndef INCLUDED_database_GUILD_H -#define INCLUDED_database_GUILD_H // Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> // Copyright (C) 2010 Winch Gate Property Limited // @@ -19,20 +17,12 @@ // along with this program. If not, see <http://www.gnu.org/licenses/>. ///////////////////////////////////////////////////////////////// -// -// -// -// -// -// WARNING : this is a generated file, don't change it ! -// -// -// -// -// -// +// WARNING : this is a generated file, don't change it ! ///////////////////////////////////////////////////////////////// +#ifndef INCLUDED_DATABASE_database_GUILD_H +#define INCLUDED_DATABASE_database_GUILD_H + #include "nel/misc/string_common.h" #include "cdb_group.h" #include "player_manager/cdb.h" @@ -1857,4 +1847,4 @@ inline void _getProp(const CCDBSynchronised &db, ICDBStructNode *node, NLMISC::C }; -#endif // INCLUDED_database_GUILD_H +#endif // INCLUDED_DATABASE_database_GUILD_H diff --git a/ryzom/server/src/entities_game_service/database_plr.cpp b/ryzom/server/src/entities_game_service/database_plr.cpp index b98c0bb0b5..3165656bd1 100644 --- a/ryzom/server/src/entities_game_service/database_plr.cpp +++ b/ryzom/server/src/entities_game_service/database_plr.cpp @@ -16,18 +16,7 @@ // along with this program. If not, see <http://www.gnu.org/licenses/>. ///////////////////////////////////////////////////////////////// -// -// -// -// -// -// WARNING : this is a generated file, don't change it ! -// -// -// -// -// -// +// WARNING : this is a generated file, don't change it ! ///////////////////////////////////////////////////////////////// #include "stdpch.h" diff --git a/ryzom/server/src/entities_game_service/database_plr.h b/ryzom/server/src/entities_game_service/database_plr.h index 0c5277073e..89af126c85 100644 --- a/ryzom/server/src/entities_game_service/database_plr.h +++ b/ryzom/server/src/entities_game_service/database_plr.h @@ -1,7 +1,5 @@ -#ifndef INCLUDED_database_PLR_H -#define INCLUDED_database_PLR_H // Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> // Copyright (C) 2010 Winch Gate Property Limited // @@ -19,20 +17,12 @@ // along with this program. If not, see <http://www.gnu.org/licenses/>. ///////////////////////////////////////////////////////////////// -// -// -// -// -// -// WARNING : this is a generated file, don't change it ! -// -// -// -// -// -// +// WARNING : this is a generated file, don't change it ! ///////////////////////////////////////////////////////////////// +#ifndef INCLUDED_DATABASE_database_PLR_H +#define INCLUDED_DATABASE_database_PLR_H + #include "nel/misc/string_common.h" #include "cdb_group.h" #include "player_manager/cdb.h" @@ -10805,4 +10795,4 @@ inline void _getProp(const CCDBSynchronised &db, ICDBStructNode *node, NLMISC::C }; -#endif // INCLUDED_database_PLR_H +#endif // INCLUDED_DATABASE_database_PLR_H diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild_unifier_itf.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild_unifier_itf.cpp index 873b69f0c3..aec2bf3563 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild_unifier_itf.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild_unifier_itf.cpp @@ -1,5 +1,5 @@ // Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> -// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2010-2021 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 @@ -70,7 +70,7 @@ namespace GU init = true; } - return handlers; + return handlers; } bool CGuildUnifierClientSkel::fwdOnProcessModuleMessage(NLNET::IModuleProxy *sender, const NLNET::CMessage &message) { @@ -161,9 +161,9 @@ namespace GU } else { - // send the message for remote dispatching and execution or local queing + // send the message for remote dispatching and execution or local queing NLNET::CMessage __message; - + buildMessageFor_guildReady(__message); _ModuleProxy->sendModuleMessage(sender, __message); @@ -179,9 +179,9 @@ namespace GU } else { - // send the message for remote dispatching and execution or local queing + // send the message for remote dispatching and execution or local queing NLNET::CMessage __message; - + buildMessageFor_receiveForeignGuild(__message, guilds); _ModuleProxy->sendModuleMessage(sender, __message); @@ -197,9 +197,9 @@ namespace GU } else { - // send the message for remote dispatching and execution or local queing + // send the message for remote dispatching and execution or local queing NLNET::CMessage __message; - + buildMessageFor_updateMemberList(__message, guildId, members); _ModuleProxy->sendModuleMessage(sender, __message); @@ -215,9 +215,9 @@ namespace GU } else { - // send the message for remote dispatching and execution or local queing + // send the message for remote dispatching and execution or local queing NLNET::CMessage __message; - + buildMessageFor_updateMemberInfo(__message, guildId, membersInfo); _ModuleProxy->sendModuleMessage(sender, __message); @@ -233,9 +233,9 @@ namespace GU } else { - // send the message for remote dispatching and execution or local queing + // send the message for remote dispatching and execution or local queing NLNET::CMessage __message; - + buildMessageFor_updateGuild(__message, guildInfo); _ModuleProxy->sendModuleMessage(sender, __message); @@ -251,9 +251,9 @@ namespace GU } else { - // send the message for remote dispatching and execution or local queing + // send the message for remote dispatching and execution or local queing NLNET::CMessage __message; - + buildMessageFor_guildDeleted(__message, guildId); _ModuleProxy->sendModuleMessage(sender, __message); @@ -269,9 +269,9 @@ namespace GU } else { - // send the message for remote dispatching and execution or local queing + // send the message for remote dispatching and execution or local queing NLNET::CMessage __message; - + buildMessageFor_messageToGuildMembers(__message, guildId, messageName, params); _ModuleProxy->sendModuleMessage(sender, __message); diff --git a/ryzom/server/src/shard_unifier_service/database_mapping.h b/ryzom/server/src/shard_unifier_service/database_mapping.h index e96676fefe..a340d3cce7 100644 --- a/ryzom/server/src/shard_unifier_service/database_mapping.h +++ b/ryzom/server/src/shard_unifier_service/database_mapping.h @@ -2201,7 +2201,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 2 }; @@ -2233,7 +2233,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -2335,7 +2336,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 3 }; @@ -2369,7 +2370,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -3696,7 +3698,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 4 }; @@ -3732,7 +3734,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -3834,7 +3837,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 3 }; @@ -3868,7 +3871,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -3969,7 +3973,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 2 }; @@ -4001,7 +4005,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -4102,7 +4107,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 2 }; @@ -4134,7 +4139,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -4237,7 +4243,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 4 }; @@ -4273,7 +4279,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -4955,7 +4962,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 3 }; @@ -4989,7 +4996,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -5090,7 +5098,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 2 }; @@ -5122,7 +5130,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -6095,7 +6104,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 4 }; @@ -6131,7 +6140,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -7342,7 +7352,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 2 }; @@ -7374,7 +7384,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } diff --git a/ryzom/server/tools/shard.screen.rc b/ryzom/server/tools/shard.screen.rc index 4d36f5c7e3..d5d2a5a049 100644 --- a/ryzom/server/tools/shard.screen.rc +++ b/ryzom/server/tools/shard.screen.rc @@ -63,7 +63,7 @@ screen -t Trk /bin/bash $SHARD_PATH/tools/service_launcher.sh ais_tryker ../sbin screen -t Zor /bin/bash $SHARD_PATH/tools/service_launcher.sh ais_zorai ../sbin/ryzom_ai_service -C../cfgs -L../logs -Nais_zorai --nobreak --writepid -mCommon:Indoors:Zorai:ZoraiNewbie:ZoraiIsland:Post # ais_roots -screen -t Pri /bin/bash $SHARD_PATH/tools/service_launcher.sh ais_roots ../sbin/ryzom_ai_service -C../cfgs -L../logs -Nais_roots --nobreak --writepid -mCommon:Nexus:Bagne:RouteGouffre:Sources:Terre:Kitiniere:Post +screen -t Pri /bin/bash $SHARD_PATH/tools/service_launcher.sh ais_roots ../sbin/ryzom_ai_service -C../cfgs -L../logs -Nais_roots --nobreak --writepid -mCommon:Nexus:Bagne:RouteGouffre:Sources:Terre:Kitiniere:Undernexus:Post #ais_ark screen -t Ark /bin/bash $SHARD_PATH/tools/service_launcher.sh ais_ark ../sbin/ryzom_ai_service -C../cfgs -L../logs -Nais_ark --nobreak --writepid -mCommon:Indoors::R2Desert:R2Roots:R2Jungle:R2Forest:R2Lakes:Post diff --git a/ryzom/tools/pd_parser/cpp_output.h b/ryzom/tools/pd_parser/cpp_output.h index f8ed9c6f82..96183b2652 100644 --- a/ryzom/tools/pd_parser/cpp_output.h +++ b/ryzom/tools/pd_parser/cpp_output.h @@ -659,7 +659,7 @@ inline void CCppOutput::flush(const std::string &fileName) buffer.resize(fi.getFileSize(), '*'); fi.serialBuffer((uint8*)(&(buffer[0])), fi.getFileSize()); - // search for $Id: cpp_output.h,v 1.15 2004/12/13 17:19:01 legros Exp $ string in file... + // search for $Id$ string in file... char *searchidstart, *searchidend; char *replaceidstart, *replaceidend; From 1c36488dc31b77509a317c91c9c49c0369ec7d00 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Sat, 17 Jun 2023 01:13:44 +0200 Subject: [PATCH 052/194] Fix --- .../entities_game_service/database_guild.cpp | 13 +---- .../entities_game_service/database_guild.h | 20 ++----- .../entities_game_service/database_plr.cpp | 13 +---- .../src/entities_game_service/database_plr.h | 20 ++----- .../guild_manager/guild_unifier_itf.cpp | 32 +++++------ .../shard_unifier_service/database_mapping.h | 55 +++++++++++-------- ryzom/tools/pd_parser/cpp_output.h | 2 +- 7 files changed, 62 insertions(+), 93 deletions(-) diff --git a/ryzom/server/src/entities_game_service/database_guild.cpp b/ryzom/server/src/entities_game_service/database_guild.cpp index 90014e7e2c..cc4c36c817 100644 --- a/ryzom/server/src/entities_game_service/database_guild.cpp +++ b/ryzom/server/src/entities_game_service/database_guild.cpp @@ -16,18 +16,7 @@ // along with this program. If not, see <http://www.gnu.org/licenses/>. ///////////////////////////////////////////////////////////////// -// -// -// -// -// -// WARNING : this is a generated file, don't change it ! -// -// -// -// -// -// +// WARNING : this is a generated file, don't change it ! ///////////////////////////////////////////////////////////////// #include "stdpch.h" diff --git a/ryzom/server/src/entities_game_service/database_guild.h b/ryzom/server/src/entities_game_service/database_guild.h index fb8611cf5c..4c51f81f72 100644 --- a/ryzom/server/src/entities_game_service/database_guild.h +++ b/ryzom/server/src/entities_game_service/database_guild.h @@ -1,7 +1,5 @@ -#ifndef INCLUDED_database_GUILD_H -#define INCLUDED_database_GUILD_H // Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> // Copyright (C) 2010 Winch Gate Property Limited // @@ -19,20 +17,12 @@ // along with this program. If not, see <http://www.gnu.org/licenses/>. ///////////////////////////////////////////////////////////////// -// -// -// -// -// -// WARNING : this is a generated file, don't change it ! -// -// -// -// -// -// +// WARNING : this is a generated file, don't change it ! ///////////////////////////////////////////////////////////////// +#ifndef INCLUDED_DATABASE_database_GUILD_H +#define INCLUDED_DATABASE_database_GUILD_H + #include "nel/misc/string_common.h" #include "cdb_group.h" #include "player_manager/cdb.h" @@ -1857,4 +1847,4 @@ inline void _getProp(const CCDBSynchronised &db, ICDBStructNode *node, NLMISC::C }; -#endif // INCLUDED_database_GUILD_H +#endif // INCLUDED_DATABASE_database_GUILD_H diff --git a/ryzom/server/src/entities_game_service/database_plr.cpp b/ryzom/server/src/entities_game_service/database_plr.cpp index b98c0bb0b5..3165656bd1 100644 --- a/ryzom/server/src/entities_game_service/database_plr.cpp +++ b/ryzom/server/src/entities_game_service/database_plr.cpp @@ -16,18 +16,7 @@ // along with this program. If not, see <http://www.gnu.org/licenses/>. ///////////////////////////////////////////////////////////////// -// -// -// -// -// -// WARNING : this is a generated file, don't change it ! -// -// -// -// -// -// +// WARNING : this is a generated file, don't change it ! ///////////////////////////////////////////////////////////////// #include "stdpch.h" diff --git a/ryzom/server/src/entities_game_service/database_plr.h b/ryzom/server/src/entities_game_service/database_plr.h index 0c5277073e..89af126c85 100644 --- a/ryzom/server/src/entities_game_service/database_plr.h +++ b/ryzom/server/src/entities_game_service/database_plr.h @@ -1,7 +1,5 @@ -#ifndef INCLUDED_database_PLR_H -#define INCLUDED_database_PLR_H // Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> // Copyright (C) 2010 Winch Gate Property Limited // @@ -19,20 +17,12 @@ // along with this program. If not, see <http://www.gnu.org/licenses/>. ///////////////////////////////////////////////////////////////// -// -// -// -// -// -// WARNING : this is a generated file, don't change it ! -// -// -// -// -// -// +// WARNING : this is a generated file, don't change it ! ///////////////////////////////////////////////////////////////// +#ifndef INCLUDED_DATABASE_database_PLR_H +#define INCLUDED_DATABASE_database_PLR_H + #include "nel/misc/string_common.h" #include "cdb_group.h" #include "player_manager/cdb.h" @@ -10805,4 +10795,4 @@ inline void _getProp(const CCDBSynchronised &db, ICDBStructNode *node, NLMISC::C }; -#endif // INCLUDED_database_PLR_H +#endif // INCLUDED_DATABASE_database_PLR_H diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild_unifier_itf.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild_unifier_itf.cpp index 873b69f0c3..aec2bf3563 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild_unifier_itf.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild_unifier_itf.cpp @@ -1,5 +1,5 @@ // Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> -// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2010-2021 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 @@ -70,7 +70,7 @@ namespace GU init = true; } - return handlers; + return handlers; } bool CGuildUnifierClientSkel::fwdOnProcessModuleMessage(NLNET::IModuleProxy *sender, const NLNET::CMessage &message) { @@ -161,9 +161,9 @@ namespace GU } else { - // send the message for remote dispatching and execution or local queing + // send the message for remote dispatching and execution or local queing NLNET::CMessage __message; - + buildMessageFor_guildReady(__message); _ModuleProxy->sendModuleMessage(sender, __message); @@ -179,9 +179,9 @@ namespace GU } else { - // send the message for remote dispatching and execution or local queing + // send the message for remote dispatching and execution or local queing NLNET::CMessage __message; - + buildMessageFor_receiveForeignGuild(__message, guilds); _ModuleProxy->sendModuleMessage(sender, __message); @@ -197,9 +197,9 @@ namespace GU } else { - // send the message for remote dispatching and execution or local queing + // send the message for remote dispatching and execution or local queing NLNET::CMessage __message; - + buildMessageFor_updateMemberList(__message, guildId, members); _ModuleProxy->sendModuleMessage(sender, __message); @@ -215,9 +215,9 @@ namespace GU } else { - // send the message for remote dispatching and execution or local queing + // send the message for remote dispatching and execution or local queing NLNET::CMessage __message; - + buildMessageFor_updateMemberInfo(__message, guildId, membersInfo); _ModuleProxy->sendModuleMessage(sender, __message); @@ -233,9 +233,9 @@ namespace GU } else { - // send the message for remote dispatching and execution or local queing + // send the message for remote dispatching and execution or local queing NLNET::CMessage __message; - + buildMessageFor_updateGuild(__message, guildInfo); _ModuleProxy->sendModuleMessage(sender, __message); @@ -251,9 +251,9 @@ namespace GU } else { - // send the message for remote dispatching and execution or local queing + // send the message for remote dispatching and execution or local queing NLNET::CMessage __message; - + buildMessageFor_guildDeleted(__message, guildId); _ModuleProxy->sendModuleMessage(sender, __message); @@ -269,9 +269,9 @@ namespace GU } else { - // send the message for remote dispatching and execution or local queing + // send the message for remote dispatching and execution or local queing NLNET::CMessage __message; - + buildMessageFor_messageToGuildMembers(__message, guildId, messageName, params); _ModuleProxy->sendModuleMessage(sender, __message); diff --git a/ryzom/server/src/shard_unifier_service/database_mapping.h b/ryzom/server/src/shard_unifier_service/database_mapping.h index e96676fefe..a340d3cce7 100644 --- a/ryzom/server/src/shard_unifier_service/database_mapping.h +++ b/ryzom/server/src/shard_unifier_service/database_mapping.h @@ -2201,7 +2201,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 2 }; @@ -2233,7 +2233,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -2335,7 +2336,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 3 }; @@ -2369,7 +2370,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -3696,7 +3698,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 4 }; @@ -3732,7 +3734,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -3834,7 +3837,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 3 }; @@ -3868,7 +3871,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -3969,7 +3973,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 2 }; @@ -4001,7 +4005,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -4102,7 +4107,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 2 }; @@ -4134,7 +4139,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -4237,7 +4243,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 4 }; @@ -4273,7 +4279,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -4955,7 +4962,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 3 }; @@ -4989,7 +4996,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -5090,7 +5098,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 2 }; @@ -5122,7 +5130,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -6095,7 +6104,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 4 }; @@ -6131,7 +6140,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } @@ -7342,7 +7352,7 @@ namespace RSMGR end_of_enum, invalid_val, - + /// Number of enumerated values nb_enum_items = 2 }; @@ -7374,7 +7384,8 @@ namespace RSMGR }; static NLMISC::CStringConversion<TValues> conversionTable(TValues_nl_string_conversion_table, sizeof(TValues_nl_string_conversion_table) - / sizeof(TValues_nl_string_conversion_table[0]), invalid_val); + / sizeof(TValues_nl_string_conversion_table[0]), + invalid_val); return conversionTable; } diff --git a/ryzom/tools/pd_parser/cpp_output.h b/ryzom/tools/pd_parser/cpp_output.h index f8ed9c6f82..96183b2652 100644 --- a/ryzom/tools/pd_parser/cpp_output.h +++ b/ryzom/tools/pd_parser/cpp_output.h @@ -659,7 +659,7 @@ inline void CCppOutput::flush(const std::string &fileName) buffer.resize(fi.getFileSize(), '*'); fi.serialBuffer((uint8*)(&(buffer[0])), fi.getFileSize()); - // search for $Id: cpp_output.h,v 1.15 2004/12/13 17:19:01 legros Exp $ string in file... + // search for $Id$ string in file... char *searchidstart, *searchidend; char *replaceidstart, *replaceidend; From c3c0bc9ef915c39ae632b358a41ddc119221b90e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Sat, 17 Jun 2023 02:24:18 +0000 Subject: [PATCH 053/194] Update --- ryzom/server/tools/cfg_creator/templates/ai_service.cfg | 4 ++++ .../tools/cfg_creator/templates/ai_service_default.cfg | 8 ++++++++ .../tools/cfg_creator/templates/entities_game_service.cfg | 5 +++++ .../templates/entities_game_service_default.cfg | 2 +- .../cfg_creator/templates/frontend_service_default.cfg | 2 +- .../tools/cfg_creator/templates/input_output_service.cfg | 2 +- .../tools/cfg_creator/templates/used_continents.cfg | 3 ++- 7 files changed, 22 insertions(+), 4 deletions(-) diff --git a/ryzom/server/tools/cfg_creator/templates/ai_service.cfg b/ryzom/server/tools/cfg_creator/templates/ai_service.cfg index 2fb67b600a..55c3b761b8 100644 --- a/ryzom/server/tools/cfg_creator/templates/ai_service.cfg +++ b/ryzom/server/tools/cfg_creator/templates/ai_service.cfg @@ -119,6 +119,10 @@ UsedPrimitives = "kitiniere_all", // "kitiniere", + +"undernexus_all", +// "undernexus", + //ace kitiniere+tcm "corrupted_moor_all", }; diff --git a/ryzom/server/tools/cfg_creator/templates/ai_service_default.cfg b/ryzom/server/tools/cfg_creator/templates/ai_service_default.cfg index cbff847816..f70e7d3732 100644 --- a/ryzom/server/tools/cfg_creator/templates/ai_service_default.cfg +++ b/ryzom/server/tools/cfg_creator/templates/ai_service_default.cfg @@ -301,6 +301,14 @@ StartCommandsWhenMirrorReadyKitiniere = "loadMapsFromCommon kitiniere_all", }; +// commands for Undernexus continent +StartCommandsWhenMirrorReadyUndernexus = +{ + "loadContinent undernexus", + "createStaticAIInstance undernexus", + "loadMapsFromCommon undernexus_all", +}; + // commands for R2 continent StartCommandsWhenMirrorReadyR2Desert = { diff --git a/ryzom/server/tools/cfg_creator/templates/entities_game_service.cfg b/ryzom/server/tools/cfg_creator/templates/entities_game_service.cfg index 0db0cca11b..463e2dd3b7 100644 --- a/ryzom/server/tools/cfg_creator/templates/entities_game_service.cfg +++ b/ryzom/server/tools/cfg_creator/templates/entities_game_service.cfg @@ -150,6 +150,8 @@ UsedPrimitives = // "bagne_the_abyss_of_ichor", "kitiniere_all", +"undernexus_all", + // "kitiniere", //ace kitiniere+tcm "corrupted_moor_all", "r2_desert_all", @@ -189,6 +191,9 @@ DontUseSU = 0; // Set this shard as a ring (1) or mainland (0) shard (main behavior switch) IsRingShard = 0; +IsDevShard = #DEV_SHARD#; + + // Set a mainland SessionId. // Live: Must be 0 for ring shards, non-zero (usually ShardId) for mainland shards // Dev: Can be non-zero to initially connect a client to a ring shard diff --git a/ryzom/server/tools/cfg_creator/templates/entities_game_service_default.cfg b/ryzom/server/tools/cfg_creator/templates/entities_game_service_default.cfg index 2dddc223a5..70e5fc47bc 100644 --- a/ryzom/server/tools/cfg_creator/templates/entities_game_service_default.cfg +++ b/ryzom/server/tools/cfg_creator/templates/entities_game_service_default.cfg @@ -1416,7 +1416,7 @@ OutpostEditingConcurrencyCheckDelay = 50; // Period in seconds between 2 updates of outpost timers on clients OutpostClientTimersUpdatePeriod = 60; // Number of rounds in an outpost fight -OutpostFightRoundCount = 24; +OutpostFightRoundCount = 12; // Number of rounds in an outpost (in test) fight OutpostInTestFightRoundCount = 11; // Coef for squad count per round at outpost in test diff --git a/ryzom/server/tools/cfg_creator/templates/frontend_service_default.cfg b/ryzom/server/tools/cfg_creator/templates/frontend_service_default.cfg index b876829067..11ef9c1813 100644 --- a/ryzom/server/tools/cfg_creator/templates/frontend_service_default.cfg +++ b/ryzom/server/tools/cfg_creator/templates/frontend_service_default.cfg @@ -32,7 +32,7 @@ LimboTimeOut = 60000; // 1 min TotalBandwidth = 536870911; // <512 MB : max value for 32 bit bitsize ! // Maximum bytes per game cycle sent to a client, including all headers -ClientBandwidth = 332 * BandwidthRatio; // 332 <=> 13 kbit/s at 5 Hz; 202 <=> 16 kbit/s at 10 Hz +ClientBandwidth = 202 * BandwidthRatio; // 332 <=> 13 kbit/s at 5 Hz; 202 <=> 16 kbit/s at 10 Hz // Maximum bytes for impulsion channels per datagram sent to a client ImpulsionByteSize0 = 20 * BandwidthRatio; diff --git a/ryzom/server/tools/cfg_creator/templates/input_output_service.cfg b/ryzom/server/tools/cfg_creator/templates/input_output_service.cfg index 812de5168b..ce74a86eac 100644 --- a/ryzom/server/tools/cfg_creator/templates/input_output_service.cfg +++ b/ryzom/server/tools/cfg_creator/templates/input_output_service.cfg @@ -31,7 +31,7 @@ StartCommands += }; Paths += { - "../language", + "../language/translated", }; // ---- service NeL variables (used by CVariable class) diff --git a/ryzom/server/tools/cfg_creator/templates/used_continents.cfg b/ryzom/server/tools/cfg_creator/templates/used_continents.cfg index 86dfbb3507..2e351ac71d 100644 --- a/ryzom/server/tools/cfg_creator/templates/used_continents.cfg +++ b/ryzom/server/tools/cfg_creator/templates/used_continents.cfg @@ -35,6 +35,7 @@ UsedContinents = "r2_forest", "23", "r2_lakes", "24", "r2_jungle", "25", - "r2_roots", "26" + "r2_roots", "26", + "undernexus", "27" //ace kitiniere+tcm "corrupted_moor", "22" }; From db8f9cd832d20cc13f71054862b2ab235e89c7c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Tue, 4 Jul 2023 16:50:27 +0100 Subject: [PATCH 054/194] Fix Rp Items --- ryzom/client/src/player_cl.cpp | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/ryzom/client/src/player_cl.cpp b/ryzom/client/src/player_cl.cpp index cbd8928987..7437682798 100644 --- a/ryzom/client/src/player_cl.cpp +++ b/ryzom/client/src/player_cl.cpp @@ -486,7 +486,7 @@ void CPlayerCL::equip(SLOTTYPE::EVisualSlot slot, const std::string &shapeName, break; case SLOTTYPE::LEFT_HAND_SLOT: - if(_Items[slot].Sheet && _Items[slot].Sheet->getAnimSet()=="s") + if((_Items[slot].Sheet && _Items[slot].Sheet->getAnimSet() == "s") || (item && item->getAnimSet() == "s")) stickPoint = "Box_bouclier"; else stickPoint = "box_arme_gauche"; @@ -853,13 +853,11 @@ void CPlayerCL::updateVisualPropertyVpa(const NLMISC::TGameCycle &/* gameCycle * else { // No Valid item in the right hand. - SLOTTYPE::EVisualSlot slot = SLOTTYPE::RIGHT_HAND_SLOT; rightHandTag = getTag(5); if (!rightHandTag.empty() && rightHandTag != "_") { - fakeRightHand = SheetMngr.getVSIndex("stake.sitem", slot); - const CItemSheet *itemSheet = SheetMngr.getItem(slot, (uint)fakeRightHand); + vector<string> tagInfos; splitString(rightHandTag, string("|"), tagInfos); UInstance instance; @@ -872,16 +870,18 @@ void CPlayerCL::updateVisualPropertyVpa(const NLMISC::TGameCycle &/* gameCycle * tagInfos[0] = SheetMngr.getRpItem(itemNameId); } - if (tagInfos.size() == 2) + if (tagInfos.size() >= 3 && tagInfos[2] == "2H") + fakeRightHand = SheetMngr.getVSIndex("ic_candy_stick.sitem", slot); + else + fakeRightHand = SheetMngr.getVSIndex("stake.sitem", slot); + + const CItemSheet *itemSheet = SheetMngr.getItem(slot, (uint)fakeRightHand); + + if (tagInfos.size() >= 2) { sint instTexture; fromString(tagInfos[1], instTexture); - equip(slot, tagInfos[0], itemSheet); equip(slot, tagInfos[0], itemSheet, instTexture); - /*UInstance pInst = _Instances[slot].createLoadingFromCurrent(); - if(!pInst.empty()) - pInst.selectTextureSet(instTexture); - _Instances[slot].TextureSet = instTexture;*/ } else { @@ -929,7 +929,8 @@ void CPlayerCL::updateVisualPropertyVpa(const NLMISC::TGameCycle &/* gameCycle * tagInfos[0] = SheetMngr.getRpItem(itemNameId); } - if (tagInfos.size() == 3 && tagInfos[2] == ")") + + if (tagInfos.size() >= 3 && tagInfos[2] == "S") fakeLeftHand = SheetMngr.getVSIndex("icbss_pvp.sitem", slot); else fakeLeftHand = SheetMngr.getVSIndex("icfm1pd.sitem", slot); @@ -941,8 +942,6 @@ void CPlayerCL::updateVisualPropertyVpa(const NLMISC::TGameCycle &/* gameCycle * sint instTexture; fromString(tagInfos[1], instTexture); equip(slot, tagInfos[0], itemSheet, instTexture); - //_Instances[slot].selectTextureSet(instTexture); - //_Instances[slot].TextureSet = instTexture; } else { From 29badb25895a3996c9a650faedf5419ab0f0219f Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Wed, 14 Jun 2023 14:39:39 +0200 Subject: [PATCH 055/194] Merge branch '138-toggle-free-look-with-hotkey' into main/gingo-test --- .../client/data/gamedev/interfaces_v3/actions.xml | 1 + ryzom/client/data/gamedev/interfaces_v3/keys.xml | 1 + .../data/gamedev/interfaces_v3/keys_r2ed.xml | 1 + .../src/interface_v3/action_handler_game.cpp | 14 ++++++++++++++ ryzom/client/src/motion/user_controls.h | 2 ++ 5 files changed, 19 insertions(+) diff --git a/ryzom/client/data/gamedev/interfaces_v3/actions.xml b/ryzom/client/data/gamedev/interfaces_v3/actions.xml index 0a00cb0f64..194434a839 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/actions.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/actions.xml @@ -417,6 +417,7 @@ <action name="camera_down" hardtext="uiCameraDown" /> <action name="camera_foreward" hardtext="uiMoveForward" /> <action name="camera_backward" hardtext="uiMoveBackward" /> + <action name="toggle_free_look" hardtext="uiToggleFreeLook" /> </action_category> <action_category name="windows" hardtext="uiWindows" contexts="game, r2ed, r2ed_anim_test, r2ed_anim_dm"> diff --git a/ryzom/client/data/gamedev/interfaces_v3/keys.xml b/ryzom/client/data/gamedev/interfaces_v3/keys.xml index 677854a9ef..60d219ddb2 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/keys.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/keys.xml @@ -36,6 +36,7 @@ <key name="KeyNUMPAD2" action="camera_turn_right" /> <key name="KeyDECIMAL" action="camera_turn_center" /> <key name="KeyF5" shift="1" action="toggle_chat" /> + <key name="N/A" action="toggle_free_look" /> <!-- Target --> <key name="KeyF12" ctrl="0" action="no_target" /> diff --git a/ryzom/client/data/gamedev/interfaces_v3/keys_r2ed.xml b/ryzom/client/data/gamedev/interfaces_v3/keys_r2ed.xml index 65c7603cd2..b7ecb65519 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/keys_r2ed.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/keys_r2ed.xml @@ -37,6 +37,7 @@ <key name="KeyDECIMAL" action="camera_turn_center" /> <key name="KeyF5" shift="1" action="toggle_chat" /> + <key name="N/A" action="toggle_free_look" /> <key name="KeyF10" shift="1" action="screen_shot" /> <key name="KeyF10" ctrl="1" action="screen_shot_jpg" /> diff --git a/ryzom/client/src/interface_v3/action_handler_game.cpp b/ryzom/client/src/interface_v3/action_handler_game.cpp index eeb92888db..790c8b13d1 100644 --- a/ryzom/client/src/interface_v3/action_handler_game.cpp +++ b/ryzom/client/src/interface_v3/action_handler_game.cpp @@ -860,6 +860,20 @@ class CHandlerContextFreeLook : public IActionHandler }; REGISTER_ACTION_HANDLER( CHandlerContextFreeLook, "context_free_look"); +// *************************************************************************** +class CHandlerToggleFreeLook : public IActionHandler +{ +public: + void execute(CCtrlBase * /* pCaller */, const std::string & /* sParams */) + { + if (UserControls.getFreeLook()) + UserControls.stopFreeLook(); + else + UserControls.startFreeLook(); + } +}; +REGISTER_ACTION_HANDLER( CHandlerToggleFreeLook, "toggle_free_look"); + // *************************************************************************** // GCM Move // *************************************************************************** diff --git a/ryzom/client/src/motion/user_controls.h b/ryzom/client/src/motion/user_controls.h index 1ceabd8d9c..7f09ef7f29 100644 --- a/ryzom/client/src/motion/user_controls.h +++ b/ryzom/client/src/motion/user_controls.h @@ -179,6 +179,8 @@ class CUserControls /// Stop Free Look (can be called multiple times if needed). Additionaly, the mouse/pointer is restored void stopFreeLook(); + bool getFreeLook() const { return _FreeLook; } + /// Is the camera inside the character. bool isInternalView() {return _InternalView;} From 26054bafc2c72bab539c71921f5d422429826786 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Wed, 14 Jun 2023 14:39:28 +0200 Subject: [PATCH 056/194] Merge branch '158-allow-macro-keybind-to-be-unassigned' into main/gingo-test --- .../data/gamedev/interfaces_v3/macros.xml | 1 + .../src/interface_v3/macrocmd_manager.cpp | 38 +++++++++++++++++++ .../src/interface_v3/macrocmd_manager.h | 2 + 3 files changed, 41 insertions(+) diff --git a/ryzom/client/data/gamedev/interfaces_v3/macros.xml b/ryzom/client/data/gamedev/interfaces_v3/macros.xml index d14e6e8886..297a94980d 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/macros.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/macros.xml @@ -238,6 +238,7 @@ <action name="uimMacroExec" handler="macros_exec" icon="r2ed_tool_start.tga" /> <action name="uimMacroEdit" handler="macros_edit" icon="r2ed_edit_dialog_small.tga" /> <action name="uimMacroCopy" handler="macros_copy" icon="r2ed_tool_copy.tga" /> + <action name="uimMacroUnassign" handler="macros_unassign" icon="" /> <separator/> <action name="uimMacroDel" handler="macros_del" icon="patch_off.tga" /> </group> diff --git a/ryzom/client/src/interface_v3/macrocmd_manager.cpp b/ryzom/client/src/interface_v3/macrocmd_manager.cpp index f942ae7e1d..f19bd71d52 100644 --- a/ryzom/client/src/interface_v3/macrocmd_manager.cpp +++ b/ryzom/client/src/interface_v3/macrocmd_manager.cpp @@ -162,6 +162,12 @@ void CMacroCmd::moveDownCommand (uint cmdNb) Commands[cmdNb+1] = c; } +// ------------------------------------------------------------------------------------------------ +void CMacroCmd::unassignCombo() +{ + Combo.Key = KeyCount; + Combo.KeyButtons = noKeyButton; +} // ------------------------------------------------------------------------------------------------ // CMacroCmdManager @@ -304,6 +310,19 @@ void CMacroCmdManager::delMacro(sint32 nMacNb) addActionManagerEntries(); } +void CMacroCmdManager::unassignMacro(size_t nMacNb) +{ + if (nMacNb >= _Macros.size()) + { + nlwarning("unassign called on out-of-bounds index %lu, (size %lu)", nMacNb, _Macros.size()); + return; + } + + delActionManagerEntries(); + _Macros[nMacNb].unassignCombo(); + addActionManagerEntries(); +} + // ------------------------------------------------------------------------------------------------ // Refresh key association that can be changed in another place than in macro container void CMacroCmdManager::refreshMacroCombo() @@ -1128,6 +1147,25 @@ class CHandlerMacrosCopy : public IActionHandler }; REGISTER_ACTION_HANDLER( CHandlerMacrosCopy, "macros_copy"); + +// *************************************************************************** +// Called from context menu on a macro +class CHandlerMacrosUnassign : public IActionHandler +{ +public: + virtual void execute(CCtrlBase *pCaller, const string &/* Params */) + { + sint nMacNb = getMacroFromId(pCaller->getId()); + if (nMacNb < 0) return; + + CMacroCmdManager::getInstance()->unassignMacro(nMacNb); + // update keybinding in macros list without calling runActionHandler("macros_open", NULL) + CViewText *pVT = dynamic_cast<CViewText*>(CWidgetManager::getInstance()->getElementFromId(pCaller->getId() + ":" + TEMPLATE_MACRO_ELT_KEYTEXT)); + if (pVT) pVT->setText(CI18N::get(VIEW_EDITCMD_TEXT_KEY_DEFAULT)); + } +}; +REGISTER_ACTION_HANDLER( CHandlerMacrosUnassign, "macros_unassign"); + // *************************************************************************** // Called from context menu on a macro class CHandlerMacrosDel : public IActionHandler diff --git a/ryzom/client/src/interface_v3/macrocmd_manager.h b/ryzom/client/src/interface_v3/macrocmd_manager.h index 0bc2eec03c..dfe59b67b7 100644 --- a/ryzom/client/src/interface_v3/macrocmd_manager.h +++ b/ryzom/client/src/interface_v3/macrocmd_manager.h @@ -78,6 +78,7 @@ class CMacroCmd void delCommand (uint cmdNb); void moveUpCommand (uint cmdNb); void moveDownCommand (uint cmdNb); + void unassignCombo(); void writeTo (xmlNodePtr node) const; bool readFrom (xmlNodePtr node); @@ -104,6 +105,7 @@ class CMacroCmdManager const std::vector<CMacroCmd> &getMacros() { return _Macros; } void addMacro (const CMacroCmd &m, sint32 nPos=-1); void delMacro(sint32 nMacNb); + void unassignMacro(size_t nMacNb); void removeAllMacros(); void refreshMacroCombo(); From 92687652447c66f2b394a1b3d2bc874d28d45739 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Wed, 14 Jun 2023 14:39:14 +0200 Subject: [PATCH 057/194] Merge branch '164-crash-on-patching-and-possibly-right-after-login' into main/gingo-test --- azure-pipelines.yml | 7 +++++++ ryzom/client/src/login_patch.cpp | 16 ++++++++-------- ryzom/client/src/user_entity.cpp | 1 + 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 9c735531ba..e42680e060 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,3 +1,10 @@ +trigger: + branches: + include: + - core4 + - feature/* + - main/atys-live + jobs: - job: ubuntu18 timeoutInMinutes: 120 diff --git a/ryzom/client/src/login_patch.cpp b/ryzom/client/src/login_patch.cpp index 82665aac1d..b97d410bef 100644 --- a/ryzom/client/src/login_patch.cpp +++ b/ryzom/client/src/login_patch.cpp @@ -533,6 +533,8 @@ void CPatchManager::getInfoToDisp(SPatchInfo &piOut) } } +void stopSoundMngr(); + // **************************************************************************** // TODO : use selected categories to patch a list of files void CPatchManager::startPatchThread(const vector<string> &CategoriesSelected, bool applyPatch) @@ -623,6 +625,12 @@ void CPatchManager::startPatchThread(const vector<string> &CategoriesSelected, b // Close opened big files CBigFile::getInstance().remove(FilesToPatch[k].FileName); + + if (NLMISC::startsWith(FilesToPatch[k].FileName, "sound")) + { + // Stop sound playback + stopSoundMngr(); + } } } } @@ -2605,8 +2613,6 @@ class CPatchThreadDownloadProgress : public NLMISC::IProgressCallback } }; -void stopSoundMngr(); - // **************************************************************************** void CPatchThread::processFile (CPatchManager::SFileToPatch &rFTP) { @@ -2618,12 +2624,6 @@ void CPatchThread::processFile (CPatchManager::SFileToPatch &rFTP) // Destination File Name (in writable directory) string DestinationName; - if (NLMISC::startsWith(rFTP.FileName, "sound")) - { - // Stop sound playback - stopSoundMngr(); - } - if (rFTP.ExtractPath.empty()) { DestinationName = pPM->WritableClientDataPath + rFTP.FileName; diff --git a/ryzom/client/src/user_entity.cpp b/ryzom/client/src/user_entity.cpp index 0077b2bc46..9ec59f6fb1 100644 --- a/ryzom/client/src/user_entity.cpp +++ b/ryzom/client/src/user_entity.cpp @@ -194,6 +194,7 @@ CUserEntity::CUserEntity() _R2CharMode= R2::TCharMode::Player; + _CameraMoves = NLMISC::CVector(0, 0, 0); }// CUserEntity // From 4ca2bd14740e8f7e11719bfb778adaf182019ffd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Tue, 4 Jul 2023 20:03:22 +0100 Subject: [PATCH 058/194] New lua versions --- .../interfaces_v3/check_lua_versions.lua | 38 +++++++++++++++++++ .../client/data/gamedev/interfaces_v3/map.lua | 2 +- .../data/gamedev/interfaces_v3/player.lua | 2 +- .../data/gamedev/interfaces_v3/sceneedit.lua | 2 +- 4 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua diff --git a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua new file mode 100644 index 0000000000..4ff1d4d75a --- /dev/null +++ b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua @@ -0,0 +1,38 @@ +local all_good_versions = true +if RYZOM_APPZONE_VERSION ~= 324 then all_good_versions = false end +if RYZOM_ARK_VERSION ~= 324 then all_good_versions = false end +if RYZOM_ARK_LESSONS_VERSION ~= 324 then all_good_versions = false end +if RYZOM_BG_DOWNLOADER_VERSION ~= 324 then all_good_versions = false end +if RYZOM_BOT_CHAT_V4_VERSION ~= 324 then all_good_versions = false end +if RYZOM_CHECK_LUA_VERSIONS_VERSION ~= 324 then all_good_versions = false end +if RYZOM_COMPASS_VERSION ~= 324 then all_good_versions = false end +if RYZOM_GAME_CONFIG_VERSION ~= 324 then all_good_versions = false end +if RYZOM_GAME_R2_LOADING_VERSION ~= 324 then all_good_versions = false end +if RYZOM_GUILD_VERSION ~= 324 then all_good_versions = false end +if RYZOM_HELP_VERSION ~= 324 then all_good_versions = false end +if RYZOM_INFO_PLAYER_VERSION ~= 324 then all_good_versions = false end +if RYZOM_INTERACTION_VERSION ~= 324 then all_good_versions = false end +if RYZOM_INVENTORY_VERSION ~= 324 then all_good_versions = false end +if RYZOM_JSON_VERSION ~= 324 then all_good_versions = false end +if RYZOM_MAP_VERSION ~= 328 then all_good_versions = false end +if RYZOM_MISC_VERSION ~= 324 then all_good_versions = false end +if RYZOM_NAMES_FYROS_VERSION ~= 324 then all_good_versions = false end +if RYZOM_NAMES_MATIS_VERSION ~= 324 then all_good_versions = false end +if RYZOM_NAMES_TRYKER_VERSION ~= 324 then all_good_versions = false end +if RYZOM_NAMES_ZORAI_VERSION ~= 324 then all_good_versions = false end +if RYZOM_OUT_V2_APPEAR_VERSION ~= 324 then all_good_versions = false end +if RYZOM_OUT_V2_SELECT_VERSION ~= 324 then all_good_versions = false end +if RYZOM_OUTPOST_VERSION ~= 324 then all_good_versions = false end +if RYZOM_PLAYER_VERSION ~= 328 then all_good_versions = false end +if RYZOM_PLAYER_TRADE_VERSION ~= 324 then all_good_versions = false end +if RYZOM_RING_ACCESS_POINT_VERSION ~= 324 then all_good_versions = false end +if RYZOM_RING_ACCESS_POINT_FILTER_VERSION ~= 324 then all_good_versions = false end +if RYZOM_RING_WINDOW_VERSION ~= 324 then all_good_versions = false end +if RYZOM_RYZHOME_TOOLBAR_VERSION ~= 324 then all_good_versions = false end +if RYZOM_SCENEEDIT_VERSION ~= 328 then all_good_versions = false end +if RYZOM_TASKBAR_VERSION ~= 324 then all_good_versions = false end +if RYZOM_TP_INTERFACE_VERSION ~= 324 then all_good_versions = false end +if RYZOM_WEB_QUEUE_VERSION ~= 324 then all_good_versions = false end +if RYZOM_WEBBROWSER_VERSION ~= 324 then all_good_versions = false end +if RYZOM_WEBIG_VERSION ~= 324 then all_good_versions = false end +if not all_good_versions then broadcastBadLuaVersions() end diff --git a/ryzom/client/data/gamedev/interfaces_v3/map.lua b/ryzom/client/data/gamedev/interfaces_v3/map.lua index 6b731a64c2..b9d321ae63 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/map.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/map.lua @@ -274,4 +274,4 @@ game:addMapArkPoint("Vip", 4154, -3305, "vip_allegory", "", "allegory_16.tga", " -- game:setAltMap("fyros_map.tga", "fyros_map_sp.tga") -- VERSION -- -RYZOM_MAP_VERSION = 324 +RYZOM_MAP_VERSION = 328 diff --git a/ryzom/client/data/gamedev/interfaces_v3/player.lua b/ryzom/client/data/gamedev/interfaces_v3/player.lua index 6efbc1a6fe..c662b6edbf 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/player.lua @@ -1065,4 +1065,4 @@ function game:fixVpx(vpx) end -- VERSION -- -RYZOM_PLAYER_VERSION = 324 +RYZOM_PLAYER_VERSION = 328 diff --git a/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua b/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua index 739977e57a..f3a2e967e0 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua @@ -670,4 +670,4 @@ end -- VERSION -- -RYZOM_SCENEEDIT_VERSION = 324 +RYZOM_SCENEEDIT_VERSION = 328 From e6060173af9717f7d636d55bc530b05940d5778e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Meelis=20M=C3=A4gi?= <nimetu@gmail.com> Date: Wed, 5 Jul 2023 10:49:44 +0000 Subject: [PATCH 059/194] Resolve "Toggle Free Look with Hotkey" --- .../client/data/gamedev/interfaces_v3/actions.xml | 1 + ryzom/client/data/gamedev/interfaces_v3/keys.xml | 1 + .../data/gamedev/interfaces_v3/keys_r2ed.xml | 1 + .../src/interface_v3/action_handler_game.cpp | 14 ++++++++++++++ ryzom/client/src/motion/user_controls.h | 2 ++ 5 files changed, 19 insertions(+) diff --git a/ryzom/client/data/gamedev/interfaces_v3/actions.xml b/ryzom/client/data/gamedev/interfaces_v3/actions.xml index 0a00cb0f64..194434a839 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/actions.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/actions.xml @@ -417,6 +417,7 @@ <action name="camera_down" hardtext="uiCameraDown" /> <action name="camera_foreward" hardtext="uiMoveForward" /> <action name="camera_backward" hardtext="uiMoveBackward" /> + <action name="toggle_free_look" hardtext="uiToggleFreeLook" /> </action_category> <action_category name="windows" hardtext="uiWindows" contexts="game, r2ed, r2ed_anim_test, r2ed_anim_dm"> diff --git a/ryzom/client/data/gamedev/interfaces_v3/keys.xml b/ryzom/client/data/gamedev/interfaces_v3/keys.xml index 677854a9ef..60d219ddb2 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/keys.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/keys.xml @@ -36,6 +36,7 @@ <key name="KeyNUMPAD2" action="camera_turn_right" /> <key name="KeyDECIMAL" action="camera_turn_center" /> <key name="KeyF5" shift="1" action="toggle_chat" /> + <key name="N/A" action="toggle_free_look" /> <!-- Target --> <key name="KeyF12" ctrl="0" action="no_target" /> diff --git a/ryzom/client/data/gamedev/interfaces_v3/keys_r2ed.xml b/ryzom/client/data/gamedev/interfaces_v3/keys_r2ed.xml index 65c7603cd2..b7ecb65519 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/keys_r2ed.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/keys_r2ed.xml @@ -37,6 +37,7 @@ <key name="KeyDECIMAL" action="camera_turn_center" /> <key name="KeyF5" shift="1" action="toggle_chat" /> + <key name="N/A" action="toggle_free_look" /> <key name="KeyF10" shift="1" action="screen_shot" /> <key name="KeyF10" ctrl="1" action="screen_shot_jpg" /> diff --git a/ryzom/client/src/interface_v3/action_handler_game.cpp b/ryzom/client/src/interface_v3/action_handler_game.cpp index 8c8c56e34e..15851758db 100644 --- a/ryzom/client/src/interface_v3/action_handler_game.cpp +++ b/ryzom/client/src/interface_v3/action_handler_game.cpp @@ -860,6 +860,20 @@ class CHandlerContextFreeLook : public IActionHandler }; REGISTER_ACTION_HANDLER( CHandlerContextFreeLook, "context_free_look"); +// *************************************************************************** +class CHandlerToggleFreeLook : public IActionHandler +{ +public: + void execute(CCtrlBase * /* pCaller */, const std::string & /* sParams */) + { + if (UserControls.getFreeLook()) + UserControls.stopFreeLook(); + else + UserControls.startFreeLook(); + } +}; +REGISTER_ACTION_HANDLER( CHandlerToggleFreeLook, "toggle_free_look"); + // *************************************************************************** // GCM Move // *************************************************************************** diff --git a/ryzom/client/src/motion/user_controls.h b/ryzom/client/src/motion/user_controls.h index 1ceabd8d9c..7f09ef7f29 100644 --- a/ryzom/client/src/motion/user_controls.h +++ b/ryzom/client/src/motion/user_controls.h @@ -179,6 +179,8 @@ class CUserControls /// Stop Free Look (can be called multiple times if needed). Additionaly, the mouse/pointer is restored void stopFreeLook(); + bool getFreeLook() const { return _FreeLook; } + /// Is the camera inside the character. bool isInternalView() {return _InternalView;} From 4dbbed0342965914b73846f9933a4a1d1d13ba8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Meelis=20M=C3=A4gi?= <nimetu@gmail.com> Date: Wed, 5 Jul 2023 10:49:58 +0000 Subject: [PATCH 060/194] Resolve "Allow macro keybind to be unassigned" --- .../data/gamedev/interfaces_v3/macros.xml | 1 + .../src/interface_v3/macrocmd_manager.cpp | 38 +++++++++++++++++++ .../src/interface_v3/macrocmd_manager.h | 2 + 3 files changed, 41 insertions(+) diff --git a/ryzom/client/data/gamedev/interfaces_v3/macros.xml b/ryzom/client/data/gamedev/interfaces_v3/macros.xml index d14e6e8886..297a94980d 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/macros.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/macros.xml @@ -238,6 +238,7 @@ <action name="uimMacroExec" handler="macros_exec" icon="r2ed_tool_start.tga" /> <action name="uimMacroEdit" handler="macros_edit" icon="r2ed_edit_dialog_small.tga" /> <action name="uimMacroCopy" handler="macros_copy" icon="r2ed_tool_copy.tga" /> + <action name="uimMacroUnassign" handler="macros_unassign" icon="" /> <separator/> <action name="uimMacroDel" handler="macros_del" icon="patch_off.tga" /> </group> diff --git a/ryzom/client/src/interface_v3/macrocmd_manager.cpp b/ryzom/client/src/interface_v3/macrocmd_manager.cpp index f942ae7e1d..f19bd71d52 100644 --- a/ryzom/client/src/interface_v3/macrocmd_manager.cpp +++ b/ryzom/client/src/interface_v3/macrocmd_manager.cpp @@ -162,6 +162,12 @@ void CMacroCmd::moveDownCommand (uint cmdNb) Commands[cmdNb+1] = c; } +// ------------------------------------------------------------------------------------------------ +void CMacroCmd::unassignCombo() +{ + Combo.Key = KeyCount; + Combo.KeyButtons = noKeyButton; +} // ------------------------------------------------------------------------------------------------ // CMacroCmdManager @@ -304,6 +310,19 @@ void CMacroCmdManager::delMacro(sint32 nMacNb) addActionManagerEntries(); } +void CMacroCmdManager::unassignMacro(size_t nMacNb) +{ + if (nMacNb >= _Macros.size()) + { + nlwarning("unassign called on out-of-bounds index %lu, (size %lu)", nMacNb, _Macros.size()); + return; + } + + delActionManagerEntries(); + _Macros[nMacNb].unassignCombo(); + addActionManagerEntries(); +} + // ------------------------------------------------------------------------------------------------ // Refresh key association that can be changed in another place than in macro container void CMacroCmdManager::refreshMacroCombo() @@ -1128,6 +1147,25 @@ class CHandlerMacrosCopy : public IActionHandler }; REGISTER_ACTION_HANDLER( CHandlerMacrosCopy, "macros_copy"); + +// *************************************************************************** +// Called from context menu on a macro +class CHandlerMacrosUnassign : public IActionHandler +{ +public: + virtual void execute(CCtrlBase *pCaller, const string &/* Params */) + { + sint nMacNb = getMacroFromId(pCaller->getId()); + if (nMacNb < 0) return; + + CMacroCmdManager::getInstance()->unassignMacro(nMacNb); + // update keybinding in macros list without calling runActionHandler("macros_open", NULL) + CViewText *pVT = dynamic_cast<CViewText*>(CWidgetManager::getInstance()->getElementFromId(pCaller->getId() + ":" + TEMPLATE_MACRO_ELT_KEYTEXT)); + if (pVT) pVT->setText(CI18N::get(VIEW_EDITCMD_TEXT_KEY_DEFAULT)); + } +}; +REGISTER_ACTION_HANDLER( CHandlerMacrosUnassign, "macros_unassign"); + // *************************************************************************** // Called from context menu on a macro class CHandlerMacrosDel : public IActionHandler diff --git a/ryzom/client/src/interface_v3/macrocmd_manager.h b/ryzom/client/src/interface_v3/macrocmd_manager.h index 0bc2eec03c..dfe59b67b7 100644 --- a/ryzom/client/src/interface_v3/macrocmd_manager.h +++ b/ryzom/client/src/interface_v3/macrocmd_manager.h @@ -78,6 +78,7 @@ class CMacroCmd void delCommand (uint cmdNb); void moveUpCommand (uint cmdNb); void moveDownCommand (uint cmdNb); + void unassignCombo(); void writeTo (xmlNodePtr node) const; bool readFrom (xmlNodePtr node); @@ -104,6 +105,7 @@ class CMacroCmdManager const std::vector<CMacroCmd> &getMacros() { return _Macros; } void addMacro (const CMacroCmd &m, sint32 nPos=-1); void delMacro(sint32 nMacNb); + void unassignMacro(size_t nMacNb); void removeAllMacros(); void refreshMacroCombo(); From e7ad07346cf279a02f62319fc984f0d5e5a2da77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Meelis=20M=C3=A4gi?= <nimetu@gmail.com> Date: Wed, 5 Jul 2023 10:50:08 +0000 Subject: [PATCH 061/194] Resolve "Crash on patching and (possibly) right after login" --- azure-pipelines.yml | 7 +++++++ ryzom/client/src/login_patch.cpp | 16 ++++++++-------- ryzom/client/src/user_entity.cpp | 1 + 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 9c735531ba..e42680e060 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,3 +1,10 @@ +trigger: + branches: + include: + - core4 + - feature/* + - main/atys-live + jobs: - job: ubuntu18 timeoutInMinutes: 120 diff --git a/ryzom/client/src/login_patch.cpp b/ryzom/client/src/login_patch.cpp index 82665aac1d..b97d410bef 100644 --- a/ryzom/client/src/login_patch.cpp +++ b/ryzom/client/src/login_patch.cpp @@ -533,6 +533,8 @@ void CPatchManager::getInfoToDisp(SPatchInfo &piOut) } } +void stopSoundMngr(); + // **************************************************************************** // TODO : use selected categories to patch a list of files void CPatchManager::startPatchThread(const vector<string> &CategoriesSelected, bool applyPatch) @@ -623,6 +625,12 @@ void CPatchManager::startPatchThread(const vector<string> &CategoriesSelected, b // Close opened big files CBigFile::getInstance().remove(FilesToPatch[k].FileName); + + if (NLMISC::startsWith(FilesToPatch[k].FileName, "sound")) + { + // Stop sound playback + stopSoundMngr(); + } } } } @@ -2605,8 +2613,6 @@ class CPatchThreadDownloadProgress : public NLMISC::IProgressCallback } }; -void stopSoundMngr(); - // **************************************************************************** void CPatchThread::processFile (CPatchManager::SFileToPatch &rFTP) { @@ -2618,12 +2624,6 @@ void CPatchThread::processFile (CPatchManager::SFileToPatch &rFTP) // Destination File Name (in writable directory) string DestinationName; - if (NLMISC::startsWith(rFTP.FileName, "sound")) - { - // Stop sound playback - stopSoundMngr(); - } - if (rFTP.ExtractPath.empty()) { DestinationName = pPM->WritableClientDataPath + rFTP.FileName; diff --git a/ryzom/client/src/user_entity.cpp b/ryzom/client/src/user_entity.cpp index 0077b2bc46..9ec59f6fb1 100644 --- a/ryzom/client/src/user_entity.cpp +++ b/ryzom/client/src/user_entity.cpp @@ -194,6 +194,7 @@ CUserEntity::CUserEntity() _R2CharMode= R2::TCharMode::Player; + _CameraMoves = NLMISC::CVector(0, 0, 0); }// CUserEntity // From f3bf0f4be0e221607b772ce87549d0962bdc5850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Wed, 5 Jul 2023 12:09:47 +0100 Subject: [PATCH 062/194] Update --- .../interfaces_v3/check_lua_versions.lua | 73 +++++++++---------- 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua index 4ff1d4d75a..b3399d95bc 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua @@ -1,38 +1,37 @@ -local all_good_versions = true -if RYZOM_APPZONE_VERSION ~= 324 then all_good_versions = false end -if RYZOM_ARK_VERSION ~= 324 then all_good_versions = false end -if RYZOM_ARK_LESSONS_VERSION ~= 324 then all_good_versions = false end -if RYZOM_BG_DOWNLOADER_VERSION ~= 324 then all_good_versions = false end -if RYZOM_BOT_CHAT_V4_VERSION ~= 324 then all_good_versions = false end -if RYZOM_CHECK_LUA_VERSIONS_VERSION ~= 324 then all_good_versions = false end -if RYZOM_COMPASS_VERSION ~= 324 then all_good_versions = false end -if RYZOM_GAME_CONFIG_VERSION ~= 324 then all_good_versions = false end -if RYZOM_GAME_R2_LOADING_VERSION ~= 324 then all_good_versions = false end -if RYZOM_GUILD_VERSION ~= 324 then all_good_versions = false end -if RYZOM_HELP_VERSION ~= 324 then all_good_versions = false end -if RYZOM_INFO_PLAYER_VERSION ~= 324 then all_good_versions = false end -if RYZOM_INTERACTION_VERSION ~= 324 then all_good_versions = false end -if RYZOM_INVENTORY_VERSION ~= 324 then all_good_versions = false end -if RYZOM_JSON_VERSION ~= 324 then all_good_versions = false end -if RYZOM_MAP_VERSION ~= 328 then all_good_versions = false end -if RYZOM_MISC_VERSION ~= 324 then all_good_versions = false end -if RYZOM_NAMES_FYROS_VERSION ~= 324 then all_good_versions = false end -if RYZOM_NAMES_MATIS_VERSION ~= 324 then all_good_versions = false end -if RYZOM_NAMES_TRYKER_VERSION ~= 324 then all_good_versions = false end -if RYZOM_NAMES_ZORAI_VERSION ~= 324 then all_good_versions = false end -if RYZOM_OUT_V2_APPEAR_VERSION ~= 324 then all_good_versions = false end -if RYZOM_OUT_V2_SELECT_VERSION ~= 324 then all_good_versions = false end -if RYZOM_OUTPOST_VERSION ~= 324 then all_good_versions = false end -if RYZOM_PLAYER_VERSION ~= 328 then all_good_versions = false end -if RYZOM_PLAYER_TRADE_VERSION ~= 324 then all_good_versions = false end -if RYZOM_RING_ACCESS_POINT_VERSION ~= 324 then all_good_versions = false end -if RYZOM_RING_ACCESS_POINT_FILTER_VERSION ~= 324 then all_good_versions = false end -if RYZOM_RING_WINDOW_VERSION ~= 324 then all_good_versions = false end -if RYZOM_RYZHOME_TOOLBAR_VERSION ~= 324 then all_good_versions = false end -if RYZOM_SCENEEDIT_VERSION ~= 328 then all_good_versions = false end -if RYZOM_TASKBAR_VERSION ~= 324 then all_good_versions = false end -if RYZOM_TP_INTERFACE_VERSION ~= 324 then all_good_versions = false end -if RYZOM_WEB_QUEUE_VERSION ~= 324 then all_good_versions = false end -if RYZOM_WEBBROWSER_VERSION ~= 324 then all_good_versions = false end -if RYZOM_WEBIG_VERSION ~= 324 then all_good_versions = false end +local ryzom_have_all_good_version = true +if RYZOM_APPZONE_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_APPZONE_VERSION, 324, "appzone") end +if RYZOM_ARK_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_ARK_VERSION, 324, "ark") end +if RYZOM_ARK_LESSONS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_ARK_LESSONS_VERSION, 324, "ark_lessons") end +if RYZOM_BG_DOWNLOADER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_BG_DOWNLOADER_VERSION, 324, "bg_downloader") end +if RYZOM_BOT_CHAT_V4_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_BOT_CHAT_V4_VERSION, 324, "bot_chat_v4") end +if RYZOM_COMPASS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_COMPASS_VERSION, 324, "compass") end +if RYZOM_GAME_CONFIG_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_GAME_CONFIG_VERSION, 324, "game_config") end +if RYZOM_GAME_R2_LOADING_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_GAME_R2_LOADING_VERSION, 324, "game_r2_loading") end +if RYZOM_GUILD_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_GUILD_VERSION, 324, "guild") end +if RYZOM_HELP_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_HELP_VERSION, 324, "help") end +if RYZOM_INFO_PLAYER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_INFO_PLAYER_VERSION, 324, "info_player") end +if RYZOM_INTERACTION_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_INTERACTION_VERSION, 324, "interaction") end +if RYZOM_INVENTORY_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_INVENTORY_VERSION, 324, "inventory") end +if RYZOM_JSON_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_JSON_VERSION, 324, "json") end +if RYZOM_MAP_VERSION ~= 328 then broadcastBadLuaVersions(RYZOM_MAP_VERSION, 328, "map") end +if RYZOM_MISC_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_MISC_VERSION, 324, "misc") end +if RYZOM_NAMES_FYROS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_FYROS_VERSION, 324, "names_fyros") end +if RYZOM_NAMES_MATIS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_MATIS_VERSION, 324, "names_matis") end +if RYZOM_NAMES_TRYKER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_TRYKER_VERSION, 324, "names_tryker") end +if RYZOM_NAMES_ZORAI_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_ZORAI_VERSION, 324, "names_zorai") end +if RYZOM_OUT_V2_APPEAR_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_APPEAR_VERSION, 324, "out_v2_appear") end +if RYZOM_OUT_V2_SELECT_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_SELECT_VERSION, 324, "out_v2_select") end +if RYZOM_OUTPOST_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUTPOST_VERSION, 324, "outpost") end +if RYZOM_PLAYER_VERSION ~= 328 then broadcastBadLuaVersions(RYZOM_PLAYER_VERSION, 328, "player") end +if RYZOM_PLAYER_TRADE_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_PLAYER_TRADE_VERSION, 324, "player_trade") end +if RYZOM_RING_ACCESS_POINT_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RING_ACCESS_POINT_VERSION, 324, "ring_access_point") end +if RYZOM_RING_ACCESS_POINT_FILTER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RING_ACCESS_POINT_FILTER_VERSION, 324, "ring_access_point_filter") end +if RYZOM_RING_WINDOW_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RING_WINDOW_VERSION, 324, "ring_window") end +if RYZOM_RYZHOME_TOOLBAR_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RYZHOME_TOOLBAR_VERSION, 324, "ryzhome_toolbar") end +if RYZOM_SCENEEDIT_VERSION ~= 328 then broadcastBadLuaVersions(RYZOM_SCENEEDIT_VERSION, 328, "sceneedit") end +if RYZOM_TASKBAR_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_TASKBAR_VERSION, 324, "taskbar") end +if RYZOM_TP_INTERFACE_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_TP_INTERFACE_VERSION, 324, "tp_interface") end +if RYZOM_WEB_QUEUE_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_WEB_QUEUE_VERSION, 324, "web_queue") end +if RYZOM_WEBBROWSER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_WEBBROWSER_VERSION, 324, "webbrowser") end +if RYZOM_WEBIG_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_WEBIG_VERSION, 324, "webig") end if not all_good_versions then broadcastBadLuaVersions() end From a9e8be1dfcc6d9ceed914a2908f7b7ad92b28816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Wed, 12 Jul 2023 12:06:26 +0100 Subject: [PATCH 063/194] Fix checkRpItemsPosition --- .../gamedev/interfaces_v3/interaction.lua | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua index 8a281d924d..558904e819 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua @@ -268,7 +268,7 @@ function game:addRequireRpItemsPosition(x, y, id) end function game:addRequireRpItems(left, target, mode, id) - game.wantedRpTargets[left..":"..target..":"..mode] = id + game.wantedRpTargets[left..":"..target..":"..mode..":"..id] = id end game.usedRpLeftItem = "_" @@ -300,16 +300,21 @@ function game:updateRpItems() mode = tostring(getTargetMode()) end + game:checkRpItemsPosition() local html = getUI("ui:interface:rpitems_actions"):find("html") for k, v in pairs(game.wantedRpTargets) do local a = html:find("action"..v) if a then - if string.find(left..":"..target..":"..mode, k) or string.find(left..":"..target..":*", k) then - a:find("but").frozen = false + if a:find("but").onclick_l == "lua" and (string.find(k, left..":"..target..":"..mode) or string.find(k, left..":"..target..":")) then + a:find("img").texture = "grey_0.tga" + a:find("but").onclick_l = "lua" + a:find("but").alpha = 255 a:find("text").alpha = 255 else - a:find("but").frozen = true - a:find("text").alpha = 155 + a:find("img").texture = "r2ed_toolbar_lock_small.tga" + a:find("but").onclick_l = "" + a:find("but").alpha = 150 + a:find("text").alpha = 100 end end end @@ -325,11 +330,13 @@ function game:checkRpItemsPosition() local a = html:find("action"..v) if a then if string.find(sx..":"..sy, k) then - a:find("but").frozen = false + a:find("but").onclick_l = "lua" + a:find("img").texture = "grey_0.tga" a:find("text").alpha = 255 else - a:find("but").frozen = true - a:find("text").alpha = 155 + a:find("but").onclick_l = "proc" + a:find("img").texture = "r2ed_toolbar_lock_small.tga" + a:find("text").alpha = 200 end end end @@ -1290,4 +1297,4 @@ function arkNpcShop:Buy(id) end -- VERSION -- -RYZOM_INTERACTION_VERSION = 324 \ No newline at end of file +RYZOM_INTERACTION_VERSION = 324 From 4c2d5c518ae24f973be328cd4d388d32b30bc704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Wed, 12 Jul 2023 12:06:26 +0100 Subject: [PATCH 064/194] Fix checkRpItemsPosition --- .../gamedev/interfaces_v3/interaction.lua | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua index 8a281d924d..558904e819 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua @@ -268,7 +268,7 @@ function game:addRequireRpItemsPosition(x, y, id) end function game:addRequireRpItems(left, target, mode, id) - game.wantedRpTargets[left..":"..target..":"..mode] = id + game.wantedRpTargets[left..":"..target..":"..mode..":"..id] = id end game.usedRpLeftItem = "_" @@ -300,16 +300,21 @@ function game:updateRpItems() mode = tostring(getTargetMode()) end + game:checkRpItemsPosition() local html = getUI("ui:interface:rpitems_actions"):find("html") for k, v in pairs(game.wantedRpTargets) do local a = html:find("action"..v) if a then - if string.find(left..":"..target..":"..mode, k) or string.find(left..":"..target..":*", k) then - a:find("but").frozen = false + if a:find("but").onclick_l == "lua" and (string.find(k, left..":"..target..":"..mode) or string.find(k, left..":"..target..":")) then + a:find("img").texture = "grey_0.tga" + a:find("but").onclick_l = "lua" + a:find("but").alpha = 255 a:find("text").alpha = 255 else - a:find("but").frozen = true - a:find("text").alpha = 155 + a:find("img").texture = "r2ed_toolbar_lock_small.tga" + a:find("but").onclick_l = "" + a:find("but").alpha = 150 + a:find("text").alpha = 100 end end end @@ -325,11 +330,13 @@ function game:checkRpItemsPosition() local a = html:find("action"..v) if a then if string.find(sx..":"..sy, k) then - a:find("but").frozen = false + a:find("but").onclick_l = "lua" + a:find("img").texture = "grey_0.tga" a:find("text").alpha = 255 else - a:find("but").frozen = true - a:find("text").alpha = 155 + a:find("but").onclick_l = "proc" + a:find("img").texture = "r2ed_toolbar_lock_small.tga" + a:find("text").alpha = 200 end end end @@ -1290,4 +1297,4 @@ function arkNpcShop:Buy(id) end -- VERSION -- -RYZOM_INTERACTION_VERSION = 324 \ No newline at end of file +RYZOM_INTERACTION_VERSION = 324 From c10d9ae26098b7398e8dc55bfd0477141e3c457c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Wed, 12 Jul 2023 12:07:44 +0100 Subject: [PATCH 065/194] Update checkRpItemsPosition and getTeam --- .../mission_manager/missions_commands.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index 1ba303d344..6c3e959714 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -2003,8 +2003,13 @@ NLMISC_COMMAND(slide, "slide to the powo", "<uid> x y cell [z] [h]") } //---------------------------------------------------------------------------- -NLMISC_COMMAND(getPlayersInPowos, "get list of players in a powo", "") +NLMISC_COMMAND(getPlayersInPowos, "get list of players in a powo", "[onlyPowoId]") { + sint32 onlyPowoId = 0; + + if (args.size() >= 1) + fromString(args[0], onlyPowoId); + CPlayerManager::TMapPlayers::const_iterator itPlayer = PlayerManager.getPlayers().begin(); for (; itPlayer != PlayerManager.getPlayers().end(); ++itPlayer) @@ -2015,7 +2020,7 @@ NLMISC_COMMAND(getPlayersInPowos, "get list of players in a powo", "") if (player) { sint32 powo = player->getPowoCell(); - if (powo != 0) + if (powo != 0 && (onlyPowoId == 0 || powo == onlyPowoId)) log.displayNL("%d: %s", powo, player->getName().toString().c_str()); } } @@ -3433,6 +3438,9 @@ NLMISC_COMMAND(getTeam, "get the team of a player","<uid>") if (pTeam != NULL) { log.displayNL("%d", c->getTeamId()); + ucstring name = CEntityIdTranslator::getInstance()->getByEntity(pTeam->getLeader()); + CEntityIdTranslator::removeShardFromName(name); + log.displayNL("leader|%s", name.toUtf8().c_str()); for (list<CEntityId>::const_iterator it = pTeam->getTeamMembers().begin(); it != pTeam->getTeamMembers().end(); ++it) { ucstring name = CEntityIdTranslator::getInstance()->getByEntity((*it)); From b13d4bab5a9d64788e1aa2c0ab5335570f7a4407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Wed, 12 Jul 2023 12:08:28 +0100 Subject: [PATCH 066/194] Try fix Team members positions when somone leave --- .../team_manager/team.cpp | 114 +++++++++--------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/ryzom/server/src/entities_game_service/team_manager/team.cpp b/ryzom/server/src/entities_game_service/team_manager/team.cpp index 13b9a6fe91..52c1617d21 100644 --- a/ryzom/server/src/entities_game_service/team_manager/team.cpp +++ b/ryzom/server/src/entities_game_service/team_manager/team.cpp @@ -67,17 +67,17 @@ void CTeam::init( CCharacter* leader, uint16 teamId ) msgout.serial( idGroupe ); msgout.serialEnum( typeGroupe ); sendMessageViaMirror( "IOS", msgout ); - + // Add leader to chat group CMessage msgAdd("ADD_TO_GROUP"); msgAdd.serial( idGroupe ); msgAdd.serial( const_cast<CEntityId&> (leader->getId()) ); sendMessageViaMirror( "IOS", msgAdd ); - + // inform the new team leader PHRASE_UTILITIES::sendDynamicSystemMessage( leader->getEntityRowId(), "TEAM_CREATE"); //CCharacter::sendMessageToClient(_LeaderId,"OPS_CREATE_TEAM"); - + // update leader DB // leader->_PropertyDatabase.setProp( "USER:TEAM_MEMBER", 1 ); CBankAccessor_PLR::getUSER().setTEAM_MEMBER(leader->_PropertyDatabase, true); @@ -106,7 +106,7 @@ void CTeam::release() _RewardSharing->giveAllItems( TheDataset.getDataSetRow( *_TeamMembers.begin())); } delete _RewardSharing; - _RewardSharing = NULL; + _RewardSharing = NULL; } const uint size = (uint)_Missions.size(); for ( uint i = 0; i < size; i++ ) @@ -177,7 +177,7 @@ void CTeam::addCharacter(CCharacter *newCharacter) uint8 index = getSuccessorIndex(); CBankAccessor_PLR::getGROUP().setSUCCESSOR_INDEX(newCharacter->_PropertyDatabase, index); } - + // update all member's DB // char buffer[256]; uint position = (uint)_TeamMembers.size()-1; @@ -239,7 +239,7 @@ void CTeam::addCharacter(CCharacter *newCharacter) hp = (uint8) ( ( float(TeamMembersStatusMaxValue) * ( character->getPhysScores()._PhysicalScores[ SCORES::hit_points ].Current ) ) / ( character->getPhysScores()._PhysicalScores[ SCORES::hit_points ].Max ) ); else hp = 0; - + if ( character->getPhysScores()._PhysicalScores[ SCORES::sap ].Max != 0) sap = (uint8) ( ( float(TeamMembersStatusMaxValue) * ( character->getPhysScores()._PhysicalScores[ SCORES::sap ].Current ) ) / ( character->getPhysScores()._PhysicalScores[ SCORES::sap ].Max ) ); else @@ -257,7 +257,7 @@ void CTeam::addCharacter(CCharacter *newCharacter) // sprintf(buffer, "GROUP:%d:HP",i ); // newCharacter->_PropertyDatabase.setProp( buffer, hp ); newArrayItem.setHP(newCharacter->_PropertyDatabase, hp); - + // sprintf(buffer, "GROUP:%d:SAP",i ); // newCharacter->_PropertyDatabase.setProp( buffer, sap ); newArrayItem.setSAP(newCharacter->_PropertyDatabase, sap); @@ -287,7 +287,7 @@ void CTeam::addCharacter(CCharacter *newCharacter) // insert new member _TeamMembers.push_back( newCharacter->getId() ); ++_NbMembers; - + // set the character team newCharacter->setTeamId(_TeamId); @@ -300,7 +300,7 @@ void CTeam::addCharacter(CCharacter *newCharacter) msgout.serial( idGroupe ); msgout.serial( const_cast<CEntityId&> (newCharacter->getId()) ); sendMessageViaMirror( "IOS", msgout ); - + // send messages to members SM_STATIC_PARAMS_1(params, STRING_MANAGER::player); @@ -308,7 +308,7 @@ void CTeam::addCharacter(CCharacter *newCharacter) //CCharacter::sendMessageToClient(newCharacter->getId(),"OPS_JOIN_TEAM_E",_LeaderId); params[0].setEId( _LeaderId ); PHRASE_UTILITIES::sendDynamicSystemMessage(newCharacter->getEntityRowId(), "TEAM_YOU_JOIN", params); - + params[0].setEIdAIAlias( newCharacter->getId(), CAIAliasTranslator::getInstance()->getAIAlias( newCharacter->getId()) ); set<CEntityId> exclude; @@ -335,7 +335,7 @@ void CTeam::addCharacter(CCharacter *newCharacter) string msgName = "OPS_JOIN_TEAM_ACCEPT_E"; CMessage msggroup("STATIC_STRING"); msggroup.serial( groupId ); - + msggroup.serialCont( exclude); msggroup.serial( msgName ); msggroup.serial( const_cast<CEntityId&>(newCharacter->getId()) ); @@ -414,10 +414,10 @@ void CTeam::removeCharacter( CCharacter * player ) _Missions[0]->onFailure(true); count++; } - + // send a message to the last team member PHRASE_UTILITIES::sendDynamicSystemMessage(TheDataset.getDataSetRow(_TeamMembers.front()), "TEAM_DISOLVED"); - + // clear the player DB clearPlayerTeamDB( *_TeamMembers.begin() ); CCharacter * lastPlayer = PlayerManager.getOnlineChar( *_TeamMembers.begin() ); @@ -440,7 +440,7 @@ void CTeam::removeCharacter( CCharacter * player ) CMessage msgRemoveGroup("REMOVE_GROUP"); msgRemoveGroup.serial( idGroupe ); sendMessageViaMirror( "IOS", msgRemoveGroup ); - + // release the team release(); //remove the team from the manager @@ -491,11 +491,11 @@ void CTeam::removeCharacter( CCharacter * player ) for (std::list<NLMISC::CEntityId>::iterator it2 = _TeamMembers.begin() ; it2 != _TeamMembers.end() ; ++it2) { if ( (*it) == (*it2) ) - continue; + continue; CBankAccessor_PLR::TGROUP::TArray &groupItem = CBankAccessor_PLR::getGROUP().getArray(pos); - CCharacter * ch2 = PlayerManager.getOnlineChar( (*it2) ); + CCharacter * ch2 = PlayerManager.getOnlineChar( (*it2) ); if (ch2 != NULL) { // update new char for old char @@ -511,22 +511,22 @@ void CTeam::removeCharacter( CCharacter * player ) stamina = (uint8) ( ( float(TeamMembersStatusMaxValue) * ( ch2->getPhysScores()._PhysicalScores[ SCORES::stamina ].Current ) ) / ( ch2->getPhysScores()._PhysicalScores[ SCORES::stamina ].Max ) ); else stamina = 0; - + CMirrorPropValueRO<uint32> nameIndexValue( TheDataset, ch2->getId(), "NameIndex" ); nameId = nameIndexValue(); - + // sprintf(buffer, "GROUP:%d:HP",pos ); // ch1->_PropertyDatabase.setProp( buffer, hp ); groupItem.setHP(ch1->_PropertyDatabase, hp); - + // sprintf(buffer, "GROUP:%d:SAP",pos ); // ch1->_PropertyDatabase.setProp( buffer, sap ); groupItem.setSAP(ch1->_PropertyDatabase, sap); - + // sprintf(buffer, "GROUP:%d:STA",pos ); // ch1->_PropertyDatabase.setProp( buffer, stamina ); groupItem.setSTA(ch1->_PropertyDatabase, stamina); - + // sprintf(buffer, "GROUP:%d:NAME",pos ); // ch1->_PropertyDatabase.setProp( buffer, nameId ); groupItem.setNAME(ch1->_PropertyDatabase, nameId); @@ -534,7 +534,7 @@ void CTeam::removeCharacter( CCharacter * player ) // sprintf(buffer, "GROUP:%d:UID",pos ); // ch1->_PropertyDatabase.setProp( buffer, ch2->getEntityRowId().getCompressedIndex() ); groupItem.setUID(ch1->_PropertyDatabase, ch2->getEntityRowId().getCompressedIndex()); - + // sprintf(buffer, "GROUP:%d:PRESENT",pos ); // ch1->_PropertyDatabase.setProp( buffer, (uint8)1 ); groupItem.setPRESENT(ch1->_PropertyDatabase, true); @@ -560,12 +560,12 @@ void CTeam::removeCharacter( CCharacter * player ) _RewardSharing->resetCandidates(this); // update positions - updateMembersPositions(); + updateMembersPositions(true); // remove character from chat group - TGroupId idGroupe = CHAT_GROUPS_IDS::getTeamChatGroupId(_TeamId); + TGroupId idGroup = CHAT_GROUPS_IDS::getTeamChatGroupId(_TeamId); CMessage msgRemoveGroup("REMOVE_FROM_GROUP"); - msgRemoveGroup.serial( idGroupe ); + msgRemoveGroup.serial( idGroup ); msgRemoveGroup.serial( const_cast<CEntityId&> ( charId ) ); sendMessageViaMirror( "IOS", msgRemoveGroup ); @@ -596,7 +596,7 @@ void CTeam::setLeague(const string &leagueName) // set historic size of the newly created channel DynChatEGS.setHistoricSize(_LeagueId, 100); } - + updateLeague(); } @@ -634,12 +634,12 @@ void CTeam::setLeader(CEntityId id, bool bMessage) _TeamMembers.insert(_TeamMembers.begin(), _LeaderId); // inform the new leader - SM_STATIC_PARAMS_1(params1, STRING_MANAGER::player); + SM_STATIC_PARAMS_1(params1, STRING_MANAGER::player); params1[0].setEId( id ); PHRASE_UTILITIES::sendDynamicSystemMessage(TheDataset.getDataSetRow(_LeaderId), "TEAM_YOU_NEW_LEADER", params1); - // inform the group - SM_STATIC_PARAMS_2(params, STRING_MANAGER::player, STRING_MANAGER::player); + // inform the group + SM_STATIC_PARAMS_2(params, STRING_MANAGER::player, STRING_MANAGER::player); params[0].setEId( id ); params[1].setEId( _LeaderId ); @@ -743,7 +743,7 @@ void CTeam::setSuccessor( uint8 memberIdx, bool bMessage) //--------------------------------------------------- sint16 CTeam::findCharacterPosition( const NLMISC::CEntityId &charId ) const { - + list<CEntityId>::const_iterator it = _TeamMembers.begin(); sint16 i = 0; for (; it != _TeamMembers.end(); ++it) @@ -777,12 +777,12 @@ void CTeam::updateCharacterScore(const CCharacter *player, SCORES::TScores score { if ( (*it) == player->getId()) continue; - + if ( charPosition > i ) position = charPosition - 1 ; else position = charPosition; - + character = PlayerManager.getOnlineChar( (*it) ); if (character != NULL) { @@ -807,9 +807,9 @@ void CTeam::updateCharacterScore(const CCharacter *player, SCORES::TScores score { nlwarning("<CTeam::updateCharacterScore> Unknown character %s", player->getId().toString().c_str() ); } - + ++i; - } + } } } // updateCharacterScore // @@ -829,9 +829,9 @@ void CTeam::clearPlayerTeamDB( const NLMISC::CEntityId &charId ) CBankAccessor_PLR::getUSER().setTEAM_MEMBER(character->_PropertyDatabase, 0); // character->_PropertyDatabase.setProp( "USER:TEAM_LEADER", 0 ); CBankAccessor_PLR::getUSER().setTEAM_LEADER(character->_PropertyDatabase, 0); - + for (uint8 i = 0; i < CTEAM::TeamMaxNbMembers - (uint8)1 ; ++i) - { + { CBankAccessor_PLR::TGROUP::TArray &groupItem = CBankAccessor_PLR::getGROUP().getArray(i); // sprintf(buffer, "GROUP:%d:PRESENT",i ); // character->_PropertyDatabase.setProp( buffer, (uint8)0 ); @@ -935,7 +935,7 @@ bool CTeam::processTeamMissionStepEvent(std::list< CMissionEvent* > & eventList, return false; else if ( result == CMissionEvent::MissionFailed ) return true; - + CMissionTemplate * templ = CMissionManager::getInstance()->getTemplate( mission->getTemplateId() ); nlassert( templ ); if ( result == CMissionEvent::MissionEnds ) @@ -955,7 +955,7 @@ bool CTeam::processTeamMissionStepEvent(std::list< CMissionEvent* > & eventList, CMissionManager::getInstance()->missionDoneOnce(templ); mission->stopChildren(); - + // only remove no list missions, other must be manually removed by user if ( templ->Tags.NoList || mission->isChained() || templ->Tags.AutoRemove ) { @@ -1003,7 +1003,7 @@ void CTeam::rewardSharing(CRewardSharing * reward) CMessage msgout ("IMPULSION_ID"); msgout.serial ((CEntityId&)(*it)); CBitMemStream bms; - + if (!GenericMsgManager.pushNameToStream ("TEAM:SHARE_OPEN", bms)) nlstopex (("Missing TEAM:SHARE_OPEN in msg.xml")); msgout.serialBufferWithSize ((uint8*)bms.buffer(), bms.length()); @@ -1018,7 +1018,7 @@ void CTeam::rewardSharing(CRewardSharing * reward) struct TUpdatedMemberPosition { sint64 Pos; - + TUpdatedMemberPosition(sint32 x, sint32 y) { Pos = (sint64(x)<<32) + y; } }; @@ -1044,15 +1044,15 @@ void CTeam::updateMembersPositions(bool forceUpdate) nlwarning("<CTeam::updateCharacterScore> Unknown character %s", (*it).toString().c_str() ); continue; } - + const sint32 lastX = (sint32)(character->getLastPosXInDB() * 0.001f); const sint32 lastY = (sint32)(character->getLastPosYInDB() * 0.001f); - + const sint32 posX = (sint32)(character->getX() * 0.001f); const sint32 posY = (sint32)(character->getY() * 0.001f); - + const sint32 member1Delta = (sint32)CVector2d(posX - lastX, posY - lastY).sqrnorm(); - + sint16 j = i; list<CEntityId>::const_iterator it2 = it; ++it2; @@ -1064,26 +1064,26 @@ void CTeam::updateMembersPositions(bool forceUpdate) nlwarning("<CTeam::updateCharacterScore> Unknown character %s", (*it2).toString().c_str() ); continue; } - + const sint32 lastXMember2 = (sint32)(member2->getLastPosXInDB() * 0.001f); const sint32 lastYMember2 = (sint32)(member2->getLastPosYInDB() * 0.001f); - + const sint32 posXMember2 = (sint32)(member2->getX() * 0.001f); const sint32 posYMember2 = (sint32)(member2->getY() * 0.001f); - + // get distance between the two players const sint32 dist = (sint32)CVector2d(posXMember2 - posX, posYMember2 - posY).sqrnorm(); // distance between new and old pos for player 2 const sint32 member2Delta = (sint32)CVector2d(posXMember2 - lastXMember2, posYMember2 - lastYMember2).sqrnorm(); - + // update first player DB if member2Delta is important enough - if ( ( ( member2Delta<<5 > dist || member2Delta > (80*80) ) && dist > 1 ) || forceUpdate) + if ( ( ( member2Delta<<5 > dist || member2Delta > (80*80) ) && dist > 1 ) || forceUpdate) { UpdatedMemberPos.insert( make_pair( member2->getId(), TUpdatedMemberPosition(member2->getX(), member2->getY()))); member2->setLastPosXInDB(member2->getX()); member2->setLastPosYInDB(member2->getY()); } - + // update member2 DB is member1Delta is important enough if ( ( ( member1Delta<<5 > dist || member1Delta > (80*80) ) && dist > 1 ) || forceUpdate ) { @@ -1094,7 +1094,7 @@ void CTeam::updateMembersPositions(bool forceUpdate) ++j; } ++i; - } + } i=0; for (list<CEntityId>::const_iterator it = _TeamMembers.begin() ; it != itEnd ; ++it) @@ -1137,7 +1137,7 @@ void CTeam::updateMembersPositions(bool forceUpdate) ++j; } ++i; - } + } } // updateCharacterScore // CMissionTeam* CTeam::getMissionByAlias( TAIAlias missionAlias ) @@ -1165,7 +1165,7 @@ void CTeam::updateMembersDb() { CBankAccessor_PLR::getGROUP().setLEADER_INDEX(ch1->_PropertyDatabase, 0xf); } - else + else { CBankAccessor_PLR::getGROUP().setLEADER_INDEX(ch1->_PropertyDatabase, 0); } @@ -1175,11 +1175,11 @@ void CTeam::updateMembersDb() for (std::list<NLMISC::CEntityId>::iterator it2 = _TeamMembers.begin() ; it2 != _TeamMembers.end() ; ++it2) { if ( (*it) == (*it2) ) - continue; + continue; CBankAccessor_PLR::TGROUP::TArray &groupItem = CBankAccessor_PLR::getGROUP().getArray(pos); - CCharacter * ch2 = PlayerManager.getOnlineChar( (*it2) ); + CCharacter * ch2 = PlayerManager.getOnlineChar( (*it2) ); if (ch2 != NULL) { // update new char for old char @@ -1195,10 +1195,10 @@ void CTeam::updateMembersDb() stamina = (uint8) ( ( float(TeamMembersStatusMaxValue) * ( ch2->getPhysScores()._PhysicalScores[ SCORES::stamina ].Current ) ) / ( ch2->getPhysScores()._PhysicalScores[ SCORES::stamina ].Max ) ); else stamina = 0; - + CMirrorPropValueRO<uint32> nameIndexValue( TheDataset, ch2->getId(), "NameIndex" ); nameId = nameIndexValue(); - + groupItem.setHP(ch1->_PropertyDatabase, hp); groupItem.setSAP(ch1->_PropertyDatabase, sap); groupItem.setSTA(ch1->_PropertyDatabase, stamina); From 668cfb4772446ccf09a74bd79efb2654faae7be1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Wed, 12 Jul 2023 12:09:21 +0100 Subject: [PATCH 067/194] Fix "no remove aqua speed" bug when player leaves the water --- .../src/entities_game_service/player_manager/character.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index aab3eb6696..e1a924919d 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -23755,11 +23755,16 @@ void CCharacter::incAggroCount() bool CCharacter::isInWater() const { - if (!_PlayerIsInWater && (_ActionFlags.getValue() & RYZOMACTIONFLAGS::InWater)) + nlinfo("check is in water = %d", (_EntityState.Z.getValue() & 4)); + if (!_PlayerIsInWater && (((_EntityState.Z.getValue() & 4) != 0) || (_ActionFlags.getValue() & RYZOMACTIONFLAGS::InWater))) { entersWater(); _PlayerIsInWater = true; } + else if (_PlayerIsInWater && (_EntityState.Z.getValue() & 4) == 0) + { + _PlayerIsInWater = false; + } return (_PlayerIsInWater || (_ActionFlags.getValue() & RYZOMACTIONFLAGS::InWater)); } From 8a4a0b3113726f6163fe42770b67dfafef193a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Wed, 12 Jul 2023 12:12:02 +0100 Subject: [PATCH 068/194] Fix deactivated guild roles options when player name take time to come --- ryzom/client/src/interface_v3/guild_manager.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/ryzom/client/src/interface_v3/guild_manager.cpp b/ryzom/client/src/interface_v3/guild_manager.cpp index 83dbbdeeaa..af01f6c276 100644 --- a/ryzom/client/src/interface_v3/guild_manager.cpp +++ b/ryzom/client/src/interface_v3/guild_manager.cpp @@ -352,6 +352,7 @@ void CGuildManager::update() // *** Need to update Names? if (_NeedUpdate) { + _NeedUpdate = false; bool bAllValid = true; // Update wait until all the name of members, name of the guild and description are valid @@ -420,6 +421,9 @@ void CGuildManager::update() uint i; _Grade = EGSPD::CGuildGrade::Member; string sUserName = toLower(UserEntity->getEntityName()); + if (sUserName.empty()) + _NeedUpdate = true; + for (i = 0; i < _GuildMembers.size(); ++i) { if (toLower(_GuildMembers[i].Name) == sUserName) @@ -453,7 +457,6 @@ void CGuildManager::update() } // guild updated - _NeedUpdate = false; _NeedUpdateMembers= false; } } @@ -876,7 +879,7 @@ class CAHGuildSheetOpen : public IActionHandler break; } } - + CCtrlBase *inviteButton = pLine->getCtrl("invite_button"); if (inviteButton != NULL) inviteButton->setActive(rGuildMembers[i].Online != ccs_offline && rGuildMembers[i].Name != UserEntity->getEntityName()); @@ -900,12 +903,12 @@ class CAHGuildSheetOpen : public IActionHandler pLine->setParent (pParent); pParent->addChild (pLine); } - + // update member online count view CViewText *pOnlineMember = dynamic_cast<CViewText*>(CWidgetManager::getInstance()->getElementFromId(VIEW_TEXT_GUILD_MEMBER_COUNT_ONLINE)); if (pOnlineMember) pOnlineMember->setText(toString(member_online)); - + } } }; @@ -1094,7 +1097,7 @@ class CAHGuildSheetTellMember : public IActionHandler MemberIndexSelected= nLineNb; MemberNameSelected = rGuildMembers[nLineNb].Name; - CPeopleInterraction::displayTellInMainChat(MemberNameSelected); + CPeopleInterraction::displayTellInMainChat(MemberNameSelected); } // Current selection @@ -1118,7 +1121,7 @@ class CAHGuildSheetSetLeader : public IActionHandler } }; REGISTER_ACTION_HANDLER (CAHGuildSheetSetLeader, "guild_member_chg_to_leader"); - + // *************************************************************************** class CAHGuildSheetSetLeaderConfirm : public IActionHandler { From a45d790e0f5c7468ec61aabef833888f49b02d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Thu, 13 Jul 2023 15:27:12 +0100 Subject: [PATCH 069/194] Fixes and add getPlayerPosition --- .../mission_manager/missions_commands.cpp | 31 +++++++++++++++++++ .../player_manager/character.cpp | 1 - 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index 6c3e959714..c2827f029e 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -668,6 +668,10 @@ NLMISC_COMMAND(spawnItem, "Spawn a new Item", "<uid> <inv> <quantity(0=force)> < item->recommended(recommended); } + const CStaticItem* form = CSheets::getForm(sheet); + if (form != NULL && form->Family == ITEMFAMILY::ITEM_SAP_RECHARGE) + item->setSapLoad(quality); + log.displayNL("OK"); return true; } @@ -703,6 +707,13 @@ NLMISC_COMMAND(spawnItem, "Spawn a new Item", "<uid> <inv> <quantity(0=force)> < finalItem->recommended(recommended); } + const CStaticItem* form = finalItem->getStaticForm(); + + if (form != NULL) { + if (form->Family == ITEMFAMILY::ITEM_SAP_RECHARGE) + finalItem->setSapLoad(finalItem->quality()); + } + if (c->addItemToInventory(getTInventory(selected_inv), finalItem)) { log.displayNL("OK"); @@ -1312,6 +1323,26 @@ NLMISC_COMMAND(getPosition, "get position of entity", "<uid>") } +//---------------------------------------------------------------------------- +NLMISC_COMMAND(getPlayerPosition, "get position of an user", "<player name>") +{ + if (args.size() != 1) + return false; + + CCharacter * player = PlayerManager.getCharacterByName(args[0]); + if (!player || !TheDataset.isAccessible(player->getEntityRowId())) + { + log.displayNL("ERR: user not found"); + return true; + } + + log.displayNL("%s", player->getPositionInfos().c_str()); + return true; +} + + + + //---------------------------------------------------------------------------- // DEPRECATED use getTarget who send also position NLMISC_COMMAND(getTargetPosition, "get position of entity", "<uid>") diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index e1a924919d..66893d05ec 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -23755,7 +23755,6 @@ void CCharacter::incAggroCount() bool CCharacter::isInWater() const { - nlinfo("check is in water = %d", (_EntityState.Z.getValue() & 4)); if (!_PlayerIsInWater && (((_EntityState.Z.getValue() & 4) != 0) || (_ActionFlags.getValue() & RYZOMACTIONFLAGS::InWater))) { entersWater(); From 4a67a2bcbfebd3df8f1a246160d50a1740da626a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Sat, 15 Jul 2023 16:08:05 +0100 Subject: [PATCH 070/194] Don't udpate LastOverSpeedTick when using aqua_speed --- .../src/entities_game_service/player_manager/character.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index 66893d05ec..76fae01529 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -2781,13 +2781,17 @@ void CCharacter::applyRegenAndClipCurrentValue() _PhysScores.SpeedVariationModifier += _LastAppliedWeightMalus; sint16 speedVariationModifier = std::max((sint)_PhysScores.SpeedVariationModifier, (sint) - 100); CSheetId aqua_speed("aqua_speed.sbrick"); + bool usingAquaSpeed = false; if (isInWater() && getMode() != MBEHAV::MOUNT_NORMAL && (haveBrick(aqua_speed) || _CurrentSpeedSwimBonus > 0)) { setBonusMalusName("aqua_speed", addEffectInDB(aqua_speed, true)); if (_CurrentSpeedSwimBonus > 0) speedVariationModifier = std::min(speedVariationModifier + (sint16)_CurrentSpeedSwimBonus, 100); else + { + usingAquaSpeed = true; speedVariationModifier = std::min(speedVariationModifier + 33, 100); + } } else { @@ -2822,7 +2826,7 @@ void CCharacter::applyRegenAndClipCurrentValue() CBankAccessor_PLR::getUSER().setSPEED_FACTOR( _PropertyDatabase, checkedCast<uint8>(speedVariationModifier + 100.0f)); - if (speedVariationModifier > 0) + if (speedVariationModifier > 0 && !usingAquaSpeed) { _LastOverSpeedTick = CTickEventHandler::getGameCycle(); } From 06b65fa34c1760b65a46581d65aa80dba22c9bc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Sat, 15 Jul 2023 16:12:02 +0100 Subject: [PATCH 071/194] Don't udpate LastOverSpeedTick when using aqua_speed --- .../src/entities_game_service/player_manager/character.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index 76fae01529..3fbc4a4e48 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -2826,7 +2826,7 @@ void CCharacter::applyRegenAndClipCurrentValue() CBankAccessor_PLR::getUSER().setSPEED_FACTOR( _PropertyDatabase, checkedCast<uint8>(speedVariationModifier + 100.0f)); - if (speedVariationModifier > 0 && !usingAquaSpeed) + if (speedVariationModifier > 0 && (!usingAquaSpeed || speedVariationModifier - 33 > 0) { _LastOverSpeedTick = CTickEventHandler::getGameCycle(); } From 1f538d9c61f1d6b41273208def91866dd90efff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Sat, 15 Jul 2023 16:12:02 +0100 Subject: [PATCH 072/194] Don't udpate LastOverSpeedTick when using aqua_speed --- .../src/entities_game_service/player_manager/character.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index 76fae01529..3fbc4a4e48 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -2826,7 +2826,7 @@ void CCharacter::applyRegenAndClipCurrentValue() CBankAccessor_PLR::getUSER().setSPEED_FACTOR( _PropertyDatabase, checkedCast<uint8>(speedVariationModifier + 100.0f)); - if (speedVariationModifier > 0 && !usingAquaSpeed) + if (speedVariationModifier > 0 && (!usingAquaSpeed || speedVariationModifier - 33 > 0) { _LastOverSpeedTick = CTickEventHandler::getGameCycle(); } From 731ab8d583df3e77d256d0668399044e9f34e408 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Sun, 23 Jul 2023 10:24:35 +0000 Subject: [PATCH 073/194] Fixed: Don't udpate LastOverSpeedTick when using aqua_speed --- .../src/entities_game_service/player_manager/character.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index 3fbc4a4e48..7b2874cca3 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -2826,7 +2826,7 @@ void CCharacter::applyRegenAndClipCurrentValue() CBankAccessor_PLR::getUSER().setSPEED_FACTOR( _PropertyDatabase, checkedCast<uint8>(speedVariationModifier + 100.0f)); - if (speedVariationModifier > 0 && (!usingAquaSpeed || speedVariationModifier - 33 > 0) + if (speedVariationModifier > 0 && (!usingAquaSpeed || speedVariationModifier - 33 > 0)) { _LastOverSpeedTick = CTickEventHandler::getGameCycle(); } From 0b27439120744c357377a0dff19c7fa0703d59c5 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Sun, 23 Jul 2023 10:24:35 +0000 Subject: [PATCH 074/194] Fixed: Don't udpate LastOverSpeedTick when using aqua_speed --- .../src/entities_game_service/player_manager/character.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index 3fbc4a4e48..7b2874cca3 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -2826,7 +2826,7 @@ void CCharacter::applyRegenAndClipCurrentValue() CBankAccessor_PLR::getUSER().setSPEED_FACTOR( _PropertyDatabase, checkedCast<uint8>(speedVariationModifier + 100.0f)); - if (speedVariationModifier > 0 && (!usingAquaSpeed || speedVariationModifier - 33 > 0) + if (speedVariationModifier > 0 && (!usingAquaSpeed || speedVariationModifier - 33 > 0)) { _LastOverSpeedTick = CTickEventHandler::getGameCycle(); } From 5f2b4f90fc4d017c03f0c3e267fec86f8580c081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Tue, 1 Aug 2023 14:58:05 +0100 Subject: [PATCH 075/194] Remove guild fame requirement to buy a GH --- .../guild_high_officer_module.cpp | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild_high_officer_module.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild_high_officer_module.cpp index a9955d7ada..ffa769ebfa 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild_high_officer_module.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild_high_officer_module.cpp @@ -68,10 +68,10 @@ void CGuildHighOfficerModule::buyGuildOption( const CStaticItem * form ) if ( proxy.getMoney() < form->GuildOption->MoneyCost ) return; - + // if ( guild->getXP() < form->GuildOption->XpCost ) // return; - + if ( form->GuildOption->Type == GUILD_OPTION::GuildMainBuilding ) { CCreature * bot = proxy.getInterlocutor(); @@ -79,15 +79,15 @@ void CGuildHighOfficerModule::buyGuildOption( const CStaticItem * form ) { nlwarning("<BUILDING> char %s bot %s is invalid",proxy.getId().toString().c_str(), proxy.getInterlocutor()->getId().toString().c_str() ); return; - } + } if ( bot->getGuildBuilding() == NULL ) { nlwarning("<BUILDING> char %s bot %s has no building",proxy.getId().toString().c_str(), proxy.getInterlocutor()->getId().toString().c_str() ); return; - } - - sint32 fame = CFameInterface::getInstance().getFameIndexed( guild->getEId(), bot->getForm()->getFaction()); + } + + /*sint32 fame = CFameInterface::getInstance().getFameIndexed( guild->getEId(), bot->getForm()->getFaction()); if ( fame < MinFameToBuyGuildBuilding ) { SM_STATIC_PARAMS_2(params,STRING_MANAGER::integer,STRING_MANAGER::race); @@ -95,19 +95,19 @@ void CGuildHighOfficerModule::buyGuildOption( const CStaticItem * form ) params[1].Enum = bot->getRace(); proxy.sendSystemMessage( "GUILD_BUILDING_BAD_FAME", params); return; - } + }*/ guild->setBuilding( bot->getGuildBuilding()->getAlias() ); } // else if ( guild->getBuilding() != 0 ) -// { +// { // EGSPD::CSPType::TSPType type = GUILD_OPTION::toSPType( form->GuildOption->Type); // if ( type == EGSPD::CSPType::EndSPType ) // { // nlwarning("<BUILDING> char %s, sheet %s invalid sp type",proxy.getId().toString().c_str(),form->SheetId.toString().c_str() ); // return; // } -// +// // if ( guild->hasRoleMaster( type ) ) // { // proxy.sendSystemMessage( "GUILD_RM_ALREADY_BOUGHT" ); @@ -133,7 +133,7 @@ void CGuildHighOfficerModule::buyOutpostBuilding(NLMISC::CSheetId sid) CGuildCharProxy proxy; getProxy(proxy); - CGuild *pGuild = MODULE_CAST<CGuild*>(_GuildMemberCore->getGuild()); + CGuild *pGuild = MODULE_CAST<CGuild*>(_GuildMemberCore->getGuild()); MODULE_AST(pGuild); // This is an outpost building trade here @@ -225,7 +225,7 @@ COutpost::TChallengeOutpostErrors CGuildHighOfficerModule::challengeOutpost(NLMI proxy.sendSystemMessage( "NEED_MORE_GUILD_MONEY" ); return COutpost::NotEnoughMoney; } - + if (outpost->getAttackerGuild()!=0) { if (!simulate) @@ -242,9 +242,9 @@ COutpost::TChallengeOutpostErrors CGuildHighOfficerModule::challengeOutpost(NLMI ); return COutpost::AlreadyOwned; } - + COutpost::TChallengeOutpostErrors ret = outpost->challengeOutpost(guild, simulate); - + if (!simulate && ret == COutpost::NoError) { uint32 remainingAmountToPay = outpost->getChallengeCost(); @@ -269,7 +269,7 @@ COutpost::TChallengeOutpostErrors CGuildHighOfficerModule::challengeOutpost(NLMI nlassert(remainingAmountToPay == 0); } - + return ret; } @@ -310,10 +310,10 @@ void CGuildHighOfficerModule::outpostSetSquad(NLMISC::CSheetId outpostSheet, uin { CGuildCharProxy proxy; getProxy(proxy); - + CGuild * guild = MODULE_CAST<CGuild*>(_GuildMemberCore->getGuild()); MODULE_AST(guild); - + NLMISC::CSmartPtr<COutpost> outpost = COutpostManager::getInstance().getOutpostFromSheet(outpostSheet); if (outpost == NULL) return; @@ -356,10 +356,10 @@ void CGuildHighOfficerModule::outpostSetSquadSpawnZone(NLMISC::CSheetId outpostS { CGuildCharProxy proxy; getProxy(proxy); - + CGuild * guild = MODULE_CAST<CGuild*>(_GuildMemberCore->getGuild()); MODULE_AST(guild); - + NLMISC::CSmartPtr<COutpost> outpost = COutpostManager::getInstance().getOutpostFromSheet(outpostSheet); if (outpost == NULL) return; @@ -402,10 +402,10 @@ void CGuildHighOfficerModule::outpostInsertSquad(NLMISC::CSheetId outpostSheet, { CGuildCharProxy proxy; getProxy(proxy); - + CGuild * guild = MODULE_CAST<CGuild*>(_GuildMemberCore->getGuild()); MODULE_AST(guild); - + NLMISC::CSmartPtr<COutpost> outpost = COutpostManager::getInstance().getOutpostFromSheet(outpostSheet); if (outpost == NULL) return; @@ -447,10 +447,10 @@ void CGuildHighOfficerModule::outpostRemoveSquad(NLMISC::CSheetId outpostSheet, { CGuildCharProxy proxy; getProxy(proxy); - + CGuild * guild = MODULE_CAST<CGuild*>(_GuildMemberCore->getGuild()); MODULE_AST(guild); - + NLMISC::CSmartPtr<COutpost> outpost = COutpostManager::getInstance().getOutpostFromSheet(outpostSheet); if (outpost == NULL) return; @@ -492,10 +492,10 @@ void CGuildHighOfficerModule::outpostSetExpenseLimit(NLMISC::CSheetId outpostShe { CGuildCharProxy proxy; getProxy(proxy); - + CGuild * guild = MODULE_CAST<CGuild*>(_GuildMemberCore->getGuild()); MODULE_AST(guild); - + NLMISC::CSmartPtr<COutpost> outpost = COutpostManager::getInstance().getOutpostFromSheet(outpostSheet); if (outpost == NULL) return; @@ -537,14 +537,14 @@ void CGuildHighOfficerModule::outpostSetDefensePeriod(NLMISC::CSheetId outpostSh { CGuildCharProxy proxy; getProxy(proxy); - + CGuild * guild = MODULE_CAST<CGuild*>(_GuildMemberCore->getGuild()); MODULE_AST(guild); - + NLMISC::CSmartPtr<COutpost> outpost = COutpostManager::getInstance().getOutpostFromSheet(outpostSheet); if (outpost == NULL) return; - + if (proxy.getGuildId() != outpost->getOwnerGuild()) { nlwarning("Player %s is not allowed to edit the outpost '%s'", @@ -553,11 +553,11 @@ void CGuildHighOfficerModule::outpostSetDefensePeriod(NLMISC::CSheetId outpostSh ); return; } - + // check editing concurrency if (!outpost->submitEditingAccess(OUTPOSTENUMS::OutpostOwner, proxy.getId(), COutpost::EditDefenseHour)) return; - + outpost->timeSetDefenseHour(hour); } From 9eeeebddb6456e4c382a25d40629a82d9769822d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Tue, 1 Aug 2023 14:58:13 +0100 Subject: [PATCH 076/194] Fix crash --- .../entities_game_service/mission_manager/missions_commands.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index c2827f029e..ccee08a9b0 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -3642,7 +3642,7 @@ NLMISC_COMMAND(addPlayerPet, "add a pet to player", "<uid> <sheetid> [size] [nam fromString(args[2], size); ucstring customName; - if (args.size() >= 3) + if (args.size() > 3) customName.fromUtf8(args[3]); string clientSheet; From 4d18ebc6d6d4d582e1c5c04408332f3215f48a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Wed, 30 Aug 2023 17:09:36 +0100 Subject: [PATCH 077/194] Redefine HALF_FREQUENCY_SENDING_TO_CLIENT (better) --- ryzom/common/src/game_share/entity_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/common/src/game_share/entity_types.h b/ryzom/common/src/game_share/entity_types.h index cd38a514c0..7645c28a99 100644 --- a/ryzom/common/src/game_share/entity_types.h +++ b/ryzom/common/src/game_share/entity_types.h @@ -44,7 +44,7 @@ namespace CLFECOMMON { * Defined -> one send every two cycles (usually 5 Hz). * Don't forget to adjust the variable ClientBandwidth in frontend_service.cfg. */ -#undef HALF_FREQUENCY_SENDING_TO_CLIENT +#define HALF_FREQUENCY_SENDING_TO_CLIENT /* From 18e85895bd4dcd8c96f31454adfad75e7a926a4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Wed, 30 Aug 2023 17:17:05 +0100 Subject: [PATCH 078/194] Fix rumors and remove infos --- .../data/gamedev/interfaces_v3/game_context_menu.xml | 6 +++--- .../client/data/gamedev/interfaces_v3/interaction.xml | 2 +- .../data/gamedev/interfaces_v3/webig_widgets.xml | 4 ++-- ryzom/client/src/game_context_menu.cpp | 11 ++++++----- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/game_context_menu.xml b/ryzom/client/data/gamedev/interfaces_v3/game_context_menu.xml index 834714f313..49e0d60098 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/game_context_menu.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/game_context_menu.xml @@ -74,8 +74,6 @@ <!-- interaction --> <action id="talk" name="uimGcmTalk" handler="context_talk" params="" icon="r2_mini_activity_empty_chat.tga" /> - <action id="news" name="uimGcmChat" handler="lua" params="game:TalkWithNpc(0)" icon="radar_mission3_16.tga" /> - <action id="news_aggressive" name="uimGcmBullying" handler="lua" params="game:TalkWithNpc(1)" icon="bullying.tga" /> <action id="attack" name="uimGcmAttack" handler="context_attack" params="" icon="ico_blade.tga" /> @@ -89,7 +87,9 @@ <action id="disengage" name="uimGcmDisengage" handler="context_disengage" params="" icon="ico_disarm.tga" /> <separator/> - <action id="info" name="uimGcmInfo" handler="open_title_help" params="from=target" icon="spe_status.tga" /> + <!-- <action id="info" name="uimGcmInfo" handler="open_title_help" params="from=target" icon="spe_status.tga" /> --> + <action id="news" name="uimGcmChat" handler="lua" params="game:TalkWithNpc(0)" icon="radar_mission3_16.tga" /> + <action id="news_aggressive" name="uimGcmBullying" handler="lua" params="game:TalkWithNpc(1)" icon="bullying.tga" /> <separator/> <!-- friendly --> diff --git a/ryzom/client/data/gamedev/interfaces_v3/interaction.xml b/ryzom/client/data/gamedev/interfaces_v3/interaction.xml index ab219f874f..98a5ba4b0b 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/interaction.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/interaction.xml @@ -16,7 +16,7 @@ <variable entry="UI:VARIABLES:USER:TRACK_TARGET_PVP_CHANGE_MODE" type="sint32" value="0" /> - <variable entry="UI:SAVE:ENABLE_RUMORS" + <variable entry="UI:SAVE:DISABLE_RUMORS" type="bool" value="0" /> <!-- The Target selected --> diff --git a/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml index 418faade26..e7256c2b3f 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml @@ -204,7 +204,7 @@ </template> <!-- //////////// TEMPLATE : webig_inv_item /////////// --> - <template name="webig_inv_item" line_maxw="40" ql0="" ql1="" ql2="" q0="" q1="" q2="" q3="" q4="" q5="" q6="" q7="" o0="" o1="" o2="" o3="" o4="" o5="" o6="" o7="" render_layer1="1" render_layer2="2" render_layer3="3" render_layer4="4" w="43" keep="true" img1="token_basic.tga" img2="" img3="" img4="" tooltip="" quality="" quantity="" overlay="" text="" text2="" color="255 255 255 255" gc1="true" gc2="true" color2="255 255 255 255" slotbg="w_slot_item.tga" slotbg_gc="true" bg="blank2.tga" tx_normal="blank.tga" tx_pushed="blank.tga" tx_over="blank.tga" ctrl_color="0 0 0 0" col_over="255 255 255 50" col_pushed="255 255 255 0" params_over="" params_l="" params_r="" x="0" y="0"> + <template name="webig_inv_item" line_maxw="40" ql0="" ql1="" ql2="" ql3="" q0="" q1="" q2="" q3="" q4="" q5="" q6="" q7="" o0="" o1="" o2="" o3="" o4="" o5="" o6="" o7="" render_layer1="1" render_layer2="2" render_layer3="3" render_layer4="4" w="43" keep="true" img1="token_basic.tga" img2="" img3="" img4="" tooltip="" quality="" quantity="" overlay="" text="" text2="" color="255 255 255 255" gc1="true" gc2="true" color2="255 255 255 255" slotbg="w_slot_item.tga" slotbg_gc="true" bg="blank2.tga" tx_normal="blank.tga" tx_pushed="blank.tga" tx_over="blank.tga" ctrl_color="0 0 0 0" col_over="255 255 255 50" col_pushed="255 255 255 0" params_over="" params_l="" params_r="" x="0" y="0"> <group id="#id" posref="MM MM" w="#w" h="43" x="#x" y="#y" sizeref="" render_layer="#render_layer1"> <view type="bitmap" id="back" posref="ML ML" x="3" y="0" h="42" w="42" scale="true" render_layer="#render_layer1" texture="#slotbg" color="255 255 255 255" global_color="#slotbg_gc" /> <view type="bitmap" id="bg" posparent="back" posref="MM MM" x="" y="0" w="40" h="40" render_layer="#render_layer2" scale="false" texture="#bg" global_color="false" /> @@ -215,7 +215,7 @@ <instance id="over" template="typo_ryzom" posref="TL TL" render_layer="6" x="4" y="-2" t0="#o0" t1="#o1" t2="#o2" t3="#o3" t4="#o4" t5="#o5" t6="#o6" t7="#o7" /> <instance id="quantity" template="typo_ryzom" posref="BL BL" typo="numbers" render_layer="5" posparent="" x="5" y="1" t0="#q0" t1="#q1" t2="#q2" t3="#q3" t4="#q4" t5="#q5" t6="#q6" t7="#q7" /> - <instance id="quality" template="typo_ryzom" posref="BL BL" typo="numbers" render_layer="5" posparent="back" x="24" y="1" t0="#ql0" t1="#ql1" t2="#ql2" gc="true"/> + <instance id="quality" template="typo_ryzom" posref="BL BL" typo="numbers" render_layer="5" posparent="back" x="24" y="1" t0="#ql0" t1="#ql1" t2="#ql2" t3="#ql3" gc="true"/> <view type="bitmap" id="numbers_back" posparent="" posref="BL BL" render_layer="4" x="3" y="0" h="10" w="42" scale="true" texture="blank.tga" color="0 0 0 150" global_color="false" /> <view type="text" id="text1" multi_line="true" line_maxw="#line_maxw" multi_line_maxw_only="true" posref="TR TL" posparent="back" x="3" y="1" fontsize="8" hardtext_format="#text" color="#color1" shadow="true" global_color="#gc1" /> diff --git a/ryzom/client/src/game_context_menu.cpp b/ryzom/client/src/game_context_menu.cpp index 363abdd807..5c64b19645 100644 --- a/ryzom/client/src/game_context_menu.cpp +++ b/ryzom/client/src/game_context_menu.cpp @@ -460,14 +460,14 @@ void CGameContextMenu::update() fameValue = pLeafFame->getValue8(); } - - bool enable_rumors = NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:ENABLE_RUMORS")->getValueBool(); + bool disable_rumors = NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:DISABLE_RUMORS")->getValueBool(); + bool newbie = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:USER:IS_NEWBIE")->getValueBool(); if (_TextNews) - _TextNews->setActive(enable_rumors && !UserEntity->isFighting() && !UserEntity->isRiding() && selection && !canAttack() && selection->isNPC() && fameValue >= -30); + _TextNews->setActive(!disable_rumors && !newbie && !UserEntity->isFighting() && !UserEntity->isRiding() && selection && !canAttack() && selection->isNPC() && fameValue >= -30); if (_TextNewsAgressive) - _TextNewsAgressive->setActive(enable_rumors && !UserEntity->isFighting() && !UserEntity->isRiding() && selection && !canAttack() && selection->isNPC() && fameValue < -30); + _TextNewsAgressive->setActive(!disable_rumors && !newbie && !UserEntity->isFighting() && !UserEntity->isRiding() && selection && !canAttack() && selection->isNPC() && fameValue < -30); if (_TextDuel && _TextUnDuel) @@ -521,7 +521,8 @@ void CGameContextMenu::update() // Disable player properties if(_TextInfo) - _TextInfo->setActive(selection && (!selection->isForageSource())); + //_TextInfo->setActive(selection && (!selection->isForageSource())); + _TextInfo->setActive(false); // Follow if(_TextFollow) From 061198b59b341eb7077c68c985ef8a324f63b0d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Thu, 31 Aug 2023 14:14:51 +0100 Subject: [PATCH 079/194] Add infos into target window --- .../data/gamedev/interfaces_v3/interaction.lua | 6 +++++- .../data/gamedev/interfaces_v3/interaction.xml | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua index 558904e819..8ef1be2a21 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua @@ -360,12 +360,15 @@ function game:updateTargetConsiderUI() local wgPvPTag = targetWindow:find("pvp_tags") local wgHeader = targetWindow:find("header_opened") local wgLock = targetWindow:find("lock") + local wginfos = targetWindow:find("target_tinfos") wgTargetSlotForce.active = true wgTargetSlotForce.texture = "consider_bg.tga" wgImpossible.active = true wgTargetSlotForce.h = 16 + wginfos.active = false + -- no selection ? if twGetTargetLevel() == -1 then wgLock.active = false @@ -394,7 +397,8 @@ function game:updateTargetConsiderUI() -- if the selection is a player, then both the local & targeted player must be in PVP mode for the level to be displayed if (twIsTargetPlayer()) then - -- don't display anything ... + -- don't display anything except infos ... + wginfos.active = true wgLock.active = false wgTargetSlotForce.active = false wgTargetLevel.active = false diff --git a/ryzom/client/data/gamedev/interfaces_v3/interaction.xml b/ryzom/client/data/gamedev/interfaces_v3/interaction.xml index 98a5ba4b0b..d3320228b9 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/interaction.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/interaction.xml @@ -304,6 +304,22 @@ w="0" h="0" tooltip_parent="win" /> + <ctrl type="button" + id="target_tinfos" + button_type="push_button" + posref="TR TR" + x="0" + y="0" + tx_normal="profile.tga" + tx_pushed="profile.tga" + tx_over="profile.tga" + global_color_normal="false" + global_color_over="false" + global_color_pushed="false" + onclick_l="open_title_help" + params_l="from=target" + tooltip="uimGcmInfo" + tooltip_parent="win" /> </group> <group id="pvp_tags" From fbdab7b2a141a91f73380b768e02a35a364d8d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Thu, 7 Sep 2023 13:21:20 +0100 Subject: [PATCH 080/194] setVpx accept now all VPX using ; as delimiter --- ryzom/server/src/ai_service/ai_bot_npc.cpp | 75 ++++++++++++---------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/ryzom/server/src/ai_service/ai_bot_npc.cpp b/ryzom/server/src/ai_service/ai_bot_npc.cpp index 7f06d37d96..227987de22 100644 --- a/ryzom/server/src/ai_service/ai_bot_npc.cpp +++ b/ryzom/server/src/ai_service/ai_bot_npc.cpp @@ -240,12 +240,12 @@ void CSpawnBotNpc::updateChat(CAIState const* state) if (!state) return; CBotNpc const& botNpc = getPersistent(); - + FOREACHC(itChat, CCont<CAIStateChat>, state->chats()) { if (!itChat->testCompatibility(botNpc)) continue; - + // update chat information if any CNpcChatProfileImp const* const chatProfile = botNpc.getChat(); if (chatProfile) @@ -1104,42 +1104,47 @@ void CBotNpc::setVisualProperties(std::string input) // AJM if(input.empty()) return; - // split 'input' string into keyword and tail - std::string keyword, tail; - if(!AI_SHARE::stringToKeywordAndTail(input,keyword,tail)) - { - nlwarning("Failed to parse visual property text: '%s' for bot: '%s'",input.c_str(),getAliasNode()->fullName().c_str()); - return; - } - // load val from tail - // accept 64bit hex value - uint64 val; - sscanf( tail.c_str(), "%" NL_I64 "x", &val ); - - // can't set into mirror row until bot is spawned, so save away - if( NLMISC::nlstricmp( keyword,"VPA")==0 ) // VisualPropertyA + std::vector< std::string > vpx; + NLMISC::splitString(input, ";", vpx); + for (uint8 i = 0; i < vpx.size(); i++) { - _VisualPropertyA = val; - _useVisualProperties = true; - } - else if( NLMISC::nlstricmp( keyword,"VPB")==0 ) // VisualPropertyB - { - _VisualPropertyB = val; - _useVisualProperties = true; - } - else if( NLMISC::nlstricmp( keyword,"VPC")==0 ) // VisualPropertyC - { - _VisualPropertyC = val; - _useVisualProperties = true; - } + // split 'input' string into keyword and tail + std::string keyword, tail; + if(!AI_SHARE::stringToKeywordAndTail(vpx[i],keyword,tail)) + { + nlwarning("Failed to parse visual property text: '%s' for bot: '%s'", vpx[i].c_str(), getAliasNode()->fullName().c_str()); + return; + } - else - { - nlwarning("Bot '%s'%s: failed to parse visual property argument: '%s'", - getAliasFullName().c_str(), - getAliasString().c_str(), - input.c_str()); + // load val from tail + // accept 64bit hex value + uint64 val; + sscanf( tail.c_str(), "%" NL_I64 "x", &val ); + + // can't set into mirror row until bot is spawned, so save away + if( NLMISC::nlstricmp( keyword,"VPA")==0 ) // VisualPropertyA + { + _VisualPropertyA = val; + _useVisualProperties = true; + } + else if( NLMISC::nlstricmp( keyword,"VPB")==0 ) // VisualPropertyB + { + _VisualPropertyB = val; + _useVisualProperties = true; + } + else if( NLMISC::nlstricmp( keyword,"VPC")==0 ) // VisualPropertyC + { + _VisualPropertyC = val; + _useVisualProperties = true; + } + else + { + nlwarning("Bot '%s'%s: failed to parse visual property argument: '%s'", + getAliasFullName().c_str(), + getAliasString().c_str(), + input.c_str()); + } } } From 71b300903895042636a6be3670f4f15b4afec9e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <nuno@troispetits.net> Date: Thu, 7 Sep 2023 13:22:16 +0100 Subject: [PATCH 081/194] spawnBots accept now name and vpx, addedspawnGroup_ffsssffff_c --- ryzom/server/src/ai_service/ai_grp.h | 3 + ryzom/server/src/ai_service/ai_grp_fauna.cpp | 5 + ryzom/server/src/ai_service/ai_grp_fauna.h | 1 + ryzom/server/src/ai_service/ai_grp_npc.cpp | 65 ++++++++- ryzom/server/src/ai_service/ai_grp_npc.h | 1 + ryzom/server/src/ai_service/ai_grp_pet.cpp | 12 +- ryzom/server/src/ai_service/ai_grp_pet.h | 1 + ryzom/server/src/ai_service/ai_instance.cpp | 19 ++- ryzom/server/src/ai_service/ai_instance.h | 4 +- ryzom/server/src/ai_service/nf_grp.cpp | 10 +- ryzom/server/src/ai_service/nf_grp_npc.cpp | 145 ++++++++++++------- 11 files changed, 188 insertions(+), 78 deletions(-) diff --git a/ryzom/server/src/ai_service/ai_grp.h b/ryzom/server/src/ai_service/ai_grp.h index c2cdfc011c..440967206c 100644 --- a/ryzom/server/src/ai_service/ai_grp.h +++ b/ryzom/server/src/ai_service/ai_grp.h @@ -64,6 +64,7 @@ class CSpawnGroup virtual void spawnBots() = 0; virtual void spawnBots(const std::string &name) = 0; + virtual void spawnBots(const std::string &name, const std::string &vpx) = 0; virtual void despawnBots(bool immediately) = 0; virtual void update() = 0; @@ -215,6 +216,8 @@ class CGroup CAliasTreeOwner* aliasTreeOwner() { return this; } + std::string botName; + std::string botVpx; bool _AutoDestroy; void autoDestroy(bool ad) { _AutoDestroy = ad; } diff --git a/ryzom/server/src/ai_service/ai_grp_fauna.cpp b/ryzom/server/src/ai_service/ai_grp_fauna.cpp index 1a54c8c4c8..d3e5f8c8dd 100644 --- a/ryzom/server/src/ai_service/ai_grp_fauna.cpp +++ b/ryzom/server/src/ai_service/ai_grp_fauna.cpp @@ -551,6 +551,11 @@ void CSpawnGroupFauna::spawnBots(const std::string &name) } +void CSpawnGroupFauna::spawnBots(const std::string &name, const std::string &vpx) +{ +} + + void CSpawnGroupFauna::despawnBots(bool immediately) { setDespawnImmediately(immediately); diff --git a/ryzom/server/src/ai_service/ai_grp_fauna.h b/ryzom/server/src/ai_service/ai_grp_fauna.h index 086e7ac523..bf84b27d37 100644 --- a/ryzom/server/src/ai_service/ai_grp_fauna.h +++ b/ryzom/server/src/ai_service/ai_grp_fauna.h @@ -72,6 +72,7 @@ class CSpawnGroupFauna virtual void spawnBots(); virtual void spawnBots(const std::string &name); + virtual void spawnBots(const std::string &name, const std::string &vpx); virtual void despawnBots(bool immediately); // overrides the init to avoid automatic bot spawn .. diff --git a/ryzom/server/src/ai_service/ai_grp_npc.cpp b/ryzom/server/src/ai_service/ai_grp_npc.cpp index 88e1c22d99..7f65297442 100644 --- a/ryzom/server/src/ai_service/ai_grp_npc.cpp +++ b/ryzom/server/src/ai_service/ai_grp_npc.cpp @@ -392,6 +392,65 @@ void CSpawnGroupNpc::spawnBots(const std::string &name) } } +void CSpawnGroupNpc::spawnBots(const std::string &name, const std::string &vpx) +{ + ucstring ucName; + ucName.fromUtf8(name); + + FOREACH(itBot, CCont<CBot>, bots()) + { + CBot* bot = *itBot; + if (!bot->isSpawned()) { + bot->spawn(); + + CBotNpc *botnpc = static_cast<CBotNpc*>(bot); + if (botnpc) + { + botnpc->setVisualProperties(vpx); + botnpc->sendVisualProperties(); + } + + if (!ucName.empty()) + { + CSpawnBot *spawnBot = bot->getSpawnObj(); + if (spawnBot) + { + TDataSetRow row = spawnBot->dataSetRow(); + NLNET::CMessage msgout("CHARACTER_NAME"); + msgout.serial(row); + msgout.serial(ucName); + sendMessageViaMirror("IOS", msgout); + spawnBot->getPersistent().setCustomName(ucName); + } + } + + if (_Cell < 0) { + CEntityId id = bot->getSpawnObj()->getEntityId(); + sint32 x = bot->getSpawnObj()->pos().x(); + sint32 y = bot->getSpawnObj()->pos().y(); + sint32 z = bot->getSpawnObj()->pos().h(); + float t = bot->getSpawnObj()->pos().theta().asRadians(); + uint8 cont = 0; + uint8 slide = 1; + NLMISC::TGameCycle tick = CTickEventHandler::getGameCycle() + 1; + CMessage msgout2("ENTITY_TELEPORTATION"); + msgout2.serial( id ); + msgout2.serial( x ); + msgout2.serial( y ); + msgout2.serial( z ); + msgout2.serial( t ); + msgout2.serial( tick ); + msgout2.serial( cont ); + msgout2.serial( _Cell ); + msgout2.serial( slide ); + + sendMessageViaMirror("GPMS", msgout2); + } + } + } +} + + void CSpawnGroupNpc::spawnBots() { FOREACH(itBot, CCont<CBot>, bots()) @@ -663,13 +722,13 @@ void CGroupNpc::addParameter(std::string const& parameter) static std::string DESPAWN_TIME("despawn time"); static std::string RING("ring"); static std::string DENIED_ASTAR_FLAGS("denied_astar_flags"); - + std::string key, tail; - + // force lowercase std::string p = NLMISC::toLowerAscii(parameter); AI_SHARE::stringToKeywordAndTail(p, key, tail); - + breakable { if (key == RING) diff --git a/ryzom/server/src/ai_service/ai_grp_npc.h b/ryzom/server/src/ai_service/ai_grp_npc.h index 382c6840ed..5b520bd277 100644 --- a/ryzom/server/src/ai_service/ai_grp_npc.h +++ b/ryzom/server/src/ai_service/ai_grp_npc.h @@ -46,6 +46,7 @@ class CSpawnGroupNpc virtual void spawnBots(); virtual void spawnBots(const std::string &name); + virtual void spawnBots(const std::string &name, const std::string &vpx); virtual void despawnBots(bool immediately); void update(); diff --git a/ryzom/server/src/ai_service/ai_grp_pet.cpp b/ryzom/server/src/ai_service/ai_grp_pet.cpp index 9e45c0d46e..7f10d6f86b 100644 --- a/ryzom/server/src/ai_service/ai_grp_pet.cpp +++ b/ryzom/server/src/ai_service/ai_grp_pet.cpp @@ -36,15 +36,15 @@ void CSpawnGroupPet::update () if (!botPet->isSpawned() || botPet->haveToDespawn()) // must erase this bot. getPersistent().bots().removeChildByIndex(botPet->getChildIndex()); } - + CEntityId const& entityId = getPersistent().getPetOwner(); CAIEntityPhysical* const petOwner = CAIS::instance().getEntityPhysical(CMirrors::DataSet->getDataSetRow(entityId)); - + // Quick hack to prevent of too much computing.. if (petOwner) - { + { double const distContDestToRealDest = petOwner->wpos().toAIVector().quickDistTo(_PathCont.getDestination()); - + if (distContDestToRealDest>4) // update only each 4 meters. _PathCont.setDestination(petOwner->wpos()); _IsPlayerSpawned = true; @@ -64,11 +64,11 @@ void CSpawnGroupPet::update () _IsPlayerSpawned = false; } } - + { uint32 const newTime = CTimeInterface::gameCycle(); uint32 const dt = newTime - _LastUpdate; - + FOREACH(it, CCont<CBot>, bots()) { (safe_cast<CBotPet*>(*it))->update(dt, petOwner); diff --git a/ryzom/server/src/ai_service/ai_grp_pet.h b/ryzom/server/src/ai_service/ai_grp_pet.h index 7d0f56ed28..bf01114c6e 100644 --- a/ryzom/server/src/ai_service/ai_grp_pet.h +++ b/ryzom/server/src/ai_service/ai_grp_pet.h @@ -46,6 +46,7 @@ class CSpawnGroupPet void spawnBots() { } void spawnBots(const std::string &name) { } + void spawnBots(const std::string &name, const std::string &vpx) {} void despawnBots (bool immediately) { } void update(); diff --git a/ryzom/server/src/ai_service/ai_instance.cpp b/ryzom/server/src/ai_service/ai_instance.cpp index 8f3fce9fb2..6db8caac81 100644 --- a/ryzom/server/src/ai_service/ai_instance.cpp +++ b/ryzom/server/src/ai_service/ai_instance.cpp @@ -675,7 +675,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, const std::string &look, sint32 cell) { +CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& sheetId, CAIVector const& pos, double dispersionRadius, bool spawnBots, double orientation, const std::string &grpName, const std::string &look, sint32 cell, const std::string &botsName, const std::string &vpx) { if (!_EventNpcManager) return NULL; @@ -687,7 +687,8 @@ CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& } _LastGroupAlias++; - string name = botsName.empty() ? NLMISC::toString("event_group_%u", _LastGroupAlias):botsName; + string name = grpName.empty() ? NLMISC::toString("event_group_%u", _LastGroupAlias):grpName; + string botname = botsName.empty() ? name : botsName; // Create a group CGroupNpc* grp = new CGroupNpc(_EventNpcManager, _LastGroupAlias, name, RYAI_MAP_CRUNCH::Nothing); // Register it in the manager @@ -695,7 +696,8 @@ CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& // Set the group parameters grp->setAutoSpawn(false); - + grp->botVpx = vpx; + grp->botName = botname; grp->setName(name); grp->clearParameters(); grp->setPlayerAttackable(true); @@ -705,7 +707,8 @@ CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& grp->clrBotsAreNamedFlag(); - eventCreateNpcBot(grp, nbBots, false, sheetId, pos, "", orientation, dispersionRadius, look); + if (nbBots > 0) + eventCreateNpcBot(grp, nbBots, false, sheetId, pos, "", orientation, dispersionRadius, look, botname, vpx); grp->spawn(); CSpawnGroupNpc* spawnGroup = grp->getSpawnObj(); @@ -723,7 +726,7 @@ CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& destZone->setPosAndRadius(AITYPES::vp_auto, CAIPos(pos, 0, 0), (uint32)(dispersionRadius*1000.)); spawnGroup->movingProfile().setAIProfile(new CGrpProfileWanderNoPrim(spawnGroup, destZone)); - if (!botsName.empty()) + if (!grpName.empty()) { CStateMachine* sm = _EventNpcManager->getStateMachine(); uint32 stateAlias = grp->getStateAlias("start"); @@ -743,12 +746,12 @@ CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& } if (spawnBots) - grp->getSpawnObj()->spawnBots(); + grp->getSpawnObj()->spawnBots(botname, vpx); return grp; } -bool CAIInstance::eventCreateNpcBot(CGroupNpc* grp, uint nbBots, bool spawnBots, NLMISC::CSheetId const& sheetId, CAIVector const& pos, const std::string &name, double orientation, double dispersionRadius, const std::string &look) +bool CAIInstance::eventCreateNpcBot(CGroupNpc* grp, uint nbBots, bool spawnBots, NLMISC::CSheetId const& sheetId, CAIVector const& pos, const std::string &name, double orientation, double dispersionRadius, const std::string &look, const std::string &botname, const std::string &vpx) { uint32 offset = grp->bots().size(); for (uint i=0; i<nbBots; ++i) @@ -805,7 +808,7 @@ bool CAIInstance::eventCreateNpcBot(CGroupNpc* grp, uint nbBots, bool spawnBots, } if (spawnBots) - grp->getSpawnObj()->spawnBots(name); + grp->getSpawnObj()->spawnBots(botname, vpx); return true; } diff --git a/ryzom/server/src/ai_service/ai_instance.h b/ryzom/server/src/ai_service/ai_instance.h index b2a71cd3f8..db22a18bf6 100644 --- a/ryzom/server/src/ai_service/ai_instance.h +++ b/ryzom/server/src/ai_service/ai_instance.h @@ -208,8 +208,8 @@ class CAIInstance return NULL; } - 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, sint32 cell=0); - bool eventCreateNpcBot(CGroupNpc* grp, uint nbBots, bool spawnBots, NLMISC::CSheetId const& sheetId, CAIVector const& pos, const std::string &name, double orientation, double dispersionRadius, const std::string &look); + CGroupNpc* eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& sheetId, CAIVector const& pos, double dispersionRadius, bool spawnBots, double orientation, const std::string &grpName, const std::string &look, sint32 cell=0, const std::string &botsName = "", const std::string &vpx = ""); + bool eventCreateNpcBot(CGroupNpc* grp, uint nbBots, bool spawnBots, NLMISC::CSheetId const& sheetId, CAIVector const& pos, const std::string &name, double orientation, double dispersionRadius, const std::string &look, const std::string &botsName = "", const std::string &vpx = ""); /// 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/ryzom/server/src/ai_service/nf_grp.cpp b/ryzom/server/src/ai_service/nf_grp.cpp index 43d5711578..333c45107b 100644 --- a/ryzom/server/src/ai_service/nf_grp.cpp +++ b/ryzom/server/src/ai_service/nf_grp.cpp @@ -65,7 +65,7 @@ void spawn__(CStateInstance* entity, CScriptStack& stack) if (grp) { if (grp->isSpawned()) - grp->getSpawnObj()->spawnBots(); + grp->getSpawnObj()->spawnBots(grp->botName, grp->botVpx); } } @@ -110,10 +110,10 @@ void despawn_f_(CStateInstance* entity, CScriptStack& stack) //---------------------------------------------------------------------------- /** @page code -@subsection spawnBot_fsssffff_ +@subsection spawnBot_fsssfffff_ Spawn new bots in the current group. -Arguments: f(NbrBots), s(Sheet), s(Name), s(Look), f(x), f(y), f(orientation), f(dispersion) -> +Arguments: f(NbrBots), s(Sheet), s(Name), s(Look), f(x), f(y), f(orientation), f(dispersion), f(cell) -> @code @@ -148,12 +148,10 @@ void spawnBot_fsssffff_(CStateInstance* entity, CScriptStack& stack) CGroupNpc* grp = dynamic_cast<CGroupNpc*>(entity->getGroup()); if (grp) - aiInstance->eventCreateNpcBot(grp, nbBots, true, sheetId, CAIVector(x, y), name, orientation, dispersionRadius, look); + aiInstance->eventCreateNpcBot(grp, nbBots, true, sheetId, CAIVector(x, y), name, orientation, dispersionRadius, look, grp->botName, grp->botVpx); return; } - - //---------------------------------------------------------------------------- /** @page code diff --git a/ryzom/server/src/ai_service/nf_grp_npc.cpp b/ryzom/server/src/ai_service/nf_grp_npc.cpp index 0a67aea43c..66b2c118b6 100644 --- a/ryzom/server/src/ai_service/nf_grp_npc.cpp +++ b/ryzom/server/src/ai_service/nf_grp_npc.cpp @@ -2644,6 +2644,7 @@ void rename_s_(CStateInstance* entity, CScriptStack& stack) ucstring name; name.fromUtf8(newName); CGroup* group = entity->getGroup(); + group->botName = newName; if (group->isSpawned()) { @@ -2676,6 +2677,7 @@ void vpx_s_(CStateInstance* entity, CScriptStack& stack) string vpx = (string)stack.top(); stack.pop(); CGroup* group = entity->getGroup(); + group->botVpx = vpx; if (group->isSpawned()) { @@ -3245,45 +3247,71 @@ void resetHealGroups_(CStateInstance* entity, CScriptStack& stack) //---------------------------------------------------------------------------- /** @page code -@subsection spawnGroup_fsssffff_ +@subsection spawnGroup_ffsssffff_ Spawn new group. -Arguments: f(NbrBots), f(spawnBot) s(Sheet), s(Name), s(Look), f(x), f(y), f(orientation), f(dispersion) -> +Arguments: f(NbrBots), f(spawnBot), s(Sheet), s(Name), s(Look), f(x), f(y), f(orientation), f(dispersion) -> @code @endcode */ -// CGroup -void spawnGroup_ffsssffff_c(CStateInstance* entity, CScriptStack& stack) +void spawnGroup_ffsssffff_(CStateInstance* entity, CScriptStack& stack) { - double dispersionRadius = (double)(float)stack.top(); - stack.pop(); + double dispersionRadius = (double)(float)stack.top(); stack.pop(); + double orientation = (double)(float)stack.top(); stack.pop(); + double y = (double)(float)stack.top(); stack.pop(); + double x = (double)(float)stack.top(); stack.pop(); + string look = (string)stack.top(); stack.pop(); + string name = (string)stack.top(); stack.pop(); + CSheetId sheetId((string)stack.top()); stack.pop(); + bool spawn = (float&)stack.top()!=0.0f; stack.pop(); + uint nbBots = (uint)(float)stack.top(); stack.pop(); - double orientation = (double)(float)stack.top(); - stack.pop(); + IManagerParent* const managerParent = entity->getGroup()->getOwner()->getOwner(); + CAIInstance* const aiInstance = dynamic_cast<CAIInstance*>(managerParent); + if (!aiInstance) + return; - double y = (double)(float)stack.top(); - stack.pop(); + CGroupNpc* grp = dynamic_cast<CGroupNpc*>(entity->getGroup()); + if (grp) + { + CSpawnGroupNpc* spawnGroup = grp->getSpawnObj(); + CGroupNpc* npcGroup; + if (spawnGroup) + npcGroup = aiInstance->eventCreateNpcGroup(nbBots, sheetId, CAIVector(x, y), dispersionRadius, spawn, orientation, name, look, spawnGroup->getCell()); + else + npcGroup = aiInstance->eventCreateNpcGroup(nbBots, sheetId, CAIVector(x, y), dispersionRadius, spawn, orientation, name, look); + } +} - double x = (double)(float)stack.top(); - stack.pop(); - string look = (string)stack.top(); - stack.pop(); +//---------------------------------------------------------------------------- +/** @page code - string name = (string)stack.top(); - stack.pop(); +@subsection spawnGroup_fsssfffff_c +Spawn new group. - CSheetId sheetId((string)stack.top()); - stack.pop(); +Arguments: f(NbrBots), f(spawnBot) s(Sheet), s(Name), s(Look), f(x), f(y), f(orientation), f(dispersion) -> - bool spawn = (float&)stack.top()!=0.0f; - stack.pop(); +@code - uint nbBots = (uint)(float)stack.top(); - stack.pop(); +@endcode + +*/ +// CGroup +void spawnGroup_ffsssffff_c(CStateInstance* entity, CScriptStack& stack) +{ + double dispersionRadius = (double)(float)stack.top(); stack.pop(); + double orientation = (double)(float)stack.top(); stack.pop(); + double y = (double)(float)stack.top(); stack.pop(); + double x = (double)(float)stack.top(); stack.pop(); + string look = (string)stack.top(); stack.pop(); + string name = (string)stack.top(); stack.pop(); + CSheetId sheetId((string)stack.top()); stack.pop(); + bool spawn = (float&)stack.top()!=0.0f; stack.pop(); + uint nbBots = (uint)(float)stack.top(); stack.pop(); IManagerParent* const managerParent = entity->getGroup()->getOwner()->getOwner(); CAIInstance* const aiInstance = dynamic_cast<CAIInstance*>(managerParent); @@ -3291,47 +3319,52 @@ void spawnGroup_ffsssffff_c(CStateInstance* entity, CScriptStack& stack) return; CGroupNpc* grp = dynamic_cast<CGroupNpc*>(entity->getGroup()); + CGroupNpc* npcGroup; if (grp) { CSpawnGroupNpc* spawnGroup = grp->getSpawnObj(); - CGroupNpc* npcGroup; if (spawnGroup) npcGroup = aiInstance->eventCreateNpcGroup(nbBots, sheetId, CAIVector(x, y), dispersionRadius, spawn, orientation, name, look, spawnGroup->getCell()); - else - npcGroup = aiInstance->eventCreateNpcGroup(nbBots, sheetId, CAIVector(x, y), dispersionRadius, spawn, orientation, name, look); - if (npcGroup) - stack.push(npcGroup->getPersistentStateInstance()); } -} -void spawnGroup_ffsssffff_(CStateInstance* entity, CScriptStack& stack) -{ - double dispersionRadius = (double)(float)stack.top(); - stack.pop(); + if (!npcGroup) + npcGroup = aiInstance->eventCreateNpcGroup(nbBots, sheetId, CAIVector(x, y), dispersionRadius, spawn, orientation, name, look); - double orientation = (double)(float)stack.top(); - stack.pop(); + if (npcGroup) + stack.push(npcGroup->getPersistentStateInstance()); - double y = (double)(float)stack.top(); - stack.pop(); + return; - double x = (double)(float)stack.top(); - stack.pop(); +} - string look = (string)stack.top(); - stack.pop(); +//---------------------------------------------------------------------------- +/** @page code - string name = (string)stack.top(); - stack.pop(); +@subsection spawnGroup_ffsssssffff_c +Create a group with bots (not spawned) - CSheetId sheetId((string)stack.top()); - stack.pop(); +Arguments: f(NbrBots), f(spawnBot), s(Sheet), s(Name), s(BotName), s(Look), s(vpx), f(x), f(y), f(orientation), f(dispersion) -> - bool spawn = (float&)stack.top()!=0.0f; - stack.pop(); +@code - uint nbBots = (uint)(float)stack.top(); - stack.pop(); +@endcode + +*/ +// CGroup +void spawnGroup_ffsssssffff_c(CStateInstance* entity, CScriptStack& stack) +{ + sint32 cell = (sint32)(float)stack.top(); stack.pop(); + double dispersionRadius = (double)(float)stack.top(); stack.pop(); + double orientation = (double)(float)stack.top(); stack.pop(); + double y = (double)(float)stack.top(); stack.pop(); + double x = (double)(float)stack.top(); stack.pop(); + string vpx = (string)stack.top(); stack.pop(); + string look = (string)stack.top(); stack.pop(); + string botname = (string)stack.top(); stack.pop(); + string name = (string)stack.top(); stack.pop(); + CSheetId sheetId((string)stack.top()); stack.pop(); + bool spawn = (float&)stack.top()!=0.0f; stack.pop(); + uint nbBots = (uint)(float)stack.top(); stack.pop(); IManagerParent* const managerParent = entity->getGroup()->getOwner()->getOwner(); CAIInstance* const aiInstance = dynamic_cast<CAIInstance*>(managerParent); @@ -3339,17 +3372,22 @@ void spawnGroup_ffsssffff_(CStateInstance* entity, CScriptStack& stack) return; CGroupNpc* grp = dynamic_cast<CGroupNpc*>(entity->getGroup()); + CGroupNpc* npcGroup; if (grp) { CSpawnGroupNpc* spawnGroup = grp->getSpawnObj(); - CGroupNpc* npcGroup; if (spawnGroup) - npcGroup = aiInstance->eventCreateNpcGroup(nbBots, sheetId, CAIVector(x, y), dispersionRadius, spawn, orientation, name, look, spawnGroup->getCell()); - else - npcGroup = aiInstance->eventCreateNpcGroup(nbBots, sheetId, CAIVector(x, y), dispersionRadius, spawn, orientation, name, look); + npcGroup = aiInstance->eventCreateNpcGroup(nbBots, sheetId, CAIVector(x, y), dispersionRadius, spawn, orientation, name, look, spawnGroup->getCell(), botname, vpx); } -} + if (!npcGroup) + npcGroup = aiInstance->eventCreateNpcGroup(nbBots, sheetId, CAIVector(x, y), dispersionRadius, spawn, orientation, name, look, 0, botname, vpx); + + if (npcGroup) + stack.push(npcGroup->getPersistentStateInstance()); + + return; +} std::map<std::string, FScrptNativeFunc> nfGetNpcGroupNativeFunctions() { @@ -3427,6 +3465,7 @@ std::map<std::string, FScrptNativeFunc> nfGetNpcGroupNativeFunctions() REGISTER_NATIVE_FUNC(functions, spawnGroup_ffsssffff_); REGISTER_NATIVE_FUNC(functions, spawnGroup_ffsssffff_c); + REGISTER_NATIVE_FUNC(functions, spawnGroup_ffsssssffff_c); // REGISTER_NATIVE_FUNC(functions, hideMissionStepIcon_b_); // REGISTER_NATIVE_FUNC(functions, hideMissionGiverIcon_b_); From 2e11be8d605b0e6d09cb4ba4d698459de412eea0 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Thu, 5 Oct 2023 12:37:52 +0200 Subject: [PATCH 082/194] Added onOverShapeButton --- .../data/gamedev/interfaces_v3/sceneedit.lua | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua b/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua index f3a2e967e0..9a02d2fe47 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/sceneedit.lua @@ -561,6 +561,21 @@ function SceneEditor:get_html_section(message, color) return '<table width="100%" cellspacing="0" cellpadding="0"><tr bgcolor="'..color..'"><td align="center" valign="middle"><font color="#FFFFFF" size="12">'..message..'</font></td></tr></table>' end +function SceneEditor:onOverShapeButton(shape_id) + if SceneEditor.lastColorizedCheck then + setupShape(SceneEditor.lastColorizedCheck, {colorize="0"}) + end + SceneEditor.lastColorizedCheck = shape_id + setupShape(shape_id, {colorize="255 0 0 255"}) +end + +function SceneEditor:setupShapeButton(shape_id) + local button = getUI("ui:interface:ark_scene_editor:browser:content:html"):find("shape_"..shape_id):find("b") + button.onover = "lua" + button.params_over = "SceneEditor:onOverShapeButton("..shape_id..")" +end + + function SceneEditor:get_html(message, message_bg) debug("get_html :"..message) local new_group = '  <a class="ryzom-ui-button" href="'..self.baseUrl..'_AddGroup&add_new_group=1&scene_id='..self.sceneId..'"><img src="'..self.iconsUrl..'/32/chart_organisation_add.png" alt="'..self.T["add_new_group"]..'" /></a>' @@ -627,15 +642,20 @@ function SceneEditor:get_html(message, message_bg) if k % 2 == 0 then color = "101010" end - local text_color = "ef9b64" if self.Shapes[shape_id].modified == "modified" then - text_color = "aa5555" + color = "aa5555" else if self.Shapes[shape_id].modified == "added" then - text_color = "55aa55" + color = "55aa55" end end - table.insert(shapes_html_dict, {id=shape.db_id, html="<tr bgcolor='#"..color.."'><td height='20px'> <input type='hidden' name='shape[]', value='"..SceneEditor:enc64((shape.db_id or '')..":"..Json.encode(shape)).."' />"..'#'..(shape.db_id or '0').." <a href='ah:lua:SceneEditor:launch_menu("..tostring(shape_id)..")'><font color='#"..text_color.."'>"..shape.file.."</font></a></td>\ + table.insert(shapes_html_dict, {id=shape.db_id, html="<tr bgcolor='#"..color.."'>\ + <td height='20px'> \ + <input type='hidden' name='shape[]', value='"..SceneEditor:enc64((shape.db_id or '')..":"..Json.encode(shape)).."' />\ + "..'#'..(shape.db_id or '0').." <a class='ryzom-ui-button' name='shape_"..tostring(shape_id).."' href='ah:lua:SceneEditor:launch_menu("..tostring(shape_id)..")'>\ + "..shape.file.."</a>\ + <lua>SceneEditor:setupShapeButton('"..tostring(shape_id).."')</lua>\ + </td>\ <td width='30px'><a href='ah:lua:SceneEditor:editShapeProperties("..tostring(shape_id)..")'><img src='"..self.iconsUrl.."/16/layout_edit.png' /></a></td>\ <td width='3px'><a href='ah:lua:SceneEditor:removeShape("..tostring(shape_id)..")'><img src='"..self.iconsUrl.."/16/cross.png' /></a></td>\ </tr>"}) @@ -668,6 +688,5 @@ function SceneEditor:get_html(message, message_bg) end end - -- VERSION -- RYZOM_SCENEEDIT_VERSION = 328 From 1cb98b80946f43d4c3e3e820ab4d5653502ce29f Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Thu, 5 Oct 2023 12:40:14 +0200 Subject: [PATCH 083/194] Manage wildcards (?*) in /tar command --- ryzom/client/src/entities.cpp | 100 +++++++++++++++++----------------- 1 file changed, 51 insertions(+), 49 deletions(-) diff --git a/ryzom/client/src/entities.cpp b/ryzom/client/src/entities.cpp index 7f4172f11b..95c44377e3 100644 --- a/ryzom/client/src/entities.cpp +++ b/ryzom/client/src/entities.cpp @@ -461,7 +461,7 @@ void CEntityManager::initialize(uint nbMaxEntity) NLGUI::CDBManager::getInstance()->getDB()->addObserver(&TeamUIDObserver, textId ); _GroupMemberUidDB[i] = NLGUI::CDBManager::getInstance()->getDbProp(text, false); nlassert(_GroupMemberUidDB[i]); - + text = toString(TEAM_DB_PATH ":%d:NAME", i); textId = ICDBNode::CTextId(text); NLGUI::CDBManager::getInstance()->getDB()->addObserver(&TeamPresentObserver, textId ); @@ -477,13 +477,13 @@ void CEntityManager::initialize(uint nbMaxEntity) NLGUI::CDBManager::getInstance()->getDB()->addObserver(&AnimalUIDObserver, textId); _BeastUidDB[i] = NLGUI::CDBManager::getInstance()->getDbProp(text, false); nlassert(_BeastUidDB[i]); - + text = toString("SERVER:PACK_ANIMAL:BEAST%d:STATUS", i); textId = ICDBNode::CTextId(text); NLGUI::CDBManager::getInstance()->getDB()->addObserver(&AnimalStatusObserver, textId); _BeastStatusDB[i] = NLGUI::CDBManager::getInstance()->getDbProp(text, false); nlassert(_BeastStatusDB[i]); - + text = toString("SERVER:PACK_ANIMAL:BEAST%d:TYPE", i); _BeastTypeDB[i] = NLGUI::CDBManager::getInstance()->getDbProp(text, false); nlassert(_BeastTypeDB[i]); @@ -550,7 +550,7 @@ CShapeInstanceReference CEntityManager::createInstance(const string& shape, cons primitive = PACS->addCollisionablePrimitive(dynamicWI, 1); primitive->setDontSnapToGround(false); } - + // Put instance in last deleted position if found if (_LastRemovedInstance != -1) { @@ -565,7 +565,7 @@ CShapeInstanceReference CEntityManager::createInstance(const string& shape, cons _ShapeInstances[idx].BboxActive = !text.empty() || !url.empty(); _ShapeInstances[idx].Deleted = false; _ShapeInstances[idx].InIGZone = inIgZone > 0; - + _LastRemovedInstance = _ShapeInstances[idx].LastDeleted; _ShapeInstances[idx].LastDeleted = -1; TIGZoneShapes::iterator it = _IgZoneShapes.find(inIgZone); @@ -658,7 +658,7 @@ CVector CEntityManager::getInstancePos(uint32 idx) UInstance instance = _ShapeInstances[idx].Instance; if(instance.empty()) return CVector(0,0,0); - + return instance.getPos(); } @@ -666,17 +666,17 @@ bool CEntityManager::setInstancePos(uint32 idx, CVector pos) { if (!Scene || idx >= _ShapeInstances.size() || _ShapeInstances[idx].Deleted) return false; - + UInstance instance = _ShapeInstances[idx].Instance; if(instance.empty()) return false; - + UMovePrimitive *primitive = _ShapeInstances[idx].Primitive; if (primitive) { primitive->setGlobalPosition(_ShapeInstances[idx].PrimRelativePos + pos, dynamicWI); } - + instance.setPos(pos); return true; } @@ -685,11 +685,11 @@ CVector CEntityManager::getInstanceRot(uint32 idx) { if (!Scene || idx >= _ShapeInstances.size() || _ShapeInstances[idx].Deleted) return CVector(0,0,0); - + UInstance instance = _ShapeInstances[idx].Instance; if(instance.empty()) return CVector(0,0,0); - + return instance.getRotEuler(); } @@ -697,13 +697,13 @@ bool CEntityManager::setInstanceRot(uint32 idx, CVector rot) { if (!Scene || idx >= _ShapeInstances.size() || _ShapeInstances[idx].Deleted) return false; - + UInstance instance = _ShapeInstances[idx].Instance; if(instance.empty()) return false; - + instance.setRotEuler(rot); - + return true; } @@ -715,7 +715,7 @@ CVector CEntityManager::getInstanceScale(uint32 idx) UInstance instance = _ShapeInstances[idx].Instance; if(instance.empty()) return CVector(0,0,0); - + return instance.getScale(); } @@ -723,7 +723,7 @@ CVector CEntityManager::getInstanceColPos(uint32 idx) { if (!Scene || idx >= _ShapeInstances.size() || _ShapeInstances[idx].Deleted) return CVector(0,0,0); - + return _ShapeInstances[idx].PrimRelativePos; } @@ -735,11 +735,11 @@ CVector CEntityManager::getInstanceColScale(uint32 idx) UMovePrimitive *primitive = _ShapeInstances[idx].Primitive; if (!primitive) return CVector(0,0,0); - + float width, depth; primitive->getSize(width, depth); float height = primitive->getHeight(); - + return CVector(width, depth, height); } @@ -747,11 +747,11 @@ double CEntityManager::getInstanceColOrient(uint32 idx) { if (!Scene || idx >= _ShapeInstances.size() || _ShapeInstances[idx].Deleted) return 0.f; - + UMovePrimitive *primitive = _ShapeInstances[idx].Primitive; if (!primitive) return 0.f; - + return primitive->getOrientation(dynamicWI); } @@ -763,21 +763,21 @@ CVector CEntityManager::getInstanceBBoxMin(uint32 idx) UInstance instance = _ShapeInstances[idx].Instance; if (instance.empty()) return CVector(0,0,0); - + NLMISC::CAABBox bbox; _ShapeInstances[idx].Instance.getShapeAABBox(bbox); - + CVector bbox_min; - + if (bbox.getCenter() == CVector::Null) bbox_min = CVector(-0.5f, -0.5f, -0.5f); else bbox_min = bbox.getMin(); - + bbox_min.x *= _ShapeInstances[idx].Instance.getScale().x; bbox_min.y *= _ShapeInstances[idx].Instance.getScale().y; bbox_min.z *= _ShapeInstances[idx].Instance.getScale().z; - + return bbox_min+_ShapeInstances[idx].Instance.getPos(); } @@ -789,28 +789,28 @@ CVector CEntityManager::getInstanceBBoxMax(uint32 idx) UInstance instance = _ShapeInstances[idx].Instance; if(instance.empty()) return CVector(0,0,0); - + NLMISC::CAABBox bbox; _ShapeInstances[idx].Instance.getShapeAABBox(bbox); - + CVector bbox_max; - + if (bbox.getCenter() == CVector::Null) bbox_max = CVector(-0.5f, -0.5f, -0.5f); else bbox_max = bbox.getMax(); - + bbox_max.x *= _ShapeInstances[idx].Instance.getScale().x; bbox_max.y *= _ShapeInstances[idx].Instance.getScale().y; bbox_max.z *= _ShapeInstances[idx].Instance.getScale().z; - + return bbox_max+_ShapeInstances[idx].Instance.getPos(); } bool CEntityManager::removeInstances() { if (!Scene) return false; - + for(uint i=0; i<_ShapeInstances.size(); ++i) { if (!_ShapeInstances[i].InIGZone) @@ -823,13 +823,13 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const { if (!Scene || idx >= _ShapeInstances.size() || _ShapeInstances[idx].Deleted) return false; - + UInstance instance = _ShapeInstances[idx].Instance; if(instance.empty()) return false; - + UMovePrimitive *primitive = _ShapeInstances[idx].Primitive; - + for (uint32 i=0; i < keys.size(); i++) { string param = keys[i]; @@ -900,7 +900,7 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const { float v; CVector pos = getInstancePos(idx); - + if (getRelativeFloatFromString(values[i], v)) { updateVector(param, pos, v, true); @@ -913,10 +913,10 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const } else if (param == "rot x" || param == "rot y" || param == "rot z") { - + float v; CVector rot = getInstanceRot(idx); - + if (getRelativeFloatFromString(values[i], v)) { updateVector(param, rot, v, true); @@ -931,7 +931,7 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const { float v; CVector scale = instance.getScale(); - + if (getRelativeFloatFromString(values[i], v)) { updateVector(param, scale, v, true); @@ -942,17 +942,17 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const } instance.setScale(scale); } - + // Primitive colissions setups - + if (!primitive) continue; - + if (param == "col size x" || param == "col size y" || param == "col size z") { float width, depth; primitive->getSize(width, depth); float height = primitive->getHeight(); - + CVector size = CVector(width, depth, height); float v; if (getRelativeFloatFromString(values[i], v)) @@ -970,7 +970,7 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const { CVector pos = instance.getPos(); float v; - + if (getRelativeFloatFromString(values[i], v)) { updateVector(param, _ShapeInstances[idx].PrimRelativePos, v, false); @@ -990,10 +990,10 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const { double orient = primitive->getOrientation(dynamicWI); double v = 0.f; - + if (values[i].empty()) continue; - + if (values[i][0] == '+') { fromString(values[i].substr(1), v); @@ -1004,7 +1004,7 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const fromString(values[i], v); orient = v; } - + primitive->setOrientation(orient, dynamicWI); } else if (param == "col mask player") @@ -1035,7 +1035,7 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const } else if (param == "col obstacle") { - + } } @@ -1048,7 +1048,7 @@ CShapeInstanceReference CEntityManager::getShapeInstanceUnderPos(float x, float CShapeInstanceReference selectedInstance(UInstance(), string(""), string("")); _LastInstanceUnderPos= NULL; idx = -1; - + // If not initialised, return if (_ShapeInstances.empty()) return selectedInstance; @@ -2397,7 +2397,9 @@ CEntityCL *CEntityManager::getEntityByKeywords (const std::vector<string> &keywo bool match = true; for (uint k = 0; k < lcKeywords.size(); ++k) { - if (lcName.find(lcKeywords[k]) == string::npos) + string::size_type poswc = lcKeywords[k].find_first_of("?*"); + if ((poswc != string::npos && !testWildCard(lcName, lcKeywords[k])) + || (poswc == string::npos && lcName.find(lcKeywords[k]) == string::npos)) { match = false; break; From 1547f027cab55863b8cd2416b3c527d5ea59d2c9 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Thu, 5 Oct 2023 12:42:11 +0200 Subject: [PATCH 084/194] Improve follow player code, remove useless check of Ai in setEquipement --- .../server/src/ai_service/ai_profile_npc.cpp | 52 +++++++++++-------- .../src/ai_service/doc/doxycfg/commondoc.cfg | 40 +++++++------- ryzom/server/src/ai_service/nf_grp_npc.cpp | 3 -- 3 files changed, 49 insertions(+), 46 deletions(-) diff --git a/ryzom/server/src/ai_service/ai_profile_npc.cpp b/ryzom/server/src/ai_service/ai_profile_npc.cpp index fd338e518f..04bf51ca0d 100644 --- a/ryzom/server/src/ai_service/ai_profile_npc.cpp +++ b/ryzom/server/src/ai_service/ai_profile_npc.cpp @@ -2357,8 +2357,19 @@ void CGrpProfileFollowPlayer::updateProfile(uint ticksSinceLastUpdate) return; } - _PathCont.setDestination(plrPtr->wpos()); - _PathPos._Angle = plrPtr->theta(); + //_PathCont.setDestination(plrPtr->wpos()); + //_PathPos._Angle = plrPtr->theta(); + double const distContDestToRealDest = plrPtr->wpos().toAIVector().quickDistTo(_PathCont.getDestination()); + if (distContDestToRealDest > 4) // update only each 4 meters. + { + _PathCont.setDestination(plrPtr->wpos()); + _PathPos._Angle = plrPtr->theta(); + } + + // Need to wait for a correct position before moving? + CAIVector const& dest = _PathCont.getDestination(); + if (dest.x()==0 || dest.y()==0) + return; for (uint i = 0; i < pgrp.bots().size(); ++i) { @@ -2371,33 +2382,28 @@ void CGrpProfileFollowPlayer::updateProfile(uint ticksSinceLastUpdate) 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)) + float dist; + if (sbot->getPersistent().getOwner()->getSpawnObj()->checkProfileParameter("running")) 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) + if ((_PathCont.getDestination() - sbot->wpos().toAIVector()).quickNorm() > 6.f) { - nlwarning("Problem with following player"); - } - + // Move + CFollowPath::TFollowStatus const status = CFollowPath::getInstance()->followPath( + sbot, + _PathPos, + _PathCont, + dist, + _DispersionRadius/10.f, + 0.5f); + if (status==CFollowPath::FOLLOW_NO_PATH) + { + nlwarning("Problem with following player"); + } + } } } diff --git a/ryzom/server/src/ai_service/doc/doxycfg/commondoc.cfg b/ryzom/server/src/ai_service/doc/doxycfg/commondoc.cfg index 1d48c0c84c..561e359828 100644 --- a/ryzom/server/src/ai_service/doc/doxycfg/commondoc.cfg +++ b/ryzom/server/src/ai_service/doc/doxycfg/commondoc.cfg @@ -6,7 +6,7 @@ # (C) 2001 Radon Labs GmbH #------------------------------------------------------------------------------ -# If you have dot (http://www.research.att.com/sw/tools/graphviz/) +# If you have dot (http://www.research.att.com/sw/tools/graphviz/) # on your system, then you can uncomment this line for more detailed graphs. # HAVE_DOT = YES @@ -27,7 +27,7 @@ BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ALWAYS_DETAILED_SEC = NO FULL_PATH_NAMES = NO -STRIP_FROM_PATH = +STRIP_FROM_PATH = INTERNAL_DOCS = NO CLASS_DIAGRAMS = YES DETAILS_AT_TOP = YES @@ -35,7 +35,7 @@ DETAILS_AT_TOP = YES # Setting this to NO, drops the .CHM size from 5mb to 3mb. SOURCE_BROWSER = YES -INLINE_SOURCES = NO +INLINE_SOURCES = YES STRIP_CODE_COMMENTS = YES CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO @@ -47,13 +47,13 @@ INLINE_INFO = YES SORT_MEMBER_DOCS = NO DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 4 -ENABLED_SECTIONS = +ENABLED_SECTIONS = GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES -ALIASES = "cmd=\par Script Command:\n" -ALIASES += "input=\par Command Input:\n" -ALIASES += "output=\par Command Output:\n" +ALIASES = "cmd=\par Script Command:\n" +ALIASES += "input=\par Command Input:\n" +ALIASES += "output=\par Command Output:\n" ALIASES += "info=\par Command Description:\n" ALIASES += "classinfo=\par Class Description:\n" ALIASES += "scriptclass=\file\n\par Class:\n" @@ -63,19 +63,19 @@ QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = NO WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = +WARN_LOGFILE = FILE_PATTERNS = *.h *.cc *.cpp *.dox RECURSIVE = NO -EXAMPLE_PATH = -EXAMPLE_PATTERNS = -IMAGE_PATH = -INPUT_FILTER = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +IMAGE_PATH = +INPUT_FILTER = FILTER_SOURCE_FILES = NO ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = +IGNORE_PREFIX = GENERATE_HTML = YES HTML_OUTPUT = html @@ -93,8 +93,8 @@ GENERATE_LATEX = NO LATEX_OUTPUT = latex COMPACT_LATEX = NO PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = +EXTRA_PACKAGES = +LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO @@ -103,7 +103,7 @@ GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = +RTF_STYLESHEET_FILE = GENERATE_MAN = NO MAN_OUTPUT = man @@ -114,10 +114,10 @@ ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO diff --git a/ryzom/server/src/ai_service/nf_grp_npc.cpp b/ryzom/server/src/ai_service/nf_grp_npc.cpp index 0a67aea43c..ad9ac13ce1 100644 --- a/ryzom/server/src/ai_service/nf_grp_npc.cpp +++ b/ryzom/server/src/ai_service/nf_grp_npc.cpp @@ -2745,9 +2745,6 @@ void setEquipment_s_(CStateInstance* entity, CScriptStack& stack) stack.pop(); IManagerParent* const managerParent = entity->getGroup()->getOwner()->getOwner(); - CAIInstance* const aiInstance = dynamic_cast<CAIInstance*>(managerParent); - if (!aiInstance) - return; std::vector<CAIActions::CArg> args; std::vector<std::string> equipements; From 37c7df063e89f9ad5b5443f13072759dd8b5d67f Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Thu, 5 Oct 2023 12:43:57 +0200 Subject: [PATCH 085/194] Added groupBots and displayInfos commands --- ryzom/server/src/ai_service/commands.cpp | 98 ++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/ryzom/server/src/ai_service/commands.cpp b/ryzom/server/src/ai_service/commands.cpp index 10db3a862a..c017af8a76 100644 --- a/ryzom/server/src/ai_service/commands.cpp +++ b/ryzom/server/src/ai_service/commands.cpp @@ -1697,6 +1697,42 @@ NLMISC_COMMAND(getDatasetId,"get datasetid of bots with name matchiong the given return true; } + +NLMISC_COMMAND(groupBots,"get number of bots (total and alive (spawned))", "<groupFilter>") +{ + if (args.size()!=1) + return false; + + string const& grpName = args[0]; + uint8 spawneds = 0; + uint8 total = 0; + + vector<CGroup*> grps; + /// try to find the bot name + buildFilteredGroupList(grps, grpName); + if (!grps.empty()) + { + FOREACHC(itGrp, vector<CGroup*>, grps) + { + CGroup* grp = *itGrp; + if (grp == NULL) + continue; + + FOREACH(itBot, CCont<CBot>, grp->bots()) + { + CBot* bot = *itBot; + CSpawnBot* spawnBot = bot->getSpawnObj(); + total++; + if (spawnBot != NULL && spawnBot->isAlive()) + spawneds++; + } + } + } + log.displayNL("%u/%u", spawneds, total); + return true; +} + + NLMISC_COMMAND(script,"execute a script for groups matching the given filter [buffered]","<groupFilter> <code>") { clearBufferedRetStrings(); @@ -1968,6 +2004,68 @@ NLMISC_COMMAND(displayTarget,"display bot target status for given bot(s) or play return true; } + + +NLMISC_COMMAND(displayInfos,"display bot status for given bot(s) or player(s)","<bot id>[...]") +{ + if(args.size() <1) + return false; + + CLogStringWriter stringWriter(&log); + + for (uint i=0;i<args.size();++i) + { + CAIEntityPhysical* EntityPtr = CAIS::instance().tryToGetEntityPhysical(args[i].c_str()); + if (!EntityPtr) + { +// log.displayNL("=> can't find entity: %s", args[i].c_str()); + continue; + } + + CAIEntityPhysical *phys=EntityPtr->getTarget(); + + if (!phys) + { + log.displayNL("=> bot %s have no target", args[i].c_str()); + continue; + } + + bool found=false; + + switch (phys->getRyzomType()) + { + case RYZOMID::npc: + case RYZOMID::creature: + case RYZOMID::pack_animal: + break; + case RYZOMID::player: + log.displayNL("=> target is a player"); + break; + default: + { + CSpawnBot* spawnBot=dynamic_cast<CSpawnBot*>(phys); + if (spawnBot) + { + vector<string> strings = spawnBot->getPersistent().getMultiLineInfoString(); + FOREACHC(itString, vector<string>, strings) + log.displayNL("%s", itString->c_str()); + found=true; + } + + } + break; + } + + if (!found) + { + log.displayNL("=> can't display information for the target of: %s", args[i].c_str()); + } + + } + return true; +} + + NLMISC_COMMAND(displayVision3x3,"display 3x3 cell vision centred on a given coordinate in the given aIInstance","<aiInstance> <x><y>") { if(args.size()!=3) From ad6dfdcf435eef7e47a10ef1abdb86dfd83ded8b Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Thu, 5 Oct 2023 12:44:46 +0200 Subject: [PATCH 086/194] Added spawnCrystalItem --- .../src/interface_v3/action_handler_game.cpp | 2 +- .../mission_manager/missions_commands.cpp | 75 ++++++++++++++++--- 2 files changed, 67 insertions(+), 10 deletions(-) diff --git a/ryzom/client/src/interface_v3/action_handler_game.cpp b/ryzom/client/src/interface_v3/action_handler_game.cpp index 790c8b13d1..1d1f78e1dc 100644 --- a/ryzom/client/src/interface_v3/action_handler_game.cpp +++ b/ryzom/client/src/interface_v3/action_handler_game.cpp @@ -2500,7 +2500,7 @@ class CAHTarget : public IActionHandler if (preferCompleteMatch) { // Try to get the entity with complete match first - entity = EntitiesMngr.getEntityByName (entityName, false, true); + entity = EntitiesMngr.getEntityByName(entityName, false, true); } if (entity == NULL && !keywords.empty()) diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index c2827f029e..ef0b2d2aa3 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -38,10 +38,12 @@ #include "weather_everywhere.h" #include "death_penalties.h" #include "harvest_source.h" + #include "mission_manager/mission_team.h" #include "mission_manager/mission_step_ai.h" #include "mission_manager/mission_guild.h" #include "shop_type/named_items.h" +#include "modules/client_command_forwarder.h" #include "guild_manager/guild_manager.h" #include "guild_manager/guild.h" #include "guild_manager/guild_member_module.h" @@ -622,11 +624,11 @@ NLMISC_COMMAND(getEid, "get entitiy id of entity", "<uid>") NLMISC_COMMAND(spawnItem, "Spawn a new Item", "<uid> <inv> <quantity(0=force)> <sheetid> <quality> <drop=0|1> [<phraseid>|<param>=<value>,*]") { - GET_ACTIVE_CHARACTER - if (args.size() < 6) return false; + GET_ACTIVE_CHARACTER + string selected_inv = args[1]; CInventoryPtr inventory = getInventory(c, selected_inv); @@ -731,11 +733,11 @@ NLMISC_COMMAND(spawnItem, "Spawn a new Item", "<uid> <inv> <quantity(0=force)> < NLMISC_COMMAND(spawnNamedItem, "Spawn a named Item", "<uid> <inv> <quantity> <named_item>") { - GET_ACTIVE_CHARACTER - if (args.size() < 4) return false; + GET_ACTIVE_CHARACTER + string selected_inv = args[1]; CInventoryPtr inventory = getInventory(c, selected_inv); @@ -763,6 +765,66 @@ NLMISC_COMMAND(spawnNamedItem, "Spawn a named Item", "<uid> <inv> <quantity> <na return true; } +// spawnCrystalItem 2 temporary allegory 150 jloot_generic.sbrick,jboost_100x.sbrick + +NLMISC_COMMAND(spawnCrystalItem, "Spawn a crystalized spell or allegory", "<uid> <inv> <spell|allegory> <sap_charge> <sbrick1>[,<sbrick2>,...]") +{ + + GET_ACTIVE_CHARACTER + + if (args.size() < 5) + return false; + + string selected_inv = args[1]; + + CInventoryPtr inventory = getInventory(c, selected_inv); + if (inventory == NULL) + { + log.displayNL("ERR: invalid inventory"); + return true; + } + + bool isSpell = args[2] == "spell"; + + CSheetId sheet; + if (isSpell) + sheet = CSheetId("crystalized_spell.sitem"); + else + sheet = CSheetId("crystalized_allegory.sitem"); + + uint16 sap_charge; + NLMISC::fromString(args[3], sap_charge); + + // Get Sbricks + std::vector<CSheetId> sheets; + std::vector<string> sheet_names; + NLMISC::splitString(args[4], ",", sheet_names); + for (uint32 i=0; i<sheet_names.size(); i++) + { + CSheetId sheet = CSheetId(sheet_names[i]); + sheets.push_back(sheet); + } + + + CGameItemPtr item = GameItemManager.createItem(sheet, sap_charge, true, true); + if (item != NULL) + { + if (c->addItemToInventory(getTInventory(selected_inv), item)) + { + item->recommended(sap_charge); + item->applyEnchantment(sheets); + + log.displayNL("OK"); + return true; + } + item.deleteItem(); + } + + log.displayNL("ERR: adding item"); + return true; +} + + //---------------------------------------------------------------------------- NLMISC_COMMAND(getItemList, "get list of items of character by filter", "<uid> [bag sheet quantity_min quantity_max quality_min quality_max extra_infos]") @@ -2583,11 +2645,6 @@ NLMISC_COMMAND(spawn, "spawn entity", "<uid> quantity sheet dispersion spawnbot uint32 nbBots; fromString(args[1], nbBots); - if (nbBots<=0) - { - log.displayNL("ERR: invalid bot count"); - return false; - } NLMISC::CSheetId sheetId(args[2]); if (sheetId == NLMISC::CSheetId::Unknown) From 5641d79f60c5ec04ddd11433b42ba3f03903a0ae Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 6 Oct 2023 11:43:01 +0200 Subject: [PATCH 087/194] Fix addEntitiesTrigger --- .../mission_manager/missions_commands.cpp | 22 ++++++++-------- .../player_manager/character.cpp | 1 - .../entities_game_service/zone_manager.cpp | 17 ++++++------- .../src/entities_game_service/zone_manager.h | 25 ++++++++++--------- 4 files changed, 32 insertions(+), 33 deletions(-) diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index ef0b2d2aa3..1ffde45423 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -5253,34 +5253,34 @@ NLMISC_COMMAND(addEntitiesTrigger, "add an Entity as RP points trigger", "<uid> GET_ACTIVE_CHARACTER - TAIAlias alias; + CEntityId id; string e = args[1]; if (e == "_target_") { - alias = CAIAliasTranslator::getInstance()->getAIAlias(c->getTarget()); + id = c->getTarget(); } else if (e == "_self_") { - alias = CAIAliasTranslator::getInstance()->getAIAlias(c->getId()); + id = c->getId(); } else { vector<TAIAlias> aliases; CAIAliasTranslator::getInstance()->getNPCAliasesFromName( e, aliases ); - if ( aliases.empty() ) - { - log.displayNL("ERR: no entity"); - return true; - } - alias = aliases[0]; + if (aliases.empty()) + id.fromString(args[1].c_str()); + else + id = CAIAliasTranslator::getInstance()->getEntityId(aliases[0]); } + if (id == CEntityId::Unknown) + return "ERR: no entity"; uint16 distance; fromString(args[2], distance); string url = args[3]; - CZoneManager::getInstance().addEntitiesTrigger(alias, distance, url); - log.displayNL("OK"); + CZoneManager::getInstance().addEntitiesTrigger(id, distance, url); + log.displayNL("%s", id.toString().c_str()); return true; } diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index 7b2874cca3..494a030f92 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -12358,7 +12358,6 @@ void CCharacter::addRpPoints(sint32 points) _LastRpPointsWin = CTickEventHandler::getGameCycle(); } - nlinfo("Add rp points : %d", points); if (_RpPoints + points > 0) _RpPoints += points; else diff --git a/ryzom/server/src/entities_game_service/zone_manager.cpp b/ryzom/server/src/entities_game_service/zone_manager.cpp index 8db6c439d3..55384ab563 100644 --- a/ryzom/server/src/entities_game_service/zone_manager.cpp +++ b/ryzom/server/src/entities_game_service/zone_manager.cpp @@ -1899,31 +1899,30 @@ void CZoneManager::updateCharacterPosition( CCharacter * user, uint32 elapsedTim } // Trigger entities - std::map<TAIAlias, uint8>::const_iterator it; + std::map<CEntityId, uint8>::const_iterator it; for (it = EntitiesDistanceTriggers.begin(); it != EntitiesDistanceTriggers.end(); it++) { - nlinfo("Entity trigger : %s", NLMISC::toString(it->first).c_str()); + //nlinfo("Entity trigger : %s", NLMISC::toString(it->first).c_str()); if (it->second == 0) { - std::map<TAIAlias, std::string>::const_iterator it2 = EntitiesUrlTriggers.find(it->first); + std::map<CEntityId, std::string>::const_iterator it2 = EntitiesUrlTriggers.find(it->first); if ( it2 != EntitiesUrlTriggers.end() ) user->sendRpPoints(it2->second); } else { - nlinfo("Distance = %d", it->second); - const CEntityId & botId = CAIAliasTranslator::getInstance()->getEntityId(it->first); - if ( botId != CEntityId::Unknown ) + //nlinfo("Distance = %d", it->second); + if ( it->first != CEntityId::Unknown ) { - nlinfo("Botid found"); - CEntityBase *entityBase = CreatureManager.getCreature (botId); + //nlinfo("Botid found"); + CEntityBase *entityBase = CEntityBaseManager::getEntityBasePtr(it->first); if (entityBase != NULL) { sint32 x = entityBase->getState().X/1000.f; sint32 y = entityBase->getState().Y/1000.f; sint32 px = user->getState().X/1000.f; sint32 py = user->getState().Y/1000.f; - nlinfo("entityBase found, check pos %i, %i, %i, %i", x, y, px, py); + //nlinfo("entityBase found, check pos %i, %i, %i, %i", x, y, px, py); if ((px-x)*(px-x)+(py-y)*(py-y) < it->second * it->second) user->addRpPoints(elapsedTime); } diff --git a/ryzom/server/src/entities_game_service/zone_manager.h b/ryzom/server/src/entities_game_service/zone_manager.h index 3a27f62b38..6078ee6612 100644 --- a/ryzom/server/src/entities_game_service/zone_manager.h +++ b/ryzom/server/src/entities_game_service/zone_manager.h @@ -543,21 +543,21 @@ class CZoneManager : public NLMISC::CSingleton<CZoneManager> } // Global Triggers for entities - std::map<TAIAlias, std::string> EntitiesUrlTriggers; - std::map<TAIAlias, uint8> EntitiesDistanceTriggers; - inline void addEntitiesTrigger(const TAIAlias alias, uint16 distance, const std::string url) + std::map<NLMISC::CEntityId, std::string> EntitiesUrlTriggers; + std::map<NLMISC::CEntityId, uint8> EntitiesDistanceTriggers; + inline void addEntitiesTrigger(const NLMISC::CEntityId &id, uint16 distance, const std::string url) { - EntitiesUrlTriggers[alias] = url; - EntitiesDistanceTriggers[alias] = distance; + EntitiesUrlTriggers[id] = url; + EntitiesDistanceTriggers[id] = distance; } - inline void delEntitiesTrigger(const TAIAlias alias) + inline void delEntitiesTrigger(const NLMISC::CEntityId &id) { - std::map<TAIAlias, std::string>::const_iterator it = EntitiesUrlTriggers.find(alias); + std::map<NLMISC::CEntityId, std::string>::const_iterator it = EntitiesUrlTriggers.find(id); if ( it != EntitiesUrlTriggers.end() ) EntitiesUrlTriggers.erase(it); - std::map<TAIAlias, uint8>::const_iterator it2 = EntitiesDistanceTriggers.find(alias); + std::map<NLMISC::CEntityId, uint8>::const_iterator it2 = EntitiesDistanceTriggers.find(id); if ( it2 != EntitiesDistanceTriggers.end() ) EntitiesDistanceTriggers.erase(it2); } @@ -565,12 +565,13 @@ class CZoneManager : public NLMISC::CSingleton<CZoneManager> inline void delEntitiesTriggers() { EntitiesDistanceTriggers.clear(); + EntitiesUrlTriggers.clear(); } - inline std::string getEntitiesUrlTrigger(const TAIAlias alias) + inline std::string getEntitiesUrlTrigger(const NLMISC::CEntityId &id) { std::string url; - std::map<TAIAlias, std::string>::const_iterator it = EntitiesUrlTriggers.find(alias); + std::map<NLMISC::CEntityId, std::string>::const_iterator it = EntitiesUrlTriggers.find(id); if ( it != EntitiesUrlTriggers.end() ) { url = it->second; @@ -578,10 +579,10 @@ class CZoneManager : public NLMISC::CSingleton<CZoneManager> return url; } - inline uint16 getEntitiesDistanceTrigger(const TAIAlias alias) + inline uint16 getEntitiesDistanceTrigger(const NLMISC::CEntityId &id) { uint16 distance = 0; - std::map<TAIAlias, uint8>::const_iterator it = EntitiesDistanceTriggers.find(alias); + std::map<NLMISC::CEntityId, uint8>::const_iterator it = EntitiesDistanceTriggers.find(id); if ( it != EntitiesDistanceTriggers.end() ) distance = it->second; return distance; From 9187c1d54efee5e12481604b4c1a10063272271b Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 6 Oct 2023 23:50:10 +0200 Subject: [PATCH 088/194] Fix --- ryzom/server/src/ai_service/ai_instance.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ryzom/server/src/ai_service/ai_instance.cpp b/ryzom/server/src/ai_service/ai_instance.cpp index 6db8caac81..d0711ddaa0 100644 --- a/ryzom/server/src/ai_service/ai_instance.cpp +++ b/ryzom/server/src/ai_service/ai_instance.cpp @@ -688,7 +688,6 @@ CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& _LastGroupAlias++; string name = grpName.empty() ? NLMISC::toString("event_group_%u", _LastGroupAlias):grpName; - string botname = botsName.empty() ? name : botsName; // Create a group CGroupNpc* grp = new CGroupNpc(_EventNpcManager, _LastGroupAlias, name, RYAI_MAP_CRUNCH::Nothing); // Register it in the manager @@ -697,7 +696,7 @@ CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& grp->setAutoSpawn(false); grp->botVpx = vpx; - grp->botName = botname; + grp->botName = botsName; grp->setName(name); grp->clearParameters(); grp->setPlayerAttackable(true); @@ -708,7 +707,7 @@ CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& grp->clrBotsAreNamedFlag(); if (nbBots > 0) - eventCreateNpcBot(grp, nbBots, false, sheetId, pos, "", orientation, dispersionRadius, look, botname, vpx); + eventCreateNpcBot(grp, nbBots, false, sheetId, pos, "", orientation, dispersionRadius, look, botsName, vpx); grp->spawn(); CSpawnGroupNpc* spawnGroup = grp->getSpawnObj(); @@ -746,7 +745,7 @@ CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const& } if (spawnBots) - grp->getSpawnObj()->spawnBots(botname, vpx); + grp->getSpawnObj()->spawnBots(botsName, vpx); return grp; } From e0d19d36d3d87a5b5749a9b921bddd40f883d2db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Meelis=20M=C3=A4gi?= <nimetu@gmail.com> Date: Mon, 9 Oct 2023 10:04:03 +0000 Subject: [PATCH 089/194] Resolve "Emotes like /wave not using player ignore list" --- .../src/input_output_service/chat_manager.cpp | 19 ++++++++++++++----- .../src/input_output_service/chat_manager.h | 3 ++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/ryzom/server/src/input_output_service/chat_manager.cpp b/ryzom/server/src/input_output_service/chat_manager.cpp index 03afd7f3b5..2f483b6832 100644 --- a/ryzom/server/src/input_output_service/chat_manager.cpp +++ b/ryzom/server/src/input_output_service/chat_manager.cpp @@ -1832,10 +1832,10 @@ void CChatManager::sendEmoteTextToAudience( const TDataSetRow& sender,const std // ignore users in the excluded vector if ( std::find( excluded.begin(),excluded.end(), (*itA) ) == excluded.end() ) { + static ucstring ucstr = ucstring(""); // the phrase uint32 sentId = STRING_MANAGER::sendStringToClient( *itA,phraseId.c_str(),params,&IosLocalSender ); - // send phrase id with an invalid sender, so that client dont display "toto says : toto bows" - sendChat2Ex( CChatGroup::say, *itA, sentId, TDataSetRow::createFromRawIndex( INVALID_DATASET_ROW ) ); + sendChat2Ex( CChatGroup::say, *itA, sentId, sender, ucstr, true ); } } // restore old chat mode @@ -2253,7 +2253,7 @@ void CChatManager::sendChatParam( CChatGroup::TGroupType senderChatMode, const T // sendChat2Ex // //----------------------------------------------- -void CChatManager::sendChat2Ex( CChatGroup::TGroupType senderChatMode, const TDataSetRow &receiver, uint32 phraseId, const TDataSetRow &sender, ucstring customTxt ) +void CChatManager::sendChat2Ex( CChatGroup::TGroupType senderChatMode, const TDataSetRow &receiver, uint32 phraseId, const TDataSetRow &sender, ucstring customTxt, bool isEmote ) { CCharacterInfos * charInfos = NULL; if( sender.isValid() /* != CEntityId::Unknown*/ ) @@ -2296,8 +2296,17 @@ void CChatManager::sendChat2Ex( CChatGroup::TGroupType senderChatMode, const TDa GenericXmlMsgHeaderMngr.pushNameToStream( "STRING:CHAT2", bms ); CChatMsg2 chatMsg; - chatMsg.CompressedIndex = sender.getCompressedIndex(); - chatMsg.SenderNameId = charInfos ? charInfos->NameIndex : 0; // empty string if there is no sender + if (isEmote) + { + TDataSetRow senderFake = TDataSetRow::createFromRawIndex( INVALID_DATASET_ROW ); + chatMsg.CompressedIndex = senderFake.getCompressedIndex(); + chatMsg.SenderNameId = 0; + } + else + { + chatMsg.CompressedIndex = sender.getCompressedIndex(); + chatMsg.SenderNameId = charInfos ? charInfos->NameIndex : 0; // empty string if there is no sender + } chatMsg.ChatMode = (uint8) senderChatMode; chatMsg.PhraseId = phraseId; chatMsg.CustomTxt = customTxt; diff --git a/ryzom/server/src/input_output_service/chat_manager.h b/ryzom/server/src/input_output_service/chat_manager.h index b3af3538be..f8699978b8 100644 --- a/ryzom/server/src/input_output_service/chat_manager.h +++ b/ryzom/server/src/input_output_service/chat_manager.h @@ -416,8 +416,9 @@ private : * \param phraseId the string manager string number of the chat phrase * \param sender is the id of the sender * \param customTxt is a custom text which can be added immediately after the chat message, on the same line + * \param isEmote if true, change receiver to unknown so that client dont display "toto says : toto bows" */ - void sendChat2Ex( CChatGroup::TGroupType senderChatMode, const TDataSetRow &receiver, uint32 phraseId, const TDataSetRow &sender = TDataSetRow(), ucstring customTxt = ucstring("")); + void sendChat2Ex( CChatGroup::TGroupType senderChatMode, const TDataSetRow &receiver, uint32 phraseId, const TDataSetRow &sender = TDataSetRow(), ucstring customTxt = ucstring(""), bool isEmote = false); /** * Send a custom emote chat message From f4fd10db49926ba67fc18db4f23ba1f21976bcaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Meelis=20M=C3=A4gi?= <nimetu@gmail.com> Date: Mon, 9 Oct 2023 10:04:03 +0000 Subject: [PATCH 090/194] Resolve "Emotes like /wave not using player ignore list" --- .../src/input_output_service/chat_manager.cpp | 19 ++++++++++++++----- .../src/input_output_service/chat_manager.h | 3 ++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/ryzom/server/src/input_output_service/chat_manager.cpp b/ryzom/server/src/input_output_service/chat_manager.cpp index 03afd7f3b5..2f483b6832 100644 --- a/ryzom/server/src/input_output_service/chat_manager.cpp +++ b/ryzom/server/src/input_output_service/chat_manager.cpp @@ -1832,10 +1832,10 @@ void CChatManager::sendEmoteTextToAudience( const TDataSetRow& sender,const std // ignore users in the excluded vector if ( std::find( excluded.begin(),excluded.end(), (*itA) ) == excluded.end() ) { + static ucstring ucstr = ucstring(""); // the phrase uint32 sentId = STRING_MANAGER::sendStringToClient( *itA,phraseId.c_str(),params,&IosLocalSender ); - // send phrase id with an invalid sender, so that client dont display "toto says : toto bows" - sendChat2Ex( CChatGroup::say, *itA, sentId, TDataSetRow::createFromRawIndex( INVALID_DATASET_ROW ) ); + sendChat2Ex( CChatGroup::say, *itA, sentId, sender, ucstr, true ); } } // restore old chat mode @@ -2253,7 +2253,7 @@ void CChatManager::sendChatParam( CChatGroup::TGroupType senderChatMode, const T // sendChat2Ex // //----------------------------------------------- -void CChatManager::sendChat2Ex( CChatGroup::TGroupType senderChatMode, const TDataSetRow &receiver, uint32 phraseId, const TDataSetRow &sender, ucstring customTxt ) +void CChatManager::sendChat2Ex( CChatGroup::TGroupType senderChatMode, const TDataSetRow &receiver, uint32 phraseId, const TDataSetRow &sender, ucstring customTxt, bool isEmote ) { CCharacterInfos * charInfos = NULL; if( sender.isValid() /* != CEntityId::Unknown*/ ) @@ -2296,8 +2296,17 @@ void CChatManager::sendChat2Ex( CChatGroup::TGroupType senderChatMode, const TDa GenericXmlMsgHeaderMngr.pushNameToStream( "STRING:CHAT2", bms ); CChatMsg2 chatMsg; - chatMsg.CompressedIndex = sender.getCompressedIndex(); - chatMsg.SenderNameId = charInfos ? charInfos->NameIndex : 0; // empty string if there is no sender + if (isEmote) + { + TDataSetRow senderFake = TDataSetRow::createFromRawIndex( INVALID_DATASET_ROW ); + chatMsg.CompressedIndex = senderFake.getCompressedIndex(); + chatMsg.SenderNameId = 0; + } + else + { + chatMsg.CompressedIndex = sender.getCompressedIndex(); + chatMsg.SenderNameId = charInfos ? charInfos->NameIndex : 0; // empty string if there is no sender + } chatMsg.ChatMode = (uint8) senderChatMode; chatMsg.PhraseId = phraseId; chatMsg.CustomTxt = customTxt; diff --git a/ryzom/server/src/input_output_service/chat_manager.h b/ryzom/server/src/input_output_service/chat_manager.h index b3af3538be..f8699978b8 100644 --- a/ryzom/server/src/input_output_service/chat_manager.h +++ b/ryzom/server/src/input_output_service/chat_manager.h @@ -416,8 +416,9 @@ private : * \param phraseId the string manager string number of the chat phrase * \param sender is the id of the sender * \param customTxt is a custom text which can be added immediately after the chat message, on the same line + * \param isEmote if true, change receiver to unknown so that client dont display "toto says : toto bows" */ - void sendChat2Ex( CChatGroup::TGroupType senderChatMode, const TDataSetRow &receiver, uint32 phraseId, const TDataSetRow &sender = TDataSetRow(), ucstring customTxt = ucstring("")); + void sendChat2Ex( CChatGroup::TGroupType senderChatMode, const TDataSetRow &receiver, uint32 phraseId, const TDataSetRow &sender = TDataSetRow(), ucstring customTxt = ucstring(""), bool isEmote = false); /** * Send a custom emote chat message From 9bc4510bb9d20e81a56a5b156afba1cc24e817e2 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Mon, 9 Oct 2023 17:49:38 +0200 Subject: [PATCH 091/194] Fix --- ryzom/client/src/game_context_menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/client/src/game_context_menu.cpp b/ryzom/client/src/game_context_menu.cpp index 5c64b19645..a571ae2a1a 100644 --- a/ryzom/client/src/game_context_menu.cpp +++ b/ryzom/client/src/game_context_menu.cpp @@ -775,7 +775,7 @@ void CGameContextMenu::updateContextMenuMissionsOptions( bool forceHide ) if (result == string("Qui etes-vous ?") || result == string("Wer bist Du?") || result == string("Who are you?") - || result == string("Quién eres tú?") + || result == string("¿Quién eres tú?") || result == string("Кто Ñ‚Ñ‹?")) { pVTM->setActive(false); From 47083cc8944f16e9c4036fe8bc45c582436b24a2 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Wed, 18 Oct 2023 19:17:20 +0200 Subject: [PATCH 092/194] Added new R2 4 islands --- .../common/data_common/r2/r2_entry_points.txt | 2142 +++--- ryzom/common/data_common/r2/r2_islands.xml | 5734 +++++++++-------- 2 files changed, 3961 insertions(+), 3915 deletions(-) diff --git a/ryzom/common/data_common/r2/r2_entry_points.txt b/ryzom/common/data_common/r2/r2_entry_points.txt index 643a416c70..018ec2bab7 100644 --- a/ryzom/common/data_common/r2/r2_entry_points.txt +++ b/ryzom/common/data_common/r2/r2_entry_points.txt @@ -1,1068 +1,1074 @@ -a1 uiR2_Lakes01 uiR2EntryPoint01 31346 -1310 N -a1 uiR2_Lakes01 uiR2EntryPoint02 31269 -1238 E -a1 uiR2_Lakes01 uiR2EntryPoint03 31456 -1379 N - -a1 uiR2_Lakes07 uiR2EntryPoint01 36264 -1103 S -a1 uiR2_Lakes07 uiR2EntryPoint02 36208 -1353 N -a1 uiR2_Lakes07 uiR2EntryPoint03 36478 -1269 W -a1 uiR2_Lakes07 uiR2EntryPoint04 36478 -1105 SW - -a1 uiR2_Lakes22 uiR2EntryPoint01 32250 -2800 W -a1 uiR2_Lakes22 uiR2EntryPoint02 31920 -3160 N -a1 uiR2_Lakes22 uiR2EntryPoint03 32080 -3090 N -a1 uiR2_Lakes22 uiR2EntryPoint04 32250 -3065 NE - -l1 uiR2_Lakes15 uiR2EntryPoint01 34634 -1872 SW -l1 uiR2_Lakes15 uiR2EntryPoint02 34258 -1991 W -l1 uiR2_Lakes15 uiR2EntryPoint03 34321 -1860 S -l1 uiR2_Lakes15 uiR2EntryPoint04 34510 -2060 W - -l1 uiR2_Lakes17 uiR2EntryPoint01 36150 -2310 NE -l1 uiR2_Lakes17 uiR2EntryPoint02 35936 -2243 S -l1 uiR2_Lakes17 uiR2EntryPoint03 35920 -1844 W -l1 uiR2_Lakes17 uiR2EntryPoint04 36103 -1923 SW -l1 uiR2_Lakes17 uiR2EntryPoint05 35895 -1935 S - -l1 uiR2_Lakes18 uiR2EntryPoint01 36725 -1993 E -l1 uiR2_Lakes18 uiR2EntryPoint02 36688 -2159 N -l1 uiR2_Lakes18 uiR2EntryPoint03 36879 -2217 N -l1 uiR2_Lakes18 uiR2EntryPoint04 36941 -1970 SW - -l1 uiR2_Lakes26 uiR2EntryPoint01 34460 -3120 E -l1 uiR2_Lakes26 uiR2EntryPoint02 34689 -2756 SW -l1 uiR2_Lakes26 uiR2EntryPoint03 34681 -3111 N -l1 uiR2_Lakes26 uiR2EntryPoint04 34671 -2931 N - -l1 uiR2_Lakes27 uiR2EntryPoint01 35605 -3080 NW -l1 uiR2_Lakes27 uiR2EntryPoint02 35520 -2780 S -l1 uiR2_Lakes27 uiR2EntryPoint03 35133 -2663 SE -l1 uiR2_Lakes27 uiR2EntryPoint04 35283 -3051 N - -l1 uiR2_Lakes38 uiR2EntryPoint01 36720 -3740 S -l1 uiR2_Lakes38 uiR2EntryPoint02 36751 -4024 NW -l1 uiR2_Lakes38 uiR2EntryPoint03 36230 -3767 E -l1 uiR2_Lakes38 uiR2EntryPoint04 36481 -3564 S - -l1 uiR2_Lakes39 uiR2EntryPoint01 37510 -3900 N -l1 uiR2_Lakes39 uiR2EntryPoint02 37299 -3575 SE -l1 uiR2_Lakes39 uiR2EntryPoint03 37861 -3719 W - -l2 uiR2_Lakes03 uiR2EntryPoint01 32961 -1388 N -l2 uiR2_Lakes03 uiR2EntryPoint02 32784 -1507 NE -l2 uiR2_Lakes03 uiR2EntryPoint03 33390 -1517 NW -l2 uiR2_Lakes03 uiR2EntryPoint04 33365 -916 SW -l2 uiR2_Lakes03 uiR2EntryPoint05 33033 -991 S - -l2 uiR2_Lakes08 uiR2EntryPoint01 36991 -1311 E -l2 uiR2_Lakes08 uiR2EntryPoint02 37197 -1547 NW -l2 uiR2_Lakes08 uiR2EntryPoint03 37230 -1035 S -l2 uiR2_Lakes08 uiR2EntryPoint04 37111 -1264 SE -l2 uiR2_Lakes08 uiR2EntryPoint05 37393 -1285 W - -l2 uiR2_Lakes16 uiR2EntryPoint01 35330 -2120 W -l2 uiR2_Lakes16 uiR2EntryPoint02 35180 -2010 S -l2 uiR2_Lakes16 uiR2EntryPoint03 35145 -2135 NE - -l2 uiR2_Lakes19 uiR2EntryPoint01 37681 -2167 N -l2 uiR2_Lakes19 uiR2EntryPoint02 37367 -2341 NW -l2 uiR2_Lakes19 uiR2EntryPoint03 37331 -2070 NE -l2 uiR2_Lakes19 uiR2EntryPoint04 37521 -1929 S -l2 uiR2_Lakes19 uiR2EntryPoint05 37773 -2008 W - -l2 uiR2_Lakes23 uiR2EntryPoint01 32727 -3120 W -l2 uiR2_Lakes23 uiR2EntryPoint02 32694 -2802 W -l2 uiR2_Lakes23 uiR2EntryPoint03 32523 -2995 E - -l2 uiR2_Lakes10 uiR2EntryPoint01 38531 -1379 NE -l2 uiR2_Lakes10 uiR2EntryPoint02 38962 -1092 S -l2 uiR2_Lakes10 uiR2EntryPoint03 38677 -1146 SE -l2 uiR2_Lakes10 uiR2EntryPoint04 38953 -1444 NW - -l2 uiR2_Lakes11 uiR2EntryPoint01 31531 -2280 NW -l2 uiR2_Lakes11 uiR2EntryPoint02 31517 -1946 SW -l2 uiR2_Lakes11 uiR2EntryPoint03 31107 -2130 NE -l2 uiR2_Lakes11 uiR2EntryPoint04 31203 -1938 SE -l2 uiR2_Lakes11 uiR2EntryPoint05 31358 -2065 NW - -l3 uiR2_Lakes14 uiR2EntryPoint01 33438 -2169 E -l3 uiR2_Lakes14 uiR2EntryPoint02 33562 -2128 SW -l3 uiR2_Lakes14 uiR2EntryPoint03 33590 -2230 NW - -l3 uiR2_Lakes21 uiR2EntryPoint01 31247 -2790 E -l3 uiR2_Lakes21 uiR2EntryPoint02 31128 -3031 N -l3 uiR2_Lakes21 uiR2EntryPoint03 31536 -2778 W -l3 uiR2_Lakes21 uiR2EntryPoint04 31413 -3101 NE -l3 uiR2_Lakes21 uiR2EntryPoint05 31306 -3168 NW - -l3 uiR2_Lakes31 uiR2EntryPoint01 31295 -4080 N -l3 uiR2_Lakes31 uiR2EntryPoint02 31425 -3724 SW -l3 uiR2_Lakes31 uiR2EntryPoint03 31258 -3747 SE - -l3 uiR2_Lakes04 uiR2EntryPoint01 33740 -1068 E -l3 uiR2_Lakes04 uiR2EntryPoint02 34268 -1202 W -l3 uiR2_Lakes04 uiR2EntryPoint03 34145 -1045 SW -l3 uiR2_Lakes04 uiR2EntryPoint04 33996 -1283 N -l3 uiR2_Lakes04 uiR2EntryPoint05 33691 -1206 E - -l3 uiR2_Lakes06 uiR2EntryPoint01 35468 -1272 N -l3 uiR2_Lakes06 uiR2EntryPoint02 35954 -1080 SW -l3 uiR2_Lakes06 uiR2EntryPoint03 35764 -1026 E -l3 uiR2_Lakes06 uiR2EntryPoint04 35438 -890 SE -l3 uiR2_Lakes06 uiR2EntryPoint05 35634 -1288 N - -l3 uiR2_Lakes09 uiR2EntryPoint01 37916 -1124 S -l3 uiR2_Lakes09 uiR2EntryPoint02 37709 -1451 NE -l3 uiR2_Lakes09 uiR2EntryPoint03 38149 -1051 SW -l3 uiR2_Lakes09 uiR2EntryPoint04 38073 -1412 NW - -l3 uiR2_Lakes20 uiR2EntryPoint01 38155 -2000 E -l3 uiR2_Lakes20 uiR2EntryPoint02 38290 -1813 E -l3 uiR2_Lakes20 uiR2EntryPoint03 38488 -1996 W -l3 uiR2_Lakes20 uiR2EntryPoint04 38289 -2183 S - -l4 uiR2_Lakes33 uiR2EntryPoint01 32370 -3880 N -l4 uiR2_Lakes33 uiR2EntryPoint02 32447 -3577 SE -l4 uiR2_Lakes33 uiR2EntryPoint03 32561 -3774 SW -l4 uiR2_Lakes33 uiR2EntryPoint04 32716 -3591 S -l4 uiR2_Lakes33 uiR2EntryPoint05 32721 -3914 N - -l4 uiR2_Lakes02 uiR2EntryPoint01 32059 -1392 N -l4 uiR2_Lakes02 uiR2EntryPoint02 32267 -1181 W -l4 uiR2_Lakes02 uiR2EntryPoint03 32053 -1159 SE - -l4 uiR2_Lakes05 uiR2EntryPoint01 34650 -1133 NE -l4 uiR2_Lakes05 uiR2EntryPoint02 35018 -1280 SW -l4 uiR2_Lakes05 uiR2EntryPoint03 34984 -889 SW -l4 uiR2_Lakes05 uiR2EntryPoint04 34769 -1166 NE - -l4 uiR2_Lakes12 uiR2EntryPoint01 32040 -2368 N -l4 uiR2_Lakes12 uiR2EntryPoint02 32401 -2210 SW -l4 uiR2_Lakes12 uiR2EntryPoint03 32019 -1939 S -l4 uiR2_Lakes12 uiR2EntryPoint04 31891 -2241 E - -l4 uiR2_Lakes24 uiR2EntryPoint01 33350 -3120 N -l4 uiR2_Lakes24 uiR2EntryPoint02 33200 -2865 N -l4 uiR2_Lakes24 uiR2EntryPoint03 33450 -2950 W - -l4 uiR2_Lakes34 uiR2EntryPoint01 33520 -3910 N -l4 uiR2_Lakes34 uiR2EntryPoint02 33206 -3990 W -l4 uiR2_Lakes34 uiR2EntryPoint03 33276 -3784 N -l4 uiR2_Lakes34 uiR2EntryPoint04 33619 -3638 NW -l4 uiR2_Lakes34 uiR2EntryPoint05 33335 -3829 NE - -o1 uiR2_Lakes25 uiR2EntryPoint01 33980 -3110 N -o1 uiR2_Lakes25 uiR2EntryPoint02 33900 -2990 NE -o1 uiR2_Lakes25 uiR2EntryPoint03 34105 -2760 SW - -o1 uiR2_Lakes28 uiR2EntryPoint01 36480 -3100 N -o1 uiR2_Lakes28 uiR2EntryPoint02 36146 -2679 SE -o1 uiR2_Lakes28 uiR2EntryPoint03 36324 -2871 S - -o1 uiR2_Lakes29 uiR2EntryPoint01 37500 -3110 N -o1 uiR2_Lakes29 uiR2EntryPoint02 37078 -2937 SW -o1 uiR2_Lakes29 uiR2EntryPoint03 37389 -2802 S - -o1 uiR2_Lakes30 uiR2EntryPoint01 38100 -2850 E -o1 uiR2_Lakes30 uiR2EntryPoint02 38414 -2715 S -o1 uiR2_Lakes30 uiR2EntryPoint03 38489 -3116 NW - -o1 uiR2_Lakes32 uiR2EntryPoint01 31900 -3600 E -o1 uiR2_Lakes32 uiR2EntryPoint02 32108 -3832 N -o1 uiR2_Lakes32 uiR2EntryPoint03 32112 -3672 W - -o1 uiR2_Lakes35 uiR2EntryPoint01 34200 -4080 E -o1 uiR2_Lakes35 uiR2EntryPoint02 34145 -3645 SE -o1 uiR2_Lakes35 uiR2EntryPoint03 34387 -3988 S - -o1 uiR2_Lakes36 uiR2EntryPoint01 34960 -3770 N -o1 uiR2_Lakes36 uiR2EntryPoint02 35149 -3703 SW -o1 uiR2_Lakes36 uiR2EntryPoint03 34957 -3586 S - -o1 uiR2_Lakes37 uiR2EntryPoint01 35760 -3750 N -o1 uiR2_Lakes37 uiR2EntryPoint02 35577 -3640 SE -o1 uiR2_Lakes37 uiR2EntryPoint03 35912 -3874 N -o1 uiR2_Lakes37 uiR2EntryPoint04 35902 -3589 SE - -o1 uiR2_Lakes40 uiR2EntryPoint01 38180 -3470 SE -o1 uiR2_Lakes40 uiR2EntryPoint01 38416 -3819 NE -o1 uiR2_Lakes40 uiR2EntryPoint01 38151 -3740 N - - -//z1 uiR2_Lakes13 uiR2EntryPoint01 32479 -2298 E -//z1 uiR2_Lakes13 uiR2EntryPoint02 32880 -2080 S -//z1 uiR2_Lakes13 uiR2EntryPoint03 33050 -2265 NW - -// Desert - - -a1 uiR2_Deserts03 uiR2EntryPoint01 22791 -1289 N -a1 uiR2_Deserts03 uiR2EntryPoint02 23041 -1284 NW -a1 uiR2_Deserts03 uiR2EntryPoint03 22873 -1110 SE - -a1 uiR2_Deserts21 uiR2EntryPoint01 25980 -2015 E -a1 uiR2_Deserts21 uiR2EntryPoint02 26452 -1963 W -a1 uiR2_Deserts21 uiR2EntryPoint03 26353 -1872 SW -a1 uiR2_Deserts21 uiR2EntryPoint04 26214 -1961 S - -a1 uiR2_Deserts32 uiR2EntryPoint01 28070 -2340 E -a1 uiR2_Deserts32 uiR2EntryPoint02 28240 -2719 N -a1 uiR2_Deserts32 uiR2EntryPoint03 28318 -2643 W -a1 uiR2_Deserts32 uiR2EntryPoint04 28293 -2445 W - -d1 uiR2_Deserts02 uiR2EntryPoint01 22383 -1512 N -d1 uiR2_Deserts02 uiR2EntryPoint02 22454 -1186 SW -d1 uiR2_Deserts02 uiR2EntryPoint03 22062 -1050 S -d1 uiR2_Deserts02 uiR2EntryPoint04 22072 -1289 NE - -d1 uiR2_Deserts10 uiR2EntryPoint01 28923 -1434 N -d1 uiR2_Deserts10 uiR2EntryPoint02 29217 -1371 E -d1 uiR2_Deserts10 uiR2EntryPoint03 28901 -1115 SW - -d1 uiR2_Deserts22 uiR2EntryPoint01 26950 -2015 N -d1 uiR2_Deserts22 uiR2EntryPoint02 26937 -1864 S -d1 uiR2_Deserts22 uiR2EntryPoint03 27089 -2042 NW - -d1 uiR2_Deserts23 uiR2EntryPoint01 27600 -1924 S -d1 uiR2_Deserts23 uiR2EntryPoint02 27575 -2351 NW -d1 uiR2_Deserts23 uiR2EntryPoint03 27545 -2211 N -d1 uiR2_Deserts23 uiR2EntryPoint04 27442 -1866 S - -d1 uiR2_Deserts28 uiR2EntryPoint01 25050 -2650 S -d1 uiR2_Deserts28 uiR2EntryPoint02 24910 -2819 E -d1 uiR2_Deserts28 uiR2EntryPoint03 24881 -2720 N -d1 uiR2_Deserts28 uiR2EntryPoint04 24915 -2511 SW - -d1 uiR2_Deserts29 uiR2EntryPoint01 25880 -2630 E -d1 uiR2_Deserts29 uiR2EntryPoint02 26022 -2374 SW -d1 uiR2_Deserts29 uiR2EntryPoint03 26156 -2560 N -d1 uiR2_Deserts29 uiR2EntryPoint04 26163 -2402 S - -d1 uiR2_Deserts31 uiR2EntryPoint01 27760 -2700 N -d1 uiR2_Deserts31 uiR2EntryPoint02 27404 -2588 S -d1 uiR2_Deserts31 uiR2EntryPoint03 27538 -2606 S -d1 uiR2_Deserts31 uiR2EntryPoint04 27413 -2744 NE - -d1 uiR2_Deserts05 uiR2EntryPoint01 24257 -1520 NE -d1 uiR2_Deserts05 uiR2EntryPoint02 24593 -1447 N -d1 uiR2_Deserts05 uiR2EntryPoint03 24341 -1184 NE -d1 uiR2_Deserts05 uiR2EntryPoint04 24535 -1054 S - -d1 uiR2_Deserts13 uiR2EntryPoint01 28942 -1919 S -d1 uiR2_Deserts13 uiR2EntryPoint02 28538 -2241 E -d1 uiR2_Deserts13 uiR2EntryPoint03 28814 -2251 NW -d1 uiR2_Deserts13 uiR2EntryPoint04 28956 -2079 W -d1 uiR2_Deserts13 uiR2EntryPoint05 28794 -1912 S - -d1 uiR2_Deserts17 uiR2EntryPoint01 23250 -1840 W -d1 uiR2_Deserts17 uiR2EntryPoint02 23096 -1943 NE -d1 uiR2_Deserts17 uiR2EntryPoint03 23034 -1839 E -d1 uiR2_Deserts17 uiR2EntryPoint04 23096 -1713 S - -d1 uiR2_Deserts24 uiR2EntryPoint01 27915 -1875 S -d1 uiR2_Deserts24 uiR2EntryPoint02 28136 -1960 S -d1 uiR2_Deserts24 uiR2EntryPoint03 28233 -1746 S -d1 uiR2_Deserts24 uiR2EntryPoint04 28324 -1841 W - -d3 uiR2_Deserts27 uiR2EntryPoint01 23305 -2454 E -d3 uiR2_Deserts27 uiR2EntryPoint02 23313 -2682 N -d3 uiR2_Deserts27 uiR2EntryPoint03 23464 -2611 N -d3 uiR2_Deserts27 uiR2EntryPoint04 23496 -2442 SW - -d3 uiR2_Deserts04 uiR2EntryPoint01 23452 -1050 SE -d3 uiR2_Deserts04 uiR2EntryPoint02 23846 -1435 W -d3 uiR2_Deserts04 uiR2EntryPoint03 23599 -1418 N -d3 uiR2_Deserts04 uiR2EntryPoint04 23927 -1163 W - -d3 uiR2_Deserts11 uiR2EntryPoint01 29554 -1468 N -d3 uiR2_Deserts11 uiR2EntryPoint02 29922 -1222 W -d3 uiR2_Deserts11 uiR2EntryPoint03 29622 -1048 S -d3 uiR2_Deserts11 uiR2EntryPoint04 29615 -1306 SE -d3 uiR2_Deserts11 uiR2EntryPoint05 29755 -1447 NW - -d3 uiR2_Deserts16 uiR2EntryPoint01 22304 -1856 E -d3 uiR2_Deserts16 uiR2EntryPoint02 22513 -1995 E -d3 uiR2_Deserts16 uiR2EntryPoint03 22687 -1891 N -d3 uiR2_Deserts16 uiR2EntryPoint04 22537 -1877 N - -d4 uiR2_Deserts18 uiR2EntryPoint01 23730 -2280 N -d4 uiR2_Deserts18 uiR2EntryPoint02 23666 -2154 NE -d4 uiR2_Deserts18 uiR2EntryPoint03 23871 -1977 SE -d4 uiR2_Deserts18 uiR2EntryPoint04 23570 -2056 NE -d4 uiR2_Deserts18 uiR2EntryPoint05 23834 -1997 W - -d4 uiR2_Deserts19 uiR2EntryPoint01 24560 -2015 N -d4 uiR2_Deserts19 uiR2EntryPoint02 24267 -1998 E -d4 uiR2_Deserts19 uiR2EntryPoint03 24841 -2002 W -d4 uiR2_Deserts19 uiR2EntryPoint04 24562 -1914 S - -d4 uiR2_Deserts09 uiR2EntryPoint01 27814 -1375 N -d4 uiR2_Deserts09 uiR2EntryPoint02 27471 -1503 E -d4 uiR2_Deserts09 uiR2EntryPoint03 27609 -1197 E -d4 uiR2_Deserts09 uiR2EntryPoint04 27730 -1088 S -d4 uiR2_Deserts09 uiR2EntryPoint05 27529 -1014 SE - -d4 uiR2_Deserts14 uiR2EntryPoint01 30629 -2300 N -// d4 uiR2_Deserts14 uiR2EntryPoint04 30747 -2023 SW -d4 uiR2_Deserts14 uiR2EntryPoint02 30577 -1836 S -d4 uiR2_Deserts14 uiR2EntryPoint03 30347 -2140 SE -// d4 uiR2_Deserts14 uiR2EntryPoint05 30407 -1835 SE - -d5 uiR2_Deserts15 uiR2EntryPoint01 21500 -1830 E -d5 uiR2_Deserts15 uiR2EntryPoint02 21933 -1833 W -d5 uiR2_Deserts15 uiR2EntryPoint03 21763 -1839 E -d5 uiR2_Deserts15 uiR2EntryPoint04 21515 -1913 N - -d5 uiR2_Deserts30 uiR2EntryPoint01 26650 -2650 E -d5 uiR2_Deserts30 uiR2EntryPoint02 27036 -2638 W -d5 uiR2_Deserts30 uiR2EntryPoint03 26922 -2433 SE -d5 uiR2_Deserts30 uiR2EntryPoint04 26779 -2504 S - -d5 uiR2_Deserts33 uiR2EntryPoint01 29510 -2040 S -d5 uiR2_Deserts33 uiR2EntryPoint02 29517 -2239 N -d5 uiR2_Deserts33 uiR2EntryPoint03 29712 -2523 NW -d5 uiR2_Deserts33 uiR2EntryPoint04 29920 -2157 W -d5 uiR2_Deserts33 uiR2EntryPoint05 29758 -2318 W - -d5 uiR2_Deserts08 uiR2EntryPoint01 26694 -1485 N -d5 uiR2_Deserts08 uiR2EntryPoint02 26949 -1512 NW -d5 uiR2_Deserts08 uiR2EntryPoint03 26482 -1366 E -d5 uiR2_Deserts08 uiR2EntryPoint04 26875 -1010 S -d5 uiR2_Deserts08 uiR2EntryPoint05 26460 -1205 NE - -d6 uiR2_Deserts06 uiR2EntryPoint01 25523 -1500 NW -d6 uiR2_Deserts06 uiR2EntryPoint02 25419 -1142 SW -d6 uiR2_Deserts06 uiR2EntryPoint03 25220 -1416 W -d6 uiR2_Deserts06 uiR2EntryPoint04 25168 -1168 SW - -d6 uiR2_Deserts20 uiR2EntryPoint01 25206 -2118 N -d6 uiR2_Deserts20 uiR2EntryPoint02 25435 -1997 W -d6 uiR2_Deserts20 uiR2EntryPoint03 25410 -2177 N -d6 uiR2_Deserts20 uiR2EntryPoint04 25532 -1942 N -d6 uiR2_Deserts20 uiR2EntryPoint05 25724 -2192 W - -d6 uiR2_Deserts25 uiR2EntryPoint01 21845 -2475 S -d6 uiR2_Deserts25 uiR2EntryPoint02 21891 -2836 W -d6 uiR2_Deserts25 uiR2EntryPoint03 21442 -2799 NW -d6 uiR2_Deserts25 uiR2EntryPoint04 21460 -2447 S -d6 uiR2_Deserts25 uiR2EntryPoint05 21765 -2480 W - -d6 uiR2_Deserts26 uiR2EntryPoint01 22627 -2480 W -d6 uiR2_Deserts26 uiR2EntryPoint02 22352 -2474 E -d6 uiR2_Deserts26 uiR2EntryPoint03 22925 -2483 W -d6 uiR2_Deserts26 uiR2EntryPoint04 22790 -2627 N - - - -o1 uiR2_Deserts07 uiR2EntryPoint01 26051 -1405 N -o1 uiR2_Deserts07 uiR2EntryPoint02 26153 -1044 S -o1 uiR2_Deserts07 uiR2EntryPoint03 25855 -1233 E -o1 uiR2_Deserts07 uiR2EntryPoint04 25818 -1027 SE - -o1 uiR2_Deserts12 uiR2EntryPoint01 30818 -1487 NW -o1 uiR2_Deserts12 uiR2EntryPoint02 30726 -1023 S -o1 uiR2_Deserts12 uiR2EntryPoint03 30369 -1083 SE -o1 uiR2_Deserts12 uiR2EntryPoint04 30389 -1307 E -o1 uiR2_Deserts12 uiR2EntryPoint05 30539 -1440 NW - - - -//z1 uiR2_Deserts01 uiR2EntryPoint01 21570 -1363 N -//z1 uiR2_Deserts01 uiR2EntryPoint02 21340 -1066 SE -//z1 uiR2_Deserts01 uiR2EntryPoint03 21678 -1129 SW -//z1 uiR2_Deserts01 uiR2EntryPoint04 21503 -1296 N - - - - -// Forest - - -a1 uiR2_Forest04 uiR2EntryPoint01 24213 -11157 W -a1 uiR2_Forest04 uiR2EntryPoint02 23975 -11225 E -a1 uiR2_Forest04 uiR2EntryPoint03 23827 -11373 NE -a1 uiR2_Forest04 uiR2EntryPoint04 24180 -11383 NW -a1 uiR2_Forest04 uiR2EntryPoint05 23871 -11059 SE -a1 uiR2_Forest04 uiR2EntryPoint06 24189 -10982 SW - -a1 uiR2_Forest05 uiR2EntryPoint01 24752 -11360 N -a1 uiR2_Forest05 uiR2EntryPoint02 24602 -11060 SE -a1 uiR2_Forest05 uiR2EntryPoint03 24865 -11100 SW -a1 uiR2_Forest05 uiR2EntryPoint04 25046 -11197 W -a1 uiR2_Forest05 uiR2EntryPoint05 24640 -11453 N -a1 uiR2_Forest05 uiR2EntryPoint06 24537 -11201 E - -a1 uiR2_Forest14 uiR2EntryPoint01 21282 -12196 N -a1 uiR2_Forest14 uiR2EntryPoint02 21276 -11986 S -a1 uiR2_Forest14 uiR2EntryPoint03 21276 -11766 S - -a1 uiR2_Forest27 uiR2EntryPoint01 21173 -12644 W -a1 uiR2_Forest27 uiR2EntryPoint02 21068 -12561 S -a1 uiR2_Forest27 uiR2EntryPoint03 21113 -12714 N -a1 uiR2_Forest27 uiR2EntryPoint04 21119 -12639 S - -a1 uiR2_Forest32 uiR2EntryPoint01 24680 -12600 SE -a1 uiR2_Forest32 uiR2EntryPoint02 24538 -13025 N -a1 uiR2_Forest32 uiR2EntryPoint03 24822 -13039 N -a1 uiR2_Forest32 uiR2EntryPoint04 24718 -12889 N -a1 uiR2_Forest32 uiR2EntryPoint05 24830 -12554 SW -a1 uiR2_Forest32 uiR2EntryPoint06 24659 -12750 E - -f1 uiR2_Forest03 uiR2EntryPoint01 23010 -11209 E -f1 uiR2_Forest03 uiR2EntryPoint02 23080 -11152 E -f1 uiR2_Forest03 uiR2EntryPoint03 23400 -11400 NW -f1 uiR2_Forest03 uiR2EntryPoint04 23400 -11000 SW -f1 uiR2_Forest03 uiR2EntryPoint05 23000 -11000 SE - -f1 uiR2_Forest19 uiR2EntryPoint01 24944 -12220 N -f1 uiR2_Forest19 uiR2EntryPoint02 25357 -12233 N -f1 uiR2_Forest19 uiR2EntryPoint03 25265 -12240 W -f1 uiR2_Forest19 uiR2EntryPoint04 24971 -11947 S -f1 uiR2_Forest19 uiR2EntryPoint05 25155 -12081 SE - -f1 uiR2_Forest23 uiR2EntryPoint01 28465 -12056 W -f1 uiR2_Forest23 uiR2EntryPoint02 28011 -12082 E -f1 uiR2_Forest23 uiR2EntryPoint03 28496 -12248 N -f1 uiR2_Forest23 uiR2EntryPoint04 28375 -11911 SE -f1 uiR2_Forest23 uiR2EntryPoint05 28194 -12118 E -f1 uiR2_Forest23 uiR2EntryPoint06 27926 -11988 SE - -f1 uiR2_Forest39 uiR2EntryPoint01 30520 -12600 S -f1 uiR2_Forest39 uiR2EntryPoint02 30143 -12958 E -f1 uiR2_Forest39 uiR2EntryPoint03 30195 -12559 SE -f1 uiR2_Forest39 uiR2EntryPoint04 30621 -12958 NW -f1 uiR2_Forest39 uiR2EntryPoint05 30298 -12694 SE -f1 uiR2_Forest39 uiR2EntryPoint06 30524 -12799 W -f1 uiR2_Forest39 uiR2EntryPoint07 30291 -12910 NE - -f1 uiR2_Forest41 uiR2EntryPoint01 22140 -13150 SE -f1 uiR2_Forest41 uiR2EntryPoint02 22401 -13440 NW -f1 uiR2_Forest41 uiR2EntryPoint03 22263 -13269 S -f1 uiR2_Forest41 uiR2EntryPoint04 22338 -13133 SW -f1 uiR2_Forest41 uiR2EntryPoint05 22173 -13476 NE - -f1 uiR2_Forest20 uiR2EntryPoint01 26110 -11936 SW -f1 uiR2_Forest20 uiR2EntryPoint02 25734 -11920 SE -f1 uiR2_Forest20 uiR2EntryPoint03 25691 -12200 SW -f1 uiR2_Forest20 uiR2EntryPoint04 26113 -12164 NW -f1 uiR2_Forest20 uiR2EntryPoint05 25950 -12097 N - -f1 uiR2_Forest31 uiR2EntryPoint01 23470 -12600 SE -f1 uiR2_Forest31 uiR2EntryPoint02 23681 -12712 S -f1 uiR2_Forest31 uiR2EntryPoint03 23510 -13001 NE -f1 uiR2_Forest31 uiR2EntryPoint04 23948 -13020 W -f1 uiR2_Forest31 uiR2EntryPoint05 23598 -12850 SW -f1 uiR2_Forest31 uiR2EntryPoint06 23995 -12787 W -f1 uiR2_Forest31 uiR2EntryPoint07 23879 -12573 W - -f2 uiR2_Forest34 uiR2EntryPoint01 26220 -12600 SE -f2 uiR2_Forest34 uiR2EntryPoint02 26613 -12753 NW -f2 uiR2_Forest34 uiR2EntryPoint03 26413 -12556 S -f2 uiR2_Forest34 uiR2EntryPoint04 26238 -12888 N -f2 uiR2_Forest34 uiR2EntryPoint05 26661 -12640 W - -f2 uiR2_Forest35 uiR2EntryPoint01 27100 -12600 S -f2 uiR2_Forest35 uiR2EntryPoint02 27043 -12938 N -f2 uiR2_Forest35 uiR2EntryPoint03 27222 -12726 W - -f2 uiR2_Forest45 uiR2EntryPoint01 26000 -13600 SW -f2 uiR2_Forest45 uiR2EntryPoint02 25983 -13976 NW -f2 uiR2_Forest45 uiR2EntryPoint03 25684 -13611 SE -f2 uiR2_Forest45 uiR2EntryPoint04 25835 -13674 SE -f2 uiR2_Forest45 uiR2EntryPoint05 26004 -13834 NW -f2 uiR2_Forest45 uiR2EntryPoint06 25786 -13883 N - -f2 uiR2_Forest08 uiR2EntryPoint01 26957 -11364 NE -f2 uiR2_Forest08 uiR2EntryPoint02 27200 -11178 S -f2 uiR2_Forest08 uiR2EntryPoint03 27360 -11040 SW -f2 uiR2_Forest08 uiR2EntryPoint04 27002 -10967 SE -f2 uiR2_Forest08 uiR2EntryPoint05 27406 -11414 NW - -f2 uiR2_Forest12 uiR2EntryPoint01 29919 -11062 N -f2 uiR2_Forest12 uiR2EntryPoint02 29855 -11111 NE -f2 uiR2_Forest12 uiR2EntryPoint03 29986 -10996 SW - -f2 uiR2_Forest33 uiR2EntryPoint01 25300 -12600 S -f2 uiR2_Forest33 uiR2EntryPoint02 25598 -13023 N -f2 uiR2_Forest33 uiR2EntryPoint03 25598 -12632 W -f2 uiR2_Forest33 uiR2EntryPoint04 25299 -12957 N - -f3 uiR2_Forest38 uiR2EntryPoint01 29630 -12600 SW -f3 uiR2_Forest38 uiR2EntryPoint02 29735 -12939 NW -f3 uiR2_Forest38 uiR2EntryPoint03 29350 -12779 E -f3 uiR2_Forest38 uiR2EntryPoint04 29525 -12714 SE -f3 uiR2_Forest38 uiR2EntryPoint05 29391 -12585 SE -f3 uiR2_Forest38 uiR2EntryPoint06 29465 -13029 NE - -f3 uiR2_Forest46 uiR2EntryPoint01 27000 -13600 S -f3 uiR2_Forest46 uiR2EntryPoint02 28057 -14465 N -f3 uiR2_Forest46 uiR2EntryPoint03 26890 -14013 NE -f3 uiR2_Forest46 uiR2EntryPoint04 27254 -13872 S - -f3 uiR2_Forest02 uiR2EntryPoint01 22236 -11281 NE -f3 uiR2_Forest02 uiR2EntryPoint02 22468 -11198 W -f3 uiR2_Forest02 uiR2EntryPoint03 22222 -11426 NE -f3 uiR2_Forest02 uiR2EntryPoint04 22353 -11000 S -f3 uiR2_Forest02 uiR2EntryPoint05 22446 -11374 NW -f3 uiR2_Forest02 uiR2EntryPoint06 22137 -11199 E -f3 uiR2_Forest02 uiR2EntryPoint07 22158 -10990 E -f3 uiR2_Forest02 uiR2EntryPoint08 22259 -11108 E - -f3 uiR2_Forest07 uiR2EntryPoint01 26322 -11348 N -f3 uiR2_Forest07 uiR2EntryPoint02 26310 -11200 E -f3 uiR2_Forest07 uiR2EntryPoint03 26545 -11157 W -f3 uiR2_Forest07 uiR2EntryPoint04 26185 -10967 E -f3 uiR2_Forest07 uiR2EntryPoint05 26171 -11200 E -f3 uiR2_Forest07 uiR2EntryPoint06 26446 -11021 SW -f3 uiR2_Forest07 uiR2EntryPoint07 26222 -11401 NE -f3 uiR2_Forest07 uiR2EntryPoint08 26498 -11359 W - -f3 uiR2_Forest16 uiR2EntryPoint01 23114 -11953 W -f3 uiR2_Forest16 uiR2EntryPoint02 22883 -11999 E -f3 uiR2_Forest16 uiR2EntryPoint03 22743 -12136 N -f3 uiR2_Forest16 uiR2EntryPoint04 22735 -11817 SE -f3 uiR2_Forest16 uiR2EntryPoint05 23038 -12182 NW - -f3 uiR2_Forest18 uiR2EntryPoint01 24326 -11878 SE -f3 uiR2_Forest18 uiR2EntryPoint02 24390 -12095 N -f3 uiR2_Forest18 uiR2EntryPoint03 24525 -12090 E -f3 uiR2_Forest18 uiR2EntryPoint04 24225 -11836 E - -f4 uiR2_Forest25 uiR2EntryPoint01 29903 -11886 SO -f4 uiR2_Forest25 uiR2EntryPoint02 29714 -12046 NE -f4 uiR2_Forest25 uiR2EntryPoint03 29730 -11826 SE -f4 uiR2_Forest25 uiR2EntryPoint04 29959 -11791 SW - -f4 uiR2_Forest01 uiR2EntryPoint01 21581 -11056 S -f4 uiR2_Forest01 uiR2EntryPoint02 21733 -11412 NW -f4 uiR2_Forest01 uiR2EntryPoint03 21648 -11248 S -f4 uiR2_Forest01 uiR2EntryPoint04 21510 -11443 NE -f4 uiR2_Forest01 uiR2EntryPoint05 21400 -11247 E -f4 uiR2_Forest01 uiR2EntryPoint06 21762 -10995 S -f4 uiR2_Forest01 uiR2EntryPoint07 21855 -11231 W -f4 uiR2_Forest01 uiR2EntryPoint08 21355 -11040 E -f4 uiR2_Forest01 uiR2EntryPoint09 21596 -10946 S - -f4 uiR2_Forest10 uiR2EntryPoint01 28673 -11191 N -f4 uiR2_Forest10 uiR2EntryPoint02 28645 -11007 S -f4 uiR2_Forest10 uiR2EntryPoint03 28566 -11110 E - -f4 uiR2_Forest24 uiR2EntryPoint01 29365 -11968 W -f4 uiR2_Forest24 uiR2EntryPoint02 28963 -11969 E -f4 uiR2_Forest24 uiR2EntryPoint03 29146 -11817 S -f4 uiR2_Forest24 uiR2EntryPoint04 29117 -12186 N -f4 uiR2_Forest24 uiR2EntryPoint05 29139 -12001 N - -f4 uiR2_Forest30 uiR2EntryPoint01 22865 -12920 N -f4 uiR2_Forest30 uiR2EntryPoint02 23068 -12632 W -f4 uiR2_Forest30 uiR2EntryPoint03 22773 -12782 E -f4 uiR2_Forest30 uiR2EntryPoint04 22901 -12688 S - -f4 uiR2_Forest40 uiR2EntryPoint01 21150 -13350 N -f4 uiR2_Forest40 uiR2EntryPoint02 21536 -13506 N -f4 uiR2_Forest40 uiR2EntryPoint03 21359 -13195 S -f4 uiR2_Forest40 uiR2EntryPoint04 21162 -13553 NE -f4 uiR2_Forest40 uiR2EntryPoint05 21267 -13280 W -f4 uiR2_Forest40 uiR2EntryPoint06 21118 -13278 SE - - - -o1 uiR2_Forest09 uiR2EntryPoint01 28210 -10964 SW -o1 uiR2_Forest09 uiR2EntryPoint02 28058 -11137 S -o1 uiR2_Forest09 uiR2EntryPoint03 27855 -11099 E - -o1 uiR2_Forest13 uiR2EntryPoint01 30783 -11199 W -o1 uiR2_Forest13 uiR2EntryPoint02 30569 -10957 S -o1 uiR2_Forest13 uiR2EntryPoint03 30355 -11071 E - -o1 uiR2_Forest21 uiR2EntryPoint01 26547 -12021 E -o1 uiR2_Forest21 uiR2EntryPoint02 26748 -11980 SW -o1 uiR2_Forest21 uiR2EntryPoint03 26636 -12215 N -o1 uiR2_Forest21 uiR2EntryPoint04 26560 -11775 S - -o1 uiR2_Forest26 uiR2EntryPoint01 30827 -11803 W -o1 uiR2_Forest26 uiR2EntryPoint02 30559 -11816 E -o1 uiR2_Forest26 uiR2EntryPoint03 30347 -11839 E - -o1 uiR2_Forest28 uiR2EntryPoint01 21720 -12717 N -o1 uiR2_Forest28 uiR2EntryPoint02 21559 -12569 S -o1 uiR2_Forest28 uiR2EntryPoint03 21581 -12739 NE -o1 uiR2_Forest28 uiR2EntryPoint04 21831 -12579 SW -o1 uiR2_Forest28 uiR2EntryPoint05 21676 -12643 E - - - -//z1 uiR2_Forest06 uiR2EntryPoint01 25424 -11251 E -//z1 uiR2_Forest06 uiR2EntryPoint02 25768 -11068 SW -//z1 uiR2_Forest06 uiR2EntryPoint03 25616 -11254 NW - -//z1 uiR2_Forest11 uiR2EntryPoint01 29400 -11408 NW -//z1 uiR2_Forest11 uiR2EntryPoint02 29273 -11198 S -//z1 uiR2_Forest11 uiR2EntryPoint03 29112 -11028 SE - -//z1 uiR2_Forest15 uiR2EntryPoint01 22136 -11787 S -//z1 uiR2_Forest15 uiR2EntryPoint02 21908 -12109 NE -//z1 uiR2_Forest15 uiR2EntryPoint03 21903 -11855 SE -//z1 uiR2_Forest15 uiR2EntryPoint04 22206 -12161 NW -//z1 uiR2_Forest15 uiR2EntryPoint05 22066 -11993 N - -//z1 uiR2_Forest17 uiR2EntryPoint01 23533 -11761 SE -//z1 uiR2_Forest17 uiR2EntryPoint02 23689 -12007 N -//z1 uiR2_Forest17 uiR2EntryPoint03 23688 -12223 N -//z1 uiR2_Forest17 uiR2EntryPoint04 23850 -11791 SW -//z1 uiR2_Forest17 uiR2EntryPoint05 23464 -12000 E -//z1 uiR2_Forest17 uiR2EntryPoint06 23862 -12143 NW - -//z1 uiR2_Forest22 uiR2EntryPoint01 27153 -12009 E -//z1 uiR2_Forest22 uiR2EntryPoint02 27581 -11992 SW -//z1 uiR2_Forest22 uiR2EntryPoint03 27374 -12176 N -//z1 uiR2_Forest22 uiR2EntryPoint04 27381 -11938 S -//z1 uiR2_Forest22 uiR2EntryPoint05 27260 -12085 E -//z1 uiR2_Forest22 uiR2EntryPoint06 27444 -12071 W - -//z1 uiR2_Forest29 uiR2EntryPoint01 22306 -12674 W -//z1 uiR2_Forest29 uiR2EntryPoint02 22404 -12746 N -//z1 uiR2_Forest29 uiR2EntryPoint03 22152 -12719 NE - -//z1 uiR2_Forest36 uiR2EntryPoint01 27800 -12770 E -//z1 uiR2_Forest36 uiR2EntryPoint02 28127 -12573 SW -//z1 uiR2_Forest36 uiR2EntryPoint03 28218 -13020 NW -//z1 uiR2_Forest36 uiR2EntryPoint04 27909 -12736 SW -//z1 uiR2_Forest36 uiR2EntryPoint05 27805 -12614 S -//z1 uiR2_Forest36 uiR2EntryPoint06 27896 -12855 E -//z1 uiR2_Forest36 uiR2EntryPoint07 27794 -13005 NW -//z1 uiR2_Forest36 uiR2EntryPoint08 28058 -12493 SE - -//z1 uiR2_Forest37 uiR2EntryPoint01 28980 -12920 W -//z1 uiR2_Forest37 uiR2EntryPoint02 28880 -12886 SE -//z1 uiR2_Forest37 uiR2EntryPoint03 28879 -13020 NE -//z1 uiR2_Forest37 uiR2EntryPoint04 28522 -12562 E -//z1 uiR2_Forest37 uiR2EntryPoint05 28712 -12686 s -//z1 uiR2_Forest37 uiR2EntryPoint06 28747 -12911 N - -//z1 uiR2_Forest42 uiR2EntryPoint01 22830 -13600 NE -//z1 uiR2_Forest42 uiR2EntryPoint02 23342 -13475 W -//z1 uiR2_Forest42 uiR2EntryPoint03 22853 -13394 SE -//z1 uiR2_Forest42 uiR2EntryPoint04 23099 -13430 S - -//z1 uiR2_Forest43 uiR2EntryPoint01 24000 -13600 N -//z1 uiR2_Forest43 uiR2EntryPoint02 24076 -13838 W -//z1 uiR2_Forest43 uiR2EntryPoint03 23825 -13411 SE -//z1 uiR2_Forest43 uiR2EntryPoint04 24208 -13583 W -//z1 uiR2_Forest43 uiR2EntryPoint05 24000 -13364 S -//z1 uiR2_Forest43 uiR2EntryPoint06 24039 -13492 W - -//z1 uiR2_Forest44 uiR2EntryPoint01 24670 -13600 S -//z1 uiR2_Forest44 uiR2EntryPoint02 24877 -14823 N -//z1 uiR2_Forest44 uiR2EntryPoint03 24959 -14224 W -//z1 uiR2_Forest44 uiR2EntryPoint04 24653 -14092 N -//z1 uiR2_Forest44 uiR2EntryPoint05 24565 -13357 S -//z1 uiR2_Forest44 uiR2EntryPoint06 24642 -14325 E - - - - -// Jungle - -a1 uiR2_Jungle14 uiR2EntryPoint01 40700 -11200 E -a1 uiR2_Jungle14 uiR2EntryPoint02 40876 -11370 W -a1 uiR2_Jungle14 uiR2EntryPoint03 40681 -11376 W -a1 uiR2_Jungle14 uiR2EntryPoint04 40841 -10966 W - -a1 uiR2_Jungle23 uiR2EntryPoint01 38200 -12000 N -a1 uiR2_Jungle23 uiR2EntryPoint02 38163 -11917 W -a1 uiR2_Jungle23 uiR2EntryPoint03 37956 -12037 E -a1 uiR2_Jungle23 uiR2EntryPoint04 38356 -11999 NW -a1 uiR2_Jungle23 uiR2EntryPoint05 38489 -11936 NW -a1 uiR2_Jungle23 uiR2EntryPoint06 38196 -11782 S - -a1 uiR2_Jungle27 uiR2EntryPoint01 31200 -12700 N -a1 uiR2_Jungle27 uiR2EntryPoint02 31207 -12533 S -a1 uiR2_Jungle27 uiR2EntryPoint03 31299 -12813 NW - -j1 uiR2_Jungle06 uiR2EntryPoint01 34426 -11339 NE -j1 uiR2_Jungle06 uiR2EntryPoint02 34698 -11060 W -j1 uiR2_Jungle06 uiR2EntryPoint03 34836 -11243 W -j1 uiR2_Jungle06 uiR2EntryPoint04 34651 -11405 S -j1 uiR2_Jungle06 uiR2EntryPoint05 34372 -11029 E - -j1 uiR2_Jungle07 uiR2EntryPoint01 35300 -11200 SE -j1 uiR2_Jungle07 uiR2EntryPoint02 35534 -11057 SW -j1 uiR2_Jungle07 uiR2EntryPoint03 35424 -11378 N -j1 uiR2_Jungle07 uiR2EntryPoint04 35100 -11026 SE - -j1 uiR2_Jungle15 uiR2EntryPoint01 31300 -12000 N -j1 uiR2_Jungle15 uiR2EntryPoint02 31181 -11823 SE -j1 uiR2_Jungle15 uiR2EntryPoint03 31185 -12211 NE -j1 uiR2_Jungle15 uiR2EntryPoint04 31549 -12148 NW -j1 uiR2_Jungle15 uiR2EntryPoint05 31549 -11920 W - -j1 uiR2_Jungle18 uiR2EntryPoint01 34000 -12000 S -j1 uiR2_Jungle18 uiR2EntryPoint02 34234 -12243 N -j1 uiR2_Jungle18 uiR2EntryPoint03 34161 -11953 E -j1 uiR2_Jungle18 uiR2EntryPoint04 34191 -11792 S -j1 uiR2_Jungle18 uiR2EntryPoint05 33799 -11882 SE -j1 uiR2_Jungle18 uiR2EntryPoint06 33832 -12256 N - -j1 uiR2_Jungle36 uiR2EntryPoint01 37074 -12782 N -j1 uiR2_Jungle36 uiR2EntryPoint02 37071 -12878 SW -j1 uiR2_Jungle36 uiR2EntryPoint03 36896 -12875 E -j1 uiR2_Jungle36 uiR2EntryPoint04 36934 -12737 S -j1 uiR2_Jungle36 uiR2EntryPoint05 36978 -13070 N -j1 uiR2_Jungle36 uiR2EntryPoint06 36800 -13062 NE - -j1 uiR2_Jungle41 uiR2EntryPoint01 40648 -12573 N -j1 uiR2_Jungle41 uiR2EntryPoint02 40696 -12807 E -j1 uiR2_Jungle41 uiR2EntryPoint03 40771 -13042 N - -j1 uiR2_Jungle53 uiR2EntryPoint01 39683 -13678 W -j1 uiR2_Jungle53 uiR2EntryPoint02 39413 -13784 NE -j1 uiR2_Jungle53 uiR2EntryPoint03 39514 -13435 SE -j1 uiR2_Jungle53 uiR2EntryPoint04 39718 -13338 S - -j2 uiR2_Jungle01 uiR2EntryPoint01 31300 -11100 S -j2 uiR2_Jungle01 uiR2EntryPoint02 31257 -10932 E -j2 uiR2_Jungle01 uiR2EntryPoint03 31594 -11118 N -j2 uiR2_Jungle01 uiR2EntryPoint04 31080 -11296 NE - -j2 uiR2_Jungle28 uiR2EntryPoint01 31600 -12550 N -j2 uiR2_Jungle28 uiR2EntryPoint02 31788 -12534 S - -j2 uiR2_Jungle32 uiR2EntryPoint01 33720 -12700 SW -j2 uiR2_Jungle32 uiR2EntryPoint02 33855 -12620 W -j2 uiR2_Jungle32 uiR2EntryPoint03 33646 -12853 SE -j2 uiR2_Jungle32 uiR2EntryPoint04 33757 -12969 NW - -j2 uiR2_Jungle34 uiR2EntryPoint01 35220 -12610 N -j2 uiR2_Jungle34 uiR2EntryPoint02 35030 -12535 SW -j2 uiR2_Jungle34 uiR2EntryPoint03 35028 -12728 SE -j2 uiR2_Jungle34 uiR2EntryPoint04 35304 -12781 W -j2 uiR2_Jungle34 uiR2EntryPoint05 35419 -12726 S - -j2 uiR2_Jungle51 uiR2EntryPoint01 38204 -13916 N -j2 uiR2_Jungle51 uiR2EntryPoint02 38135 -13696 NW -j2 uiR2_Jungle51 uiR2EntryPoint03 38032 -13508 E - -j2 uiR2_Jungle02 uiR2EntryPoint01 32203 -11283 NW -j2 uiR2_Jungle02 uiR2EntryPoint02 32062 -10944 E -j2 uiR2_Jungle02 uiR2EntryPoint03 32396 -11409 N -j2 uiR2_Jungle02 uiR2EntryPoint04 32557 -11107 S -j2 uiR2_Jungle02 uiR2EntryPoint05 32533 -10964 W - -j2 uiR2_Jungle05 uiR2EntryPoint01 33768 -11278 N -j2 uiR2_Jungle05 uiR2EntryPoint02 33981 -11292 W - -j3 uiR2_Jungle38 uiR2EntryPoint01 38290 -12740 E -j3 uiR2_Jungle38 uiR2EntryPoint02 38288 -12905 E -j3 uiR2_Jungle38 uiR2EntryPoint03 38446 -13070 E -j3 uiR2_Jungle38 uiR2EntryPoint04 38665 -12895 NW -j3 uiR2_Jungle38 uiR2EntryPoint05 38475 -12755 S - -j3 uiR2_Jungle49 uiR2EntryPoint01 36953 -13596 N -j3 uiR2_Jungle49 uiR2EntryPoint02 36931 -13379 SW -j3 uiR2_Jungle49 uiR2EntryPoint03 36564 -13630 NE -j3 uiR2_Jungle49 uiR2EntryPoint04 36901 -13803 N - -j3 uiR2_Jungle52 uiR2EntryPoint01 39145 -13665 W -j3 uiR2_Jungle52 uiR2EntryPoint02 39053 -13517 E -j3 uiR2_Jungle52 uiR2EntryPoint03 38963 -13387 N -j3 uiR2_Jungle52 uiR2EntryPoint04 38710 -13477 S -j3 uiR2_Jungle52 uiR2EntryPoint05 38931 -13723 W -j3 uiR2_Jungle52 uiR2EntryPoint06 38915 -13580 N - -j3 uiR2_Jungle03 uiR2EntryPoint01 33100 -11200 NE -j3 uiR2_Jungle03 uiR2EntryPoint02 32837 -11458 E -j3 uiR2_Jungle03 uiR2EntryPoint03 33230 -11343 N -j3 uiR2_Jungle03 uiR2EntryPoint04 33304 -11015 SW - -j3 uiR2_Jungle24 uiR2EntryPoint01 39000 -12000 W -j3 uiR2_Jungle24 uiR2EntryPoint02 39297 -11888 S -j3 uiR2_Jungle24 uiR2EntryPoint03 38832 -11886 SE -j3 uiR2_Jungle24 uiR2EntryPoint04 38847 -12265 NE -j3 uiR2_Jungle24 uiR2EntryPoint05 39289 -12258 NE - -j3 uiR2_Jungle25 uiR2EntryPoint01 39621 -12083 NW -j3 uiR2_Jungle25 uiR2EntryPoint02 39938 -12037 S -j3 uiR2_Jungle25 uiR2EntryPoint03 39916 -12213 SE -j3 uiR2_Jungle25 uiR2EntryPoint04 40114 -11884 W -j3 uiR2_Jungle25 uiR2EntryPoint05 39955 -11803 W -j3 uiR2_Jungle25 uiR2EntryPoint06 39786 -11886 W - -j3 uiR2_Jungle29 uiR2EntryPoint01 31753 -12934 N -j3 uiR2_Jungle29 uiR2EntryPoint02 31766 -13034 W -j3 uiR2_Jungle29 uiR2EntryPoint03 31948 -12894 NW -j3 uiR2_Jungle29 uiR2EntryPoint04 31574 -12918 N - -j4 uiR2_Jungle50 uiR2EntryPoint01 37426 -13620 N -j4 uiR2_Jungle50 uiR2EntryPoint02 37482 -13875 E -j4 uiR2_Jungle50 uiR2EntryPoint03 37596 -13682 E -j4 uiR2_Jungle50 uiR2EntryPoint04 37700 -13544 NE -j4 uiR2_Jungle50 uiR2EntryPoint05 37685 -13388 NW - -j4 uiR2_Jungle08 uiR2EntryPoint01 36200 -11200 SE -j4 uiR2_Jungle08 uiR2EntryPoint02 36390 -11360 W -j4 uiR2_Jungle08 uiR2EntryPoint03 36076 -11069 W - -j4 uiR2_Jungle12 uiR2EntryPoint01 39235 -11288 N -j4 uiR2_Jungle12 uiR2EntryPoint02 39448 -10932 W -j4 uiR2_Jungle12 uiR2EntryPoint03 38946 -11120 E -j4 uiR2_Jungle12 uiR2EntryPoint04 39153 -11467 N -j4 uiR2_Jungle12 uiR2EntryPoint05 39130 -11005 NE -j4 uiR2_Jungle12 uiR2EntryPoint06 39426 -11406 S - -j4 uiR2_Jungle16 uiR2EntryPoint01 32200 -12000 E -j4 uiR2_Jungle16 uiR2EntryPoint02 32017 -11813 S -j4 uiR2_Jungle16 uiR2EntryPoint03 32332 -12242 N -j4 uiR2_Jungle16 uiR2EntryPoint04 32459 -11865 W -j4 uiR2_Jungle16 uiR2EntryPoint05 32047 -12201 N - -j4 uiR2_Jungle22 uiR2EntryPoint01 37400 -12000 N -j4 uiR2_Jungle22 uiR2EntryPoint02 37515 -11789 N -j4 uiR2_Jungle22 uiR2EntryPoint03 37631 -12105 N -j4 uiR2_Jungle22 uiR2EntryPoint04 37530 -12275 NE -j4 uiR2_Jungle22 uiR2EntryPoint05 37339 -12275 NW -j4 uiR2_Jungle22 uiR2EntryPoint06 37167 -11731 S - -j4 uiR2_Jungle42 uiR2EntryPoint01 31103 -13282 E -j4 uiR2_Jungle42 uiR2EntryPoint02 31352 -13419 W -j4 uiR2_Jungle42 uiR2EntryPoint03 31285 -13573 S -j4 uiR2_Jungle42 uiR2EntryPoint04 31307 -13712 N -j4 uiR2_Jungle42 uiR2EntryPoint05 31420 -13639 SW -j4 uiR2_Jungle42 uiR2EntryPoint06 31083 -13691 NE - - -o1 uiR2_Jungle11 uiR2EntryPoint01 38400 -11200 N -o1 uiR2_Jungle11 uiR2EntryPoint02 38565 -11080 W -o1 uiR2_Jungle11 uiR2EntryPoint03 38389 -11029 E - -o1 uiR2_Jungle19 uiR2EntryPoint01 35000 -12000 N -o1 uiR2_Jungle19 uiR2EntryPoint02 34752 -12146 NE -o1 uiR2_Jungle19 uiR2EntryPoint03 34749 -11909 SE -o1 uiR2_Jungle19 uiR2EntryPoint04 35292 -12042 S -o1 uiR2_Jungle19 uiR2EntryPoint05 35320 -12203 S - -o1 uiR2_Jungle21 uiR2EntryPoint01 36600 -12000 N -o1 uiR2_Jungle21 uiR2EntryPoint02 36833 -11757 SW -o1 uiR2_Jungle21 uiR2EntryPoint03 36443 -12055 E -o1 uiR2_Jungle21 uiR2EntryPoint04 36504 -12275 NW -o1 uiR2_Jungle21 uiR2EntryPoint05 36657 -12265 NW - -o1 uiR2_Jungle26 uiR2EntryPoint01 40600 -12000 W -o1 uiR2_Jungle26 uiR2EntryPoint02 40903 -11996 W -o1 uiR2_Jungle26 uiR2EntryPoint03 40429 -12233 NE - -o1 uiR2_Jungle30 uiR2EntryPoint01 32318 -12599 N -o1 uiR2_Jungle30 uiR2EntryPoint02 32444 -12765 N -o1 uiR2_Jungle30 uiR2EntryPoint03 32497 -12629 W - -o1 uiR2_Jungle33 uiR2EntryPoint01 34230 -12745 N -o1 uiR2_Jungle33 uiR2EntryPoint02 34311 -12806 SE -o1 uiR2_Jungle33 uiR2EntryPoint03 34399 -12967 W -o1 uiR2_Jungle33 uiR2EntryPoint04 34221 -12959 E - -o1 uiR2_Jungle35 uiR2EntryPoint01 35800 -13010 N -o1 uiR2_Jungle35 uiR2EntryPoint02 36057 -12912 W -o1 uiR2_Jungle35 uiR2EntryPoint03 35755 -12619 E -o1 uiR2_Jungle35 uiR2EntryPoint04 36228 -12618 W -o1 uiR2_Jungle35 uiR2EntryPoint05 35934 -12714 E - -o1 uiR2_Jungle44 uiR2EntryPoint01 32799 -13439 N -o1 uiR2_Jungle44 uiR2EntryPoint02 32628 -13363 SE -o1 uiR2_Jungle44 uiR2EntryPoint03 32928 -13375 SW -o1 uiR2_Jungle44 uiR2EntryPoint04 32828 -13484 SE -o1 uiR2_Jungle44 uiR2EntryPoint05 32954 -13703 N - -o1 uiR2_Jungle45 uiR2EntryPoint01 33599 -13741 N -o1 uiR2_Jungle45 uiR2EntryPoint02 33422 -13656 NE -o1 uiR2_Jungle45 uiR2EntryPoint03 33762 -13543 NW -o1 uiR2_Jungle45 uiR2EntryPoint04 33521 -13372 SE - -o1 uiR2_Jungle46 uiR2EntryPoint01 34218 -13905 N -o1 uiR2_Jungle46 uiR2EntryPoint02 34374 -13798 NE -o1 uiR2_Jungle46 uiR2EntryPoint03 34517 -13771 S -o1 uiR2_Jungle46 uiR2EntryPoint04 34582 -13541 SE -o1 uiR2_Jungle46 uiR2EntryPoint05 34311 -13491 N -o1 uiR2_Jungle46 uiR2EntryPoint06 34194 -13371 NW - -o1 uiR2_Jungle47 uiR2EntryPoint01 35624 -13369 N -o1 uiR2_Jungle47 uiR2EntryPoint02 35613 -13526 W -o1 uiR2_Jungle47 uiR2EntryPoint03 35446 -13684 E -o1 uiR2_Jungle47 uiR2EntryPoint04 35162 -13683 W -o1 uiR2_Jungle47 uiR2EntryPoint05 35118 -13442 E -o1 uiR2_Jungle47 uiR2EntryPoint06 35379 -13426 SE - -o1 uiR2_Jungle48 uiR2EntryPoint01 35989 -13425 N -o1 uiR2_Jungle48 uiR2EntryPoint02 36122 -13469 SW -o1 uiR2_Jungle48 uiR2EntryPoint03 36107 -13750 N - - - -//z1 uiR2_Jungle04 uiR2EntryPoint01 33840 -11000 N - -//z1 uiR2_Jungle09 uiR2EntryPoint01 36694 -11144 E -//z1 uiR2_Jungle09 uiR2EntryPoint02 36947 -11190 N -//z1 uiR2_Jungle09 uiR2EntryPoint03 36698 -10954 S -//z1 uiR2_Jungle09 uiR2EntryPoint04 36679 -11467 N -//z1 uiR2_Jungle09 uiR2EntryPoint05 36880 -11041 S -//z1 uiR2_Jungle09 uiR2EntryPoint06 36870 -11253 E -//z1 uiR2_Jungle09 uiR2EntryPoint07 37203 -11179 N - -//z1 uiR2_Jungle10 uiR2EntryPoint01 37790 -11080 E -//z1 uiR2_Jungle10 uiR2EntryPoint02 37909 -11413 N -//z1 uiR2_Jungle10 uiR2EntryPoint03 37530 -11208 NE -//z1 uiR2_Jungle10 uiR2EntryPoint04 37588 -11375 N - -//z1 uiR2_Jungle13 uiR2EntryPoint01 40000 -11200 W -//z1 uiR2_Jungle13 uiR2EntryPoint02 40187 -11030 S -//z1 uiR2_Jungle13 uiR2EntryPoint03 39771 -10957 E -//z1 uiR2_Jungle13 uiR2EntryPoint04 39793 -11177 E -//z1 uiR2_Jungle13 uiR2EntryPoint05 40057 -11356 E - -//z1 uiR2_Jungle17 uiR2EntryPoint01 33000 -12000 N -//z1 uiR2_Jungle17 uiR2EntryPoint02 33158 -12149 N -//z1 uiR2_Jungle17 uiR2EntryPoint03 33211 -11895 N -//z1 uiR2_Jungle17 uiR2EntryPoint04 33199 -12007 W -//z1 uiR2_Jungle17 uiR2EntryPoint05 32971 -11754 S -//z1 uiR2_Jungle17 uiR2EntryPoint06 33038 -11926 E - -//z1 uiR2_Jungle20 uiR2EntryPoint01 35650 -12140 N - -//z1 uiR2_Jungle31 uiR2EntryPoint01 33149 -12874 N -//z1 uiR2_Jungle31 uiR2EntryPoint02 33066 -13037 S -//z1 uiR2_Jungle31 uiR2EntryPoint03 33043 -12726 NW - -//z1 uiR2_Jungle37 uiR2EntryPoint01 37929 -12925 N - -//z1 uiR2_Jungle39 uiR2EntryPoint01 38971 -12788 N -//z1 uiR2_Jungle39 uiR2EntryPoint02 39024 -13072 NE -//z1 uiR2_Jungle39 uiR2EntryPoint03 39159 -12877 E -//z1 uiR2_Jungle39 uiR2EntryPoint04 39432 -13045 N -//z1 uiR2_Jungle39 uiR2EntryPoint05 39280 -12841 N -//z1 uiR2_Jungle39 uiR2EntryPoint06 39255 -12682 N -//z1 uiR2_Jungle39 uiR2EntryPoint07 39433 -12707 E - -//z1 uiR2_Jungle40 uiR2EntryPoint01 40132 -12610 N - -//z1 uiR2_Jungle43 uiR2EntryPoint01 31767 -13391 N - - -// Prime Roots - -p1 uiR2_Primes04 uiR2EntryPoint01 33300 -21200 S -p1 uiR2_Primes04 uiR2EntryPoint02 33454 -21456 NW -p1 uiR2_Primes04 uiR2EntryPoint03 33029 -21522 E - -p1 uiR2_Primes06 uiR2EntryPoint01 34700 -21070 SE -p1 uiR2_Primes06 uiR2EntryPoint02 34905 -21093 SW -p1 uiR2_Primes06 uiR2EntryPoint03 34733 -21359 N - -p1 uiR2_Primes22 uiR2EntryPoint01 37500 -21960 S -p1 uiR2_Primes22 uiR2EntryPoint02 37524 -22163 N -p1 uiR2_Primes22 uiR2EntryPoint03 37394 -22286 NE - -p1 uiR2_Primes09 uiR2EntryPoint01 36950 -21200 E -p1 uiR2_Primes09 uiR2EntryPoint02 37532 -21366 W -p1 uiR2_Primes09 uiR2EntryPoint03 37208 -21170 S - -p3 uiR2_Primes29 uiR2EntryPoint01 33140 -22910 W -p3 uiR2_Primes29 uiR2EntryPoint02 33016 -22602 S -p3 uiR2_Primes29 uiR2EntryPoint03 32776 -23057 NE - -p3 uiR2_Primes01 uiR2EntryPoint01 31110 -21520 E -p3 uiR2_Primes01 uiR2EntryPoint02 31198 -21061 S -p3 uiR2_Primes01 uiR2EntryPoint03 31132 -21312 E - -p3 uiR2_Primes05 uiR2EntryPoint01 34250 -21300 W -p3 uiR2_Primes05 uiR2EntryPoint02 33891 -21271 E -p3 uiR2_Primes05 uiR2EntryPoint03 34151 -21558 N - -p5 uiR2_Primes16 uiR2EntryPoint01 32970 -22100 NW -p5 uiR2_Primes16 uiR2EntryPoint02 32763 -21871 SE -p5 uiR2_Primes16 uiR2EntryPoint03 32890 -21990 S - -p5 uiR2_Primes18 uiR2EntryPoint01 34600 -22075 W -p5 uiR2_Primes18 uiR2EntryPoint02 34205 -22078 E -p5 uiR2_Primes18 uiR2EntryPoint03 34651 -21825 S - -p5 uiR2_Primes25 uiR2EntryPoint01 39910 -22320 E -p5 uiR2_Primes25 uiR2EntryPoint02 39757 -22077 E -p5 uiR2_Primes25 uiR2EntryPoint03 39979 -22132 NW - -p6 uiR2_Primes03 uiR2EntryPoint01 32300 -21100 SE -p6 uiR2_Primes03 uiR2EntryPoint02 32288 -21484 N -p6 uiR2_Primes03 uiR2EntryPoint03 32691 -21085 SW - -p6 uiR2_Primes07 uiR2EntryPoint01 35350 -21300 NE -p6 uiR2_Primes07 uiR2EntryPoint02 35519 -21067 S -p6 uiR2_Primes07 uiR2EntryPoint03 35601 -21405 N - -p6 uiR2_Primes13 uiR2EntryPoint01 40330 -21600 N -p6 uiR2_Primes13 uiR2EntryPoint02 40127 -21438 E -p6 uiR2_Primes13 uiR2EntryPoint03 40537 -21438 W - -p7 uiR2_Primes19 uiR2EntryPoint01 35000 -22300 N -p7 uiR2_Primes19 uiR2EntryPoint02 35456 -22007 W -p7 uiR2_Primes19 uiR2EntryPoint03 35022 -21891 SE - -p7 uiR2_Primes26 uiR2EntryPoint01 40500 -22100 N -p7 uiR2_Primes26 uiR2EntryPoint02 40694 -22284 NW -p7 uiR2_Primes26 uiR2EntryPoint03 40426 -22298 NE - -p7 uiR2_Primes08 uiR2EntryPoint01 36200 -21100 E -p7 uiR2_Primes08 uiR2EntryPoint02 36393 -21558 N -p7 uiR2_Primes08 uiR2EntryPoint03 36077 -21345 S - -p8 uiR2_Primes10 uiR2EntryPoint01 38002 -21293 N -p8 uiR2_Primes10 uiR2EntryPoint02 38006 -21532 N -p8 uiR2_Primes10 uiR2EntryPoint03 38094 -21040 S - -p8 uiR2_Primes11 uiR2EntryPoint01 38970 -21520 W -p8 uiR2_Primes11 uiR2EntryPoint02 38721 -21047 S -p8 uiR2_Primes11 uiR2EntryPoint03 38577 -21350 NW - -p8 uiR2_Primes15 uiR2EntryPoint01 31980 -21880 SE -p8 uiR2_Primes15 uiR2EntryPoint02 32365 -22121 NW -p8 uiR2_Primes15 uiR2EntryPoint03 32159 -22032 N - -p11 uiR2_Primes30 uiR2EntryPoint01 33730 -22860 N -p11 uiR2_Primes30 uiR2EntryPoint02 33656 -22604 E -p11 uiR2_Primes30 uiR2EntryPoint03 33843 -22997 E - -p11 uiR2_Primes12 uiR2EntryPoint01 39500 -21280 NE -p11 uiR2_Primes12 uiR2EntryPoint02 39240 -21197 E -p11 uiR2_Primes12 uiR2EntryPoint03 39800 -21352 W - -p11 uiR2_Primes14 uiR2EntryPoint01 31350 -21960 S -p11 uiR2_Primes14 uiR2EntryPoint02 31373 -22074 S -p11 uiR2_Primes14 uiR2EntryPoint03 31166 -22272 NE - -p12 uiR2_Primes17 uiR2EntryPoint01 33660 -22000 SW -p12 uiR2_Primes17 uiR2EntryPoint02 33397 -21879 SE -p12 uiR2_Primes17 uiR2EntryPoint03 33347 -22331 N - -p12 uiR2_Primes21 uiR2EntryPoint01 37000 -22150 W -p12 uiR2_Primes21 uiR2EntryPoint02 36645 -21864 SE -p12 uiR2_Primes21 uiR2EntryPoint03 36964 -21813 SE - -p12 uiR2_Primes27 uiR2EntryPoint01 31530 -22700 SW -p12 uiR2_Primes27 uiR2EntryPoint02 31533 -23080 NW -p12 uiR2_Primes27 uiR2EntryPoint03 31078 -22800 N - - - -o1 uiR2_Primes02 uiR2EntryPoint01 31640 -21140 SE -o1 uiR2_Primes02 uiR2EntryPoint02 31593 -21374 N -o1 uiR2_Primes02 uiR2EntryPoint03 31818 -21204 W - -o1 uiR2_Primes28 uiR2EntryPoint01 32270 -23000 N -o1 uiR2_Primes28 uiR2EntryPoint02 32316 -22662 S -o1 uiR2_Primes28 uiR2EntryPoint03 31933 -22734 SE - - - -//z1 uiR2_Primes20 uiR2EntryPoint01 35790 -22100 N - -//z1 uiR2_Primes23 uiR2EntryPoint01 38360 -21970 N - -//z1 uiR2_Primes24 uiR2EntryPoint02 38906 -21891 SE - -//z1 uiR2_Primes24 uiR2EntryPoint03 39086 -22287 NW +a1 uiR2_Lakes01 uiR2EntryPoint01 31346 -1310 N +a1 uiR2_Lakes01 uiR2EntryPoint02 31269 -1238 E +a1 uiR2_Lakes01 uiR2EntryPoint03 31456 -1379 N + +a1 uiR2_Lakes07 uiR2EntryPoint01 36264 -1103 S +a1 uiR2_Lakes07 uiR2EntryPoint02 36208 -1353 N +a1 uiR2_Lakes07 uiR2EntryPoint03 36478 -1269 W +a1 uiR2_Lakes07 uiR2EntryPoint04 36478 -1105 SW + +a1 uiR2_Lakes22 uiR2EntryPoint01 32250 -2800 W +a1 uiR2_Lakes22 uiR2EntryPoint02 31920 -3160 N +a1 uiR2_Lakes22 uiR2EntryPoint03 32080 -3090 N +a1 uiR2_Lakes22 uiR2EntryPoint04 32250 -3065 NE + +l1 uiR2_Lakes15 uiR2EntryPoint01 34634 -1872 SW +l1 uiR2_Lakes15 uiR2EntryPoint02 34258 -1991 W +l1 uiR2_Lakes15 uiR2EntryPoint03 34321 -1860 S +l1 uiR2_Lakes15 uiR2EntryPoint04 34510 -2060 W + +l1 uiR2_Lakes17 uiR2EntryPoint01 36150 -2310 NE +l1 uiR2_Lakes17 uiR2EntryPoint02 35936 -2243 S +l1 uiR2_Lakes17 uiR2EntryPoint03 35920 -1844 W +l1 uiR2_Lakes17 uiR2EntryPoint04 36103 -1923 SW +l1 uiR2_Lakes17 uiR2EntryPoint05 35895 -1935 S + +l1 uiR2_Lakes18 uiR2EntryPoint01 36725 -1993 E +l1 uiR2_Lakes18 uiR2EntryPoint02 36688 -2159 N +l1 uiR2_Lakes18 uiR2EntryPoint03 36879 -2217 N +l1 uiR2_Lakes18 uiR2EntryPoint04 36941 -1970 SW + +l1 uiR2_Lakes26 uiR2EntryPoint01 34460 -3120 E +l1 uiR2_Lakes26 uiR2EntryPoint02 34689 -2756 SW +l1 uiR2_Lakes26 uiR2EntryPoint03 34681 -3111 N +l1 uiR2_Lakes26 uiR2EntryPoint04 34671 -2931 N + +l1 uiR2_Lakes27 uiR2EntryPoint01 35605 -3080 NW +l1 uiR2_Lakes27 uiR2EntryPoint02 35520 -2780 S +l1 uiR2_Lakes27 uiR2EntryPoint03 35133 -2663 SE +l1 uiR2_Lakes27 uiR2EntryPoint04 35283 -3051 N + +l1 uiR2_Lakes38 uiR2EntryPoint01 36720 -3740 S +l1 uiR2_Lakes38 uiR2EntryPoint02 36751 -4024 NW +l1 uiR2_Lakes38 uiR2EntryPoint03 36230 -3767 E +l1 uiR2_Lakes38 uiR2EntryPoint04 36481 -3564 S + +l1 uiR2_Lakes39 uiR2EntryPoint01 37510 -3900 N +l1 uiR2_Lakes39 uiR2EntryPoint02 37299 -3575 SE +l1 uiR2_Lakes39 uiR2EntryPoint03 37861 -3719 W + +l2 uiR2_Lakes03 uiR2EntryPoint01 32961 -1388 N +l2 uiR2_Lakes03 uiR2EntryPoint02 32784 -1507 NE +l2 uiR2_Lakes03 uiR2EntryPoint03 33390 -1517 NW +l2 uiR2_Lakes03 uiR2EntryPoint04 33365 -916 SW +l2 uiR2_Lakes03 uiR2EntryPoint05 33033 -991 S + +l2 uiR2_Lakes08 uiR2EntryPoint01 36991 -1311 E +l2 uiR2_Lakes08 uiR2EntryPoint02 37197 -1547 NW +l2 uiR2_Lakes08 uiR2EntryPoint03 37230 -1035 S +l2 uiR2_Lakes08 uiR2EntryPoint04 37111 -1264 SE +l2 uiR2_Lakes08 uiR2EntryPoint05 37393 -1285 W + +l2 uiR2_Lakes16 uiR2EntryPoint01 35330 -2120 W +l2 uiR2_Lakes16 uiR2EntryPoint02 35180 -2010 S +l2 uiR2_Lakes16 uiR2EntryPoint03 35145 -2135 NE + +l2 uiR2_Lakes19 uiR2EntryPoint01 37681 -2167 N +l2 uiR2_Lakes19 uiR2EntryPoint02 37367 -2341 NW +l2 uiR2_Lakes19 uiR2EntryPoint03 37331 -2070 NE +l2 uiR2_Lakes19 uiR2EntryPoint04 37521 -1929 S +l2 uiR2_Lakes19 uiR2EntryPoint05 37773 -2008 W + +l2 uiR2_Lakes23 uiR2EntryPoint01 32727 -3120 W +l2 uiR2_Lakes23 uiR2EntryPoint02 32694 -2802 W +l2 uiR2_Lakes23 uiR2EntryPoint03 32523 -2995 E + +l2 uiR2_Lakes10 uiR2EntryPoint01 38531 -1379 NE +l2 uiR2_Lakes10 uiR2EntryPoint02 38962 -1092 S +l2 uiR2_Lakes10 uiR2EntryPoint03 38677 -1146 SE +l2 uiR2_Lakes10 uiR2EntryPoint04 38953 -1444 NW + +l2 uiR2_Lakes11 uiR2EntryPoint01 31531 -2280 NW +l2 uiR2_Lakes11 uiR2EntryPoint02 31517 -1946 SW +l2 uiR2_Lakes11 uiR2EntryPoint03 31107 -2130 NE +l2 uiR2_Lakes11 uiR2EntryPoint04 31203 -1938 SE +l2 uiR2_Lakes11 uiR2EntryPoint05 31358 -2065 NW + +l3 uiR2_Lakes14 uiR2EntryPoint01 33438 -2169 E +l3 uiR2_Lakes14 uiR2EntryPoint02 33562 -2128 SW +l3 uiR2_Lakes14 uiR2EntryPoint03 33590 -2230 NW + +l3 uiR2_Lakes21 uiR2EntryPoint01 31247 -2790 E +l3 uiR2_Lakes21 uiR2EntryPoint02 31128 -3031 N +l3 uiR2_Lakes21 uiR2EntryPoint03 31536 -2778 W +l3 uiR2_Lakes21 uiR2EntryPoint04 31413 -3101 NE +l3 uiR2_Lakes21 uiR2EntryPoint05 31306 -3168 NW + +l3 uiR2_Lakes31 uiR2EntryPoint01 31295 -4080 N +l3 uiR2_Lakes31 uiR2EntryPoint02 31425 -3724 SW +l3 uiR2_Lakes31 uiR2EntryPoint03 31258 -3747 SE + +l3 uiR2_Lakes04 uiR2EntryPoint01 33740 -1068 E +l3 uiR2_Lakes04 uiR2EntryPoint02 34268 -1202 W +l3 uiR2_Lakes04 uiR2EntryPoint03 34145 -1045 SW +l3 uiR2_Lakes04 uiR2EntryPoint04 33996 -1283 N +l3 uiR2_Lakes04 uiR2EntryPoint05 33691 -1206 E + +l3 uiR2_Lakes06 uiR2EntryPoint01 35468 -1272 N +l3 uiR2_Lakes06 uiR2EntryPoint02 35954 -1080 SW +l3 uiR2_Lakes06 uiR2EntryPoint03 35764 -1026 E +l3 uiR2_Lakes06 uiR2EntryPoint04 35438 -890 SE +l3 uiR2_Lakes06 uiR2EntryPoint05 35634 -1288 N + +l3 uiR2_Lakes09 uiR2EntryPoint01 37916 -1124 S +l3 uiR2_Lakes09 uiR2EntryPoint02 37709 -1451 NE +l3 uiR2_Lakes09 uiR2EntryPoint03 38149 -1051 SW +l3 uiR2_Lakes09 uiR2EntryPoint04 38073 -1412 NW + +l3 uiR2_Lakes20 uiR2EntryPoint01 38155 -2000 E +l3 uiR2_Lakes20 uiR2EntryPoint02 38290 -1813 E +l3 uiR2_Lakes20 uiR2EntryPoint03 38488 -1996 W +l3 uiR2_Lakes20 uiR2EntryPoint04 38289 -2183 S + +l4 uiR2_Lakes33 uiR2EntryPoint01 32370 -3880 N +l4 uiR2_Lakes33 uiR2EntryPoint02 32447 -3577 SE +l4 uiR2_Lakes33 uiR2EntryPoint03 32561 -3774 SW +l4 uiR2_Lakes33 uiR2EntryPoint04 32716 -3591 S +l4 uiR2_Lakes33 uiR2EntryPoint05 32721 -3914 N + +l4 uiR2_Lakes02 uiR2EntryPoint01 32059 -1392 N +l4 uiR2_Lakes02 uiR2EntryPoint02 32267 -1181 W +l4 uiR2_Lakes02 uiR2EntryPoint03 32053 -1159 SE + +l4 uiR2_Lakes05 uiR2EntryPoint01 34650 -1133 NE +l4 uiR2_Lakes05 uiR2EntryPoint02 35018 -1280 SW +l4 uiR2_Lakes05 uiR2EntryPoint03 34984 -889 SW +l4 uiR2_Lakes05 uiR2EntryPoint04 34769 -1166 NE + +l4 uiR2_Lakes12 uiR2EntryPoint01 32040 -2368 N +l4 uiR2_Lakes12 uiR2EntryPoint02 32401 -2210 SW +l4 uiR2_Lakes12 uiR2EntryPoint03 32019 -1939 S +l4 uiR2_Lakes12 uiR2EntryPoint04 31891 -2241 E + +l4 uiR2_Lakes24 uiR2EntryPoint01 33350 -3120 N +l4 uiR2_Lakes24 uiR2EntryPoint02 33200 -2865 N +l4 uiR2_Lakes24 uiR2EntryPoint03 33450 -2950 W + +l4 uiR2_Lakes34 uiR2EntryPoint01 33520 -3910 N +l4 uiR2_Lakes34 uiR2EntryPoint02 33206 -3990 W +l4 uiR2_Lakes34 uiR2EntryPoint03 33276 -3784 N +l4 uiR2_Lakes34 uiR2EntryPoint04 33619 -3638 NW +l4 uiR2_Lakes34 uiR2EntryPoint05 33335 -3829 NE + +o1 uiR2_Lakes25 uiR2EntryPoint01 33980 -3110 N +o1 uiR2_Lakes25 uiR2EntryPoint02 33900 -2990 NE +o1 uiR2_Lakes25 uiR2EntryPoint03 34105 -2760 SW + +o1 uiR2_Lakes28 uiR2EntryPoint01 36480 -3100 N +o1 uiR2_Lakes28 uiR2EntryPoint02 36146 -2679 SE +o1 uiR2_Lakes28 uiR2EntryPoint03 36324 -2871 S + +o1 uiR2_Lakes29 uiR2EntryPoint01 37500 -3110 N +o1 uiR2_Lakes29 uiR2EntryPoint02 37078 -2937 SW +o1 uiR2_Lakes29 uiR2EntryPoint03 37389 -2802 S + +o1 uiR2_Lakes30 uiR2EntryPoint01 38100 -2850 E +o1 uiR2_Lakes30 uiR2EntryPoint02 38414 -2715 S +o1 uiR2_Lakes30 uiR2EntryPoint03 38489 -3116 NW + +o1 uiR2_Lakes32 uiR2EntryPoint01 31900 -3600 E +o1 uiR2_Lakes32 uiR2EntryPoint02 32108 -3832 N +o1 uiR2_Lakes32 uiR2EntryPoint03 32112 -3672 W + +o1 uiR2_Lakes35 uiR2EntryPoint01 34200 -4080 E +o1 uiR2_Lakes35 uiR2EntryPoint02 34145 -3645 SE +o1 uiR2_Lakes35 uiR2EntryPoint03 34387 -3988 S + +o1 uiR2_Lakes36 uiR2EntryPoint01 34960 -3770 N +o1 uiR2_Lakes36 uiR2EntryPoint02 35149 -3703 SW +o1 uiR2_Lakes36 uiR2EntryPoint03 34957 -3586 S + +o1 uiR2_Lakes37 uiR2EntryPoint01 35760 -3750 N +o1 uiR2_Lakes37 uiR2EntryPoint02 35577 -3640 SE +o1 uiR2_Lakes37 uiR2EntryPoint03 35912 -3874 N +o1 uiR2_Lakes37 uiR2EntryPoint04 35902 -3589 SE + +o1 uiR2_Lakes40 uiR2EntryPoint01 38180 -3470 SE +o1 uiR2_Lakes40 uiR2EntryPoint01 38416 -3819 NE +o1 uiR2_Lakes40 uiR2EntryPoint01 38151 -3740 N + + +//z1 uiR2_Lakes13 uiR2EntryPoint01 32479 -2298 E +//z1 uiR2_Lakes13 uiR2EntryPoint02 32880 -2080 S +//z1 uiR2_Lakes13 uiR2EntryPoint03 33050 -2265 NW + +// Desert + + +a1 uiR2_Deserts03 uiR2EntryPoint01 22791 -1289 N +a1 uiR2_Deserts03 uiR2EntryPoint02 23041 -1284 NW +a1 uiR2_Deserts03 uiR2EntryPoint03 22873 -1110 SE + +a1 uiR2_Deserts21 uiR2EntryPoint01 25980 -2015 E +a1 uiR2_Deserts21 uiR2EntryPoint02 26452 -1963 W +a1 uiR2_Deserts21 uiR2EntryPoint03 26353 -1872 SW +a1 uiR2_Deserts21 uiR2EntryPoint04 26214 -1961 S + +a1 uiR2_Deserts32 uiR2EntryPoint01 28070 -2340 E +a1 uiR2_Deserts32 uiR2EntryPoint02 28240 -2719 N +a1 uiR2_Deserts32 uiR2EntryPoint03 28318 -2643 W +a1 uiR2_Deserts32 uiR2EntryPoint04 28293 -2445 W + +d1 uiR2_Deserts02 uiR2EntryPoint01 22383 -1512 N +d1 uiR2_Deserts02 uiR2EntryPoint02 22454 -1186 SW +d1 uiR2_Deserts02 uiR2EntryPoint03 22062 -1050 S +d1 uiR2_Deserts02 uiR2EntryPoint04 22072 -1289 NE + +d1 uiR2_Deserts10 uiR2EntryPoint01 28923 -1434 N +d1 uiR2_Deserts10 uiR2EntryPoint02 29217 -1371 E +d1 uiR2_Deserts10 uiR2EntryPoint03 28901 -1115 SW + +d1 uiR2_Deserts22 uiR2EntryPoint01 26950 -2015 N +d1 uiR2_Deserts22 uiR2EntryPoint02 26937 -1864 S +d1 uiR2_Deserts22 uiR2EntryPoint03 27089 -2042 NW + +d1 uiR2_Deserts23 uiR2EntryPoint01 27600 -1924 S +d1 uiR2_Deserts23 uiR2EntryPoint02 27575 -2351 NW +d1 uiR2_Deserts23 uiR2EntryPoint03 27545 -2211 N +d1 uiR2_Deserts23 uiR2EntryPoint04 27442 -1866 S + +d1 uiR2_Deserts28 uiR2EntryPoint01 25050 -2650 S +d1 uiR2_Deserts28 uiR2EntryPoint02 24910 -2819 E +d1 uiR2_Deserts28 uiR2EntryPoint03 24881 -2720 N +d1 uiR2_Deserts28 uiR2EntryPoint04 24915 -2511 SW + +d1 uiR2_Deserts29 uiR2EntryPoint01 25880 -2630 E +d1 uiR2_Deserts29 uiR2EntryPoint02 26022 -2374 SW +d1 uiR2_Deserts29 uiR2EntryPoint03 26156 -2560 N +d1 uiR2_Deserts29 uiR2EntryPoint04 26163 -2402 S + +d1 uiR2_Deserts31 uiR2EntryPoint01 27760 -2700 N +d1 uiR2_Deserts31 uiR2EntryPoint02 27404 -2588 S +d1 uiR2_Deserts31 uiR2EntryPoint03 27538 -2606 S +d1 uiR2_Deserts31 uiR2EntryPoint04 27413 -2744 NE + +d1 uiR2_Deserts05 uiR2EntryPoint01 24257 -1520 NE +d1 uiR2_Deserts05 uiR2EntryPoint02 24593 -1447 N +d1 uiR2_Deserts05 uiR2EntryPoint03 24341 -1184 NE +d1 uiR2_Deserts05 uiR2EntryPoint04 24535 -1054 S + +d1 uiR2_Deserts13 uiR2EntryPoint01 28942 -1919 S +d1 uiR2_Deserts13 uiR2EntryPoint02 28538 -2241 E +d1 uiR2_Deserts13 uiR2EntryPoint03 28814 -2251 NW +d1 uiR2_Deserts13 uiR2EntryPoint04 28956 -2079 W +d1 uiR2_Deserts13 uiR2EntryPoint05 28794 -1912 S + +d1 uiR2_Deserts17 uiR2EntryPoint01 23250 -1840 W +d1 uiR2_Deserts17 uiR2EntryPoint02 23096 -1943 NE +d1 uiR2_Deserts17 uiR2EntryPoint03 23034 -1839 E +d1 uiR2_Deserts17 uiR2EntryPoint04 23096 -1713 S + +d1 uiR2_Deserts24 uiR2EntryPoint01 27915 -1875 S +d1 uiR2_Deserts24 uiR2EntryPoint02 28136 -1960 S +d1 uiR2_Deserts24 uiR2EntryPoint03 28233 -1746 S +d1 uiR2_Deserts24 uiR2EntryPoint04 28324 -1841 W + +d3 uiR2_Deserts27 uiR2EntryPoint01 23305 -2454 E +d3 uiR2_Deserts27 uiR2EntryPoint02 23313 -2682 N +d3 uiR2_Deserts27 uiR2EntryPoint03 23464 -2611 N +d3 uiR2_Deserts27 uiR2EntryPoint04 23496 -2442 SW + +d3 uiR2_Deserts04 uiR2EntryPoint01 23452 -1050 SE +d3 uiR2_Deserts04 uiR2EntryPoint02 23846 -1435 W +d3 uiR2_Deserts04 uiR2EntryPoint03 23599 -1418 N +d3 uiR2_Deserts04 uiR2EntryPoint04 23927 -1163 W + +d3 uiR2_Deserts11 uiR2EntryPoint01 29554 -1468 N +d3 uiR2_Deserts11 uiR2EntryPoint02 29922 -1222 W +d3 uiR2_Deserts11 uiR2EntryPoint03 29622 -1048 S +d3 uiR2_Deserts11 uiR2EntryPoint04 29615 -1306 SE +d3 uiR2_Deserts11 uiR2EntryPoint05 29755 -1447 NW + +d3 uiR2_Deserts16 uiR2EntryPoint01 22304 -1856 E +d3 uiR2_Deserts16 uiR2EntryPoint02 22513 -1995 E +d3 uiR2_Deserts16 uiR2EntryPoint03 22687 -1891 N +d3 uiR2_Deserts16 uiR2EntryPoint04 22537 -1877 N + +d4 uiR2_Deserts18 uiR2EntryPoint01 23730 -2280 N +d4 uiR2_Deserts18 uiR2EntryPoint02 23666 -2154 NE +d4 uiR2_Deserts18 uiR2EntryPoint03 23871 -1977 SE +d4 uiR2_Deserts18 uiR2EntryPoint04 23570 -2056 NE +d4 uiR2_Deserts18 uiR2EntryPoint05 23834 -1997 W + +d4 uiR2_Deserts19 uiR2EntryPoint01 24560 -2015 N +d4 uiR2_Deserts19 uiR2EntryPoint02 24267 -1998 E +d4 uiR2_Deserts19 uiR2EntryPoint03 24841 -2002 W +d4 uiR2_Deserts19 uiR2EntryPoint04 24562 -1914 S + +d4 uiR2_Deserts09 uiR2EntryPoint01 27814 -1375 N +d4 uiR2_Deserts09 uiR2EntryPoint02 27471 -1503 E +d4 uiR2_Deserts09 uiR2EntryPoint03 27609 -1197 E +d4 uiR2_Deserts09 uiR2EntryPoint04 27730 -1088 S +d4 uiR2_Deserts09 uiR2EntryPoint05 27529 -1014 SE + +d4 uiR2_Deserts14 uiR2EntryPoint01 30629 -2300 N +// d4 uiR2_Deserts14 uiR2EntryPoint04 30747 -2023 SW +d4 uiR2_Deserts14 uiR2EntryPoint02 30577 -1836 S +d4 uiR2_Deserts14 uiR2EntryPoint03 30347 -2140 SE +// d4 uiR2_Deserts14 uiR2EntryPoint05 30407 -1835 SE + +d5 uiR2_Deserts15 uiR2EntryPoint01 21500 -1830 E +d5 uiR2_Deserts15 uiR2EntryPoint02 21933 -1833 W +d5 uiR2_Deserts15 uiR2EntryPoint03 21763 -1839 E +d5 uiR2_Deserts15 uiR2EntryPoint04 21515 -1913 N + +d5 uiR2_Deserts30 uiR2EntryPoint01 26650 -2650 E +d5 uiR2_Deserts30 uiR2EntryPoint02 27036 -2638 W +d5 uiR2_Deserts30 uiR2EntryPoint03 26922 -2433 SE +d5 uiR2_Deserts30 uiR2EntryPoint04 26779 -2504 S + +d5 uiR2_Deserts33 uiR2EntryPoint01 29510 -2040 S +d5 uiR2_Deserts33 uiR2EntryPoint02 29517 -2239 N +d5 uiR2_Deserts33 uiR2EntryPoint03 29712 -2523 NW +d5 uiR2_Deserts33 uiR2EntryPoint04 29920 -2157 W +d5 uiR2_Deserts33 uiR2EntryPoint05 29758 -2318 W + +d5 uiR2_Deserts08 uiR2EntryPoint01 26694 -1485 N +d5 uiR2_Deserts08 uiR2EntryPoint02 26949 -1512 NW +d5 uiR2_Deserts08 uiR2EntryPoint03 26482 -1366 E +d5 uiR2_Deserts08 uiR2EntryPoint04 26875 -1010 S +d5 uiR2_Deserts08 uiR2EntryPoint05 26460 -1205 NE + +d6 uiR2_Deserts06 uiR2EntryPoint01 25523 -1500 NW +d6 uiR2_Deserts06 uiR2EntryPoint02 25419 -1142 SW +d6 uiR2_Deserts06 uiR2EntryPoint03 25220 -1416 W +d6 uiR2_Deserts06 uiR2EntryPoint04 25168 -1168 SW + +d6 uiR2_Deserts20 uiR2EntryPoint01 25206 -2118 N +d6 uiR2_Deserts20 uiR2EntryPoint02 25435 -1997 W +d6 uiR2_Deserts20 uiR2EntryPoint03 25410 -2177 N +d6 uiR2_Deserts20 uiR2EntryPoint04 25532 -1942 N +d6 uiR2_Deserts20 uiR2EntryPoint05 25724 -2192 W + +d6 uiR2_Deserts25 uiR2EntryPoint01 21845 -2475 S +d6 uiR2_Deserts25 uiR2EntryPoint02 21891 -2836 W +d6 uiR2_Deserts25 uiR2EntryPoint03 21442 -2799 NW +d6 uiR2_Deserts25 uiR2EntryPoint04 21460 -2447 S +d6 uiR2_Deserts25 uiR2EntryPoint05 21765 -2480 W + +d6 uiR2_Deserts26 uiR2EntryPoint01 22627 -2480 W +d6 uiR2_Deserts26 uiR2EntryPoint02 22352 -2474 E +d6 uiR2_Deserts26 uiR2EntryPoint03 22925 -2483 W +d6 uiR2_Deserts26 uiR2EntryPoint04 22790 -2627 N + + + +o1 uiR2_Deserts07 uiR2EntryPoint01 26051 -1405 N +o1 uiR2_Deserts07 uiR2EntryPoint02 26153 -1044 S +o1 uiR2_Deserts07 uiR2EntryPoint03 25855 -1233 E +o1 uiR2_Deserts07 uiR2EntryPoint04 25818 -1027 SE + +o1 uiR2_Deserts12 uiR2EntryPoint01 30818 -1487 NW +o1 uiR2_Deserts12 uiR2EntryPoint02 30726 -1023 S +o1 uiR2_Deserts12 uiR2EntryPoint03 30369 -1083 SE +o1 uiR2_Deserts12 uiR2EntryPoint04 30389 -1307 E +o1 uiR2_Deserts12 uiR2EntryPoint05 30539 -1440 NW + + + +//z1 uiR2_Deserts01 uiR2EntryPoint01 21570 -1363 N +//z1 uiR2_Deserts01 uiR2EntryPoint02 21340 -1066 SE +//z1 uiR2_Deserts01 uiR2EntryPoint03 21678 -1129 SW +//z1 uiR2_Deserts01 uiR2EntryPoint04 21503 -1296 N + + + + +// Forest + + +a1 uiR2_Forest04 uiR2EntryPoint01 24213 -11157 W +a1 uiR2_Forest04 uiR2EntryPoint02 23975 -11225 E +a1 uiR2_Forest04 uiR2EntryPoint03 23827 -11373 NE +a1 uiR2_Forest04 uiR2EntryPoint04 24180 -11383 NW +a1 uiR2_Forest04 uiR2EntryPoint05 23871 -11059 SE +a1 uiR2_Forest04 uiR2EntryPoint06 24189 -10982 SW + +a1 uiR2_Forest05 uiR2EntryPoint01 24752 -11360 N +a1 uiR2_Forest05 uiR2EntryPoint02 24602 -11060 SE +a1 uiR2_Forest05 uiR2EntryPoint03 24865 -11100 SW +a1 uiR2_Forest05 uiR2EntryPoint04 25046 -11197 W +a1 uiR2_Forest05 uiR2EntryPoint05 24640 -11453 N +a1 uiR2_Forest05 uiR2EntryPoint06 24537 -11201 E + +a1 uiR2_Forest14 uiR2EntryPoint01 21282 -12196 N +a1 uiR2_Forest14 uiR2EntryPoint02 21276 -11986 S +a1 uiR2_Forest14 uiR2EntryPoint03 21276 -11766 S + +a1 uiR2_Forest27 uiR2EntryPoint01 21173 -12644 W +a1 uiR2_Forest27 uiR2EntryPoint02 21068 -12561 S +a1 uiR2_Forest27 uiR2EntryPoint03 21113 -12714 N +a1 uiR2_Forest27 uiR2EntryPoint04 21119 -12639 S + +a1 uiR2_Forest32 uiR2EntryPoint01 24680 -12600 SE +a1 uiR2_Forest32 uiR2EntryPoint02 24538 -13025 N +a1 uiR2_Forest32 uiR2EntryPoint03 24822 -13039 N +a1 uiR2_Forest32 uiR2EntryPoint04 24718 -12889 N +a1 uiR2_Forest32 uiR2EntryPoint05 24830 -12554 SW +a1 uiR2_Forest32 uiR2EntryPoint06 24659 -12750 E + +f1 uiR2_Forest03 uiR2EntryPoint01 23010 -11209 E +f1 uiR2_Forest03 uiR2EntryPoint02 23080 -11152 E +f1 uiR2_Forest03 uiR2EntryPoint03 23400 -11400 NW +f1 uiR2_Forest03 uiR2EntryPoint04 23400 -11000 SW +f1 uiR2_Forest03 uiR2EntryPoint05 23000 -11000 SE + +f1 uiR2_Forest19 uiR2EntryPoint01 24944 -12220 N +f1 uiR2_Forest19 uiR2EntryPoint02 25357 -12233 N +f1 uiR2_Forest19 uiR2EntryPoint03 25265 -12240 W +f1 uiR2_Forest19 uiR2EntryPoint04 24971 -11947 S +f1 uiR2_Forest19 uiR2EntryPoint05 25155 -12081 SE + +f1 uiR2_Forest23 uiR2EntryPoint01 28465 -12056 W +f1 uiR2_Forest23 uiR2EntryPoint02 28011 -12082 E +f1 uiR2_Forest23 uiR2EntryPoint03 28496 -12248 N +f1 uiR2_Forest23 uiR2EntryPoint04 28375 -11911 SE +f1 uiR2_Forest23 uiR2EntryPoint05 28194 -12118 E +f1 uiR2_Forest23 uiR2EntryPoint06 27926 -11988 SE + +f1 uiR2_Forest39 uiR2EntryPoint01 30520 -12600 S +f1 uiR2_Forest39 uiR2EntryPoint02 30143 -12958 E +f1 uiR2_Forest39 uiR2EntryPoint03 30195 -12559 SE +f1 uiR2_Forest39 uiR2EntryPoint04 30621 -12958 NW +f1 uiR2_Forest39 uiR2EntryPoint05 30298 -12694 SE +f1 uiR2_Forest39 uiR2EntryPoint06 30524 -12799 W +f1 uiR2_Forest39 uiR2EntryPoint07 30291 -12910 NE + +f1 uiR2_Forest41 uiR2EntryPoint01 22140 -13150 SE +f1 uiR2_Forest41 uiR2EntryPoint02 22401 -13440 NW +f1 uiR2_Forest41 uiR2EntryPoint03 22263 -13269 S +f1 uiR2_Forest41 uiR2EntryPoint04 22338 -13133 SW +f1 uiR2_Forest41 uiR2EntryPoint05 22173 -13476 NE + +f1 uiR2_Forest20 uiR2EntryPoint01 26110 -11936 SW +f1 uiR2_Forest20 uiR2EntryPoint02 25734 -11920 SE +f1 uiR2_Forest20 uiR2EntryPoint03 25691 -12200 SW +f1 uiR2_Forest20 uiR2EntryPoint04 26113 -12164 NW +f1 uiR2_Forest20 uiR2EntryPoint05 25950 -12097 N + +f1 uiR2_Forest31 uiR2EntryPoint01 23470 -12600 SE +f1 uiR2_Forest31 uiR2EntryPoint02 23681 -12712 S +f1 uiR2_Forest31 uiR2EntryPoint03 23510 -13001 NE +f1 uiR2_Forest31 uiR2EntryPoint04 23948 -13020 W +f1 uiR2_Forest31 uiR2EntryPoint05 23598 -12850 SW +f1 uiR2_Forest31 uiR2EntryPoint06 23995 -12787 W +f1 uiR2_Forest31 uiR2EntryPoint07 23879 -12573 W + +f1 uiR2_Forest49 uiR2EntryPoint01 22802 -14253 N +f1 uiR2_Forest50 uiR2EntryPoint01 21222 -14270 N +f1 uiR2_Forest51 uiR2EntryPoint01 23627 -14197 N +f1 uiR2_Forest52 uiR2EntryPoint01 21983 -14266 N +f1 uiR2_Forest53 uiR2EntryPoint01 21244 -14688 N + +f2 uiR2_Forest34 uiR2EntryPoint01 26220 -12600 SE +f2 uiR2_Forest34 uiR2EntryPoint02 26613 -12753 NW +f2 uiR2_Forest34 uiR2EntryPoint03 26413 -12556 S +f2 uiR2_Forest34 uiR2EntryPoint04 26238 -12888 N +f2 uiR2_Forest34 uiR2EntryPoint05 26661 -12640 W + +f2 uiR2_Forest35 uiR2EntryPoint01 27100 -12600 S +f2 uiR2_Forest35 uiR2EntryPoint02 27043 -12938 N +f2 uiR2_Forest35 uiR2EntryPoint03 27222 -12726 W + +f2 uiR2_Forest45 uiR2EntryPoint01 26000 -13600 SW +f2 uiR2_Forest45 uiR2EntryPoint02 25983 -13976 NW +f2 uiR2_Forest45 uiR2EntryPoint03 25684 -13611 SE +f2 uiR2_Forest45 uiR2EntryPoint04 25835 -13674 SE +f2 uiR2_Forest45 uiR2EntryPoint05 26004 -13834 NW +f2 uiR2_Forest45 uiR2EntryPoint06 25786 -13883 N + +f2 uiR2_Forest08 uiR2EntryPoint01 26957 -11364 NE +f2 uiR2_Forest08 uiR2EntryPoint02 27200 -11178 S +f2 uiR2_Forest08 uiR2EntryPoint03 27360 -11040 SW +f2 uiR2_Forest08 uiR2EntryPoint04 27002 -10967 SE +f2 uiR2_Forest08 uiR2EntryPoint05 27406 -11414 NW + +f2 uiR2_Forest12 uiR2EntryPoint01 29919 -11062 N +f2 uiR2_Forest12 uiR2EntryPoint02 29855 -11111 NE +f2 uiR2_Forest12 uiR2EntryPoint03 29986 -10996 SW + +f2 uiR2_Forest33 uiR2EntryPoint01 25300 -12600 S +f2 uiR2_Forest33 uiR2EntryPoint02 25598 -13023 N +f2 uiR2_Forest33 uiR2EntryPoint03 25598 -12632 W +f2 uiR2_Forest33 uiR2EntryPoint04 25299 -12957 N + +f3 uiR2_Forest38 uiR2EntryPoint01 29630 -12600 SW +f3 uiR2_Forest38 uiR2EntryPoint02 29735 -12939 NW +f3 uiR2_Forest38 uiR2EntryPoint03 29350 -12779 E +f3 uiR2_Forest38 uiR2EntryPoint04 29525 -12714 SE +f3 uiR2_Forest38 uiR2EntryPoint05 29391 -12585 SE +f3 uiR2_Forest38 uiR2EntryPoint06 29465 -13029 NE + +f3 uiR2_Forest46 uiR2EntryPoint01 27000 -13600 S +f3 uiR2_Forest46 uiR2EntryPoint02 28057 -14465 N +f3 uiR2_Forest46 uiR2EntryPoint03 26890 -14013 NE +f3 uiR2_Forest46 uiR2EntryPoint04 27254 -13872 S + +f3 uiR2_Forest02 uiR2EntryPoint01 22236 -11281 NE +f3 uiR2_Forest02 uiR2EntryPoint02 22468 -11198 W +f3 uiR2_Forest02 uiR2EntryPoint03 22222 -11426 NE +f3 uiR2_Forest02 uiR2EntryPoint04 22353 -11000 S +f3 uiR2_Forest02 uiR2EntryPoint05 22446 -11374 NW +f3 uiR2_Forest02 uiR2EntryPoint06 22137 -11199 E +f3 uiR2_Forest02 uiR2EntryPoint07 22158 -10990 E +f3 uiR2_Forest02 uiR2EntryPoint08 22259 -11108 E + +f3 uiR2_Forest07 uiR2EntryPoint01 26322 -11348 N +f3 uiR2_Forest07 uiR2EntryPoint02 26310 -11200 E +f3 uiR2_Forest07 uiR2EntryPoint03 26545 -11157 W +f3 uiR2_Forest07 uiR2EntryPoint04 26185 -10967 E +f3 uiR2_Forest07 uiR2EntryPoint05 26171 -11200 E +f3 uiR2_Forest07 uiR2EntryPoint06 26446 -11021 SW +f3 uiR2_Forest07 uiR2EntryPoint07 26222 -11401 NE +f3 uiR2_Forest07 uiR2EntryPoint08 26498 -11359 W + +f3 uiR2_Forest16 uiR2EntryPoint01 23114 -11953 W +f3 uiR2_Forest16 uiR2EntryPoint02 22883 -11999 E +f3 uiR2_Forest16 uiR2EntryPoint03 22743 -12136 N +f3 uiR2_Forest16 uiR2EntryPoint04 22735 -11817 SE +f3 uiR2_Forest16 uiR2EntryPoint05 23038 -12182 NW + +f3 uiR2_Forest18 uiR2EntryPoint01 24326 -11878 SE +f3 uiR2_Forest18 uiR2EntryPoint02 24390 -12095 N +f3 uiR2_Forest18 uiR2EntryPoint03 24525 -12090 E +f3 uiR2_Forest18 uiR2EntryPoint04 24225 -11836 E + +f4 uiR2_Forest25 uiR2EntryPoint01 29903 -11886 SO +f4 uiR2_Forest25 uiR2EntryPoint02 29714 -12046 NE +f4 uiR2_Forest25 uiR2EntryPoint03 29730 -11826 SE +f4 uiR2_Forest25 uiR2EntryPoint04 29959 -11791 SW + +f4 uiR2_Forest01 uiR2EntryPoint01 21581 -11056 S +f4 uiR2_Forest01 uiR2EntryPoint02 21733 -11412 NW +f4 uiR2_Forest01 uiR2EntryPoint03 21648 -11248 S +f4 uiR2_Forest01 uiR2EntryPoint04 21510 -11443 NE +f4 uiR2_Forest01 uiR2EntryPoint05 21400 -11247 E +f4 uiR2_Forest01 uiR2EntryPoint06 21762 -10995 S +f4 uiR2_Forest01 uiR2EntryPoint07 21855 -11231 W +f4 uiR2_Forest01 uiR2EntryPoint08 21355 -11040 E +f4 uiR2_Forest01 uiR2EntryPoint09 21596 -10946 S + +f4 uiR2_Forest10 uiR2EntryPoint01 28673 -11191 N +f4 uiR2_Forest10 uiR2EntryPoint02 28645 -11007 S +f4 uiR2_Forest10 uiR2EntryPoint03 28566 -11110 E + +f4 uiR2_Forest24 uiR2EntryPoint01 29365 -11968 W +f4 uiR2_Forest24 uiR2EntryPoint02 28963 -11969 E +f4 uiR2_Forest24 uiR2EntryPoint03 29146 -11817 S +f4 uiR2_Forest24 uiR2EntryPoint04 29117 -12186 N +f4 uiR2_Forest24 uiR2EntryPoint05 29139 -12001 N + +f4 uiR2_Forest30 uiR2EntryPoint01 22865 -12920 N +f4 uiR2_Forest30 uiR2EntryPoint02 23068 -12632 W +f4 uiR2_Forest30 uiR2EntryPoint03 22773 -12782 E +f4 uiR2_Forest30 uiR2EntryPoint04 22901 -12688 S + +f4 uiR2_Forest40 uiR2EntryPoint01 21150 -13350 N +f4 uiR2_Forest40 uiR2EntryPoint02 21536 -13506 N +f4 uiR2_Forest40 uiR2EntryPoint03 21359 -13195 S +f4 uiR2_Forest40 uiR2EntryPoint04 21162 -13553 NE +f4 uiR2_Forest40 uiR2EntryPoint05 21267 -13280 W +f4 uiR2_Forest40 uiR2EntryPoint06 21118 -13278 SE + + + +o1 uiR2_Forest09 uiR2EntryPoint01 28210 -10964 SW +o1 uiR2_Forest09 uiR2EntryPoint02 28058 -11137 S +o1 uiR2_Forest09 uiR2EntryPoint03 27855 -11099 E + +o1 uiR2_Forest13 uiR2EntryPoint01 30783 -11199 W +o1 uiR2_Forest13 uiR2EntryPoint02 30569 -10957 S +o1 uiR2_Forest13 uiR2EntryPoint03 30355 -11071 E + +o1 uiR2_Forest21 uiR2EntryPoint01 26547 -12021 E +o1 uiR2_Forest21 uiR2EntryPoint02 26748 -11980 SW +o1 uiR2_Forest21 uiR2EntryPoint03 26636 -12215 N +o1 uiR2_Forest21 uiR2EntryPoint04 26560 -11775 S + +o1 uiR2_Forest26 uiR2EntryPoint01 30827 -11803 W +o1 uiR2_Forest26 uiR2EntryPoint02 30559 -11816 E +o1 uiR2_Forest26 uiR2EntryPoint03 30347 -11839 E + +o1 uiR2_Forest28 uiR2EntryPoint01 21720 -12717 N +o1 uiR2_Forest28 uiR2EntryPoint02 21559 -12569 S +o1 uiR2_Forest28 uiR2EntryPoint03 21581 -12739 NE +o1 uiR2_Forest28 uiR2EntryPoint04 21831 -12579 SW +o1 uiR2_Forest28 uiR2EntryPoint05 21676 -12643 E + + + +//z1 uiR2_Forest06 uiR2EntryPoint01 25424 -11251 E +//z1 uiR2_Forest06 uiR2EntryPoint02 25768 -11068 SW +//z1 uiR2_Forest06 uiR2EntryPoint03 25616 -11254 NW + +//z1 uiR2_Forest11 uiR2EntryPoint01 29400 -11408 NW +//z1 uiR2_Forest11 uiR2EntryPoint02 29273 -11198 S +//z1 uiR2_Forest11 uiR2EntryPoint03 29112 -11028 SE + +//z1 uiR2_Forest15 uiR2EntryPoint01 22136 -11787 S +//z1 uiR2_Forest15 uiR2EntryPoint02 21908 -12109 NE +//z1 uiR2_Forest15 uiR2EntryPoint03 21903 -11855 SE +//z1 uiR2_Forest15 uiR2EntryPoint04 22206 -12161 NW +//z1 uiR2_Forest15 uiR2EntryPoint05 22066 -11993 N + +//z1 uiR2_Forest17 uiR2EntryPoint01 23533 -11761 SE +//z1 uiR2_Forest17 uiR2EntryPoint02 23689 -12007 N +//z1 uiR2_Forest17 uiR2EntryPoint03 23688 -12223 N +//z1 uiR2_Forest17 uiR2EntryPoint04 23850 -11791 SW +//z1 uiR2_Forest17 uiR2EntryPoint05 23464 -12000 E +//z1 uiR2_Forest17 uiR2EntryPoint06 23862 -12143 NW + +//z1 uiR2_Forest22 uiR2EntryPoint01 27153 -12009 E +//z1 uiR2_Forest22 uiR2EntryPoint02 27581 -11992 SW +//z1 uiR2_Forest22 uiR2EntryPoint03 27374 -12176 N +//z1 uiR2_Forest22 uiR2EntryPoint04 27381 -11938 S +//z1 uiR2_Forest22 uiR2EntryPoint05 27260 -12085 E +//z1 uiR2_Forest22 uiR2EntryPoint06 27444 -12071 W + +//z1 uiR2_Forest29 uiR2EntryPoint01 22306 -12674 W +//z1 uiR2_Forest29 uiR2EntryPoint02 22404 -12746 N +//z1 uiR2_Forest29 uiR2EntryPoint03 22152 -12719 NE + +//z1 uiR2_Forest36 uiR2EntryPoint01 27800 -12770 E +//z1 uiR2_Forest36 uiR2EntryPoint02 28127 -12573 SW +//z1 uiR2_Forest36 uiR2EntryPoint03 28218 -13020 NW +//z1 uiR2_Forest36 uiR2EntryPoint04 27909 -12736 SW +//z1 uiR2_Forest36 uiR2EntryPoint05 27805 -12614 S +//z1 uiR2_Forest36 uiR2EntryPoint06 27896 -12855 E +//z1 uiR2_Forest36 uiR2EntryPoint07 27794 -13005 NW +//z1 uiR2_Forest36 uiR2EntryPoint08 28058 -12493 SE + +//z1 uiR2_Forest37 uiR2EntryPoint01 28980 -12920 W +//z1 uiR2_Forest37 uiR2EntryPoint02 28880 -12886 SE +//z1 uiR2_Forest37 uiR2EntryPoint03 28879 -13020 NE +//z1 uiR2_Forest37 uiR2EntryPoint04 28522 -12562 E +//z1 uiR2_Forest37 uiR2EntryPoint05 28712 -12686 s +//z1 uiR2_Forest37 uiR2EntryPoint06 28747 -12911 N + +//z1 uiR2_Forest42 uiR2EntryPoint01 22830 -13600 NE +//z1 uiR2_Forest42 uiR2EntryPoint02 23342 -13475 W +//z1 uiR2_Forest42 uiR2EntryPoint03 22853 -13394 SE +//z1 uiR2_Forest42 uiR2EntryPoint04 23099 -13430 S + +//z1 uiR2_Forest43 uiR2EntryPoint01 24000 -13600 N +//z1 uiR2_Forest43 uiR2EntryPoint02 24076 -13838 W +//z1 uiR2_Forest43 uiR2EntryPoint03 23825 -13411 SE +//z1 uiR2_Forest43 uiR2EntryPoint04 24208 -13583 W +//z1 uiR2_Forest43 uiR2EntryPoint05 24000 -13364 S +//z1 uiR2_Forest43 uiR2EntryPoint06 24039 -13492 W + +//z1 uiR2_Forest44 uiR2EntryPoint01 24670 -13600 S +//z1 uiR2_Forest44 uiR2EntryPoint02 24877 -14823 N +//z1 uiR2_Forest44 uiR2EntryPoint03 24959 -14224 W +//z1 uiR2_Forest44 uiR2EntryPoint04 24653 -14092 N +//z1 uiR2_Forest44 uiR2EntryPoint05 24565 -13357 S +//z1 uiR2_Forest44 uiR2EntryPoint06 24642 -14325 E + + + + +// Jungle + +a1 uiR2_Jungle14 uiR2EntryPoint01 40700 -11200 E +a1 uiR2_Jungle14 uiR2EntryPoint02 40876 -11370 W +a1 uiR2_Jungle14 uiR2EntryPoint03 40681 -11376 W +a1 uiR2_Jungle14 uiR2EntryPoint04 40841 -10966 W + +a1 uiR2_Jungle23 uiR2EntryPoint01 38200 -12000 N +a1 uiR2_Jungle23 uiR2EntryPoint02 38163 -11917 W +a1 uiR2_Jungle23 uiR2EntryPoint03 37956 -12037 E +a1 uiR2_Jungle23 uiR2EntryPoint04 38356 -11999 NW +a1 uiR2_Jungle23 uiR2EntryPoint05 38489 -11936 NW +a1 uiR2_Jungle23 uiR2EntryPoint06 38196 -11782 S + +a1 uiR2_Jungle27 uiR2EntryPoint01 31200 -12700 N +a1 uiR2_Jungle27 uiR2EntryPoint02 31207 -12533 S +a1 uiR2_Jungle27 uiR2EntryPoint03 31299 -12813 NW + +j1 uiR2_Jungle06 uiR2EntryPoint01 34426 -11339 NE +j1 uiR2_Jungle06 uiR2EntryPoint02 34698 -11060 W +j1 uiR2_Jungle06 uiR2EntryPoint03 34836 -11243 W +j1 uiR2_Jungle06 uiR2EntryPoint04 34651 -11405 S +j1 uiR2_Jungle06 uiR2EntryPoint05 34372 -11029 E + +j1 uiR2_Jungle07 uiR2EntryPoint01 35300 -11200 SE +j1 uiR2_Jungle07 uiR2EntryPoint02 35534 -11057 SW +j1 uiR2_Jungle07 uiR2EntryPoint03 35424 -11378 N +j1 uiR2_Jungle07 uiR2EntryPoint04 35100 -11026 SE + +j1 uiR2_Jungle15 uiR2EntryPoint01 31300 -12000 N +j1 uiR2_Jungle15 uiR2EntryPoint02 31181 -11823 SE +j1 uiR2_Jungle15 uiR2EntryPoint03 31185 -12211 NE +j1 uiR2_Jungle15 uiR2EntryPoint04 31549 -12148 NW +j1 uiR2_Jungle15 uiR2EntryPoint05 31549 -11920 W + +j1 uiR2_Jungle18 uiR2EntryPoint01 34000 -12000 S +j1 uiR2_Jungle18 uiR2EntryPoint02 34234 -12243 N +j1 uiR2_Jungle18 uiR2EntryPoint03 34161 -11953 E +j1 uiR2_Jungle18 uiR2EntryPoint04 34191 -11792 S +j1 uiR2_Jungle18 uiR2EntryPoint05 33799 -11882 SE +j1 uiR2_Jungle18 uiR2EntryPoint06 33832 -12256 N + +j1 uiR2_Jungle36 uiR2EntryPoint01 37074 -12782 N +j1 uiR2_Jungle36 uiR2EntryPoint02 37071 -12878 SW +j1 uiR2_Jungle36 uiR2EntryPoint03 36896 -12875 E +j1 uiR2_Jungle36 uiR2EntryPoint04 36934 -12737 S +j1 uiR2_Jungle36 uiR2EntryPoint05 36978 -13070 N +j1 uiR2_Jungle36 uiR2EntryPoint06 36800 -13062 NE + +j1 uiR2_Jungle41 uiR2EntryPoint01 40648 -12573 N +j1 uiR2_Jungle41 uiR2EntryPoint02 40696 -12807 E +j1 uiR2_Jungle41 uiR2EntryPoint03 40771 -13042 N + +j1 uiR2_Jungle53 uiR2EntryPoint01 39683 -13678 W +j1 uiR2_Jungle53 uiR2EntryPoint02 39413 -13784 NE +j1 uiR2_Jungle53 uiR2EntryPoint03 39514 -13435 SE +j1 uiR2_Jungle53 uiR2EntryPoint04 39718 -13338 S + +j2 uiR2_Jungle01 uiR2EntryPoint01 31300 -11100 S +j2 uiR2_Jungle01 uiR2EntryPoint02 31257 -10932 E +j2 uiR2_Jungle01 uiR2EntryPoint03 31594 -11118 N +j2 uiR2_Jungle01 uiR2EntryPoint04 31080 -11296 NE + +j2 uiR2_Jungle28 uiR2EntryPoint01 31600 -12550 N +j2 uiR2_Jungle28 uiR2EntryPoint02 31788 -12534 S + +j2 uiR2_Jungle32 uiR2EntryPoint01 33720 -12700 SW +j2 uiR2_Jungle32 uiR2EntryPoint02 33855 -12620 W +j2 uiR2_Jungle32 uiR2EntryPoint03 33646 -12853 SE +j2 uiR2_Jungle32 uiR2EntryPoint04 33757 -12969 NW + +j2 uiR2_Jungle34 uiR2EntryPoint01 35220 -12610 N +j2 uiR2_Jungle34 uiR2EntryPoint02 35030 -12535 SW +j2 uiR2_Jungle34 uiR2EntryPoint03 35028 -12728 SE +j2 uiR2_Jungle34 uiR2EntryPoint04 35304 -12781 W +j2 uiR2_Jungle34 uiR2EntryPoint05 35419 -12726 S + +j2 uiR2_Jungle51 uiR2EntryPoint01 38204 -13916 N +j2 uiR2_Jungle51 uiR2EntryPoint02 38135 -13696 NW +j2 uiR2_Jungle51 uiR2EntryPoint03 38032 -13508 E + +j2 uiR2_Jungle02 uiR2EntryPoint01 32203 -11283 NW +j2 uiR2_Jungle02 uiR2EntryPoint02 32062 -10944 E +j2 uiR2_Jungle02 uiR2EntryPoint03 32396 -11409 N +j2 uiR2_Jungle02 uiR2EntryPoint04 32557 -11107 S +j2 uiR2_Jungle02 uiR2EntryPoint05 32533 -10964 W + +j2 uiR2_Jungle05 uiR2EntryPoint01 33768 -11278 N +j2 uiR2_Jungle05 uiR2EntryPoint02 33981 -11292 W + +j3 uiR2_Jungle38 uiR2EntryPoint01 38290 -12740 E +j3 uiR2_Jungle38 uiR2EntryPoint02 38288 -12905 E +j3 uiR2_Jungle38 uiR2EntryPoint03 38446 -13070 E +j3 uiR2_Jungle38 uiR2EntryPoint04 38665 -12895 NW +j3 uiR2_Jungle38 uiR2EntryPoint05 38475 -12755 S + +j3 uiR2_Jungle49 uiR2EntryPoint01 36953 -13596 N +j3 uiR2_Jungle49 uiR2EntryPoint02 36931 -13379 SW +j3 uiR2_Jungle49 uiR2EntryPoint03 36564 -13630 NE +j3 uiR2_Jungle49 uiR2EntryPoint04 36901 -13803 N + +j3 uiR2_Jungle52 uiR2EntryPoint01 39145 -13665 W +j3 uiR2_Jungle52 uiR2EntryPoint02 39053 -13517 E +j3 uiR2_Jungle52 uiR2EntryPoint03 38963 -13387 N +j3 uiR2_Jungle52 uiR2EntryPoint04 38710 -13477 S +j3 uiR2_Jungle52 uiR2EntryPoint05 38931 -13723 W +j3 uiR2_Jungle52 uiR2EntryPoint06 38915 -13580 N + +j3 uiR2_Jungle03 uiR2EntryPoint01 33100 -11200 NE +j3 uiR2_Jungle03 uiR2EntryPoint02 32837 -11458 E +j3 uiR2_Jungle03 uiR2EntryPoint03 33230 -11343 N +j3 uiR2_Jungle03 uiR2EntryPoint04 33304 -11015 SW + +j3 uiR2_Jungle24 uiR2EntryPoint01 39000 -12000 W +j3 uiR2_Jungle24 uiR2EntryPoint02 39297 -11888 S +j3 uiR2_Jungle24 uiR2EntryPoint03 38832 -11886 SE +j3 uiR2_Jungle24 uiR2EntryPoint04 38847 -12265 NE +j3 uiR2_Jungle24 uiR2EntryPoint05 39289 -12258 NE + +j3 uiR2_Jungle25 uiR2EntryPoint01 39621 -12083 NW +j3 uiR2_Jungle25 uiR2EntryPoint02 39938 -12037 S +j3 uiR2_Jungle25 uiR2EntryPoint03 39916 -12213 SE +j3 uiR2_Jungle25 uiR2EntryPoint04 40114 -11884 W +j3 uiR2_Jungle25 uiR2EntryPoint05 39955 -11803 W +j3 uiR2_Jungle25 uiR2EntryPoint06 39786 -11886 W + +j3 uiR2_Jungle29 uiR2EntryPoint01 31753 -12934 N +j3 uiR2_Jungle29 uiR2EntryPoint02 31766 -13034 W +j3 uiR2_Jungle29 uiR2EntryPoint03 31948 -12894 NW +j3 uiR2_Jungle29 uiR2EntryPoint04 31574 -12918 N + +j4 uiR2_Jungle50 uiR2EntryPoint01 37426 -13620 N +j4 uiR2_Jungle50 uiR2EntryPoint02 37482 -13875 E +j4 uiR2_Jungle50 uiR2EntryPoint03 37596 -13682 E +j4 uiR2_Jungle50 uiR2EntryPoint04 37700 -13544 NE +j4 uiR2_Jungle50 uiR2EntryPoint05 37685 -13388 NW + +j4 uiR2_Jungle08 uiR2EntryPoint01 36200 -11200 SE +j4 uiR2_Jungle08 uiR2EntryPoint02 36390 -11360 W +j4 uiR2_Jungle08 uiR2EntryPoint03 36076 -11069 W + +j4 uiR2_Jungle12 uiR2EntryPoint01 39235 -11288 N +j4 uiR2_Jungle12 uiR2EntryPoint02 39448 -10932 W +j4 uiR2_Jungle12 uiR2EntryPoint03 38946 -11120 E +j4 uiR2_Jungle12 uiR2EntryPoint04 39153 -11467 N +j4 uiR2_Jungle12 uiR2EntryPoint05 39130 -11005 NE +j4 uiR2_Jungle12 uiR2EntryPoint06 39426 -11406 S + +j4 uiR2_Jungle16 uiR2EntryPoint01 32200 -12000 E +j4 uiR2_Jungle16 uiR2EntryPoint02 32017 -11813 S +j4 uiR2_Jungle16 uiR2EntryPoint03 32332 -12242 N +j4 uiR2_Jungle16 uiR2EntryPoint04 32459 -11865 W +j4 uiR2_Jungle16 uiR2EntryPoint05 32047 -12201 N + +j4 uiR2_Jungle22 uiR2EntryPoint01 37400 -12000 N +j4 uiR2_Jungle22 uiR2EntryPoint02 37515 -11789 N +j4 uiR2_Jungle22 uiR2EntryPoint03 37631 -12105 N +j4 uiR2_Jungle22 uiR2EntryPoint04 37530 -12275 NE +j4 uiR2_Jungle22 uiR2EntryPoint05 37339 -12275 NW +j4 uiR2_Jungle22 uiR2EntryPoint06 37167 -11731 S + +j4 uiR2_Jungle42 uiR2EntryPoint01 31103 -13282 E +j4 uiR2_Jungle42 uiR2EntryPoint02 31352 -13419 W +j4 uiR2_Jungle42 uiR2EntryPoint03 31285 -13573 S +j4 uiR2_Jungle42 uiR2EntryPoint04 31307 -13712 N +j4 uiR2_Jungle42 uiR2EntryPoint05 31420 -13639 SW +j4 uiR2_Jungle42 uiR2EntryPoint06 31083 -13691 NE + + +o1 uiR2_Jungle11 uiR2EntryPoint01 38400 -11200 N +o1 uiR2_Jungle11 uiR2EntryPoint02 38565 -11080 W +o1 uiR2_Jungle11 uiR2EntryPoint03 38389 -11029 E + +o1 uiR2_Jungle19 uiR2EntryPoint01 35000 -12000 N +o1 uiR2_Jungle19 uiR2EntryPoint02 34752 -12146 NE +o1 uiR2_Jungle19 uiR2EntryPoint03 34749 -11909 SE +o1 uiR2_Jungle19 uiR2EntryPoint04 35292 -12042 S +o1 uiR2_Jungle19 uiR2EntryPoint05 35320 -12203 S + +o1 uiR2_Jungle21 uiR2EntryPoint01 36600 -12000 N +o1 uiR2_Jungle21 uiR2EntryPoint02 36833 -11757 SW +o1 uiR2_Jungle21 uiR2EntryPoint03 36443 -12055 E +o1 uiR2_Jungle21 uiR2EntryPoint04 36504 -12275 NW +o1 uiR2_Jungle21 uiR2EntryPoint05 36657 -12265 NW + +o1 uiR2_Jungle26 uiR2EntryPoint01 40600 -12000 W +o1 uiR2_Jungle26 uiR2EntryPoint02 40903 -11996 W +o1 uiR2_Jungle26 uiR2EntryPoint03 40429 -12233 NE + +o1 uiR2_Jungle30 uiR2EntryPoint01 32318 -12599 N +o1 uiR2_Jungle30 uiR2EntryPoint02 32444 -12765 N +o1 uiR2_Jungle30 uiR2EntryPoint03 32497 -12629 W + +o1 uiR2_Jungle33 uiR2EntryPoint01 34230 -12745 N +o1 uiR2_Jungle33 uiR2EntryPoint02 34311 -12806 SE +o1 uiR2_Jungle33 uiR2EntryPoint03 34399 -12967 W +o1 uiR2_Jungle33 uiR2EntryPoint04 34221 -12959 E + +o1 uiR2_Jungle35 uiR2EntryPoint01 35800 -13010 N +o1 uiR2_Jungle35 uiR2EntryPoint02 36057 -12912 W +o1 uiR2_Jungle35 uiR2EntryPoint03 35755 -12619 E +o1 uiR2_Jungle35 uiR2EntryPoint04 36228 -12618 W +o1 uiR2_Jungle35 uiR2EntryPoint05 35934 -12714 E + +o1 uiR2_Jungle44 uiR2EntryPoint01 32799 -13439 N +o1 uiR2_Jungle44 uiR2EntryPoint02 32628 -13363 SE +o1 uiR2_Jungle44 uiR2EntryPoint03 32928 -13375 SW +o1 uiR2_Jungle44 uiR2EntryPoint04 32828 -13484 SE +o1 uiR2_Jungle44 uiR2EntryPoint05 32954 -13703 N + +o1 uiR2_Jungle45 uiR2EntryPoint01 33599 -13741 N +o1 uiR2_Jungle45 uiR2EntryPoint02 33422 -13656 NE +o1 uiR2_Jungle45 uiR2EntryPoint03 33762 -13543 NW +o1 uiR2_Jungle45 uiR2EntryPoint04 33521 -13372 SE + +o1 uiR2_Jungle46 uiR2EntryPoint01 34218 -13905 N +o1 uiR2_Jungle46 uiR2EntryPoint02 34374 -13798 NE +o1 uiR2_Jungle46 uiR2EntryPoint03 34517 -13771 S +o1 uiR2_Jungle46 uiR2EntryPoint04 34582 -13541 SE +o1 uiR2_Jungle46 uiR2EntryPoint05 34311 -13491 N +o1 uiR2_Jungle46 uiR2EntryPoint06 34194 -13371 NW + +o1 uiR2_Jungle47 uiR2EntryPoint01 35624 -13369 N +o1 uiR2_Jungle47 uiR2EntryPoint02 35613 -13526 W +o1 uiR2_Jungle47 uiR2EntryPoint03 35446 -13684 E +o1 uiR2_Jungle47 uiR2EntryPoint04 35162 -13683 W +o1 uiR2_Jungle47 uiR2EntryPoint05 35118 -13442 E +o1 uiR2_Jungle47 uiR2EntryPoint06 35379 -13426 SE + +o1 uiR2_Jungle48 uiR2EntryPoint01 35989 -13425 N +o1 uiR2_Jungle48 uiR2EntryPoint02 36122 -13469 SW +o1 uiR2_Jungle48 uiR2EntryPoint03 36107 -13750 N + + + +//z1 uiR2_Jungle04 uiR2EntryPoint01 33840 -11000 N + +//z1 uiR2_Jungle09 uiR2EntryPoint01 36694 -11144 E +//z1 uiR2_Jungle09 uiR2EntryPoint02 36947 -11190 N +//z1 uiR2_Jungle09 uiR2EntryPoint03 36698 -10954 S +//z1 uiR2_Jungle09 uiR2EntryPoint04 36679 -11467 N +//z1 uiR2_Jungle09 uiR2EntryPoint05 36880 -11041 S +//z1 uiR2_Jungle09 uiR2EntryPoint06 36870 -11253 E +//z1 uiR2_Jungle09 uiR2EntryPoint07 37203 -11179 N + +//z1 uiR2_Jungle10 uiR2EntryPoint01 37790 -11080 E +//z1 uiR2_Jungle10 uiR2EntryPoint02 37909 -11413 N +//z1 uiR2_Jungle10 uiR2EntryPoint03 37530 -11208 NE +//z1 uiR2_Jungle10 uiR2EntryPoint04 37588 -11375 N + +//z1 uiR2_Jungle13 uiR2EntryPoint01 40000 -11200 W +//z1 uiR2_Jungle13 uiR2EntryPoint02 40187 -11030 S +//z1 uiR2_Jungle13 uiR2EntryPoint03 39771 -10957 E +//z1 uiR2_Jungle13 uiR2EntryPoint04 39793 -11177 E +//z1 uiR2_Jungle13 uiR2EntryPoint05 40057 -11356 E + +//z1 uiR2_Jungle17 uiR2EntryPoint01 33000 -12000 N +//z1 uiR2_Jungle17 uiR2EntryPoint02 33158 -12149 N +//z1 uiR2_Jungle17 uiR2EntryPoint03 33211 -11895 N +//z1 uiR2_Jungle17 uiR2EntryPoint04 33199 -12007 W +//z1 uiR2_Jungle17 uiR2EntryPoint05 32971 -11754 S +//z1 uiR2_Jungle17 uiR2EntryPoint06 33038 -11926 E + +//z1 uiR2_Jungle20 uiR2EntryPoint01 35650 -12140 N + +//z1 uiR2_Jungle31 uiR2EntryPoint01 33149 -12874 N +//z1 uiR2_Jungle31 uiR2EntryPoint02 33066 -13037 S +//z1 uiR2_Jungle31 uiR2EntryPoint03 33043 -12726 NW + +//z1 uiR2_Jungle37 uiR2EntryPoint01 37929 -12925 N + +//z1 uiR2_Jungle39 uiR2EntryPoint01 38971 -12788 N +//z1 uiR2_Jungle39 uiR2EntryPoint02 39024 -13072 NE +//z1 uiR2_Jungle39 uiR2EntryPoint03 39159 -12877 E +//z1 uiR2_Jungle39 uiR2EntryPoint04 39432 -13045 N +//z1 uiR2_Jungle39 uiR2EntryPoint05 39280 -12841 N +//z1 uiR2_Jungle39 uiR2EntryPoint06 39255 -12682 N +//z1 uiR2_Jungle39 uiR2EntryPoint07 39433 -12707 E + +//z1 uiR2_Jungle40 uiR2EntryPoint01 40132 -12610 N + +//z1 uiR2_Jungle43 uiR2EntryPoint01 31767 -13391 N + + +// Prime Roots + +p1 uiR2_Primes04 uiR2EntryPoint01 33300 -21200 S +p1 uiR2_Primes04 uiR2EntryPoint02 33454 -21456 NW +p1 uiR2_Primes04 uiR2EntryPoint03 33029 -21522 E + +p1 uiR2_Primes06 uiR2EntryPoint01 34700 -21070 SE +p1 uiR2_Primes06 uiR2EntryPoint02 34905 -21093 SW +p1 uiR2_Primes06 uiR2EntryPoint03 34733 -21359 N + +p1 uiR2_Primes22 uiR2EntryPoint01 37500 -21960 S +p1 uiR2_Primes22 uiR2EntryPoint02 37524 -22163 N +p1 uiR2_Primes22 uiR2EntryPoint03 37394 -22286 NE + +p1 uiR2_Primes09 uiR2EntryPoint01 36950 -21200 E +p1 uiR2_Primes09 uiR2EntryPoint02 37532 -21366 W +p1 uiR2_Primes09 uiR2EntryPoint03 37208 -21170 S + +p3 uiR2_Primes29 uiR2EntryPoint01 33140 -22910 W +p3 uiR2_Primes29 uiR2EntryPoint02 33016 -22602 S +p3 uiR2_Primes29 uiR2EntryPoint03 32776 -23057 NE + +p3 uiR2_Primes01 uiR2EntryPoint01 31110 -21520 E +p3 uiR2_Primes01 uiR2EntryPoint02 31198 -21061 S +p3 uiR2_Primes01 uiR2EntryPoint03 31132 -21312 E + +p3 uiR2_Primes05 uiR2EntryPoint01 34250 -21300 W +p3 uiR2_Primes05 uiR2EntryPoint02 33891 -21271 E +p3 uiR2_Primes05 uiR2EntryPoint03 34151 -21558 N + +p5 uiR2_Primes16 uiR2EntryPoint01 32970 -22100 NW +p5 uiR2_Primes16 uiR2EntryPoint02 32763 -21871 SE +p5 uiR2_Primes16 uiR2EntryPoint03 32890 -21990 S + +p5 uiR2_Primes18 uiR2EntryPoint01 34600 -22075 W +p5 uiR2_Primes18 uiR2EntryPoint02 34205 -22078 E +p5 uiR2_Primes18 uiR2EntryPoint03 34651 -21825 S + +p5 uiR2_Primes25 uiR2EntryPoint01 39910 -22320 E +p5 uiR2_Primes25 uiR2EntryPoint02 39757 -22077 E +p5 uiR2_Primes25 uiR2EntryPoint03 39979 -22132 NW + +p6 uiR2_Primes03 uiR2EntryPoint01 32300 -21100 SE +p6 uiR2_Primes03 uiR2EntryPoint02 32288 -21484 N +p6 uiR2_Primes03 uiR2EntryPoint03 32691 -21085 SW + +p6 uiR2_Primes07 uiR2EntryPoint01 35350 -21300 NE +p6 uiR2_Primes07 uiR2EntryPoint02 35519 -21067 S +p6 uiR2_Primes07 uiR2EntryPoint03 35601 -21405 N + +p6 uiR2_Primes13 uiR2EntryPoint01 40330 -21600 N +p6 uiR2_Primes13 uiR2EntryPoint02 40127 -21438 E +p6 uiR2_Primes13 uiR2EntryPoint03 40537 -21438 W + +p7 uiR2_Primes19 uiR2EntryPoint01 35000 -22300 N +p7 uiR2_Primes19 uiR2EntryPoint02 35456 -22007 W +p7 uiR2_Primes19 uiR2EntryPoint03 35022 -21891 SE + +p7 uiR2_Primes26 uiR2EntryPoint01 40500 -22100 N +p7 uiR2_Primes26 uiR2EntryPoint02 40694 -22284 NW +p7 uiR2_Primes26 uiR2EntryPoint03 40426 -22298 NE + +p7 uiR2_Primes08 uiR2EntryPoint01 36200 -21100 E +p7 uiR2_Primes08 uiR2EntryPoint02 36393 -21558 N +p7 uiR2_Primes08 uiR2EntryPoint03 36077 -21345 S + +p8 uiR2_Primes10 uiR2EntryPoint01 38002 -21293 N +p8 uiR2_Primes10 uiR2EntryPoint02 38006 -21532 N +p8 uiR2_Primes10 uiR2EntryPoint03 38094 -21040 S + +p8 uiR2_Primes11 uiR2EntryPoint01 38970 -21520 W +p8 uiR2_Primes11 uiR2EntryPoint02 38721 -21047 S +p8 uiR2_Primes11 uiR2EntryPoint03 38577 -21350 NW + +p8 uiR2_Primes15 uiR2EntryPoint01 31980 -21880 SE +p8 uiR2_Primes15 uiR2EntryPoint02 32365 -22121 NW +p8 uiR2_Primes15 uiR2EntryPoint03 32159 -22032 N + +p11 uiR2_Primes30 uiR2EntryPoint01 33730 -22860 N +p11 uiR2_Primes30 uiR2EntryPoint02 33656 -22604 E +p11 uiR2_Primes30 uiR2EntryPoint03 33843 -22997 E + +p11 uiR2_Primes12 uiR2EntryPoint01 39500 -21280 NE +p11 uiR2_Primes12 uiR2EntryPoint02 39240 -21197 E +p11 uiR2_Primes12 uiR2EntryPoint03 39800 -21352 W + +p11 uiR2_Primes14 uiR2EntryPoint01 31350 -21960 S +p11 uiR2_Primes14 uiR2EntryPoint02 31373 -22074 S +p11 uiR2_Primes14 uiR2EntryPoint03 31166 -22272 NE + +p12 uiR2_Primes17 uiR2EntryPoint01 33660 -22000 SW +p12 uiR2_Primes17 uiR2EntryPoint02 33397 -21879 SE +p12 uiR2_Primes17 uiR2EntryPoint03 33347 -22331 N + +p12 uiR2_Primes21 uiR2EntryPoint01 37000 -22150 W +p12 uiR2_Primes21 uiR2EntryPoint02 36645 -21864 SE +p12 uiR2_Primes21 uiR2EntryPoint03 36964 -21813 SE + +p12 uiR2_Primes27 uiR2EntryPoint01 31530 -22700 SW +p12 uiR2_Primes27 uiR2EntryPoint02 31533 -23080 NW +p12 uiR2_Primes27 uiR2EntryPoint03 31078 -22800 N + + + +o1 uiR2_Primes02 uiR2EntryPoint01 31640 -21140 SE +o1 uiR2_Primes02 uiR2EntryPoint02 31593 -21374 N +o1 uiR2_Primes02 uiR2EntryPoint03 31818 -21204 W + +o1 uiR2_Primes28 uiR2EntryPoint01 32270 -23000 N +o1 uiR2_Primes28 uiR2EntryPoint02 32316 -22662 S +o1 uiR2_Primes28 uiR2EntryPoint03 31933 -22734 SE + + + +//z1 uiR2_Primes20 uiR2EntryPoint01 35790 -22100 N + +//z1 uiR2_Primes23 uiR2EntryPoint01 38360 -21970 N + +//z1 uiR2_Primes24 uiR2EntryPoint02 38906 -21891 SE + +//z1 uiR2_Primes24 uiR2EntryPoint03 39086 -22287 NW diff --git a/ryzom/common/data_common/r2/r2_islands.xml b/ryzom/common/data_common/r2/r2_islands.xml index a8209512d9..feee68d572 100644 --- a/ryzom/common/data_common/r2/r2_islands.xml +++ b/ryzom/common/data_common/r2/r2_islands.xml @@ -1,2847 +1,2887 @@ -<?xml version="1.0"?> -<islands> - <complete_island island="uiR2_Lakes01" package="l1" continent="r2_lakes" xmin="31029" ymin="-1611" xmax="31691" ymax="-953"> - <zone name="9_HO"/> - <zone name="10_HN"/> - <zone name="10_HO"/> - <zone name="10_HP"/> - <zone name="9_HN"/> - <zone name="9_HP"/> - <zone name="8_HN"/> - <zone name="8_HO"/> - <zone name="8_HP"/> - <zone name="10_HM"/> - <zone name="9_HM"/> - <zone name="8_HM"/> - <zone name="7_HM"/> - <zone name="7_HN"/> - <zone name="7_HO"/> - <zone name="7_HP"/> - </complete_island> - <complete_island island="uiR2_Lakes02" package="l1" continent="r2_lakes" xmin="31833" ymin="-1611" xmax="32483" ymax="-949"> - <zone name="8_HS"/> - <zone name="9_HR"/> - <zone name="9_HS"/> - <zone name="9_HT"/> - <zone name="8_HR"/> - <zone name="8_HT"/> - <zone name="7_HR"/> - <zone name="7_HS"/> - <zone name="7_HT"/> - <zone name="10_HR"/> - <zone name="10_HS"/> - <zone name="10_HT"/> - <zone name="10_HU"/> - <zone name="9_HU"/> - <zone name="8_HU"/> - <zone name="7_HU"/> - </complete_island> - <complete_island island="uiR2_Lakes03" package="l1" continent="r2_lakes" xmin="32639" ymin="-1609" xmax="33446" ymax="-827"> - <zone name="7_HY"/> - <zone name="8_HX"/> - <zone name="8_HY"/> - <zone name="8_HZ"/> - <zone name="7_HX"/> - <zone name="7_HZ"/> - <zone name="6_HX"/> - <zone name="6_HY"/> - <zone name="6_HZ"/> - <zone name="9_HW"/> - <zone name="9_HX"/> - <zone name="9_HY"/> - <zone name="8_HW"/> - <zone name="7_HW"/> - <zone name="9_HZ"/> - <zone name="9_IA"/> - <zone name="8_IA"/> - <zone name="7_IA"/> - <zone name="6_HW"/> - <zone name="6_IA"/> - <zone name="10_HW"/> - <zone name="10_HX"/> - <zone name="10_HY"/> - <zone name="10_HZ"/> - <zone name="10_IA"/> - </complete_island> - <complete_island island="uiR2_Lakes04" package="l1" continent="r2_lakes" xmin="33627" ymin="-1352" xmax="34373" ymax="-952"> - <zone name="8_IC"/> - <zone name="9_ID"/> - <zone name="8_ID"/> - <zone name="7_IC"/> - <zone name="7_ID"/> - <zone name="9_IE"/> - <zone name="8_IE"/> - <zone name="7_IE"/> - <zone name="9_IF"/> - <zone name="8_IF"/> - <zone name="7_IF"/> - <zone name="9_IG"/> - <zone name="8_IG"/> - </complete_island> - <complete_island island="uiR2_Lakes05" package="l1" continent="r2_lakes" xmin="34554" ymin="-1353" xmax="35101" ymax="-827"> - <zone name="8_IJ"/> - <zone name="9_IJ"/> - <zone name="9_IK"/> - <zone name="8_II"/> - <zone name="8_IK"/> - <zone name="7_II"/> - <zone name="7_IJ"/> - <zone name="7_IK"/> - <zone name="9_IL"/> - <zone name="8_IL"/> - <zone name="6_II"/> - <zone name="6_IJ"/> - <zone name="6_IK"/> - </complete_island> - <complete_island island="uiR2_Lakes06" package="l1" continent="r2_lakes" xmin="35351" ymin="-1413" xmax="36009" ymax="-791"> - <zone name="9_IO"/> - <zone name="9_IN"/> - <zone name="9_IP"/> - <zone name="8_IN"/> - <zone name="8_IO"/> - <zone name="8_IP"/> - <zone name="9_IQ"/> - <zone name="8_IQ"/> - <zone name="7_IN"/> - <zone name="7_IO"/> - <zone name="7_IP"/> - <zone name="7_IQ"/> - <zone name="6_IN"/> - <zone name="6_IO"/> - </complete_island> - <complete_island island="uiR2_Lakes07" package="l1" continent="r2_lakes" xmin="36154" ymin="-1413" xmax="36552" ymax="-951"> - <zone name="7_IT"/> - <zone name="8_IS"/> - <zone name="8_IT"/> - <zone name="8_IU"/> - <zone name="7_IS"/> - <zone name="7_IU"/> - <zone name="9_IS"/> - <zone name="9_IT"/> - <zone name="9_IU"/> - </complete_island> - <complete_island island="uiR2_Lakes08" package="l1" continent="r2_lakes" xmin="36827" ymin="-1609" xmax="37449" ymax="-987"> - <zone name="9_IZ"/> - <zone name="10_IY"/> - <zone name="9_IY"/> - <zone name="8_IY"/> - <zone name="8_IZ"/> - <zone name="10_IX"/> - <zone name="9_IX"/> - <zone name="8_IX"/> - <zone name="7_IX"/> - <zone name="7_IY"/> - <zone name="9_IW"/> - <zone name="8_IW"/> - </complete_island> - <complete_island island="uiR2_Lakes09" package="l1" continent="r2_lakes" xmin="37599" ymin="-1609" xmax="38249" ymax="-959"> - <zone name="9_JD"/> - <zone name="10_JC"/> - <zone name="10_JD"/> - <zone name="10_JE"/> - <zone name="9_JC"/> - <zone name="9_JE"/> - <zone name="8_JC"/> - <zone name="8_JD"/> - <zone name="8_JE"/> - <zone name="10_JB"/> - <zone name="9_JB"/> - <zone name="8_JB"/> - <zone name="7_JB"/> - <zone name="7_JC"/> - <zone name="7_JD"/> - <zone name="7_JE"/> - </complete_island> - <complete_island island="uiR2_Lakes10" package="l1" continent="r2_lakes" xmin="38398" ymin="-1609" xmax="39046" ymax="-987"> - <zone name="10_JJ"/> - <zone name="10_JI"/> - <zone name="9_JI"/> - <zone name="9_JJ"/> - <zone name="10_JH"/> - <zone name="9_JH"/> - <zone name="8_JH"/> - <zone name="8_JI"/> - <zone name="8_JJ"/> - <zone name="10_JG"/> - <zone name="9_JG"/> - <zone name="8_JG"/> - <zone name="7_JG"/> - <zone name="7_JH"/> - <zone name="7_JI"/> - <zone name="7_JJ"/> - </complete_island> - <complete_island island="uiR2_Lakes11" package="l1" continent="r2_lakes" xmin="31034" ymin="-2406" xmax="31653" ymax="-1847"> - <zone name="13_HN"/> - <zone name="14_HM"/> - <zone name="14_HN"/> - <zone name="14_HO"/> - <zone name="13_HM"/> - <zone name="13_HO"/> - <zone name="12_HM"/> - <zone name="12_HN"/> - <zone name="12_HO"/> - <zone name="15_HN"/> - <zone name="15_HO"/> - <zone name="15_HP"/> - <zone name="14_HP"/> - <zone name="13_HP"/> - <zone name="12_HP"/> - </complete_island> - <complete_island island="uiR2_Lakes12" package="l1" continent="r2_lakes" xmin="31839" ymin="-2569" xmax="32486" ymax="-1848"> - <zone name="15_HR"/> - <zone name="16_HR"/> - <zone name="16_HS"/> - <zone name="15_HS"/> - <zone name="14_HR"/> - <zone name="14_HS"/> - <zone name="16_HT"/> - <zone name="15_HT"/> - <zone name="14_HT"/> - <zone name="13_HR"/> - <zone name="13_HS"/> - <zone name="13_HT"/> - <zone name="16_HU"/> - <zone name="15_HU"/> - <zone name="14_HU"/> - <zone name="12_HR"/> - <zone name="12_HS"/> - <zone name="12_HT"/> - </complete_island> - <complete_island island="uiR2_Lakes14" package="l1" continent="r2_lakes" xmin="33368" ymin="-2312" xmax="33672" ymax="-2008"> - <zone name="14_IA"/> - <zone name="15_IA"/> - <zone name="15_IB"/> - <zone name="14_IB"/> - <zone name="13_IA"/> - <zone name="13_IB"/> - <zone name="15_IC"/> - <zone name="14_IC"/> - <zone name="13_IC"/> - </complete_island> - <complete_island island="uiR2_Lakes15" package="l1" continent="r2_lakes" xmin="34008" ymin="-2152" xmax="34726" ymax="-1787"> - <zone name="12_II"/> - <zone name="13_IH"/> - <zone name="13_II"/> - <zone name="12_IH"/> - <zone name="14_IG"/> - <zone name="14_IH"/> - <zone name="14_II"/> - <zone name="13_IG"/> - <zone name="12_IG"/> - <zone name="14_IF"/> - <zone name="13_IF"/> - <zone name="12_IF"/> - <zone name="14_IE"/> - <zone name="13_IE"/> - <zone name="12_IE"/> - </complete_island> - <complete_island island="uiR2_Lakes16" package="l1" continent="r2_lakes" xmin="34869" ymin="-2411" xmax="35682" ymax="-1753"> - <zone name="14_IM"/> - <zone name="15_IL"/> - <zone name="15_IM"/> - <zone name="15_IN"/> - <zone name="14_IL"/> - <zone name="14_IN"/> - <zone name="13_IL"/> - <zone name="13_IM"/> - <zone name="13_IN"/> - <zone name="15_IK"/> - <zone name="14_IK"/> - <zone name="15_IO"/> - <zone name="14_IO"/> - <zone name="13_IK"/> - <zone name="13_IO"/> - <zone name="12_IK"/> - <zone name="12_IL"/> - <zone name="12_IM"/> - <zone name="12_IN"/> - <zone name="12_IO"/> - </complete_island> - <complete_island island="uiR2_Lakes17" package="l1" continent="r2_lakes" xmin="35826" ymin="-2407" xmax="36247" ymax="-1753"> - <zone name="15_IR"/> - <zone name="15_IQ"/> - <zone name="15_IS"/> - <zone name="14_IQ"/> - <zone name="13_IQ"/> - <zone name="13_IR"/> - <zone name="12_IQ"/> - <zone name="12_IR"/> - </complete_island> - <complete_island island="uiR2_Lakes18" package="l1" continent="r2_lakes" xmin="36530" ymin="-2327" xmax="37004" ymax="-1878"> - <zone name="13_IV"/> - <zone name="14_IV"/> - <zone name="14_IW"/> - <zone name="13_IU"/> - <zone name="13_IW"/> - <zone name="12_IV"/> - <zone name="15_IW"/> - <zone name="14_IX"/> - <zone name="13_IX"/> - </complete_island> - <complete_island island="uiR2_Lakes19" package="l1" continent="r2_lakes" xmin="37276" ymin="-2385" xmax="37858" ymax="-1864"> - <zone name="14_JB"/> - <zone name="14_JA"/> - <zone name="13_JA"/> - <zone name="13_JB"/> - <zone name="13_JC"/> - <zone name="15_IZ"/> - <zone name="14_IZ"/> - <zone name="13_IZ"/> - <zone name="12_JA"/> - <zone name="12_JB"/> - </complete_island> - <complete_island island="uiR2_Lakes20" package="l1" continent="r2_lakes" xmin="38066" ymin="-2385" xmax="38602" ymax="-1744"> - <zone name="13_JE"/> - <zone name="14_JF"/> - <zone name="13_JF"/> - <zone name="12_JF"/> - <zone name="15_JF"/> - <zone name="14_JG"/> - <zone name="13_JG"/> - <zone name="12_JG"/> - <zone name="13_JH"/> - </complete_island> - <complete_island island="uiR2_Lakes21" package="l1" continent="r2_lakes" xmin="31032" ymin="-3244" xmax="31591" ymax="-2678"> - <zone name="18_HN"/> - <zone name="19_HM"/> - <zone name="19_HN"/> - <zone name="19_HO"/> - <zone name="18_HM"/> - <zone name="18_HO"/> - <zone name="17_HO"/> - <zone name="20_HM"/> - <zone name="20_HN"/> - <zone name="20_HO"/> - <zone name="18_HP"/> - <zone name="21_HN"/> - </complete_island> - <complete_island island="uiR2_Lakes22" package="l1" continent="r2_lakes" xmin="31833" ymin="-3287" xmax="32336" ymax="-2715"> - <zone name="18_HT"/> - <zone name="19_HS"/> - <zone name="19_HT"/> - <zone name="18_HS"/> - <zone name="20_HR"/> - <zone name="20_HS"/> - <zone name="20_HT"/> - <zone name="19_HR"/> - <zone name="18_HR"/> - <zone name="21_HR"/> - </complete_island> - <complete_island island="uiR2_Lakes23" package="l1" continent="r2_lakes" xmin="32463" ymin="-3207" xmax="32814" ymax="-2704"> - <zone name="20_HW"/> - <zone name="20_HV"/> - <zone name="19_HV"/> - <zone name="18_HV"/> - <zone name="18_HW"/> - </complete_island> - <complete_island island="uiR2_Lakes24" package="l1" continent="r2_lakes" xmin="33076" ymin="-3252" xmax="33600" ymax="-2672"> - <zone name="20_IA"/> - <zone name="21_IA"/> - <zone name="21_IB"/> - <zone name="20_HZ"/> - <zone name="20_IB"/> - <zone name="19_HZ"/> - <zone name="19_IA"/> - <zone name="19_IB"/> - <zone name="18_HY"/> - <zone name="18_HZ"/> - <zone name="18_IA"/> - <zone name="18_IB"/> - <zone name="17_HZ"/> - </complete_island> - <complete_island island="uiR2_Lakes25" package="l1" continent="r2_lakes" xmin="33746" ymin="-3345" xmax="34190" ymax="-2672"> - <zone name="20_IE"/> - <zone name="21_IE"/> - <zone name="20_ID"/> - <zone name="20_IF"/> - <zone name="19_ID"/> - <zone name="19_IE"/> - <zone name="19_IF"/> - <zone name="18_IE"/> - <zone name="18_IF"/> - <zone name="17_IE"/> - </complete_island> - <complete_island island="uiR2_Lakes26" package="l1" continent="r2_lakes" xmin="34415" ymin="-3198" xmax="34830" ymax="-2546"> - <zone name="20_IH"/> - <zone name="20_II"/> - <zone name="19_II"/> - <zone name="20_IJ"/> - <zone name="18_IH"/> - <zone name="18_II"/> - <zone name="18_IJ"/> - <zone name="17_II"/> - </complete_island> - <complete_island island="uiR2_Lakes27" package="l1" continent="r2_lakes" xmin="35038" ymin="-3173" xmax="35752" ymax="-2551"> - <zone name="20_IO"/> - <zone name="20_IN"/> - <zone name="19_IN"/> - <zone name="19_IO"/> - <zone name="19_IP"/> - <zone name="20_IM"/> - <zone name="19_IM"/> - <zone name="18_IM"/> - <zone name="18_IN"/> - <zone name="18_IO"/> - <zone name="18_IP"/> - <zone name="20_IL"/> - <zone name="19_IL"/> - <zone name="18_IL"/> - <zone name="17_IL"/> - <zone name="17_IM"/> - <zone name="17_IN"/> - <zone name="17_IO"/> - <zone name="17_IP"/> - </complete_island> - <complete_island island="uiR2_Lakes28" package="l1" continent="r2_lakes" xmin="35991" ymin="-3209" xmax="36641" ymax="-2554"> - <zone name="20_IU"/> - <zone name="20_IT"/> - <zone name="19_IT"/> - <zone name="19_IU"/> - <zone name="20_IS"/> - <zone name="19_IS"/> - <zone name="18_IS"/> - <zone name="18_IT"/> - <zone name="18_IU"/> - <zone name="20_IR"/> - <zone name="19_IR"/> - <zone name="18_IR"/> - <zone name="17_IR"/> - <zone name="17_IS"/> - <zone name="17_IT"/> - <zone name="17_IU"/> - </complete_island> - <complete_island island="uiR2_Lakes29" package="l1" continent="r2_lakes" xmin="36888" ymin="-3173" xmax="37672" ymax="-2719"> - <zone name="20_JA"/> - <zone name="20_JB"/> - <zone name="19_IZ"/> - <zone name="19_JA"/> - <zone name="19_JB"/> - <zone name="20_IY"/> - <zone name="19_IY"/> - <zone name="18_IY"/> - <zone name="18_IZ"/> - <zone name="18_JA"/> - <zone name="18_JB"/> - <zone name="20_IX"/> - <zone name="19_IX"/> - <zone name="18_IX"/> - <zone name="20_IW"/> - <zone name="19_IW"/> - <zone name="18_IW"/> - </complete_island> - <complete_island island="uiR2_Lakes30" package="l1" continent="r2_lakes" xmin="38007" ymin="-3173" xmax="38566" ymax="-2587"> - <zone name="18_JE"/> - <zone name="19_JD"/> - <zone name="19_JE"/> - <zone name="19_JF"/> - <zone name="18_JD"/> - <zone name="18_JF"/> - <zone name="17_JD"/> - <zone name="17_JE"/> - <zone name="17_JF"/> - <zone name="20_JD"/> - <zone name="20_JE"/> - <zone name="20_JF"/> - <zone name="20_JG"/> - <zone name="19_JG"/> - <zone name="18_JG"/> - <zone name="17_JG"/> - </complete_island> - <complete_island island="uiR2_Lakes31" package="l1" continent="r2_lakes" xmin="31152" ymin="-4174" xmax="31694" ymax="-3632"> - <zone name="26_HN"/> - <zone name="25_HN"/> - <zone name="24_HM"/> - <zone name="24_HN"/> - <zone name="24_HO"/> - <zone name="23_HN"/> - <zone name="24_HP"/> - </complete_island> - <complete_island island="uiR2_Lakes32" package="l1" continent="r2_lakes" xmin="31855" ymin="-3950" xmax="32170" ymax="-3521"> - <zone name="23_HR"/> - <zone name="24_HR"/> - <zone name="24_HS"/> - <zone name="23_HS"/> - <zone name="25_HS"/> - </complete_island> - <complete_island island="uiR2_Lakes33" package="l1" continent="r2_lakes" xmin="32308" ymin="-4036" xmax="32835" ymax="-3506"> - <zone name="25_HU"/> - <zone name="25_HV"/> - <zone name="24_HU"/> - <zone name="24_HV"/> - <zone name="26_HW"/> - <zone name="25_HW"/> - <zone name="24_HW"/> - <zone name="23_HU"/> - <zone name="23_HV"/> - <zone name="23_HW"/> - <zone name="25_HX"/> - </complete_island> - <complete_island island="uiR2_Lakes34" package="l1" continent="r2_lakes" xmin="33103" ymin="-4168" xmax="33774" ymax="-3511"> - <zone name="25_IB"/> - <zone name="26_IA"/> - <zone name="26_IB"/> - <zone name="26_IC"/> - <zone name="25_IA"/> - <zone name="25_IC"/> - <zone name="24_IA"/> - <zone name="24_IB"/> - <zone name="26_HZ"/> - <zone name="25_HZ"/> - <zone name="24_HZ"/> - <zone name="23_IA"/> - <zone name="23_IB"/> - <zone name="23_IC"/> - </complete_island> - <complete_island island="uiR2_Lakes35" package="l1" continent="r2_lakes" xmin="33947" ymin="-4166" xmax="34533" ymax="-3514"> - <zone name="26_IF"/> - <zone name="26_IG"/> - <zone name="25_IF"/> - <zone name="25_IG"/> - <zone name="26_IH"/> - <zone name="25_IH"/> - <zone name="24_IE"/> - <zone name="24_IF"/> - <zone name="24_IG"/> - <zone name="23_IE"/> - <zone name="23_IF"/> - <zone name="23_IG"/> - </complete_island> - <complete_island island="uiR2_Lakes36" package="l1" continent="r2_lakes" xmin="34823" ymin="-3888" xmax="35266" ymax="-3506"> - <zone name="24_IK"/> - <zone name="25_IK"/> - <zone name="24_IJ"/> - <zone name="24_IL"/> - <zone name="23_IK"/> - <zone name="23_IL"/> - <zone name="24_IM"/> - </complete_island> - <complete_island island="uiR2_Lakes37" package="l1" continent="r2_lakes" xmin="35511" ymin="-4014" xmax="36009" ymax="-3506"> - <zone name="24_IP"/> - <zone name="25_IO"/> - <zone name="25_IP"/> - <zone name="25_IQ"/> - <zone name="24_IO"/> - <zone name="24_IQ"/> - <zone name="23_IO"/> - <zone name="23_IP"/> - <zone name="23_IQ"/> - </complete_island> - <complete_island island="uiR2_Lakes38" package="l1" continent="r2_lakes" xmin="36146" ymin="-4174" xmax="36945" ymax="-3521"> - <zone name="24_IV"/> - <zone name="25_IU"/> - <zone name="25_IV"/> - <zone name="25_IW"/> - <zone name="24_IU"/> - <zone name="24_IW"/> - <zone name="23_IU"/> - <zone name="23_IV"/> - <zone name="26_IV"/> - <zone name="24_IT"/> - <zone name="23_IT"/> - <zone name="24_IS"/> - </complete_island> - <complete_island island="uiR2_Lakes39" package="l1" continent="r2_lakes" xmin="37236" ymin="-4048" xmax="37933" ymax="-3485"> - <zone name="25_JA"/> - <zone name="26_JA"/> - <zone name="25_IZ"/> - <zone name="25_JB"/> - <zone name="24_IZ"/> - <zone name="24_JA"/> - <zone name="24_JB"/> - <zone name="25_JC"/> - <zone name="24_JC"/> - <zone name="23_IY"/> - <zone name="23_IZ"/> - <zone name="23_JA"/> - <zone name="23_JC"/> - <zone name="22_IZ"/> - </complete_island> - <complete_island island="uiR2_Lakes40" package="l1" continent="r2_lakes" xmin="38074" ymin="-3912" xmax="38632" ymax="-3351"> - <zone name="22_JE"/> - <zone name="23_JE"/> - <zone name="23_JF"/> - <zone name="22_JF"/> - <zone name="24_JE"/> - <zone name="24_JF"/> - <zone name="24_JG"/> - <zone name="23_JG"/> - <zone name="22_JG"/> - <zone name="25_JF"/> - <zone name="25_JG"/> - <zone name="25_JH"/> - <zone name="24_JH"/> - <zone name="23_JH"/> - </complete_island> - <complete_island island="uiR2_Deserts01" package="d1" continent="r2_desert" xmin="21275" ymin="-1445" xmax="21764" ymax="-962"> - <zone name="9_FE"/> - <zone name="9_FD"/> - <zone name="9_FF"/> - <zone name="8_FD"/> - <zone name="8_FE"/> - <zone name="8_FF"/> - <zone name="7_FD"/> - <zone name="7_FE"/> - <zone name="7_FF"/> - </complete_island> - <complete_island island="uiR2_Deserts02" package="d1" continent="r2_desert" xmin="21921" ymin="-1599" xmax="22558" ymax="-962"> - <zone name="9_FH"/> - <zone name="9_FI"/> - <zone name="8_FH"/> - <zone name="8_FI"/> - <zone name="10_FJ"/> - <zone name="9_FJ"/> - <zone name="8_FJ"/> - <zone name="7_FH"/> - <zone name="7_FI"/> - <zone name="10_FK"/> - <zone name="9_FK"/> - <zone name="8_FK"/> - </complete_island> - <complete_island island="uiR2_Deserts03" package="d1" continent="r2_desert" xmin="22723" ymin="-1349" xmax="23109" ymax="-1051"> - <zone name="7_FM"/> - <zone name="8_FM"/> - <zone name="8_FN"/> - <zone name="7_FN"/> - <zone name="9_FM"/> - <zone name="9_FN"/> - <zone name="9_FO"/> - <zone name="8_FO"/> - <zone name="7_FO"/> - </complete_island> - <complete_island island="uiR2_Deserts04" package="d1" continent="r2_desert" xmin="23355" ymin="-1605" xmax="24005" ymax="-962"> - <zone name="8_FT"/> - <zone name="9_FS"/> - <zone name="9_FT"/> - <zone name="8_FS"/> - <zone name="7_FS"/> - <zone name="7_FT"/> - <zone name="10_FR"/> - <zone name="10_FS"/> - <zone name="10_FT"/> - <zone name="9_FR"/> - <zone name="8_FR"/> - <zone name="7_FR"/> - <zone name="10_FQ"/> - <zone name="9_FQ"/> - <zone name="8_FQ"/> - <zone name="7_FQ"/> - </complete_island> - <complete_island island="uiR2_Deserts05" package="d1" continent="r2_desert" xmin="24161" ymin="-1598" xmax="24709" ymax="-956"> - <zone name="7_FX"/> - <zone name="8_FW"/> - <zone name="8_FX"/> - <zone name="8_FY"/> - <zone name="7_FW"/> - <zone name="7_FY"/> - <zone name="9_FV"/> - <zone name="9_FW"/> - <zone name="9_FX"/> - <zone name="8_FV"/> - <zone name="7_FV"/> - <zone name="9_FY"/> - <zone name="10_FV"/> - <zone name="10_FW"/> - <zone name="10_FX"/> - <zone name="10_FY"/> - </complete_island> - <complete_island island="uiR2_Deserts06" package="d1" continent="r2_desert" xmin="24955" ymin="-1605" xmax="25604" ymax="-956"> - <zone name="8_GB"/> - <zone name="9_GA"/> - <zone name="9_GB"/> - <zone name="9_GC"/> - <zone name="8_GA"/> - <zone name="8_GC"/> - <zone name="7_GA"/> - <zone name="7_GB"/> - <zone name="7_GC"/> - <zone name="10_GA"/> - <zone name="10_GB"/> - <zone name="10_GC"/> - <zone name="10_GD"/> - <zone name="9_GD"/> - <zone name="8_GD"/> - <zone name="7_GD"/> - </complete_island> - <complete_island island="uiR2_Deserts07" package="d1" continent="r2_desert" xmin="25755" ymin="-1597" xmax="26238" ymax="-956"> - <zone name="7_GF"/> - <zone name="8_GF"/> - <zone name="8_GG"/> - <zone name="7_GG"/> - <zone name="9_GF"/> - <zone name="9_GG"/> - <zone name="9_GH"/> - <zone name="8_GH"/> - <zone name="7_GH"/> - <zone name="10_GF"/> - <zone name="10_GG"/> - <zone name="10_GH"/> - </complete_island> - <complete_island island="uiR2_Deserts08" package="d1" continent="r2_desert" xmin="26401" ymin="-1605" xmax="27038" ymax="-962"> - <zone name="8_GJ"/> - <zone name="9_GJ"/> - <zone name="9_GK"/> - <zone name="8_GK"/> - <zone name="7_GJ"/> - <zone name="7_GK"/> - <zone name="10_GJ"/> - <zone name="10_GK"/> - <zone name="10_GL"/> - <zone name="9_GL"/> - <zone name="8_GL"/> - <zone name="7_GL"/> - <zone name="10_GM"/> - <zone name="9_GM"/> - <zone name="8_GM"/> - <zone name="7_GM"/> - </complete_island> - <complete_island island="uiR2_Deserts09" package="d1" continent="r2_desert" xmin="27361" ymin="-1605" xmax="27909" ymax="-956"> - <zone name="7_GQ"/> - <zone name="8_GP"/> - <zone name="8_GQ"/> - <zone name="8_GR"/> - <zone name="7_GP"/> - <zone name="7_GR"/> - <zone name="9_GP"/> - <zone name="9_GQ"/> - <zone name="9_GR"/> - <zone name="9_GS"/> - <zone name="8_GS"/> - <zone name="7_GS"/> - <zone name="10_GP"/> - <zone name="10_GQ"/> - <zone name="10_GR"/> - <zone name="10_GS"/> - </complete_island> - <complete_island island="uiR2_Deserts10" package="d1" continent="r2_desert" xmin="28635" ymin="-1599" xmax="29278" ymax="-1052"> - <zone name="7_GY"/> - <zone name="8_GX"/> - <zone name="8_GY"/> - <zone name="8_GZ"/> - <zone name="7_GX"/> - <zone name="9_GX"/> - <zone name="9_GY"/> - <zone name="9_GZ"/> - <zone name="9_HA"/> - <zone name="8_HA"/> - <zone name="10_GX"/> - <zone name="10_GY"/> - <zone name="10_GZ"/> - </complete_island> - <complete_island island="uiR2_Deserts11" package="d1" continent="r2_desert" xmin="29441" ymin="-1599" xmax="30077" ymax="-962"> - <zone name="10_HD"/> - <zone name="10_HC"/> - <zone name="10_HE"/> - <zone name="9_HC"/> - <zone name="9_HD"/> - <zone name="9_HE"/> - <zone name="9_HF"/> - <zone name="8_HC"/> - <zone name="8_HD"/> - <zone name="8_HE"/> - <zone name="8_HF"/> - <zone name="7_HC"/> - <zone name="7_HD"/> - <zone name="7_HE"/> - <zone name="7_HF"/> - </complete_island> - <complete_island island="uiR2_Deserts12" package="d1" continent="r2_desert" xmin="30235" ymin="-1598" xmax="30885" ymax="-961"> - <zone name="10_HI"/> - <zone name="10_HH"/> - <zone name="10_HJ"/> - <zone name="9_HH"/> - <zone name="9_HI"/> - <zone name="9_HJ"/> - <zone name="10_HK"/> - <zone name="9_HK"/> - <zone name="8_HH"/> - <zone name="8_HI"/> - <zone name="8_HJ"/> - <zone name="8_HK"/> - <zone name="7_HH"/> - <zone name="7_HI"/> - <zone name="7_HJ"/> - <zone name="7_HK"/> - </complete_island> - <complete_island island="uiR2_Deserts13" package="d1" continent="r2_desert" xmin="28483" ymin="-2309" xmax="29029" ymax="-1851"> - <zone name="12_GX"/> - <zone name="13_GX"/> - <zone name="13_GY"/> - <zone name="12_GY"/> - <zone name="14_GW"/> - <zone name="14_GX"/> - <zone name="14_GY"/> - <zone name="14_GZ"/> - <zone name="13_GZ"/> - <zone name="12_GZ"/> - <zone name="15_GW"/> - <zone name="15_GX"/> - <zone name="15_GY"/> - </complete_island> - <complete_island island="uiR2_Deserts14" package="d1" continent="r2_desert" xmin="30235" ymin="-2405" xmax="30885" ymax="-1756"> - <zone name="14_HH"/> - <zone name="15_HH"/> - <zone name="15_HI"/> - <zone name="14_HI"/> - <zone name="13_HH"/> - <zone name="13_HI"/> - <zone name="15_HJ"/> - <zone name="14_HJ"/> - <zone name="13_HJ"/> - <zone name="12_HH"/> - <zone name="12_HI"/> - <zone name="12_HJ"/> - <zone name="15_HK"/> - <zone name="14_HK"/> - <zone name="13_HK"/> - <zone name="12_HK"/> - </complete_island> - <complete_island island="uiR2_Deserts15" package="d1" continent="r2_desert" xmin="21401" ymin="-2084" xmax="22090" ymax="-1704"> - <zone name="12_FE"/> - <zone name="13_FE"/> - <zone name="12_FD"/> - <zone name="12_FF"/> - <zone name="11_FE"/> - <zone name="12_FG"/> - <zone name="11_FG"/> - <zone name="13_FH"/> - <zone name="12_FH"/> - <zone name="11_FH"/> - </complete_island> - <complete_island island="uiR2_Deserts16" package="d1" continent="r2_desert" xmin="22234" ymin="-2067" xmax="22730" ymax="-1750"> - <zone name="12_FK"/> - <zone name="13_FK"/> - <zone name="13_FL"/> - <zone name="12_FJ"/> - <zone name="12_FL"/> - </complete_island> - <complete_island island="uiR2_Deserts17" package="d1" continent="r2_desert" xmin="23000" ymin="-1985" xmax="23363" ymax="-1648"> - <zone name="11_FO"/> - <zone name="12_FN"/> - <zone name="12_FO"/> - <zone name="12_FP"/> - <zone name="13_FO"/> - </complete_island> - <complete_island island="uiR2_Deserts18" package="d1" continent="r2_desert" xmin="23510" ymin="-2334" xmax="24015" ymax="-1750"> - <zone name="13_FS"/> - <zone name="14_FR"/> - <zone name="14_FS"/> - <zone name="14_FT"/> - <zone name="13_FR"/> - <zone name="13_FT"/> - <zone name="12_FR"/> - <zone name="12_FS"/> - <zone name="12_FT"/> - <zone name="15_FS"/> - </complete_island> - <complete_island island="uiR2_Deserts19" package="d1" continent="r2_desert" xmin="24156" ymin="-2145" xmax="24963" ymax="-1864"> - <zone name="12_FX"/> - <zone name="13_FW"/> - <zone name="13_FX"/> - <zone name="13_FY"/> - <zone name="14_FX"/> - <zone name="13_FV"/> - <zone name="13_FZ"/> - </complete_island> - <complete_island island="uiR2_Deserts20" package="d1" continent="r2_desert" xmin="25108" ymin="-2412" xmax="25776" ymax="-1864"> - <zone name="14_GE"/> - <zone name="15_GD"/> - <zone name="15_GE"/> - <zone name="14_GD"/> - <zone name="13_GD"/> - <zone name="13_GE"/> - <zone name="15_GC"/> - <zone name="14_GC"/> - <zone name="13_GC"/> - <zone name="12_GD"/> - <zone name="14_GB"/> - <zone name="13_GB"/> - </complete_island> - <complete_island island="uiR2_Deserts21" package="d1" continent="r2_desert" xmin="25915" ymin="-2095" xmax="26494" ymax="-1808"> - <zone name="13_GH"/> - <zone name="13_GG"/> - <zone name="13_GI"/> - <zone name="12_GI"/> - <zone name="13_GJ"/> - </complete_island> - <complete_island island="uiR2_Deserts22" package="d1" continent="r2_desert" xmin="26843" ymin="-2117" xmax="27134" ymax="-1808"> - <zone name="13_GN"/> - <zone name="14_GM"/> - <zone name="13_GM"/> - <zone name="12_GM"/> - <zone name="13_GL"/> - </complete_island> - <complete_island island="uiR2_Deserts23" package="d1" continent="r2_desert" xmin="27345" ymin="-2416" xmax="27690" ymax="-1808"> - <zone name="12_GP"/> - <zone name="13_GP"/> - <zone name="13_GQ"/> - <zone name="12_GQ"/> - <zone name="14_GP"/> - <zone name="14_GQ"/> - <zone name="15_GP"/> - <zone name="15_GQ"/> - </complete_island> - <complete_island island="uiR2_Deserts24" package="d1" continent="r2_desert" xmin="27846" ymin="-2090" xmax="28370" ymax="-1704"> - <zone name="12_GV"/> - <zone name="13_GU"/> - <zone name="12_GU"/> - <zone name="11_GU"/> - <zone name="13_GT"/> - <zone name="12_GT"/> - <zone name="13_GS"/> - <zone name="12_GS"/> - </complete_island> - <complete_island island="uiR2_Deserts25" package="d1" continent="r2_desert" xmin="21271" ymin="-2895" xmax="21958" ymax="-2362"> - <zone name="16_FG"/> - <zone name="17_FF"/> - <zone name="17_FG"/> - <zone name="16_FF"/> - <zone name="16_FH"/> - <zone name="15_FF"/> - <zone name="15_FG"/> - <zone name="18_FE"/> - <zone name="18_FF"/> - <zone name="18_FG"/> - <zone name="17_FE"/> - <zone name="16_FE"/> - <zone name="18_FD"/> - <zone name="17_FD"/> - <zone name="16_FD"/> - </complete_island> - <complete_island island="uiR2_Deserts26" package="d1" continent="r2_desert" xmin="22236" ymin="-2724" xmax="22992" ymax="-2235"> - <zone name="17_FM"/> - <zone name="17_FL"/> - <zone name="16_FL"/> - <zone name="16_FM"/> - <zone name="16_FN"/> - <zone name="16_FK"/> - <zone name="15_FK"/> - <zone name="15_FL"/> - <zone name="15_FM"/> - <zone name="16_FJ"/> - </complete_island> - <complete_island island="uiR2_Deserts27" package="d1" continent="r2_desert" xmin="23192" ymin="-2725" xmax="23529" ymax="-2288"> - <zone name="16_FQ"/> - <zone name="17_FP"/> - <zone name="17_FQ"/> - <zone name="16_FP"/> - <zone name="15_FP"/> - </complete_island> - <complete_island island="uiR2_Deserts28" package="d1" continent="r2_desert" xmin="24785" ymin="-2874" xmax="25215" ymax="-2466"> - <zone name="16_FZ"/> - <zone name="17_FZ"/> - <zone name="17_GA"/> - <zone name="16_GA"/> - <zone name="18_FZ"/> - <zone name="18_GA"/> - <zone name="17_GB"/> - </complete_island> - <complete_island island="uiR2_Deserts29" package="d1" continent="r2_desert" xmin="25807" ymin="-2707" xmax="26255" ymax="-2335"> - <zone name="16_GH"/> - <zone name="17_GG"/> - <zone name="17_GH"/> - <zone name="16_GG"/> - <zone name="15_GG"/> - <zone name="15_GH"/> - <zone name="17_GF"/> - </complete_island> - <complete_island island="uiR2_Deserts30" package="d1" continent="r2_desert" xmin="26523" ymin="-2816" xmax="27079" ymax="-2395"> - <zone name="16_GL"/> - <zone name="17_GK"/> - <zone name="17_GL"/> - <zone name="17_GM"/> - <zone name="16_GK"/> - <zone name="16_GM"/> - <zone name="18_GK"/> - <zone name="18_GL"/> - <zone name="17_GJ"/> - <zone name="18_GM"/> - <zone name="17_GN"/> - </complete_island> - <complete_island island="uiR2_Deserts31" package="d1" continent="r2_desert" xmin="27349" ymin="-2785" xmax="27813" ymax="-2550"> - <zone name="18_GP"/> - <zone name="18_GQ"/> - <zone name="17_GP"/> - <zone name="17_GQ"/> - <zone name="18_GR"/> - <zone name="17_GR"/> - </complete_island> - <complete_island island="uiR2_Deserts32" package="d1" continent="r2_desert" xmin="27946" ymin="-2760" xmax="28359" ymax="-2225"> - <zone name="16_GU"/> - <zone name="17_GT"/> - <zone name="17_GU"/> - <zone name="17_GV"/> - <zone name="16_GT"/> - <zone name="15_GT"/> - <zone name="15_GU"/> - <zone name="18_GU"/> - <zone name="15_GS"/> - </complete_island> - <complete_island island="uiR2_Deserts33" package="d1" continent="r2_desert" xmin="29430" ymin="-2566" xmax="29959" ymax="-1917"> - <zone name="15_HD"/> - <zone name="16_HD"/> - <zone name="15_HC"/> - <zone name="15_HE"/> - <zone name="14_HC"/> - <zone name="14_HD"/> - <zone name="14_HE"/> - <zone name="14_HF"/> - <zone name="13_HC"/> - <zone name="13_HD"/> - <zone name="13_HE"/> - </complete_island> - <complete_island island="uiR2_Forest01" package="f1" continent="r2_forest" xmin="21283" ymin="-11528" xmax="21926" ymax="-10883"> - <zone name="71_FD"/> - <zone name="72_FE"/> - <zone name="71_FE"/> - <zone name="70_FD"/> - <zone name="70_FE"/> - <zone name="72_FF"/> - <zone name="71_FF"/> - <zone name="70_FF"/> - <zone name="69_FD"/> - <zone name="69_FE"/> - <zone name="69_FF"/> - <zone name="72_FG"/> - <zone name="71_FG"/> - <zone name="70_FG"/> - <zone name="69_FG"/> - </complete_island> - <complete_island island="uiR2_Forest02" package="f1" continent="r2_forest" xmin="22083" ymin="-11528" xmax="22557" ymax="-10875"> - <zone name="72_FK"/> - <zone name="72_FJ"/> - <zone name="71_FJ"/> - <zone name="71_FK"/> - <zone name="71_FL"/> - <zone name="72_FI"/> - <zone name="71_FI"/> - <zone name="70_FI"/> - <zone name="70_FJ"/> - <zone name="70_FK"/> - <zone name="70_FL"/> - <zone name="69_FI"/> - <zone name="69_FJ"/> - <zone name="69_FK"/> - </complete_island> - <complete_island island="uiR2_Forest03" package="f1" continent="r2_forest" xmin="22872" ymin="-11535" xmax="23526" ymax="-10872"> - <zone name="69_FN"/> - <zone name="70_FN"/> - <zone name="70_FO"/> - <zone name="69_FO"/> - <zone name="71_FN"/> - <zone name="71_FO"/> - <zone name="71_FP"/> - <zone name="70_FP"/> - <zone name="69_FP"/> - <zone name="72_FN"/> - <zone name="72_FO"/> - <zone name="72_FP"/> - <zone name="72_FQ"/> - <zone name="71_FQ"/> - <zone name="70_FQ"/> - <zone name="69_FQ"/> - </complete_island> - <complete_island island="uiR2_Forest04" package="f1" continent="r2_forest" xmin="23674" ymin="-11525" xmax="24335" ymax="-10876"> - <zone name="70_FT"/> - <zone name="71_FS"/> - <zone name="71_FT"/> - <zone name="71_FU"/> - <zone name="70_FS"/> - <zone name="70_FU"/> - <zone name="69_FS"/> - <zone name="69_FT"/> - <zone name="69_FU"/> - <zone name="72_FS"/> - <zone name="72_FT"/> - <zone name="72_FU"/> - <zone name="72_FV"/> - <zone name="71_FV"/> - <zone name="70_FV"/> - <zone name="69_FV"/> - </complete_island> - <complete_island island="uiR2_Forest05" package="f1" continent="r2_forest" xmin="24469" ymin="-11531" xmax="25130" ymax="-10943"> - <zone name="70_FZ"/> - <zone name="71_FY"/> - <zone name="71_FZ"/> - <zone name="71_GA"/> - <zone name="70_FY"/> - <zone name="70_GA"/> - <zone name="69_FY"/> - <zone name="69_FZ"/> - <zone name="69_GA"/> - <zone name="72_FX"/> - <zone name="72_FY"/> - <zone name="72_FZ"/> - <zone name="71_FX"/> - <zone name="70_FX"/> - <zone name="69_FX"/> - </complete_island> - <complete_island island="uiR2_Forest06" package="f1" continent="r2_forest" xmin="25282" ymin="-11552" xmax="25917" ymax="-10972"> - <zone name="71_GE"/> - <zone name="72_GD"/> - <zone name="72_GE"/> - <zone name="72_GF"/> - <zone name="71_GD"/> - <zone name="71_GF"/> - <zone name="70_GD"/> - <zone name="70_GE"/> - <zone name="70_GF"/> - <zone name="72_GC"/> - <zone name="71_GC"/> - <zone name="70_GC"/> - <zone name="69_GC"/> - <zone name="69_GD"/> - <zone name="69_GE"/> - <zone name="69_GF"/> - </complete_island> - <complete_island island="uiR2_Forest07" package="f1" continent="r2_forest" xmin="26065" ymin="-11525" xmax="26730" ymax="-10875"> - <zone name="70_GJ"/> - <zone name="71_GI"/> - <zone name="71_GJ"/> - <zone name="71_GK"/> - <zone name="70_GI"/> - <zone name="70_GK"/> - <zone name="69_GI"/> - <zone name="69_GJ"/> - <zone name="72_GH"/> - <zone name="72_GI"/> - <zone name="72_GJ"/> - <zone name="71_GH"/> - <zone name="70_GH"/> - <zone name="69_GH"/> - </complete_island> - <complete_island island="uiR2_Forest08" package="f1" continent="r2_forest" xmin="26872" ymin="-11535" xmax="27528" ymax="-10865"> - <zone name="70_GP"/> - <zone name="71_GO"/> - <zone name="71_GP"/> - <zone name="70_GO"/> - <zone name="69_GO"/> - <zone name="69_GP"/> - <zone name="72_GN"/> - <zone name="72_GO"/> - <zone name="72_GP"/> - <zone name="71_GN"/> - <zone name="70_GN"/> - <zone name="69_GN"/> - <zone name="72_GM"/> - <zone name="71_GM"/> - <zone name="70_GM"/> - <zone name="69_GM"/> - </complete_island> - <complete_island island="uiR2_Forest09" package="f1" continent="r2_forest" xmin="27665" ymin="-11371" xmax="28324" ymax="-10865"> - <zone name="70_GS"/> - <zone name="71_GR"/> - <zone name="71_GS"/> - <zone name="71_GT"/> - <zone name="70_GR"/> - <zone name="70_GT"/> - <zone name="69_GR"/> - <zone name="69_GS"/> - <zone name="69_GT"/> - <zone name="71_GU"/> - <zone name="70_GU"/> - <zone name="69_GU"/> - </complete_island> - <complete_island island="uiR2_Forest10" package="f1" continent="r2_forest" xmin="28474" ymin="-11334" xmax="28808" ymax="-10906"> - <zone name="70_GW"/> - <zone name="71_GW"/> - <zone name="71_GX"/> - <zone name="70_GX"/> - <zone name="69_GW"/> - <zone name="69_GX"/> - </complete_island> - <complete_island island="uiR2_Forest11" package="f1" continent="r2_forest" xmin="28952" ymin="-11526" xmax="29615" ymax="-10872"> - <zone name="69_GZ"/> - <zone name="70_GZ"/> - <zone name="70_HA"/> - <zone name="69_HA"/> - <zone name="71_GZ"/> - <zone name="71_HA"/> - <zone name="71_HB"/> - <zone name="70_HB"/> - <zone name="69_HB"/> - <zone name="72_GZ"/> - <zone name="72_HA"/> - <zone name="72_HB"/> - <zone name="72_HC"/> - <zone name="71_HC"/> - <zone name="70_HC"/> - <zone name="69_HC"/> - </complete_island> - <complete_island island="uiR2_Forest12" package="f1" continent="r2_forest" xmin="29786" ymin="-11204" xmax="30054" ymax="-10910"> - <zone name="69_HF"/> - <zone name="70_HE"/> - <zone name="70_HF"/> - <zone name="69_HE"/> - </complete_island> - <complete_island island="uiR2_Forest13" package="f1" continent="r2_forest" xmin="30266" ymin="-11366" xmax="30882" ymax="-10875"> - <zone name="70_HH"/> - <zone name="71_HI"/> - <zone name="70_HI"/> - <zone name="69_HH"/> - <zone name="69_HI"/> - <zone name="71_HJ"/> - <zone name="70_HJ"/> - <zone name="69_HJ"/> - <zone name="71_HK"/> - <zone name="70_HK"/> - </complete_island> - <complete_island island="uiR2_Forest14" package="f1" continent="r2_forest" xmin="20954" ymin="-12326" xmax="21615" ymax="-11672"> - <zone name="74_FC"/> - <zone name="75_FB"/> - <zone name="75_FC"/> - <zone name="75_FD"/> - <zone name="74_FB"/> - <zone name="74_FD"/> - <zone name="76_FB"/> - <zone name="76_FC"/> - <zone name="76_FD"/> - <zone name="76_FE"/> - <zone name="75_FE"/> - <zone name="74_FE"/> - <zone name="77_FB"/> - <zone name="77_FC"/> - <zone name="77_FD"/> - <zone name="77_FE"/> - </complete_island> - <complete_island island="uiR2_Forest15" package="f1" continent="r2_forest" xmin="21752" ymin="-12335" xmax="22415" ymax="-11665"> - <zone name="75_FG"/> - <zone name="76_FG"/> - <zone name="76_FH"/> - <zone name="75_FH"/> - <zone name="74_FG"/> - <zone name="74_FH"/> - <zone name="77_FG"/> - <zone name="77_FH"/> - <zone name="77_FI"/> - <zone name="76_FI"/> - <zone name="75_FI"/> - <zone name="74_FI"/> - <zone name="77_FJ"/> - <zone name="76_FJ"/> - <zone name="75_FJ"/> - <zone name="74_FJ"/> - </complete_island> - <complete_island island="uiR2_Forest16" package="f1" continent="r2_forest" xmin="22622" ymin="-12335" xmax="23215" ymax="-11670"> - <zone name="76_FM"/> - <zone name="77_FL"/> - <zone name="77_FM"/> - <zone name="77_FN"/> - <zone name="76_FL"/> - <zone name="76_FN"/> - <zone name="75_FL"/> - <zone name="75_FM"/> - <zone name="75_FN"/> - <zone name="77_FO"/> - <zone name="76_FO"/> - <zone name="75_FO"/> - <zone name="74_FL"/> - <zone name="74_FM"/> - <zone name="74_FN"/> - <zone name="74_FO"/> - </complete_island> - <complete_island island="uiR2_Forest17" package="f1" continent="r2_forest" xmin="23345" ymin="-12326" xmax="24015" ymax="-11672"> - <zone name="77_FS"/> - <zone name="77_FR"/> - <zone name="77_FT"/> - <zone name="76_FR"/> - <zone name="76_FS"/> - <zone name="76_FT"/> - <zone name="77_FQ"/> - <zone name="76_FQ"/> - <zone name="75_FQ"/> - <zone name="75_FR"/> - <zone name="75_FS"/> - <zone name="75_FT"/> - <zone name="74_FQ"/> - <zone name="74_FR"/> - <zone name="74_FS"/> - <zone name="74_FT"/> - </complete_island> - <complete_island island="uiR2_Forest18" package="f1" continent="r2_forest" xmin="24149" ymin="-12158" xmax="24638" ymax="-11752"> - <zone name="76_FX"/> - <zone name="76_FW"/> - <zone name="75_FW"/> - <zone name="75_FX"/> - <zone name="75_FV"/> - <zone name="74_FV"/> - <zone name="74_FW"/> - </complete_island> - <complete_island island="uiR2_Forest19" package="f1" continent="r2_forest" xmin="24785" ymin="-12326" xmax="25444" ymax="-11839"> - <zone name="75_GA"/> - <zone name="76_FZ"/> - <zone name="76_GA"/> - <zone name="76_GB"/> - <zone name="75_FZ"/> - <zone name="75_GB"/> - <zone name="77_FZ"/> - <zone name="77_GA"/> - <zone name="77_GB"/> - <zone name="77_GC"/> - <zone name="76_GC"/> - <zone name="75_GC"/> - </complete_island> - <complete_island island="uiR2_Forest20" package="f1" continent="r2_forest" xmin="25594" ymin="-12326" xmax="26245" ymax="-11825"> - <zone name="77_GE"/> - <zone name="77_GF"/> - <zone name="76_GE"/> - <zone name="76_GF"/> - <zone name="77_GG"/> - <zone name="76_GG"/> - <zone name="75_GE"/> - <zone name="75_GF"/> - <zone name="75_GG"/> - <zone name="77_GH"/> - <zone name="76_GH"/> - <zone name="75_GH"/> - </complete_island> - <complete_island island="uiR2_Forest21" package="f1" continent="r2_forest" xmin="26385" ymin="-12326" xmax="26895" ymax="-11717"> - <zone name="77_GK"/> - <zone name="77_GJ"/> - <zone name="77_GL"/> - <zone name="76_GJ"/> - <zone name="76_GK"/> - <zone name="76_GL"/> - <zone name="75_GJ"/> - <zone name="75_GK"/> - <zone name="75_GL"/> - <zone name="74_GJ"/> - <zone name="74_GK"/> - </complete_island> - <complete_island island="uiR2_Forest22" package="f1" continent="r2_forest" xmin="27025" ymin="-12335" xmax="27686" ymax="-11825"> - <zone name="75_GP"/> - <zone name="76_GO"/> - <zone name="76_GP"/> - <zone name="76_GQ"/> - <zone name="75_GO"/> - <zone name="75_GQ"/> - <zone name="77_GN"/> - <zone name="77_GO"/> - <zone name="77_GP"/> - <zone name="76_GN"/> - <zone name="75_GN"/> - <zone name="77_GQ"/> - </complete_island> - <complete_island island="uiR2_Forest23" package="f1" continent="r2_forest" xmin="27825" ymin="-12290" xmax="28655" ymax="-11857"> - <zone name="76_GT"/> - <zone name="77_GS"/> - <zone name="77_GT"/> - <zone name="76_GS"/> - <zone name="76_GU"/> - <zone name="75_GS"/> - <zone name="75_GT"/> - <zone name="77_GV"/> - <zone name="76_GV"/> - <zone name="75_GV"/> - <zone name="77_GW"/> - <zone name="76_GW"/> - <zone name="75_GW"/> - </complete_island> - <complete_island island="uiR2_Forest24" package="f1" continent="r2_forest" xmin="28826" ymin="-12290" xmax="29444" ymax="-11706"> - <zone name="77_GZ"/> - <zone name="77_HA"/> - <zone name="76_GY"/> - <zone name="76_GZ"/> - <zone name="76_HA"/> - <zone name="76_HB"/> - <zone name="75_GY"/> - <zone name="75_GZ"/> - <zone name="75_HA"/> - <zone name="75_HB"/> - <zone name="74_GZ"/> - <zone name="74_HA"/> - </complete_island> - <complete_island island="uiR2_Forest25" package="f1" continent="r2_forest" xmin="29594" ymin="-12166" xmax="30095" ymax="-11665"> - <zone name="74_HD"/> - <zone name="75_HD"/> - <zone name="75_HE"/> - <zone name="74_HE"/> - <zone name="76_HD"/> - <zone name="76_HE"/> - <zone name="76_HF"/> - <zone name="75_HF"/> - <zone name="74_HF"/> - </complete_island> - <complete_island island="uiR2_Forest26" package="f1" continent="r2_forest" xmin="30270" ymin="-12015" xmax="30884" ymax="-11675"> - <zone name="74_HH"/> - <zone name="75_HH"/> - <zone name="75_HI"/> - <zone name="74_HI"/> - <zone name="75_HJ"/> - <zone name="74_HJ"/> - <zone name="75_HK"/> - <zone name="74_HK"/> - </complete_island> - <complete_island island="uiR2_Forest27" package="f1" continent="r2_forest" xmin="20990" ymin="-12770" xmax="21250" ymax="-12510"> - <zone name="80_FB"/> - <zone name="80_FC"/> - <zone name="79_FB"/> - <zone name="79_FC"/> - </complete_island> - <complete_island island="uiR2_Forest28" package="f1" continent="r2_forest" xmin="21466" ymin="-12805" xmax="21924" ymax="-12465"> - <zone name="80_FE"/> - <zone name="80_FF"/> - <zone name="79_FE"/> - <zone name="79_FF"/> - <zone name="80_FG"/> - <zone name="79_FG"/> - </complete_island> - <complete_island island="uiR2_Forest29" package="f1" continent="r2_forest" xmin="22106" ymin="-12811" xmax="22488" ymax="-12475"> - <zone name="80_FI"/> - <zone name="80_FJ"/> - <zone name="79_FI"/> - <zone name="79_FJ"/> - <zone name="80_FK"/> - <zone name="79_FK"/> - </complete_island> - <complete_island island="uiR2_Forest30" package="f1" continent="r2_forest" xmin="22714" ymin="-13055" xmax="23170" ymax="-12465"> - <zone name="80_FM"/> - <zone name="81_FM"/> - <zone name="81_FN"/> - <zone name="80_FN"/> - <zone name="79_FM"/> - <zone name="79_FN"/> - <zone name="82_FM"/> - <zone name="82_FN"/> - <zone name="80_FO"/> - <zone name="79_FO"/> - </complete_island> - <complete_island island="uiR2_Forest31" package="f1" continent="r2_forest" xmin="23345" ymin="-13126" xmax="24068" ymax="-12475"> - <zone name="82_FT"/> - <zone name="82_FS"/> - <zone name="81_FS"/> - <zone name="81_FT"/> - <zone name="81_FU"/> - <zone name="82_FR"/> - <zone name="81_FR"/> - <zone name="80_FR"/> - <zone name="80_FS"/> - <zone name="80_FT"/> - <zone name="80_FU"/> - <zone name="82_FQ"/> - <zone name="81_FQ"/> - <zone name="80_FQ"/> - <zone name="79_FQ"/> - <zone name="79_FR"/> - <zone name="79_FS"/> - <zone name="79_FT"/> - </complete_island> - <complete_island island="uiR2_Forest32" package="f1" continent="r2_forest" xmin="24475" ymin="-13126" xmax="24934" ymax="-12474"> - <zone name="82_FZ"/> - <zone name="82_FY"/> - <zone name="81_FY"/> - <zone name="81_FZ"/> - <zone name="82_FX"/> - <zone name="81_FX"/> - <zone name="80_FX"/> - <zone name="80_FY"/> - <zone name="80_FZ"/> - <zone name="79_FX"/> - <zone name="79_FY"/> - <zone name="79_FZ"/> - </complete_island> - <complete_island island="uiR2_Forest33" package="f1" continent="r2_forest" xmin="25105" ymin="-13124" xmax="25768" ymax="-12475"> - <zone name="81_GC"/> - <zone name="82_GB"/> - <zone name="82_GC"/> - <zone name="82_GD"/> - <zone name="81_GB"/> - <zone name="81_GD"/> - <zone name="80_GB"/> - <zone name="80_GC"/> - <zone name="80_GD"/> - <zone name="82_GE"/> - <zone name="81_GE"/> - <zone name="80_GE"/> - <zone name="79_GB"/> - <zone name="79_GC"/> - <zone name="79_GD"/> - <zone name="79_GE"/> - </complete_island> - <complete_island island="uiR2_Forest34" package="f1" continent="r2_forest" xmin="26065" ymin="-12963" xmax="26725" ymax="-12472"> - <zone name="81_GH"/> - <zone name="81_GI"/> - <zone name="80_GH"/> - <zone name="80_GI"/> - <zone name="81_GJ"/> - <zone name="80_GJ"/> - <zone name="79_GH"/> - <zone name="79_GI"/> - <zone name="79_GJ"/> - <zone name="81_GK"/> - <zone name="80_GK"/> - <zone name="79_GK"/> - </complete_island> - <complete_island island="uiR2_Forest35" package="f1" continent="r2_forest" xmin="26865" ymin="-13026" xmax="27334" ymax="-12474"> - <zone name="80_GO"/> - <zone name="81_GN"/> - <zone name="81_GO"/> - <zone name="80_GN"/> - <zone name="80_GP"/> - <zone name="79_GN"/> - <zone name="79_GO"/> - <zone name="82_GM"/> - <zone name="82_GN"/> - <zone name="82_GO"/> - <zone name="81_GM"/> - <zone name="80_GM"/> - <zone name="79_GM"/> - </complete_island> - <complete_island island="uiR2_Forest36" package="f1" continent="r2_forest" xmin="27674" ymin="-13135" xmax="28319" ymax="-12454"> - <zone name="82_GU"/> - <zone name="82_GT"/> - <zone name="81_GT"/> - <zone name="81_GU"/> - <zone name="82_GS"/> - <zone name="81_GS"/> - <zone name="80_GS"/> - <zone name="80_GT"/> - <zone name="80_GU"/> - <zone name="82_GR"/> - <zone name="81_GR"/> - <zone name="80_GR"/> - <zone name="79_GR"/> - <zone name="79_GS"/> - <zone name="79_GT"/> - <zone name="79_GU"/> - </complete_island> - <complete_island island="uiR2_Forest37" package="f1" continent="r2_forest" xmin="28476" ymin="-13094" xmax="29094" ymax="-12453"> - <zone name="82_GY"/> - <zone name="82_GZ"/> - <zone name="81_GX"/> - <zone name="81_GY"/> - <zone name="81_GZ"/> - <zone name="81_GW"/> - <zone name="80_GW"/> - <zone name="80_GX"/> - <zone name="80_GY"/> - <zone name="79_GW"/> - </complete_island> - <complete_island island="uiR2_Forest38" package="f1" continent="r2_forest" xmin="29277" ymin="-13123" xmax="29826" ymax="-12477"> - <zone name="80_HB"/> - <zone name="81_HB"/> - <zone name="81_HC"/> - <zone name="80_HC"/> - <zone name="79_HB"/> - <zone name="79_HC"/> - <zone name="82_HB"/> - <zone name="82_HC"/> - <zone name="82_HD"/> - <zone name="81_HD"/> - <zone name="80_HD"/> - <zone name="79_HD"/> - <zone name="82_HE"/> - <zone name="81_HE"/> - <zone name="80_HE"/> - </complete_island> - <complete_island island="uiR2_Forest39" package="f1" continent="r2_forest" xmin="30076" ymin="-13094" xmax="30730" ymax="-12506"> - <zone name="81_HJ"/> - <zone name="82_HI"/> - <zone name="82_HJ"/> - <zone name="81_HI"/> - <zone name="80_HI"/> - <zone name="80_HJ"/> - <zone name="82_HH"/> - <zone name="81_HH"/> - <zone name="80_HH"/> - <zone name="79_HH"/> - <zone name="79_HI"/> - <zone name="79_HJ"/> - <zone name="82_HG"/> - <zone name="81_HG"/> - <zone name="80_HG"/> - <zone name="79_HG"/> - </complete_island> - <complete_island island="uiR2_Forest40" package="f1" continent="r2_forest" xmin="21032" ymin="-13606" xmax="21605" ymax="-13119"> - <zone name="85_FC"/> - <zone name="85_FD"/> - <zone name="84_FB"/> - <zone name="84_FC"/> - <zone name="84_FD"/> - <zone name="85_FE"/> - <zone name="84_FE"/> - <zone name="83_FB"/> - <zone name="83_FC"/> - <zone name="83_FD"/> - <zone name="83_FE"/> - </complete_island> - <complete_island island="uiR2_Forest41" package="f1" continent="r2_forest" xmin="21946" ymin="-13615" xmax="22575" ymax="-12956"> - <zone name="83_FJ"/> - <zone name="84_FI"/> - <zone name="84_FJ"/> - <zone name="84_FK"/> - <zone name="83_FI"/> - <zone name="83_FK"/> - <zone name="82_FI"/> - <zone name="82_FJ"/> - <zone name="85_FI"/> - <zone name="85_FJ"/> - <zone name="84_FH"/> - <zone name="83_FH"/> - <zone name="85_FK"/> - <zone name="82_FH"/> - </complete_island> - <complete_island island="uiR2_Forest42" package="f1" continent="r2_forest" xmin="22712" ymin="-13764" xmax="23457" ymax="-13275"> - <zone name="84_FO"/> - <zone name="85_FN"/> - <zone name="85_FO"/> - <zone name="85_FP"/> - <zone name="84_FN"/> - <zone name="84_FP"/> - <zone name="86_FM"/> - <zone name="86_FN"/> - <zone name="86_FO"/> - <zone name="85_FM"/> - <zone name="84_FM"/> - <zone name="86_FP"/> - <zone name="86_FQ"/> - <zone name="85_FQ"/> - <zone name="84_FQ"/> - </complete_island> - <complete_island island="uiR2_Forest43" package="f1" continent="r2_forest" xmin="23674" ymin="-13925" xmax="24330" ymax="-13275"> - <zone name="85_FV"/> - <zone name="86_FU"/> - <zone name="86_FV"/> - <zone name="85_FU"/> - <zone name="84_FU"/> - <zone name="84_FV"/> - <zone name="87_FT"/> - <zone name="87_FU"/> - <zone name="86_FT"/> - <zone name="85_FT"/> - <zone name="84_FT"/> - <zone name="86_FS"/> - <zone name="85_FS"/> - <zone name="84_FS"/> - </complete_island> - <complete_island island="uiR2_Forest44" package="f1" continent="r2_forest" xmin="24465" ymin="-14878" xmax="25094" ymax="-13282"> - <zone name="89_FY"/> - <zone name="90_FX"/> - <zone name="90_FY"/> - <zone name="90_FZ"/> - <zone name="89_FX"/> - <zone name="89_FZ"/> - <zone name="88_FX"/> - <zone name="88_FY"/> - <zone name="91_FY"/> - <zone name="91_FZ"/> - <zone name="90_GA"/> - <zone name="89_GA"/> - <zone name="87_FX"/> - <zone name="87_FY"/> - <zone name="87_FZ"/> - <zone name="92_FZ"/> - <zone name="86_FX"/> - <zone name="86_FY"/> - <zone name="86_FZ"/> - <zone name="86_GA"/> - <zone name="93_FZ"/> - <zone name="85_FX"/> - <zone name="85_FY"/> - <zone name="85_FZ"/> - <zone name="84_FX"/> - <zone name="84_FY"/> - <zone name="84_FZ"/> - </complete_island> - <complete_island island="uiR2_Forest45" package="f1" continent="r2_forest" xmin="25425" ymin="-14246" xmax="26255" ymax="-13432"> - <zone name="86_GE"/> - <zone name="87_GD"/> - <zone name="87_GE"/> - <zone name="87_GF"/> - <zone name="86_GD"/> - <zone name="86_GF"/> - <zone name="85_GD"/> - <zone name="85_GE"/> - <zone name="85_GF"/> - <zone name="88_GE"/> - <zone name="88_GF"/> - <zone name="88_GG"/> - <zone name="87_GG"/> - <zone name="86_GG"/> - <zone name="85_GG"/> - <zone name="89_GF"/> - <zone name="89_GG"/> - <zone name="89_GH"/> - <zone name="88_GH"/> - <zone name="87_GH"/> - <zone name="86_GH"/> - <zone name="85_GH"/> - </complete_island> - <complete_island island="uiR2_Forest46" package="f1" continent="r2_forest" xmin="26590" ymin="-14566" xmax="28178" ymax="-13425"> - <zone name="87_GO"/> - <zone name="88_GN"/> - <zone name="88_GO"/> - <zone name="88_GP"/> - <zone name="87_GN"/> - <zone name="86_GN"/> - <zone name="86_GO"/> - <zone name="89_GM"/> - <zone name="89_GN"/> - <zone name="89_GO"/> - <zone name="88_GM"/> - <zone name="87_GM"/> - <zone name="89_GQ"/> - <zone name="88_GQ"/> - <zone name="87_GQ"/> - <zone name="86_GM"/> - <zone name="85_GM"/> - <zone name="85_GN"/> - <zone name="89_GL"/> - <zone name="88_GL"/> - <zone name="87_GL"/> - <zone name="86_GL"/> - <zone name="90_GR"/> - <zone name="89_GR"/> - <zone name="88_GR"/> - <zone name="87_GR"/> - <zone name="85_GL"/> - <zone name="86_GK"/> - <zone name="85_GK"/> - <zone name="90_GS"/> - <zone name="89_GS"/> - <zone name="88_GS"/> - <zone name="91_GT"/> - <zone name="90_GT"/> - <zone name="89_GT"/> - <zone name="88_GT"/> - </complete_island> - <complete_island island="uiR2_Jungle01" package="j1" continent="r2_jungle" xmin="31038" ymin="-11361" xmax="31684" ymax="-10879"> - <zone name="70_HN"/> - <zone name="71_HM"/> - <zone name="71_HN"/> - <zone name="71_HO"/> - <zone name="70_HM"/> - <zone name="70_HO"/> - <zone name="69_HN"/> - <zone name="69_HO"/> - <zone name="70_HP"/> - <zone name="69_HP"/> - </complete_island> - <complete_island island="uiR2_Jungle02" package="j1" continent="r2_jungle" xmin="32002" ymin="-11523" xmax="32646" ymax="-10876"> - <zone name="71_HT"/> - <zone name="72_HS"/> - <zone name="72_HT"/> - <zone name="72_HU"/> - <zone name="71_HS"/> - <zone name="71_HU"/> - <zone name="70_HT"/> - <zone name="70_HU"/> - <zone name="72_HV"/> - <zone name="71_HV"/> - <zone name="70_HV"/> - <zone name="69_HS"/> - <zone name="69_HT"/> - <zone name="69_HU"/> - <zone name="69_HV"/> - </complete_island> - <complete_island island="uiR2_Jungle03" package="j1" continent="r2_jungle" xmin="32793" ymin="-11517" xmax="33446" ymax="-10865"> - <zone name="71_HY"/> - <zone name="72_HX"/> - <zone name="72_HY"/> - <zone name="72_HZ"/> - <zone name="71_HX"/> - <zone name="71_HZ"/> - <zone name="70_HX"/> - <zone name="70_HY"/> - <zone name="70_HZ"/> - <zone name="72_IA"/> - <zone name="71_IA"/> - <zone name="70_IA"/> - <zone name="69_HX"/> - <zone name="69_HY"/> - <zone name="69_HZ"/> - <zone name="69_IA"/> - </complete_island> - <complete_island island="uiR2_Jungle04" package="j1" continent="r2_jungle" xmin="33707" ymin="-11038" xmax="33965" ymax="-10884"> - <zone name="69_ID"/> - <zone name="69_IC"/> - <zone name="69_IE"/> - </complete_island> - <complete_island island="uiR2_Jungle05" package="j1" continent="r2_jungle" xmin="33602" ymin="-11365" xmax="34086" ymax="-11196"> - <zone name="71_ID"/> - <zone name="71_IC"/> - <zone name="71_IE"/> - </complete_island> - <complete_island island="uiR2_Jungle06" package="j1" continent="r2_jungle" xmin="34234" ymin="-11526" xmax="34881" ymax="-10869"> - <zone name="71_IH"/> - <zone name="72_IG"/> - <zone name="72_IH"/> - <zone name="72_II"/> - <zone name="71_IG"/> - <zone name="71_II"/> - <zone name="70_IG"/> - <zone name="70_IH"/> - <zone name="70_II"/> - <zone name="72_IJ"/> - <zone name="71_IJ"/> - <zone name="70_IJ"/> - <zone name="69_IG"/> - <zone name="69_IH"/> - <zone name="69_II"/> - <zone name="69_IJ"/> - </complete_island> - <complete_island island="uiR2_Jungle07" package="j1" continent="r2_jungle" xmin="35030" ymin="-11529" xmax="35690" ymax="-10943"> - <zone name="71_IM"/> - <zone name="72_IL"/> - <zone name="72_IM"/> - <zone name="72_IN"/> - <zone name="71_IL"/> - <zone name="71_IN"/> - <zone name="70_IL"/> - <zone name="70_IM"/> - <zone name="70_IN"/> - <zone name="72_IO"/> - <zone name="71_IO"/> - <zone name="70_IO"/> - <zone name="69_IL"/> - <zone name="69_IM"/> - <zone name="69_IN"/> - <zone name="69_IO"/> - </complete_island> - <complete_island island="uiR2_Jungle08" package="j1" continent="r2_jungle" xmin="35903" ymin="-11525" xmax="36486" ymax="-10942"> - <zone name="71_IS"/> - <zone name="72_IR"/> - <zone name="72_IS"/> - <zone name="72_IT"/> - <zone name="71_IR"/> - <zone name="71_IT"/> - <zone name="70_IR"/> - <zone name="70_IS"/> - <zone name="70_IT"/> - <zone name="71_IQ"/> - <zone name="70_IQ"/> - <zone name="69_IQ"/> - <zone name="69_IR"/> - <zone name="69_IS"/> - </complete_island> - <complete_island island="uiR2_Jungle09" package="j1" continent="r2_jungle" xmin="36636" ymin="-11521" xmax="37278" ymax="-10874"> - <zone name="70_IV"/> - <zone name="71_IV"/> - <zone name="71_IW"/> - <zone name="70_IW"/> - <zone name="69_IV"/> - <zone name="69_IW"/> - <zone name="72_IV"/> - <zone name="72_IW"/> - <zone name="71_IX"/> - <zone name="70_IX"/> - <zone name="72_IY"/> - <zone name="71_IY"/> - <zone name="70_IY"/> - </complete_island> - <complete_island island="uiR2_Jungle11" package="j1" continent="r2_jungle" xmin="38234" ymin="-11371" xmax="38648" ymax="-10870"> - <zone name="71_JG"/> - <zone name="71_JF"/> - <zone name="70_JF"/> - <zone name="70_JG"/> - <zone name="70_JH"/> - <zone name="69_JF"/> - <zone name="69_JG"/> - <zone name="69_JH"/> - </complete_island> - <complete_island island="uiR2_Jungle12" package="j1" continent="r2_jungle" xmin="38878" ymin="-11525" xmax="39526" ymax="-10877"> - <zone name="71_JL"/> - <zone name="72_JK"/> - <zone name="72_JL"/> - <zone name="72_JM"/> - <zone name="71_JK"/> - <zone name="71_JM"/> - <zone name="70_JK"/> - <zone name="70_JL"/> - <zone name="70_JM"/> - <zone name="72_JJ"/> - <zone name="71_JJ"/> - <zone name="70_JJ"/> - <zone name="69_JJ"/> - <zone name="69_JK"/> - <zone name="69_JL"/> - <zone name="69_JM"/> - </complete_island> - <complete_island island="uiR2_Jungle13" package="j1" continent="r2_jungle" xmin="39669" ymin="-11526" xmax="40327" ymax="-10876"> - <zone name="71_JQ"/> - <zone name="72_JP"/> - <zone name="72_JQ"/> - <zone name="72_JR"/> - <zone name="71_JP"/> - <zone name="71_JR"/> - <zone name="70_JP"/> - <zone name="70_JQ"/> - <zone name="70_JR"/> - <zone name="72_JO"/> - <zone name="71_JO"/> - <zone name="70_JO"/> - <zone name="69_JO"/> - <zone name="69_JP"/> - <zone name="69_JQ"/> - <zone name="69_JR"/> - </complete_island> - <complete_island island="uiR2_Jungle14" package="j1" continent="r2_jungle" xmin="40474" ymin="-11531" xmax="40970" ymax="-10875"> - <zone name="71_JU"/> - <zone name="72_JT"/> - <zone name="72_JU"/> - <zone name="72_JV"/> - <zone name="71_JT"/> - <zone name="71_JV"/> - <zone name="70_JT"/> - <zone name="70_JU"/> - <zone name="70_JV"/> - <zone name="69_JT"/> - <zone name="69_JU"/> - <zone name="69_JV"/> - </complete_island> - <complete_island island="uiR2_Jungle15" package="j1" continent="r2_jungle" xmin="31034" ymin="-12327" xmax="31690" ymax="-11676"> - <zone name="76_HN"/> - <zone name="77_HM"/> - <zone name="77_HN"/> - <zone name="77_HO"/> - <zone name="76_HM"/> - <zone name="76_HO"/> - <zone name="75_HM"/> - <zone name="75_HN"/> - <zone name="75_HO"/> - <zone name="77_HP"/> - <zone name="76_HP"/> - <zone name="75_HP"/> - <zone name="74_HM"/> - <zone name="74_HN"/> - <zone name="74_HO"/> - <zone name="74_HP"/> - </complete_island> - <complete_island island="uiR2_Jungle16" package="j1" continent="r2_jungle" xmin="31902" ymin="-12325" xmax="32577" ymax="-11669"> - <zone name="76_HT"/> - <zone name="77_HS"/> - <zone name="77_HT"/> - <zone name="77_HU"/> - <zone name="76_HS"/> - <zone name="76_HU"/> - <zone name="75_HS"/> - <zone name="75_HT"/> - <zone name="75_HU"/> - <zone name="77_HR"/> - <zone name="76_HR"/> - <zone name="77_HV"/> - <zone name="76_HV"/> - <zone name="75_HR"/> - <zone name="75_HV"/> - <zone name="74_HR"/> - <zone name="74_HS"/> - <zone name="74_HT"/> - <zone name="74_HU"/> - <zone name="74_HV"/> - </complete_island> - <complete_island island="uiR2_Jungle17" package="j1" continent="r2_jungle" xmin="32862" ymin="-12258" xmax="33377" ymax="-11670"> - <zone name="76_HY"/> - <zone name="77_HY"/> - <zone name="77_HZ"/> - <zone name="76_HX"/> - <zone name="76_HZ"/> - <zone name="75_HX"/> - <zone name="75_HY"/> - <zone name="75_HZ"/> - <zone name="77_IA"/> - <zone name="76_IA"/> - <zone name="75_IA"/> - <zone name="74_HX"/> - <zone name="74_HY"/> - <zone name="74_HZ"/> - </complete_island> - <complete_island island="uiR2_Jungle18" package="j1" continent="r2_jungle" xmin="33672" ymin="-12331" xmax="34328" ymax="-11743"> - <zone name="76_IE"/> - <zone name="77_ID"/> - <zone name="77_IE"/> - <zone name="77_IF"/> - <zone name="76_ID"/> - <zone name="76_IF"/> - <zone name="75_ID"/> - <zone name="75_IE"/> - <zone name="75_IF"/> - <zone name="77_IC"/> - <zone name="76_IC"/> - <zone name="77_IG"/> - <zone name="76_IG"/> - <zone name="75_IG"/> - <zone name="74_IE"/> - <zone name="74_IF"/> - <zone name="74_IG"/> - </complete_island> - <complete_island island="uiR2_Jungle19" package="j1" continent="r2_jungle" xmin="34622" ymin="-12322" xmax="35366" ymax="-11742"> - <zone name="76_IK"/> - <zone name="77_IJ"/> - <zone name="77_IK"/> - <zone name="77_IL"/> - <zone name="76_IJ"/> - <zone name="76_IL"/> - <zone name="75_IJ"/> - <zone name="75_IK"/> - <zone name="75_IL"/> - <zone name="77_II"/> - <zone name="76_II"/> - <zone name="77_IM"/> - <zone name="76_IM"/> - <zone name="75_II"/> - <zone name="74_II"/> - <zone name="74_IJ"/> - <zone name="74_IK"/> - <zone name="74_IL"/> - </complete_island> - <complete_island island="uiR2_Jungle21" package="j1" continent="r2_jungle" xmin="36316" ymin="-12330" xmax="36970" ymax="-11675"> - <zone name="76_IU"/> - <zone name="77_IT"/> - <zone name="77_IU"/> - <zone name="77_IV"/> - <zone name="76_IT"/> - <zone name="76_IV"/> - <zone name="75_IT"/> - <zone name="75_IU"/> - <zone name="75_IV"/> - <zone name="75_IW"/> - <zone name="74_IT"/> - <zone name="74_IU"/> - <zone name="74_IV"/> - <zone name="74_IW"/> - </complete_island> - <complete_island island="uiR2_Jungle22" package="j1" continent="r2_jungle" xmin="37116" ymin="-12320" xmax="37763" ymax="-11653"> - <zone name="76_IZ"/> - <zone name="77_IY"/> - <zone name="77_IZ"/> - <zone name="77_JA"/> - <zone name="76_IY"/> - <zone name="76_JA"/> - <zone name="75_IY"/> - <zone name="75_IZ"/> - <zone name="75_JA"/> - <zone name="77_JB"/> - <zone name="76_JB"/> - <zone name="75_JB"/> - <zone name="74_IY"/> - <zone name="74_JA"/> - </complete_island> - <complete_island island="uiR2_Jungle23" package="j1" continent="r2_jungle" xmin="37910" ymin="-12097" xmax="38558" ymax="-11675"> - <zone name="76_JE"/> - <zone name="76_JD"/> - <zone name="76_JF"/> - <zone name="75_JD"/> - <zone name="75_JE"/> - <zone name="75_JF"/> - <zone name="75_JG"/> - <zone name="74_JD"/> - <zone name="74_JE"/> - <zone name="74_JF"/> - </complete_island> - <complete_island island="uiR2_Jungle24" package="j1" continent="r2_jungle" xmin="38782" ymin="-12331" xmax="39366" ymax="-11743"> - <zone name="76_JJ"/> - <zone name="77_JI"/> - <zone name="77_JJ"/> - <zone name="77_JK"/> - <zone name="76_JI"/> - <zone name="76_JK"/> - <zone name="75_JI"/> - <zone name="75_JJ"/> - <zone name="75_JK"/> - <zone name="77_JL"/> - <zone name="76_JL"/> - <zone name="75_JL"/> - <zone name="74_JI"/> - <zone name="74_JJ"/> - <zone name="74_JK"/> - </complete_island> - <complete_island island="uiR2_Jungle25" package="j1" continent="r2_jungle" xmin="39514" ymin="-12326" xmax="40161" ymax="-11680"> - <zone name="76_JO"/> - <zone name="77_JP"/> - <zone name="76_JN"/> - <zone name="76_JP"/> - <zone name="75_JO"/> - <zone name="75_JP"/> - <zone name="76_JQ"/> - <zone name="75_JQ"/> - <zone name="74_JO"/> - <zone name="74_JP"/> - <zone name="74_JQ"/> - </complete_island> - <complete_island island="uiR2_Jungle26" package="j1" continent="r2_jungle" xmin="40314" ymin="-12327" xmax="40971" ymax="-11674"> - <zone name="76_JT"/> - <zone name="77_JS"/> - <zone name="77_JT"/> - <zone name="77_JU"/> - <zone name="76_JS"/> - <zone name="76_JU"/> - <zone name="75_JS"/> - <zone name="75_JT"/> - <zone name="75_JU"/> - <zone name="77_JV"/> - <zone name="76_JV"/> - <zone name="75_JV"/> - <zone name="74_JS"/> - <zone name="74_JT"/> - <zone name="74_JU"/> - <zone name="74_JV"/> - </complete_island> - <complete_island island="uiR2_Jungle27" package="j1" continent="r2_jungle" xmin="31102" ymin="-12888" xmax="31370" ymax="-12470"> - <zone name="80_HN"/> - <zone name="81_HM"/> - <zone name="81_HN"/> - <zone name="80_HM"/> - <zone name="79_HM"/> - <zone name="79_HN"/> - </complete_island> - <complete_island island="uiR2_Jungle28" package="j1" continent="r2_jungle" xmin="31514" ymin="-12645" xmax="31845" ymax="-12475"> - <zone name="79_HP"/> - <zone name="79_HQ"/> - </complete_island> - <complete_island island="uiR2_Jungle29" package="j1" continent="r2_jungle" xmin="31514" ymin="-13126" xmax="31998" ymax="-12795"> - <zone name="81_HQ"/> - <zone name="82_HQ"/> - <zone name="81_HP"/> - <zone name="81_HR"/> - </complete_island> - <complete_island island="uiR2_Jungle30" package="j1" continent="r2_jungle" xmin="32154" ymin="-12898" xmax="32577" ymax="-12475"> - <zone name="79_HT"/> - <zone name="80_HT"/> - <zone name="80_HU"/> - <zone name="79_HU"/> - <zone name="81_HT"/> - <zone name="81_HU"/> - <zone name="81_HV"/> - <zone name="80_HV"/> - <zone name="79_HV"/> - </complete_island> - <complete_island island="uiR2_Jungle31" package="j1" continent="r2_jungle" xmin="32954" ymin="-13121" xmax="33277" ymax="-12635"> - <zone name="81_HZ"/> - <zone name="82_HY"/> - <zone name="82_HZ"/> - <zone name="81_HY"/> - <zone name="80_HY"/> - <zone name="80_HZ"/> - </complete_island> - <complete_island island="uiR2_Jungle32" package="j1" continent="r2_jungle" xmin="33502" ymin="-13058" xmax="33930" ymax="-12542"> - <zone name="80_IC"/> - <zone name="81_IB"/> - <zone name="81_IC"/> - <zone name="81_ID"/> - <zone name="80_IB"/> - <zone name="80_ID"/> - <zone name="79_IB"/> - <zone name="79_IC"/> - <zone name="79_ID"/> - <zone name="82_IB"/> - <zone name="82_IC"/> - <zone name="82_ID"/> - </complete_island> - <complete_island island="uiR2_Jungle33" package="j1" continent="r2_jungle" xmin="34052" ymin="-13058" xmax="34488" ymax="-12636"> - <zone name="80_IF"/> - <zone name="81_IF"/> - <zone name="81_IG"/> - <zone name="80_IG"/> - <zone name="82_IF"/> - <zone name="82_IG"/> - <zone name="82_IH"/> - <zone name="81_IH"/> - </complete_island> - <complete_island island="uiR2_Jungle34" package="j1" continent="r2_jungle" xmin="34792" ymin="-13048" xmax="35531" ymax="-12469"> - <zone name="79_IM"/> - <zone name="80_IL"/> - <zone name="80_IM"/> - <zone name="80_IN"/> - <zone name="79_IL"/> - <zone name="79_IN"/> - <zone name="81_IK"/> - <zone name="81_IL"/> - <zone name="81_IM"/> - <zone name="80_IK"/> - <zone name="79_IK"/> - <zone name="81_IN"/> - <zone name="80_IJ"/> - <zone name="82_IM"/> - <zone name="82_IN"/> - <zone name="79_IJ"/> - </complete_island> - <complete_island island="uiR2_Jungle35" package="j1" continent="r2_jungle" xmin="35669" ymin="-13127" xmax="36330" ymax="-12475"> - <zone name="82_IP"/> - <zone name="82_IQ"/> - <zone name="81_IP"/> - <zone name="81_IQ"/> - <zone name="82_IR"/> - <zone name="81_IR"/> - <zone name="80_IP"/> - <zone name="80_IQ"/> - <zone name="80_IR"/> - <zone name="80_IS"/> - <zone name="79_IP"/> - <zone name="79_IQ"/> - <zone name="79_IR"/> - <zone name="79_IS"/> - </complete_island> - <complete_island island="uiR2_Jungle36" package="j1" continent="r2_jungle" xmin="36702" ymin="-13131" xmax="37217" ymax="-12630"> - <zone name="80_IX"/> - <zone name="81_IW"/> - <zone name="81_IX"/> - <zone name="81_IY"/> - <zone name="80_IW"/> - <zone name="80_IY"/> - <zone name="82_IV"/> - <zone name="82_IW"/> - <zone name="82_IX"/> - <zone name="81_IV"/> - <zone name="80_IV"/> - <zone name="82_IY"/> - </complete_island> - <complete_island island="uiR2_Jungle38" package="j1" continent="r2_jungle" xmin="38236" ymin="-13118" xmax="38718" ymax="-12634"> - <zone name="80_JF"/> - <zone name="81_JF"/> - <zone name="81_JG"/> - <zone name="80_JG"/> - <zone name="82_JF"/> - <zone name="82_JG"/> - <zone name="81_JH"/> - </complete_island> - <complete_island island="uiR2_Jungle39" package="j1" continent="r2_jungle" xmin="38873" ymin="-13126" xmax="39526" ymax="-12634"> - <zone name="80_JJ"/> - <zone name="81_JJ"/> - <zone name="81_JK"/> - <zone name="80_JK"/> - <zone name="82_JJ"/> - <zone name="82_JK"/> - <zone name="82_JL"/> - <zone name="81_JL"/> - <zone name="80_JL"/> - <zone name="82_JM"/> - <zone name="81_JM"/> - <zone name="80_JM"/> - </complete_island> - <complete_island island="uiR2_Jungle41" package="j1" continent="r2_jungle" xmin="40552" ymin="-13131" xmax="40897" ymax="-12470"> - <zone name="79_JU"/> - <zone name="80_JT"/> - <zone name="80_JU"/> - <zone name="80_JV"/> - <zone name="79_JT"/> - <zone name="79_JV"/> - <zone name="81_JU"/> - <zone name="81_JV"/> - <zone name="82_JU"/> - <zone name="82_JV"/> - </complete_island> - <complete_island island="uiR2_Jungle42" package="j1" continent="r2_jungle" xmin="31029" ymin="-13758" xmax="31518" ymax="-13192"> - <zone name="84_HM"/> - <zone name="85_HM"/> - <zone name="85_HN"/> - <zone name="84_HN"/> - <zone name="83_HM"/> - <zone name="83_HN"/> - <zone name="86_HM"/> - <zone name="86_HN"/> - <zone name="86_HO"/> - <zone name="85_HO"/> - <zone name="84_HO"/> - </complete_island> - <complete_island island="uiR2_Jungle43" package="j1" continent="r2_jungle" xmin="31674" ymin="-13469" xmax="32002" ymax="-13275"> - <zone name="84_HQ"/> - <zone name="85_HQ"/> - <zone name="85_HR"/> - <zone name="84_HR"/> - <zone name="86_HQ"/> - <zone name="86_HR"/> - <zone name="86_HS"/> - <zone name="85_HS"/> - <zone name="84_HS"/> - <zone name="87_HQ"/> - <zone name="87_HR"/> - <zone name="87_HS"/> - <zone name="87_HT"/> - <zone name="86_HT"/> - <zone name="85_HT"/> - <zone name="84_HT"/> - </complete_island> - <complete_island island="uiR2_Jungle44" package="j1" continent="r2_jungle" xmin="32552" ymin="-13771" xmax="33057" ymax="-13270"> - <zone name="84_HW"/> - <zone name="85_HV"/> - <zone name="85_HW"/> - <zone name="85_HX"/> - <zone name="84_HV"/> - <zone name="84_HX"/> - <zone name="86_HW"/> - <zone name="86_HX"/> - <zone name="86_HY"/> - <zone name="85_HY"/> - <zone name="84_HY"/> - </complete_island> - <complete_island island="uiR2_Jungle45" package="j1" continent="r2_jungle" xmin="33352" ymin="-13827" xmax="33848" ymax="-13274"> - <zone name="86_IB"/> - <zone name="87_IB"/> - <zone name="87_IC"/> - <zone name="86_IA"/> - <zone name="86_IC"/> - <zone name="85_IA"/> - <zone name="85_IB"/> - <zone name="85_IC"/> - <zone name="85_ID"/> - <zone name="84_IB"/> - <zone name="84_IC"/> - <zone name="84_ID"/> - </complete_island> - <complete_island island="uiR2_Jungle46" package="j1" continent="r2_jungle" xmin="34073" ymin="-14087" xmax="34817" ymax="-13276"> - <zone name="87_IF"/> - <zone name="88_IF"/> - <zone name="88_IG"/> - <zone name="87_IG"/> - <zone name="86_IF"/> - <zone name="86_IG"/> - <zone name="88_IH"/> - <zone name="87_IH"/> - <zone name="86_IH"/> - <zone name="85_IF"/> - <zone name="85_IG"/> - <zone name="85_IH"/> - <zone name="88_II"/> - <zone name="87_II"/> - <zone name="86_II"/> - <zone name="85_II"/> - <zone name="84_IF"/> - <zone name="84_IG"/> - <zone name="84_IH"/> - <zone name="84_II"/> - <zone name="87_IJ"/> - <zone name="86_IJ"/> - <zone name="85_IJ"/> - <zone name="84_IJ"/> - </complete_island> - <complete_island island="uiR2_Jungle47" package="j1" continent="r2_jungle" xmin="35034" ymin="-13765" xmax="35685" ymax="-13274"> - <zone name="84_IO"/> - <zone name="85_IN"/> - <zone name="85_IO"/> - <zone name="84_IN"/> - <zone name="86_IM"/> - <zone name="86_IN"/> - <zone name="86_IO"/> - <zone name="85_IM"/> - <zone name="84_IM"/> - <zone name="86_IL"/> - <zone name="85_IL"/> - <zone name="84_IL"/> - </complete_island> - <complete_island island="uiR2_Jungle48" package="j1" continent="r2_jungle" xmin="35834" ymin="-13858" xmax="36257" ymax="-13275"> - <zone name="84_IQ"/> - <zone name="85_IQ"/> - <zone name="85_IR"/> - <zone name="84_IR"/> - <zone name="86_IQ"/> - <zone name="86_IR"/> - <zone name="86_IS"/> - <zone name="85_IS"/> - <zone name="84_IS"/> - <zone name="87_IQ"/> - <zone name="87_IR"/> - <zone name="87_IS"/> - </complete_island> - <complete_island island="uiR2_Jungle49" package="j1" continent="r2_jungle" xmin="36475" ymin="-13930" xmax="37057" ymax="-13270"> - <zone name="85_IW"/> - <zone name="86_IV"/> - <zone name="86_IW"/> - <zone name="86_IX"/> - <zone name="85_IV"/> - <zone name="85_IX"/> - <zone name="84_IV"/> - <zone name="84_IW"/> - <zone name="84_IX"/> - <zone name="87_IU"/> - <zone name="87_IV"/> - <zone name="87_IW"/> - <zone name="86_IU"/> - <zone name="85_IU"/> - <zone name="87_IX"/> - <zone name="84_IU"/> - </complete_island> - <complete_island island="uiR2_Jungle50" package="j1" continent="r2_jungle" xmin="37270" ymin="-13918" xmax="37764" ymax="-13274"> - <zone name="86_IZ"/> - <zone name="87_JA"/> - <zone name="86_JA"/> - <zone name="85_IZ"/> - <zone name="85_JA"/> - <zone name="87_JB"/> - <zone name="86_JB"/> - <zone name="85_JB"/> - <zone name="84_JB"/> - </complete_island> - <complete_island island="uiR2_Jungle51" package="j1" continent="r2_jungle" xmin="37992" ymin="-14018" xmax="38308" ymax="-13343"> - <zone name="87_JE"/> - <zone name="88_JD"/> - <zone name="88_JE"/> - <zone name="88_JF"/> - <zone name="87_JD"/> - <zone name="87_JF"/> - <zone name="86_JE"/> - <zone name="85_JD"/> - <zone name="85_JE"/> - <zone name="85_JF"/> - <zone name="84_JD"/> - <zone name="84_JE"/> - <zone name="84_JF"/> - </complete_island> - <complete_island island="uiR2_Jungle52" package="j1" continent="r2_jungle" xmin="38622" ymin="-13828" xmax="39205" ymax="-13274"> - <zone name="86_JK"/> - <zone name="87_JJ"/> - <zone name="86_JJ"/> - <zone name="85_JJ"/> - <zone name="85_JK"/> - <zone name="87_JI"/> - <zone name="86_JI"/> - <zone name="85_JI"/> - <zone name="84_JI"/> - <zone name="84_JJ"/> - <zone name="86_JH"/> - <zone name="85_JH"/> - <zone name="84_JH"/> - </complete_island> - <complete_island island="uiR2_Jungle53" package="j1" continent="r2_jungle" xmin="39349" ymin="-13858" xmax="39847" ymax="-13274"> - <zone name="86_JO"/> - <zone name="87_JN"/> - <zone name="87_JO"/> - <zone name="86_JN"/> - <zone name="85_JN"/> - <zone name="85_JO"/> - <zone name="87_JM"/> - <zone name="86_JM"/> - <zone name="85_JM"/> - <zone name="84_JM"/> - <zone name="84_JN"/> - <zone name="84_JO"/> - </complete_island> - <complete_island island="uiR2_Primes01" package="p1" continent="r2_roots" xmin="31033" ymin="-21606" xmax="31367" ymax="-20959"> - <zone name="135_HM"/> - <zone name="135_HN"/> - <zone name="134_HM"/> - <zone name="134_HN"/> - <zone name="133_HM"/> - <zone name="133_HN"/> - <zone name="132_HM"/> - <zone name="132_HN"/> - </complete_island> - <complete_island island="uiR2_Primes03" package="p1" continent="r2_roots" xmin="32153" ymin="-21604" xmax="32807" ymax="-20953"> - <zone name="132_HT"/> - <zone name="133_HT"/> - <zone name="133_HU"/> - <zone name="132_HU"/> - <zone name="134_HT"/> - <zone name="134_HU"/> - <zone name="134_HV"/> - <zone name="133_HV"/> - <zone name="132_HV"/> - <zone name="135_HT"/> - <zone name="135_HU"/> - <zone name="135_HV"/> - <zone name="135_HW"/> - <zone name="134_HW"/> - <zone name="133_HW"/> - <zone name="132_HW"/> - </complete_island> - <complete_island island="uiR2_Primes04" package="p1" continent="r2_roots" xmin="32953" ymin="-21607" xmax="33606" ymax="-20954"> - <zone name="133_IA"/> - <zone name="134_HZ"/> - <zone name="134_IA"/> - <zone name="134_IB"/> - <zone name="133_HZ"/> - <zone name="133_IB"/> - <zone name="132_HZ"/> - <zone name="132_IA"/> - <zone name="132_IB"/> - <zone name="135_HY"/> - <zone name="135_HZ"/> - <zone name="135_IA"/> - <zone name="134_HY"/> - <zone name="133_HY"/> - <zone name="135_IB"/> - <zone name="132_HY"/> - </complete_island> - <complete_island island="uiR2_Primes05" package="p1" continent="r2_roots" xmin="33755" ymin="-21601" xmax="34407" ymax="-20954"> - <zone name="134_IG"/> - <zone name="135_IF"/> - <zone name="135_IG"/> - <zone name="134_IF"/> - <zone name="133_IF"/> - <zone name="133_IG"/> - <zone name="135_IE"/> - <zone name="134_IE"/> - <zone name="133_IE"/> - <zone name="132_IE"/> - <zone name="132_IF"/> - <zone name="132_IG"/> - <zone name="135_ID"/> - <zone name="134_ID"/> - <zone name="133_ID"/> - </complete_island> - <complete_island island="uiR2_Primes06" package="p1" continent="r2_roots" xmin="34554" ymin="-21521" xmax="35046" ymax="-20954"> - <zone name="132_II"/> - <zone name="133_II"/> - <zone name="133_IJ"/> - <zone name="132_IJ"/> - <zone name="134_II"/> - <zone name="134_IJ"/> - <zone name="134_IK"/> - <zone name="133_IK"/> - <zone name="132_IK"/> - <zone name="135_II"/> - <zone name="135_IJ"/> - <zone name="135_IK"/> - </complete_island> - <complete_island island="uiR2_Primes07" package="p1" continent="r2_roots" xmin="35193" ymin="-21615" xmax="35845" ymax="-20954"> - <zone name="134_IM"/> - <zone name="135_IN"/> - <zone name="134_IN"/> - <zone name="133_IM"/> - <zone name="133_IN"/> - <zone name="135_IO"/> - <zone name="134_IO"/> - <zone name="133_IO"/> - <zone name="132_IM"/> - <zone name="132_IN"/> - <zone name="132_IO"/> - <zone name="135_IP"/> - <zone name="134_IP"/> - <zone name="133_IP"/> - <zone name="132_IP"/> - </complete_island> - <complete_island island="uiR2_Primes08" package="p1" continent="r2_roots" xmin="35994" ymin="-21607" xmax="36648" ymax="-20953"> - <zone name="132_IS"/> - <zone name="133_IR"/> - <zone name="133_IS"/> - <zone name="133_IT"/> - <zone name="132_IR"/> - <zone name="132_IT"/> - <zone name="134_IR"/> - <zone name="134_IS"/> - <zone name="134_IT"/> - <zone name="134_IU"/> - <zone name="133_IU"/> - <zone name="132_IU"/> - <zone name="135_IR"/> - <zone name="135_IS"/> - <zone name="135_IT"/> - <zone name="135_IU"/> - </complete_island> - <complete_island island="uiR2_Primes09" package="p1" continent="r2_roots" xmin="36799" ymin="-21446" xmax="37594" ymax="-20953"> - <zone name="133_IW"/> - <zone name="134_IW"/> - <zone name="134_IX"/> - <zone name="133_IX"/> - <zone name="132_IW"/> - <zone name="132_IX"/> - <zone name="134_IY"/> - <zone name="133_IY"/> - <zone name="132_IY"/> - <zone name="134_IZ"/> - <zone name="133_IZ"/> - <zone name="132_IZ"/> - <zone name="134_JA"/> - <zone name="133_JA"/> - <zone name="132_JA"/> - </complete_island> - <complete_island island="uiR2_Primes10" package="p1" continent="r2_roots" xmin="37753" ymin="-21594" xmax="38247" ymax="-20955"> - <zone name="134_JD"/> - <zone name="135_JC"/> - <zone name="135_JD"/> - <zone name="134_JC"/> - <zone name="134_JE"/> - <zone name="133_JC"/> - <zone name="133_JD"/> - <zone name="133_JE"/> - <zone name="132_JC"/> - <zone name="132_JD"/> - <zone name="132_JE"/> - </complete_island> - <complete_island island="uiR2_Primes11" package="p1" continent="r2_roots" xmin="38393" ymin="-21607" xmax="39047" ymax="-20956"> - <zone name="135_JJ"/> - <zone name="135_JI"/> - <zone name="134_JI"/> - <zone name="134_JJ"/> - <zone name="135_JH"/> - <zone name="134_JH"/> - <zone name="133_JH"/> - <zone name="133_JI"/> - <zone name="133_JJ"/> - <zone name="134_JG"/> - <zone name="133_JG"/> - <zone name="132_JG"/> - <zone name="132_JH"/> - <zone name="132_JI"/> - </complete_island> - <complete_island island="uiR2_Primes12" package="p1" continent="r2_roots" xmin="39199" ymin="-21497" xmax="39841" ymax="-21063"> - <zone name="134_JM"/> - <zone name="135_JN"/> - <zone name="134_JL"/> - <zone name="134_JN"/> - <zone name="133_JL"/> - <zone name="133_JM"/> - <zone name="133_JN"/> - <zone name="135_JO"/> - <zone name="134_JO"/> - <zone name="133_JO"/> - <zone name="132_JL"/> - <zone name="132_JM"/> - </complete_island> - <complete_island island="uiR2_Primes13" package="p1" continent="r2_roots" xmin="39995" ymin="-21762" xmax="40641" ymax="-21211"> - <zone name="136_JS"/> - <zone name="136_JR"/> - <zone name="135_JR"/> - <zone name="135_JS"/> - <zone name="135_JT"/> - <zone name="135_JQ"/> - <zone name="134_JQ"/> - <zone name="134_JR"/> - <zone name="134_JS"/> - <zone name="134_JT"/> - <zone name="133_JR"/> - <zone name="133_JS"/> - </complete_island> - <complete_island island="uiR2_Primes14" package="p1" continent="r2_roots" xmin="31033" ymin="-22406" xmax="31685" ymax="-21754"> - <zone name="138_HN"/> - <zone name="139_HM"/> - <zone name="139_HN"/> - <zone name="139_HO"/> - <zone name="138_HM"/> - <zone name="138_HO"/> - <zone name="137_HM"/> - <zone name="137_HN"/> - <zone name="137_HO"/> - <zone name="140_HM"/> - <zone name="140_HN"/> - <zone name="140_HO"/> - <zone name="140_HP"/> - <zone name="139_HP"/> - <zone name="138_HP"/> - <zone name="137_HP"/> - </complete_island> - <complete_island island="uiR2_Primes15" package="p1" continent="r2_roots" xmin="31834" ymin="-22325" xmax="32484" ymax="-21753"> - <zone name="137_HR"/> - <zone name="138_HR"/> - <zone name="138_HS"/> - <zone name="137_HS"/> - <zone name="139_HR"/> - <zone name="139_HS"/> - <zone name="139_HT"/> - <zone name="138_HT"/> - <zone name="137_HT"/> - <zone name="139_HU"/> - <zone name="138_HU"/> - <zone name="137_HU"/> - </complete_island> - <complete_island island="uiR2_Primes16" package="p1" continent="r2_roots" xmin="32635" ymin="-22247" xmax="33127" ymax="-21753"> - <zone name="139_HY"/> - <zone name="139_HX"/> - <zone name="138_HX"/> - <zone name="138_HY"/> - <zone name="139_HW"/> - <zone name="138_HW"/> - <zone name="137_HW"/> - <zone name="137_HX"/> - <zone name="137_HY"/> - </complete_island> - <complete_island island="uiR2_Primes17" package="p1" continent="r2_roots" xmin="33273" ymin="-22401" xmax="33926" ymax="-21754"> - <zone name="138_IC"/> - <zone name="139_IB"/> - <zone name="139_IC"/> - <zone name="139_ID"/> - <zone name="138_IB"/> - <zone name="138_ID"/> - <zone name="137_IB"/> - <zone name="137_IC"/> - <zone name="140_IA"/> - <zone name="140_IB"/> - <zone name="140_IC"/> - <zone name="139_IA"/> - <zone name="138_IA"/> - <zone name="140_ID"/> - <zone name="137_IA"/> - </complete_island> - <complete_island island="uiR2_Primes18" package="p1" continent="r2_roots" xmin="34078" ymin="-22309" xmax="34726" ymax="-21766"> - <zone name="138_II"/> - <zone name="139_IH"/> - <zone name="139_II"/> - <zone name="138_IH"/> - <zone name="137_IH"/> - <zone name="137_II"/> - <zone name="140_IH"/> - <zone name="140_II"/> - <zone name="139_IG"/> - <zone name="138_IG"/> - <zone name="139_IF"/> - <zone name="138_IF"/> - </complete_island> - <complete_island island="uiR2_Primes19" package="p1" continent="r2_roots" xmin="34874" ymin="-22485" xmax="35514" ymax="-21746"> - <zone name="140_IK"/> - <zone name="140_IL"/> - <zone name="139_IK"/> - <zone name="139_IL"/> - <zone name="140_IM"/> - <zone name="139_IM"/> - <zone name="138_IK"/> - <zone name="138_IL"/> - <zone name="138_IM"/> - <zone name="138_IN"/> - <zone name="137_IK"/> - <zone name="137_IL"/> - <zone name="137_IM"/> - <zone name="137_IN"/> - </complete_island> - <complete_island island="uiR2_Primes20" package="p1" continent="r2_roots" xmin="35677" ymin="-22247" xmax="36029" ymax="-21914"> - <zone name="139_IP"/> - <zone name="139_IQ"/> - <zone name="138_IP"/> - <zone name="138_IQ"/> - <zone name="139_IR"/> - <zone name="138_IR"/> - <zone name="139_IS"/> - <zone name="138_IS"/> - </complete_island> - <complete_island island="uiR2_Primes21" package="p1" continent="r2_roots" xmin="36558" ymin="-22407" xmax="37124" ymax="-21753"> - <zone name="139_IX"/> - <zone name="140_IW"/> - <zone name="140_IX"/> - <zone name="139_IW"/> - <zone name="138_IW"/> - <zone name="138_IX"/> - <zone name="140_IV"/> - <zone name="139_IV"/> - <zone name="138_IV"/> - <zone name="137_IV"/> - <zone name="137_IW"/> - <zone name="137_IX"/> - <zone name="140_IU"/> - <zone name="139_IU"/> - <zone name="138_IU"/> - <zone name="137_IU"/> - </complete_island> - <complete_island island="uiR2_Primes22" package="p1" continent="r2_roots" xmin="37275" ymin="-22407" xmax="37767" ymax="-21753"> - <zone name="138_JA"/> - <zone name="139_IZ"/> - <zone name="139_JA"/> - <zone name="139_JB"/> - <zone name="138_IZ"/> - <zone name="138_JB"/> - <zone name="137_IZ"/> - <zone name="137_JA"/> - <zone name="137_JB"/> - <zone name="140_IZ"/> - <zone name="140_JA"/> - <zone name="140_JB"/> - </complete_island> - <complete_island island="uiR2_Primes23" package="p1" continent="r2_roots" xmin="37914" ymin="-22406" xmax="38481" ymax="-21759"> - <zone name="138_JF"/> - <zone name="139_JE"/> - <zone name="139_JF"/> - <zone name="139_JG"/> - <zone name="138_JE"/> - <zone name="138_JG"/> - <zone name="137_JE"/> - <zone name="137_JF"/> - <zone name="137_JG"/> - <zone name="140_JD"/> - <zone name="140_JE"/> - <zone name="140_JF"/> - <zone name="139_JD"/> - <zone name="138_JD"/> - <zone name="140_JG"/> - <zone name="137_JD"/> - </complete_island> - <complete_island island="uiR2_Primes24" package="p1" continent="r2_roots" xmin="38798" ymin="-22407" xmax="39429" ymax="-21753"> - <zone name="137_JL"/> - <zone name="138_JK"/> - <zone name="138_JL"/> - <zone name="138_JM"/> - <zone name="137_JK"/> - <zone name="137_JM"/> - <zone name="139_JJ"/> - <zone name="139_JK"/> - <zone name="138_JJ"/> - <zone name="137_JJ"/> - <zone name="140_JI"/> - <zone name="140_JJ"/> - <zone name="140_JK"/> - <zone name="139_JI"/> - <zone name="138_JI"/> - <zone name="137_JI"/> - </complete_island> - <complete_island island="uiR2_Primes25" package="p1" continent="r2_roots" xmin="39677" ymin="-22406" xmax="40163" ymax="-21913"> - <zone name="140_JP"/> - <zone name="140_JQ"/> - <zone name="139_JO"/> - <zone name="139_JP"/> - <zone name="139_JQ"/> - <zone name="138_JO"/> - <zone name="138_JP"/> - <zone name="138_JQ"/> - </complete_island> - <complete_island island="uiR2_Primes26" package="p1" continent="r2_roots" xmin="40313" ymin="-22406" xmax="40806" ymax="-21914"> - <zone name="139_JT"/> - <zone name="140_JS"/> - <zone name="140_JT"/> - <zone name="140_JU"/> - <zone name="139_JS"/> - <zone name="139_JU"/> - <zone name="138_JS"/> - <zone name="138_JT"/> - <zone name="138_JU"/> - </complete_island> - <complete_island island="uiR2_Primes27" package="p1" continent="r2_roots" xmin="31033" ymin="-23206" xmax="31686" ymax="-22553"> - <zone name="142_HP"/> - <zone name="143_HO"/> - <zone name="143_HP"/> - <zone name="142_HO"/> - <zone name="144_HN"/> - <zone name="144_HO"/> - <zone name="144_HP"/> - <zone name="143_HN"/> - <zone name="142_HN"/> - <zone name="145_HM"/> - <zone name="145_HN"/> - <zone name="145_HO"/> - <zone name="144_HM"/> - <zone name="143_HM"/> - <zone name="145_HP"/> - <zone name="142_HM"/> - </complete_island> - <complete_island island="uiR2_Primes28" package="p1" continent="r2_roots" xmin="31834" ymin="-23207" xmax="32486" ymax="-22559"> - <zone name="144_HT"/> - <zone name="145_HS"/> - <zone name="145_HT"/> - <zone name="145_HU"/> - <zone name="144_HS"/> - <zone name="144_HU"/> - <zone name="143_HS"/> - <zone name="143_HT"/> - <zone name="143_HU"/> - <zone name="145_HR"/> - <zone name="144_HR"/> - <zone name="143_HR"/> - <zone name="142_HR"/> - <zone name="142_HS"/> - <zone name="142_HT"/> - <zone name="142_HU"/> - </complete_island> - <complete_island island="uiR2_Primes29" package="p1" continent="r2_roots" xmin="32633" ymin="-23206" xmax="33287" ymax="-22559"> - <zone name="144_HZ"/> - <zone name="145_HY"/> - <zone name="145_HZ"/> - <zone name="144_HY"/> - <zone name="143_HY"/> - <zone name="143_HZ"/> - <zone name="145_HX"/> - <zone name="144_HX"/> - <zone name="143_HX"/> - <zone name="142_HX"/> - <zone name="142_HY"/> - <zone name="142_HZ"/> - <zone name="145_HW"/> - <zone name="144_HW"/> - <zone name="143_HW"/> - <zone name="142_HW"/> - </complete_island> - <complete_island island="uiR2_Primes30" package="p1" continent="r2_roots" xmin="33519" ymin="-23046" xmax="33927" ymax="-22559"> - <zone name="143_IC"/> - <zone name="144_IB"/> - <zone name="144_IC"/> - <zone name="144_ID"/> - <zone name="143_IB"/> - <zone name="143_ID"/> - <zone name="142_IB"/> - <zone name="142_IC"/> - <zone name="142_ID"/> - </complete_island> -</islands> +<?xml version="1.0"?> +<islands> + <complete_island island="uiR2_Lakes01" package="l1" continent="r2_lakes" xmin="31029" ymin="-1611" xmax="31691" ymax="-953"> + <zone name="9_HO"/> + <zone name="10_HN"/> + <zone name="10_HO"/> + <zone name="10_HP"/> + <zone name="9_HN"/> + <zone name="9_HP"/> + <zone name="8_HN"/> + <zone name="8_HO"/> + <zone name="8_HP"/> + <zone name="10_HM"/> + <zone name="9_HM"/> + <zone name="8_HM"/> + <zone name="7_HM"/> + <zone name="7_HN"/> + <zone name="7_HO"/> + <zone name="7_HP"/> + </complete_island> + <complete_island island="uiR2_Lakes02" package="l1" continent="r2_lakes" xmin="31833" ymin="-1611" xmax="32483" ymax="-949"> + <zone name="8_HS"/> + <zone name="9_HR"/> + <zone name="9_HS"/> + <zone name="9_HT"/> + <zone name="8_HR"/> + <zone name="8_HT"/> + <zone name="7_HR"/> + <zone name="7_HS"/> + <zone name="7_HT"/> + <zone name="10_HR"/> + <zone name="10_HS"/> + <zone name="10_HT"/> + <zone name="10_HU"/> + <zone name="9_HU"/> + <zone name="8_HU"/> + <zone name="7_HU"/> + </complete_island> + <complete_island island="uiR2_Lakes03" package="l1" continent="r2_lakes" xmin="32639" ymin="-1609" xmax="33446" ymax="-827"> + <zone name="7_HY"/> + <zone name="8_HX"/> + <zone name="8_HY"/> + <zone name="8_HZ"/> + <zone name="7_HX"/> + <zone name="7_HZ"/> + <zone name="6_HX"/> + <zone name="6_HY"/> + <zone name="6_HZ"/> + <zone name="9_HW"/> + <zone name="9_HX"/> + <zone name="9_HY"/> + <zone name="8_HW"/> + <zone name="7_HW"/> + <zone name="9_HZ"/> + <zone name="9_IA"/> + <zone name="8_IA"/> + <zone name="7_IA"/> + <zone name="6_HW"/> + <zone name="6_IA"/> + <zone name="10_HW"/> + <zone name="10_HX"/> + <zone name="10_HY"/> + <zone name="10_HZ"/> + <zone name="10_IA"/> + </complete_island> + <complete_island island="uiR2_Lakes04" package="l1" continent="r2_lakes" xmin="33627" ymin="-1352" xmax="34373" ymax="-952"> + <zone name="8_IC"/> + <zone name="9_ID"/> + <zone name="8_ID"/> + <zone name="7_IC"/> + <zone name="7_ID"/> + <zone name="9_IE"/> + <zone name="8_IE"/> + <zone name="7_IE"/> + <zone name="9_IF"/> + <zone name="8_IF"/> + <zone name="7_IF"/> + <zone name="9_IG"/> + <zone name="8_IG"/> + </complete_island> + <complete_island island="uiR2_Lakes05" package="l1" continent="r2_lakes" xmin="34554" ymin="-1353" xmax="35101" ymax="-827"> + <zone name="8_IJ"/> + <zone name="9_IJ"/> + <zone name="9_IK"/> + <zone name="8_II"/> + <zone name="8_IK"/> + <zone name="7_II"/> + <zone name="7_IJ"/> + <zone name="7_IK"/> + <zone name="9_IL"/> + <zone name="8_IL"/> + <zone name="6_II"/> + <zone name="6_IJ"/> + <zone name="6_IK"/> + </complete_island> + <complete_island island="uiR2_Lakes06" package="l1" continent="r2_lakes" xmin="35351" ymin="-1413" xmax="36009" ymax="-791"> + <zone name="9_IO"/> + <zone name="9_IN"/> + <zone name="9_IP"/> + <zone name="8_IN"/> + <zone name="8_IO"/> + <zone name="8_IP"/> + <zone name="9_IQ"/> + <zone name="8_IQ"/> + <zone name="7_IN"/> + <zone name="7_IO"/> + <zone name="7_IP"/> + <zone name="7_IQ"/> + <zone name="6_IN"/> + <zone name="6_IO"/> + </complete_island> + <complete_island island="uiR2_Lakes07" package="l1" continent="r2_lakes" xmin="36154" ymin="-1413" xmax="36552" ymax="-951"> + <zone name="7_IT"/> + <zone name="8_IS"/> + <zone name="8_IT"/> + <zone name="8_IU"/> + <zone name="7_IS"/> + <zone name="7_IU"/> + <zone name="9_IS"/> + <zone name="9_IT"/> + <zone name="9_IU"/> + </complete_island> + <complete_island island="uiR2_Lakes08" package="l1" continent="r2_lakes" xmin="36827" ymin="-1609" xmax="37449" ymax="-987"> + <zone name="9_IZ"/> + <zone name="10_IY"/> + <zone name="9_IY"/> + <zone name="8_IY"/> + <zone name="8_IZ"/> + <zone name="10_IX"/> + <zone name="9_IX"/> + <zone name="8_IX"/> + <zone name="7_IX"/> + <zone name="7_IY"/> + <zone name="9_IW"/> + <zone name="8_IW"/> + </complete_island> + <complete_island island="uiR2_Lakes09" package="l1" continent="r2_lakes" xmin="37599" ymin="-1609" xmax="38249" ymax="-959"> + <zone name="9_JD"/> + <zone name="10_JC"/> + <zone name="10_JD"/> + <zone name="10_JE"/> + <zone name="9_JC"/> + <zone name="9_JE"/> + <zone name="8_JC"/> + <zone name="8_JD"/> + <zone name="8_JE"/> + <zone name="10_JB"/> + <zone name="9_JB"/> + <zone name="8_JB"/> + <zone name="7_JB"/> + <zone name="7_JC"/> + <zone name="7_JD"/> + <zone name="7_JE"/> + </complete_island> + <complete_island island="uiR2_Lakes10" package="l1" continent="r2_lakes" xmin="38398" ymin="-1609" xmax="39046" ymax="-987"> + <zone name="10_JJ"/> + <zone name="10_JI"/> + <zone name="9_JI"/> + <zone name="9_JJ"/> + <zone name="10_JH"/> + <zone name="9_JH"/> + <zone name="8_JH"/> + <zone name="8_JI"/> + <zone name="8_JJ"/> + <zone name="10_JG"/> + <zone name="9_JG"/> + <zone name="8_JG"/> + <zone name="7_JG"/> + <zone name="7_JH"/> + <zone name="7_JI"/> + <zone name="7_JJ"/> + </complete_island> + <complete_island island="uiR2_Lakes11" package="l1" continent="r2_lakes" xmin="31034" ymin="-2406" xmax="31653" ymax="-1847"> + <zone name="13_HN"/> + <zone name="14_HM"/> + <zone name="14_HN"/> + <zone name="14_HO"/> + <zone name="13_HM"/> + <zone name="13_HO"/> + <zone name="12_HM"/> + <zone name="12_HN"/> + <zone name="12_HO"/> + <zone name="15_HN"/> + <zone name="15_HO"/> + <zone name="15_HP"/> + <zone name="14_HP"/> + <zone name="13_HP"/> + <zone name="12_HP"/> + </complete_island> + <complete_island island="uiR2_Lakes12" package="l1" continent="r2_lakes" xmin="31839" ymin="-2569" xmax="32486" ymax="-1848"> + <zone name="15_HR"/> + <zone name="16_HR"/> + <zone name="16_HS"/> + <zone name="15_HS"/> + <zone name="14_HR"/> + <zone name="14_HS"/> + <zone name="16_HT"/> + <zone name="15_HT"/> + <zone name="14_HT"/> + <zone name="13_HR"/> + <zone name="13_HS"/> + <zone name="13_HT"/> + <zone name="16_HU"/> + <zone name="15_HU"/> + <zone name="14_HU"/> + <zone name="12_HR"/> + <zone name="12_HS"/> + <zone name="12_HT"/> + </complete_island> + <complete_island island="uiR2_Lakes14" package="l1" continent="r2_lakes" xmin="33368" ymin="-2312" xmax="33672" ymax="-2008"> + <zone name="14_IA"/> + <zone name="15_IA"/> + <zone name="15_IB"/> + <zone name="14_IB"/> + <zone name="13_IA"/> + <zone name="13_IB"/> + <zone name="15_IC"/> + <zone name="14_IC"/> + <zone name="13_IC"/> + </complete_island> + <complete_island island="uiR2_Lakes15" package="l1" continent="r2_lakes" xmin="34008" ymin="-2152" xmax="34726" ymax="-1787"> + <zone name="12_II"/> + <zone name="13_IH"/> + <zone name="13_II"/> + <zone name="12_IH"/> + <zone name="14_IG"/> + <zone name="14_IH"/> + <zone name="14_II"/> + <zone name="13_IG"/> + <zone name="12_IG"/> + <zone name="14_IF"/> + <zone name="13_IF"/> + <zone name="12_IF"/> + <zone name="14_IE"/> + <zone name="13_IE"/> + <zone name="12_IE"/> + </complete_island> + <complete_island island="uiR2_Lakes16" package="l1" continent="r2_lakes" xmin="34869" ymin="-2411" xmax="35682" ymax="-1753"> + <zone name="14_IM"/> + <zone name="15_IL"/> + <zone name="15_IM"/> + <zone name="15_IN"/> + <zone name="14_IL"/> + <zone name="14_IN"/> + <zone name="13_IL"/> + <zone name="13_IM"/> + <zone name="13_IN"/> + <zone name="15_IK"/> + <zone name="14_IK"/> + <zone name="15_IO"/> + <zone name="14_IO"/> + <zone name="13_IK"/> + <zone name="13_IO"/> + <zone name="12_IK"/> + <zone name="12_IL"/> + <zone name="12_IM"/> + <zone name="12_IN"/> + <zone name="12_IO"/> + </complete_island> + <complete_island island="uiR2_Lakes17" package="l1" continent="r2_lakes" xmin="35826" ymin="-2407" xmax="36247" ymax="-1753"> + <zone name="15_IR"/> + <zone name="15_IQ"/> + <zone name="15_IS"/> + <zone name="14_IQ"/> + <zone name="13_IQ"/> + <zone name="13_IR"/> + <zone name="12_IQ"/> + <zone name="12_IR"/> + </complete_island> + <complete_island island="uiR2_Lakes18" package="l1" continent="r2_lakes" xmin="36530" ymin="-2327" xmax="37004" ymax="-1878"> + <zone name="13_IV"/> + <zone name="14_IV"/> + <zone name="14_IW"/> + <zone name="13_IU"/> + <zone name="13_IW"/> + <zone name="12_IV"/> + <zone name="15_IW"/> + <zone name="14_IX"/> + <zone name="13_IX"/> + </complete_island> + <complete_island island="uiR2_Lakes19" package="l1" continent="r2_lakes" xmin="37276" ymin="-2385" xmax="37858" ymax="-1864"> + <zone name="14_JB"/> + <zone name="14_JA"/> + <zone name="13_JA"/> + <zone name="13_JB"/> + <zone name="13_JC"/> + <zone name="15_IZ"/> + <zone name="14_IZ"/> + <zone name="13_IZ"/> + <zone name="12_JA"/> + <zone name="12_JB"/> + </complete_island> + <complete_island island="uiR2_Lakes20" package="l1" continent="r2_lakes" xmin="38066" ymin="-2385" xmax="38602" ymax="-1744"> + <zone name="13_JE"/> + <zone name="14_JF"/> + <zone name="13_JF"/> + <zone name="12_JF"/> + <zone name="15_JF"/> + <zone name="14_JG"/> + <zone name="13_JG"/> + <zone name="12_JG"/> + <zone name="13_JH"/> + </complete_island> + <complete_island island="uiR2_Lakes21" package="l1" continent="r2_lakes" xmin="31032" ymin="-3244" xmax="31591" ymax="-2678"> + <zone name="18_HN"/> + <zone name="19_HM"/> + <zone name="19_HN"/> + <zone name="19_HO"/> + <zone name="18_HM"/> + <zone name="18_HO"/> + <zone name="17_HO"/> + <zone name="20_HM"/> + <zone name="20_HN"/> + <zone name="20_HO"/> + <zone name="18_HP"/> + <zone name="21_HN"/> + </complete_island> + <complete_island island="uiR2_Lakes22" package="l1" continent="r2_lakes" xmin="31833" ymin="-3287" xmax="32336" ymax="-2715"> + <zone name="18_HT"/> + <zone name="19_HS"/> + <zone name="19_HT"/> + <zone name="18_HS"/> + <zone name="20_HR"/> + <zone name="20_HS"/> + <zone name="20_HT"/> + <zone name="19_HR"/> + <zone name="18_HR"/> + <zone name="21_HR"/> + </complete_island> + <complete_island island="uiR2_Lakes23" package="l1" continent="r2_lakes" xmin="32463" ymin="-3207" xmax="32814" ymax="-2704"> + <zone name="20_HW"/> + <zone name="20_HV"/> + <zone name="19_HV"/> + <zone name="18_HV"/> + <zone name="18_HW"/> + </complete_island> + <complete_island island="uiR2_Lakes24" package="l1" continent="r2_lakes" xmin="33076" ymin="-3252" xmax="33600" ymax="-2672"> + <zone name="20_IA"/> + <zone name="21_IA"/> + <zone name="21_IB"/> + <zone name="20_HZ"/> + <zone name="20_IB"/> + <zone name="19_HZ"/> + <zone name="19_IA"/> + <zone name="19_IB"/> + <zone name="18_HY"/> + <zone name="18_HZ"/> + <zone name="18_IA"/> + <zone name="18_IB"/> + <zone name="17_HZ"/> + </complete_island> + <complete_island island="uiR2_Lakes25" package="l1" continent="r2_lakes" xmin="33746" ymin="-3345" xmax="34190" ymax="-2672"> + <zone name="20_IE"/> + <zone name="21_IE"/> + <zone name="20_ID"/> + <zone name="20_IF"/> + <zone name="19_ID"/> + <zone name="19_IE"/> + <zone name="19_IF"/> + <zone name="18_IE"/> + <zone name="18_IF"/> + <zone name="17_IE"/> + </complete_island> + <complete_island island="uiR2_Lakes26" package="l1" continent="r2_lakes" xmin="34415" ymin="-3198" xmax="34830" ymax="-2546"> + <zone name="20_IH"/> + <zone name="20_II"/> + <zone name="19_II"/> + <zone name="20_IJ"/> + <zone name="18_IH"/> + <zone name="18_II"/> + <zone name="18_IJ"/> + <zone name="17_II"/> + </complete_island> + <complete_island island="uiR2_Lakes27" package="l1" continent="r2_lakes" xmin="35038" ymin="-3173" xmax="35752" ymax="-2551"> + <zone name="20_IO"/> + <zone name="20_IN"/> + <zone name="19_IN"/> + <zone name="19_IO"/> + <zone name="19_IP"/> + <zone name="20_IM"/> + <zone name="19_IM"/> + <zone name="18_IM"/> + <zone name="18_IN"/> + <zone name="18_IO"/> + <zone name="18_IP"/> + <zone name="20_IL"/> + <zone name="19_IL"/> + <zone name="18_IL"/> + <zone name="17_IL"/> + <zone name="17_IM"/> + <zone name="17_IN"/> + <zone name="17_IO"/> + <zone name="17_IP"/> + </complete_island> + <complete_island island="uiR2_Lakes28" package="l1" continent="r2_lakes" xmin="35991" ymin="-3209" xmax="36641" ymax="-2554"> + <zone name="20_IU"/> + <zone name="20_IT"/> + <zone name="19_IT"/> + <zone name="19_IU"/> + <zone name="20_IS"/> + <zone name="19_IS"/> + <zone name="18_IS"/> + <zone name="18_IT"/> + <zone name="18_IU"/> + <zone name="20_IR"/> + <zone name="19_IR"/> + <zone name="18_IR"/> + <zone name="17_IR"/> + <zone name="17_IS"/> + <zone name="17_IT"/> + <zone name="17_IU"/> + </complete_island> + <complete_island island="uiR2_Lakes29" package="l1" continent="r2_lakes" xmin="36888" ymin="-3173" xmax="37672" ymax="-2719"> + <zone name="20_JA"/> + <zone name="20_JB"/> + <zone name="19_IZ"/> + <zone name="19_JA"/> + <zone name="19_JB"/> + <zone name="20_IY"/> + <zone name="19_IY"/> + <zone name="18_IY"/> + <zone name="18_IZ"/> + <zone name="18_JA"/> + <zone name="18_JB"/> + <zone name="20_IX"/> + <zone name="19_IX"/> + <zone name="18_IX"/> + <zone name="20_IW"/> + <zone name="19_IW"/> + <zone name="18_IW"/> + </complete_island> + <complete_island island="uiR2_Lakes30" package="l1" continent="r2_lakes" xmin="38007" ymin="-3173" xmax="38566" ymax="-2587"> + <zone name="18_JE"/> + <zone name="19_JD"/> + <zone name="19_JE"/> + <zone name="19_JF"/> + <zone name="18_JD"/> + <zone name="18_JF"/> + <zone name="17_JD"/> + <zone name="17_JE"/> + <zone name="17_JF"/> + <zone name="20_JD"/> + <zone name="20_JE"/> + <zone name="20_JF"/> + <zone name="20_JG"/> + <zone name="19_JG"/> + <zone name="18_JG"/> + <zone name="17_JG"/> + </complete_island> + <complete_island island="uiR2_Lakes31" package="l1" continent="r2_lakes" xmin="31152" ymin="-4174" xmax="31694" ymax="-3632"> + <zone name="26_HN"/> + <zone name="25_HN"/> + <zone name="24_HM"/> + <zone name="24_HN"/> + <zone name="24_HO"/> + <zone name="23_HN"/> + <zone name="24_HP"/> + </complete_island> + <complete_island island="uiR2_Lakes32" package="l1" continent="r2_lakes" xmin="31855" ymin="-3950" xmax="32170" ymax="-3521"> + <zone name="23_HR"/> + <zone name="24_HR"/> + <zone name="24_HS"/> + <zone name="23_HS"/> + <zone name="25_HS"/> + </complete_island> + <complete_island island="uiR2_Lakes33" package="l1" continent="r2_lakes" xmin="32308" ymin="-4036" xmax="32835" ymax="-3506"> + <zone name="25_HU"/> + <zone name="25_HV"/> + <zone name="24_HU"/> + <zone name="24_HV"/> + <zone name="26_HW"/> + <zone name="25_HW"/> + <zone name="24_HW"/> + <zone name="23_HU"/> + <zone name="23_HV"/> + <zone name="23_HW"/> + <zone name="25_HX"/> + </complete_island> + <complete_island island="uiR2_Lakes34" package="l1" continent="r2_lakes" xmin="33103" ymin="-4168" xmax="33774" ymax="-3511"> + <zone name="25_IB"/> + <zone name="26_IA"/> + <zone name="26_IB"/> + <zone name="26_IC"/> + <zone name="25_IA"/> + <zone name="25_IC"/> + <zone name="24_IA"/> + <zone name="24_IB"/> + <zone name="26_HZ"/> + <zone name="25_HZ"/> + <zone name="24_HZ"/> + <zone name="23_IA"/> + <zone name="23_IB"/> + <zone name="23_IC"/> + </complete_island> + <complete_island island="uiR2_Lakes35" package="l1" continent="r2_lakes" xmin="33947" ymin="-4166" xmax="34533" ymax="-3514"> + <zone name="26_IF"/> + <zone name="26_IG"/> + <zone name="25_IF"/> + <zone name="25_IG"/> + <zone name="26_IH"/> + <zone name="25_IH"/> + <zone name="24_IE"/> + <zone name="24_IF"/> + <zone name="24_IG"/> + <zone name="23_IE"/> + <zone name="23_IF"/> + <zone name="23_IG"/> + </complete_island> + <complete_island island="uiR2_Lakes36" package="l1" continent="r2_lakes" xmin="34823" ymin="-3888" xmax="35266" ymax="-3506"> + <zone name="24_IK"/> + <zone name="25_IK"/> + <zone name="24_IJ"/> + <zone name="24_IL"/> + <zone name="23_IK"/> + <zone name="23_IL"/> + <zone name="24_IM"/> + </complete_island> + <complete_island island="uiR2_Lakes37" package="l1" continent="r2_lakes" xmin="35511" ymin="-4014" xmax="36009" ymax="-3506"> + <zone name="24_IP"/> + <zone name="25_IO"/> + <zone name="25_IP"/> + <zone name="25_IQ"/> + <zone name="24_IO"/> + <zone name="24_IQ"/> + <zone name="23_IO"/> + <zone name="23_IP"/> + <zone name="23_IQ"/> + </complete_island> + <complete_island island="uiR2_Lakes38" package="l1" continent="r2_lakes" xmin="36146" ymin="-4174" xmax="36945" ymax="-3521"> + <zone name="24_IV"/> + <zone name="25_IU"/> + <zone name="25_IV"/> + <zone name="25_IW"/> + <zone name="24_IU"/> + <zone name="24_IW"/> + <zone name="23_IU"/> + <zone name="23_IV"/> + <zone name="26_IV"/> + <zone name="24_IT"/> + <zone name="23_IT"/> + <zone name="24_IS"/> + </complete_island> + <complete_island island="uiR2_Lakes39" package="l1" continent="r2_lakes" xmin="37236" ymin="-4048" xmax="37933" ymax="-3485"> + <zone name="25_JA"/> + <zone name="26_JA"/> + <zone name="25_IZ"/> + <zone name="25_JB"/> + <zone name="24_IZ"/> + <zone name="24_JA"/> + <zone name="24_JB"/> + <zone name="25_JC"/> + <zone name="24_JC"/> + <zone name="23_IY"/> + <zone name="23_IZ"/> + <zone name="23_JA"/> + <zone name="23_JC"/> + <zone name="22_IZ"/> + </complete_island> + <complete_island island="uiR2_Lakes40" package="l1" continent="r2_lakes" xmin="38074" ymin="-3912" xmax="38632" ymax="-3351"> + <zone name="22_JE"/> + <zone name="23_JE"/> + <zone name="23_JF"/> + <zone name="22_JF"/> + <zone name="24_JE"/> + <zone name="24_JF"/> + <zone name="24_JG"/> + <zone name="23_JG"/> + <zone name="22_JG"/> + <zone name="25_JF"/> + <zone name="25_JG"/> + <zone name="25_JH"/> + <zone name="24_JH"/> + <zone name="23_JH"/> + </complete_island> + <complete_island island="uiR2_Deserts01" package="d1" continent="r2_desert" xmin="21275" ymin="-1445" xmax="21764" ymax="-962"> + <zone name="9_FE"/> + <zone name="9_FD"/> + <zone name="9_FF"/> + <zone name="8_FD"/> + <zone name="8_FE"/> + <zone name="8_FF"/> + <zone name="7_FD"/> + <zone name="7_FE"/> + <zone name="7_FF"/> + </complete_island> + <complete_island island="uiR2_Deserts02" package="d1" continent="r2_desert" xmin="21921" ymin="-1599" xmax="22558" ymax="-962"> + <zone name="9_FH"/> + <zone name="9_FI"/> + <zone name="8_FH"/> + <zone name="8_FI"/> + <zone name="10_FJ"/> + <zone name="9_FJ"/> + <zone name="8_FJ"/> + <zone name="7_FH"/> + <zone name="7_FI"/> + <zone name="10_FK"/> + <zone name="9_FK"/> + <zone name="8_FK"/> + </complete_island> + <complete_island island="uiR2_Deserts03" package="d1" continent="r2_desert" xmin="22723" ymin="-1349" xmax="23109" ymax="-1051"> + <zone name="7_FM"/> + <zone name="8_FM"/> + <zone name="8_FN"/> + <zone name="7_FN"/> + <zone name="9_FM"/> + <zone name="9_FN"/> + <zone name="9_FO"/> + <zone name="8_FO"/> + <zone name="7_FO"/> + </complete_island> + <complete_island island="uiR2_Deserts04" package="d1" continent="r2_desert" xmin="23355" ymin="-1605" xmax="24005" ymax="-962"> + <zone name="8_FT"/> + <zone name="9_FS"/> + <zone name="9_FT"/> + <zone name="8_FS"/> + <zone name="7_FS"/> + <zone name="7_FT"/> + <zone name="10_FR"/> + <zone name="10_FS"/> + <zone name="10_FT"/> + <zone name="9_FR"/> + <zone name="8_FR"/> + <zone name="7_FR"/> + <zone name="10_FQ"/> + <zone name="9_FQ"/> + <zone name="8_FQ"/> + <zone name="7_FQ"/> + </complete_island> + <complete_island island="uiR2_Deserts05" package="d1" continent="r2_desert" xmin="24161" ymin="-1598" xmax="24709" ymax="-956"> + <zone name="7_FX"/> + <zone name="8_FW"/> + <zone name="8_FX"/> + <zone name="8_FY"/> + <zone name="7_FW"/> + <zone name="7_FY"/> + <zone name="9_FV"/> + <zone name="9_FW"/> + <zone name="9_FX"/> + <zone name="8_FV"/> + <zone name="7_FV"/> + <zone name="9_FY"/> + <zone name="10_FV"/> + <zone name="10_FW"/> + <zone name="10_FX"/> + <zone name="10_FY"/> + </complete_island> + <complete_island island="uiR2_Deserts06" package="d1" continent="r2_desert" xmin="24955" ymin="-1605" xmax="25604" ymax="-956"> + <zone name="8_GB"/> + <zone name="9_GA"/> + <zone name="9_GB"/> + <zone name="9_GC"/> + <zone name="8_GA"/> + <zone name="8_GC"/> + <zone name="7_GA"/> + <zone name="7_GB"/> + <zone name="7_GC"/> + <zone name="10_GA"/> + <zone name="10_GB"/> + <zone name="10_GC"/> + <zone name="10_GD"/> + <zone name="9_GD"/> + <zone name="8_GD"/> + <zone name="7_GD"/> + </complete_island> + <complete_island island="uiR2_Deserts07" package="d1" continent="r2_desert" xmin="25755" ymin="-1597" xmax="26238" ymax="-956"> + <zone name="7_GF"/> + <zone name="8_GF"/> + <zone name="8_GG"/> + <zone name="7_GG"/> + <zone name="9_GF"/> + <zone name="9_GG"/> + <zone name="9_GH"/> + <zone name="8_GH"/> + <zone name="7_GH"/> + <zone name="10_GF"/> + <zone name="10_GG"/> + <zone name="10_GH"/> + </complete_island> + <complete_island island="uiR2_Deserts08" package="d1" continent="r2_desert" xmin="26401" ymin="-1605" xmax="27038" ymax="-962"> + <zone name="8_GJ"/> + <zone name="9_GJ"/> + <zone name="9_GK"/> + <zone name="8_GK"/> + <zone name="7_GJ"/> + <zone name="7_GK"/> + <zone name="10_GJ"/> + <zone name="10_GK"/> + <zone name="10_GL"/> + <zone name="9_GL"/> + <zone name="8_GL"/> + <zone name="7_GL"/> + <zone name="10_GM"/> + <zone name="9_GM"/> + <zone name="8_GM"/> + <zone name="7_GM"/> + </complete_island> + <complete_island island="uiR2_Deserts09" package="d1" continent="r2_desert" xmin="27361" ymin="-1605" xmax="27909" ymax="-956"> + <zone name="7_GQ"/> + <zone name="8_GP"/> + <zone name="8_GQ"/> + <zone name="8_GR"/> + <zone name="7_GP"/> + <zone name="7_GR"/> + <zone name="9_GP"/> + <zone name="9_GQ"/> + <zone name="9_GR"/> + <zone name="9_GS"/> + <zone name="8_GS"/> + <zone name="7_GS"/> + <zone name="10_GP"/> + <zone name="10_GQ"/> + <zone name="10_GR"/> + <zone name="10_GS"/> + </complete_island> + <complete_island island="uiR2_Deserts10" package="d1" continent="r2_desert" xmin="28635" ymin="-1599" xmax="29278" ymax="-1052"> + <zone name="7_GY"/> + <zone name="8_GX"/> + <zone name="8_GY"/> + <zone name="8_GZ"/> + <zone name="7_GX"/> + <zone name="9_GX"/> + <zone name="9_GY"/> + <zone name="9_GZ"/> + <zone name="9_HA"/> + <zone name="8_HA"/> + <zone name="10_GX"/> + <zone name="10_GY"/> + <zone name="10_GZ"/> + </complete_island> + <complete_island island="uiR2_Deserts11" package="d1" continent="r2_desert" xmin="29441" ymin="-1599" xmax="30077" ymax="-962"> + <zone name="10_HD"/> + <zone name="10_HC"/> + <zone name="10_HE"/> + <zone name="9_HC"/> + <zone name="9_HD"/> + <zone name="9_HE"/> + <zone name="9_HF"/> + <zone name="8_HC"/> + <zone name="8_HD"/> + <zone name="8_HE"/> + <zone name="8_HF"/> + <zone name="7_HC"/> + <zone name="7_HD"/> + <zone name="7_HE"/> + <zone name="7_HF"/> + </complete_island> + <complete_island island="uiR2_Deserts12" package="d1" continent="r2_desert" xmin="30235" ymin="-1598" xmax="30885" ymax="-961"> + <zone name="10_HI"/> + <zone name="10_HH"/> + <zone name="10_HJ"/> + <zone name="9_HH"/> + <zone name="9_HI"/> + <zone name="9_HJ"/> + <zone name="10_HK"/> + <zone name="9_HK"/> + <zone name="8_HH"/> + <zone name="8_HI"/> + <zone name="8_HJ"/> + <zone name="8_HK"/> + <zone name="7_HH"/> + <zone name="7_HI"/> + <zone name="7_HJ"/> + <zone name="7_HK"/> + </complete_island> + <complete_island island="uiR2_Deserts13" package="d1" continent="r2_desert" xmin="28483" ymin="-2309" xmax="29029" ymax="-1851"> + <zone name="12_GX"/> + <zone name="13_GX"/> + <zone name="13_GY"/> + <zone name="12_GY"/> + <zone name="14_GW"/> + <zone name="14_GX"/> + <zone name="14_GY"/> + <zone name="14_GZ"/> + <zone name="13_GZ"/> + <zone name="12_GZ"/> + <zone name="15_GW"/> + <zone name="15_GX"/> + <zone name="15_GY"/> + </complete_island> + <complete_island island="uiR2_Deserts14" package="d1" continent="r2_desert" xmin="30235" ymin="-2405" xmax="30885" ymax="-1756"> + <zone name="14_HH"/> + <zone name="15_HH"/> + <zone name="15_HI"/> + <zone name="14_HI"/> + <zone name="13_HH"/> + <zone name="13_HI"/> + <zone name="15_HJ"/> + <zone name="14_HJ"/> + <zone name="13_HJ"/> + <zone name="12_HH"/> + <zone name="12_HI"/> + <zone name="12_HJ"/> + <zone name="15_HK"/> + <zone name="14_HK"/> + <zone name="13_HK"/> + <zone name="12_HK"/> + </complete_island> + <complete_island island="uiR2_Deserts15" package="d1" continent="r2_desert" xmin="21401" ymin="-2084" xmax="22090" ymax="-1704"> + <zone name="12_FE"/> + <zone name="13_FE"/> + <zone name="12_FD"/> + <zone name="12_FF"/> + <zone name="11_FE"/> + <zone name="12_FG"/> + <zone name="11_FG"/> + <zone name="13_FH"/> + <zone name="12_FH"/> + <zone name="11_FH"/> + </complete_island> + <complete_island island="uiR2_Deserts16" package="d1" continent="r2_desert" xmin="22234" ymin="-2067" xmax="22730" ymax="-1750"> + <zone name="12_FK"/> + <zone name="13_FK"/> + <zone name="13_FL"/> + <zone name="12_FJ"/> + <zone name="12_FL"/> + </complete_island> + <complete_island island="uiR2_Deserts17" package="d1" continent="r2_desert" xmin="23000" ymin="-1985" xmax="23363" ymax="-1648"> + <zone name="11_FO"/> + <zone name="12_FN"/> + <zone name="12_FO"/> + <zone name="12_FP"/> + <zone name="13_FO"/> + </complete_island> + <complete_island island="uiR2_Deserts18" package="d1" continent="r2_desert" xmin="23510" ymin="-2334" xmax="24015" ymax="-1750"> + <zone name="13_FS"/> + <zone name="14_FR"/> + <zone name="14_FS"/> + <zone name="14_FT"/> + <zone name="13_FR"/> + <zone name="13_FT"/> + <zone name="12_FR"/> + <zone name="12_FS"/> + <zone name="12_FT"/> + <zone name="15_FS"/> + </complete_island> + <complete_island island="uiR2_Deserts19" package="d1" continent="r2_desert" xmin="24156" ymin="-2145" xmax="24963" ymax="-1864"> + <zone name="12_FX"/> + <zone name="13_FW"/> + <zone name="13_FX"/> + <zone name="13_FY"/> + <zone name="14_FX"/> + <zone name="13_FV"/> + <zone name="13_FZ"/> + </complete_island> + <complete_island island="uiR2_Deserts20" package="d1" continent="r2_desert" xmin="25108" ymin="-2412" xmax="25776" ymax="-1864"> + <zone name="14_GE"/> + <zone name="15_GD"/> + <zone name="15_GE"/> + <zone name="14_GD"/> + <zone name="13_GD"/> + <zone name="13_GE"/> + <zone name="15_GC"/> + <zone name="14_GC"/> + <zone name="13_GC"/> + <zone name="12_GD"/> + <zone name="14_GB"/> + <zone name="13_GB"/> + </complete_island> + <complete_island island="uiR2_Deserts21" package="d1" continent="r2_desert" xmin="25915" ymin="-2095" xmax="26494" ymax="-1808"> + <zone name="13_GH"/> + <zone name="13_GG"/> + <zone name="13_GI"/> + <zone name="12_GI"/> + <zone name="13_GJ"/> + </complete_island> + <complete_island island="uiR2_Deserts22" package="d1" continent="r2_desert" xmin="26843" ymin="-2117" xmax="27134" ymax="-1808"> + <zone name="13_GN"/> + <zone name="14_GM"/> + <zone name="13_GM"/> + <zone name="12_GM"/> + <zone name="13_GL"/> + </complete_island> + <complete_island island="uiR2_Deserts23" package="d1" continent="r2_desert" xmin="27345" ymin="-2416" xmax="27690" ymax="-1808"> + <zone name="12_GP"/> + <zone name="13_GP"/> + <zone name="13_GQ"/> + <zone name="12_GQ"/> + <zone name="14_GP"/> + <zone name="14_GQ"/> + <zone name="15_GP"/> + <zone name="15_GQ"/> + </complete_island> + <complete_island island="uiR2_Deserts24" package="d1" continent="r2_desert" xmin="27846" ymin="-2090" xmax="28370" ymax="-1704"> + <zone name="12_GV"/> + <zone name="13_GU"/> + <zone name="12_GU"/> + <zone name="11_GU"/> + <zone name="13_GT"/> + <zone name="12_GT"/> + <zone name="13_GS"/> + <zone name="12_GS"/> + </complete_island> + <complete_island island="uiR2_Deserts25" package="d1" continent="r2_desert" xmin="21271" ymin="-2895" xmax="21958" ymax="-2362"> + <zone name="16_FG"/> + <zone name="17_FF"/> + <zone name="17_FG"/> + <zone name="16_FF"/> + <zone name="16_FH"/> + <zone name="15_FF"/> + <zone name="15_FG"/> + <zone name="18_FE"/> + <zone name="18_FF"/> + <zone name="18_FG"/> + <zone name="17_FE"/> + <zone name="16_FE"/> + <zone name="18_FD"/> + <zone name="17_FD"/> + <zone name="16_FD"/> + </complete_island> + <complete_island island="uiR2_Deserts26" package="d1" continent="r2_desert" xmin="22236" ymin="-2724" xmax="22992" ymax="-2235"> + <zone name="17_FM"/> + <zone name="17_FL"/> + <zone name="16_FL"/> + <zone name="16_FM"/> + <zone name="16_FN"/> + <zone name="16_FK"/> + <zone name="15_FK"/> + <zone name="15_FL"/> + <zone name="15_FM"/> + <zone name="16_FJ"/> + </complete_island> + <complete_island island="uiR2_Deserts27" package="d1" continent="r2_desert" xmin="23192" ymin="-2725" xmax="23529" ymax="-2288"> + <zone name="16_FQ"/> + <zone name="17_FP"/> + <zone name="17_FQ"/> + <zone name="16_FP"/> + <zone name="15_FP"/> + </complete_island> + <complete_island island="uiR2_Deserts28" package="d1" continent="r2_desert" xmin="24785" ymin="-2874" xmax="25215" ymax="-2466"> + <zone name="16_FZ"/> + <zone name="17_FZ"/> + <zone name="17_GA"/> + <zone name="16_GA"/> + <zone name="18_FZ"/> + <zone name="18_GA"/> + <zone name="17_GB"/> + </complete_island> + <complete_island island="uiR2_Deserts29" package="d1" continent="r2_desert" xmin="25807" ymin="-2707" xmax="26255" ymax="-2335"> + <zone name="16_GH"/> + <zone name="17_GG"/> + <zone name="17_GH"/> + <zone name="16_GG"/> + <zone name="15_GG"/> + <zone name="15_GH"/> + <zone name="17_GF"/> + </complete_island> + <complete_island island="uiR2_Deserts30" package="d1" continent="r2_desert" xmin="26523" ymin="-2816" xmax="27079" ymax="-2395"> + <zone name="16_GL"/> + <zone name="17_GK"/> + <zone name="17_GL"/> + <zone name="17_GM"/> + <zone name="16_GK"/> + <zone name="16_GM"/> + <zone name="18_GK"/> + <zone name="18_GL"/> + <zone name="17_GJ"/> + <zone name="18_GM"/> + <zone name="17_GN"/> + </complete_island> + <complete_island island="uiR2_Deserts31" package="d1" continent="r2_desert" xmin="27349" ymin="-2785" xmax="27813" ymax="-2550"> + <zone name="18_GP"/> + <zone name="18_GQ"/> + <zone name="17_GP"/> + <zone name="17_GQ"/> + <zone name="18_GR"/> + <zone name="17_GR"/> + </complete_island> + <complete_island island="uiR2_Deserts32" package="d1" continent="r2_desert" xmin="27946" ymin="-2760" xmax="28359" ymax="-2225"> + <zone name="16_GU"/> + <zone name="17_GT"/> + <zone name="17_GU"/> + <zone name="17_GV"/> + <zone name="16_GT"/> + <zone name="15_GT"/> + <zone name="15_GU"/> + <zone name="18_GU"/> + <zone name="15_GS"/> + </complete_island> + <complete_island island="uiR2_Deserts33" package="d1" continent="r2_desert" xmin="29430" ymin="-2566" xmax="29959" ymax="-1917"> + <zone name="15_HD"/> + <zone name="16_HD"/> + <zone name="15_HC"/> + <zone name="15_HE"/> + <zone name="14_HC"/> + <zone name="14_HD"/> + <zone name="14_HE"/> + <zone name="14_HF"/> + <zone name="13_HC"/> + <zone name="13_HD"/> + <zone name="13_HE"/> + </complete_island> + <complete_island island="uiR2_Forest01" package="f1" continent="r2_forest" xmin="21283" ymin="-11528" xmax="21926" ymax="-10883"> + <zone name="71_FD"/> + <zone name="72_FE"/> + <zone name="71_FE"/> + <zone name="70_FD"/> + <zone name="70_FE"/> + <zone name="72_FF"/> + <zone name="71_FF"/> + <zone name="70_FF"/> + <zone name="69_FD"/> + <zone name="69_FE"/> + <zone name="69_FF"/> + <zone name="72_FG"/> + <zone name="71_FG"/> + <zone name="70_FG"/> + <zone name="69_FG"/> + </complete_island> + <complete_island island="uiR2_Forest02" package="f1" continent="r2_forest" xmin="22083" ymin="-11528" xmax="22557" ymax="-10875"> + <zone name="72_FK"/> + <zone name="72_FJ"/> + <zone name="71_FJ"/> + <zone name="71_FK"/> + <zone name="71_FL"/> + <zone name="72_FI"/> + <zone name="71_FI"/> + <zone name="70_FI"/> + <zone name="70_FJ"/> + <zone name="70_FK"/> + <zone name="70_FL"/> + <zone name="69_FI"/> + <zone name="69_FJ"/> + <zone name="69_FK"/> + </complete_island> + <complete_island island="uiR2_Forest03" package="f1" continent="r2_forest" xmin="22872" ymin="-11535" xmax="23526" ymax="-10872"> + <zone name="69_FN"/> + <zone name="70_FN"/> + <zone name="70_FO"/> + <zone name="69_FO"/> + <zone name="71_FN"/> + <zone name="71_FO"/> + <zone name="71_FP"/> + <zone name="70_FP"/> + <zone name="69_FP"/> + <zone name="72_FN"/> + <zone name="72_FO"/> + <zone name="72_FP"/> + <zone name="72_FQ"/> + <zone name="71_FQ"/> + <zone name="70_FQ"/> + <zone name="69_FQ"/> + </complete_island> + <complete_island island="uiR2_Forest04" package="f1" continent="r2_forest" xmin="23674" ymin="-11525" xmax="24335" ymax="-10876"> + <zone name="70_FT"/> + <zone name="71_FS"/> + <zone name="71_FT"/> + <zone name="71_FU"/> + <zone name="70_FS"/> + <zone name="70_FU"/> + <zone name="69_FS"/> + <zone name="69_FT"/> + <zone name="69_FU"/> + <zone name="72_FS"/> + <zone name="72_FT"/> + <zone name="72_FU"/> + <zone name="72_FV"/> + <zone name="71_FV"/> + <zone name="70_FV"/> + <zone name="69_FV"/> + </complete_island> + <complete_island island="uiR2_Forest05" package="f1" continent="r2_forest" xmin="24469" ymin="-11531" xmax="25130" ymax="-10943"> + <zone name="70_FZ"/> + <zone name="71_FY"/> + <zone name="71_FZ"/> + <zone name="71_GA"/> + <zone name="70_FY"/> + <zone name="70_GA"/> + <zone name="69_FY"/> + <zone name="69_FZ"/> + <zone name="69_GA"/> + <zone name="72_FX"/> + <zone name="72_FY"/> + <zone name="72_FZ"/> + <zone name="71_FX"/> + <zone name="70_FX"/> + <zone name="69_FX"/> + </complete_island> + <complete_island island="uiR2_Forest06" package="f1" continent="r2_forest" xmin="25282" ymin="-11552" xmax="25917" ymax="-10972"> + <zone name="71_GE"/> + <zone name="72_GD"/> + <zone name="72_GE"/> + <zone name="72_GF"/> + <zone name="71_GD"/> + <zone name="71_GF"/> + <zone name="70_GD"/> + <zone name="70_GE"/> + <zone name="70_GF"/> + <zone name="72_GC"/> + <zone name="71_GC"/> + <zone name="70_GC"/> + <zone name="69_GC"/> + <zone name="69_GD"/> + <zone name="69_GE"/> + <zone name="69_GF"/> + </complete_island> + <complete_island island="uiR2_Forest07" package="f1" continent="r2_forest" xmin="26065" ymin="-11525" xmax="26730" ymax="-10875"> + <zone name="70_GJ"/> + <zone name="71_GI"/> + <zone name="71_GJ"/> + <zone name="71_GK"/> + <zone name="70_GI"/> + <zone name="70_GK"/> + <zone name="69_GI"/> + <zone name="69_GJ"/> + <zone name="72_GH"/> + <zone name="72_GI"/> + <zone name="72_GJ"/> + <zone name="71_GH"/> + <zone name="70_GH"/> + <zone name="69_GH"/> + </complete_island> + <complete_island island="uiR2_Forest08" package="f1" continent="r2_forest" xmin="26872" ymin="-11535" xmax="27528" ymax="-10865"> + <zone name="70_GP"/> + <zone name="71_GO"/> + <zone name="71_GP"/> + <zone name="70_GO"/> + <zone name="69_GO"/> + <zone name="69_GP"/> + <zone name="72_GN"/> + <zone name="72_GO"/> + <zone name="72_GP"/> + <zone name="71_GN"/> + <zone name="70_GN"/> + <zone name="69_GN"/> + <zone name="72_GM"/> + <zone name="71_GM"/> + <zone name="70_GM"/> + <zone name="69_GM"/> + </complete_island> + <complete_island island="uiR2_Forest09" package="f1" continent="r2_forest" xmin="27665" ymin="-11371" xmax="28324" ymax="-10865"> + <zone name="70_GS"/> + <zone name="71_GR"/> + <zone name="71_GS"/> + <zone name="71_GT"/> + <zone name="70_GR"/> + <zone name="70_GT"/> + <zone name="69_GR"/> + <zone name="69_GS"/> + <zone name="69_GT"/> + <zone name="71_GU"/> + <zone name="70_GU"/> + <zone name="69_GU"/> + </complete_island> + <complete_island island="uiR2_Forest10" package="f1" continent="r2_forest" xmin="28474" ymin="-11334" xmax="28808" ymax="-10906"> + <zone name="70_GW"/> + <zone name="71_GW"/> + <zone name="71_GX"/> + <zone name="70_GX"/> + <zone name="69_GW"/> + <zone name="69_GX"/> + </complete_island> + <complete_island island="uiR2_Forest11" package="f1" continent="r2_forest" xmin="28952" ymin="-11526" xmax="29615" ymax="-10872"> + <zone name="69_GZ"/> + <zone name="70_GZ"/> + <zone name="70_HA"/> + <zone name="69_HA"/> + <zone name="71_GZ"/> + <zone name="71_HA"/> + <zone name="71_HB"/> + <zone name="70_HB"/> + <zone name="69_HB"/> + <zone name="72_GZ"/> + <zone name="72_HA"/> + <zone name="72_HB"/> + <zone name="72_HC"/> + <zone name="71_HC"/> + <zone name="70_HC"/> + <zone name="69_HC"/> + </complete_island> + <complete_island island="uiR2_Forest12" package="f1" continent="r2_forest" xmin="29786" ymin="-11204" xmax="30054" ymax="-10910"> + <zone name="69_HF"/> + <zone name="70_HE"/> + <zone name="70_HF"/> + <zone name="69_HE"/> + </complete_island> + <complete_island island="uiR2_Forest13" package="f1" continent="r2_forest" xmin="30266" ymin="-11366" xmax="30882" ymax="-10875"> + <zone name="70_HH"/> + <zone name="71_HI"/> + <zone name="70_HI"/> + <zone name="69_HH"/> + <zone name="69_HI"/> + <zone name="71_HJ"/> + <zone name="70_HJ"/> + <zone name="69_HJ"/> + <zone name="71_HK"/> + <zone name="70_HK"/> + </complete_island> + <complete_island island="uiR2_Forest14" package="f1" continent="r2_forest" xmin="20954" ymin="-12326" xmax="21615" ymax="-11672"> + <zone name="74_FC"/> + <zone name="75_FB"/> + <zone name="75_FC"/> + <zone name="75_FD"/> + <zone name="74_FB"/> + <zone name="74_FD"/> + <zone name="76_FB"/> + <zone name="76_FC"/> + <zone name="76_FD"/> + <zone name="76_FE"/> + <zone name="75_FE"/> + <zone name="74_FE"/> + <zone name="77_FB"/> + <zone name="77_FC"/> + <zone name="77_FD"/> + <zone name="77_FE"/> + </complete_island> + <complete_island island="uiR2_Forest15" package="f1" continent="r2_forest" xmin="21752" ymin="-12335" xmax="22415" ymax="-11665"> + <zone name="75_FG"/> + <zone name="76_FG"/> + <zone name="76_FH"/> + <zone name="75_FH"/> + <zone name="74_FG"/> + <zone name="74_FH"/> + <zone name="77_FG"/> + <zone name="77_FH"/> + <zone name="77_FI"/> + <zone name="76_FI"/> + <zone name="75_FI"/> + <zone name="74_FI"/> + <zone name="77_FJ"/> + <zone name="76_FJ"/> + <zone name="75_FJ"/> + <zone name="74_FJ"/> + </complete_island> + <complete_island island="uiR2_Forest16" package="f1" continent="r2_forest" xmin="22622" ymin="-12335" xmax="23215" ymax="-11670"> + <zone name="76_FM"/> + <zone name="77_FL"/> + <zone name="77_FM"/> + <zone name="77_FN"/> + <zone name="76_FL"/> + <zone name="76_FN"/> + <zone name="75_FL"/> + <zone name="75_FM"/> + <zone name="75_FN"/> + <zone name="77_FO"/> + <zone name="76_FO"/> + <zone name="75_FO"/> + <zone name="74_FL"/> + <zone name="74_FM"/> + <zone name="74_FN"/> + <zone name="74_FO"/> + </complete_island> + <complete_island island="uiR2_Forest17" package="f1" continent="r2_forest" xmin="23345" ymin="-12326" xmax="24015" ymax="-11672"> + <zone name="77_FS"/> + <zone name="77_FR"/> + <zone name="77_FT"/> + <zone name="76_FR"/> + <zone name="76_FS"/> + <zone name="76_FT"/> + <zone name="77_FQ"/> + <zone name="76_FQ"/> + <zone name="75_FQ"/> + <zone name="75_FR"/> + <zone name="75_FS"/> + <zone name="75_FT"/> + <zone name="74_FQ"/> + <zone name="74_FR"/> + <zone name="74_FS"/> + <zone name="74_FT"/> + </complete_island> + <complete_island island="uiR2_Forest18" package="f1" continent="r2_forest" xmin="24149" ymin="-12158" xmax="24638" ymax="-11752"> + <zone name="76_FX"/> + <zone name="76_FW"/> + <zone name="75_FW"/> + <zone name="75_FX"/> + <zone name="75_FV"/> + <zone name="74_FV"/> + <zone name="74_FW"/> + </complete_island> + <complete_island island="uiR2_Forest19" package="f1" continent="r2_forest" xmin="24785" ymin="-12326" xmax="25444" ymax="-11839"> + <zone name="75_GA"/> + <zone name="76_FZ"/> + <zone name="76_GA"/> + <zone name="76_GB"/> + <zone name="75_FZ"/> + <zone name="75_GB"/> + <zone name="77_FZ"/> + <zone name="77_GA"/> + <zone name="77_GB"/> + <zone name="77_GC"/> + <zone name="76_GC"/> + <zone name="75_GC"/> + </complete_island> + <complete_island island="uiR2_Forest20" package="f1" continent="r2_forest" xmin="25594" ymin="-12326" xmax="26245" ymax="-11825"> + <zone name="77_GE"/> + <zone name="77_GF"/> + <zone name="76_GE"/> + <zone name="76_GF"/> + <zone name="77_GG"/> + <zone name="76_GG"/> + <zone name="75_GE"/> + <zone name="75_GF"/> + <zone name="75_GG"/> + <zone name="77_GH"/> + <zone name="76_GH"/> + <zone name="75_GH"/> + </complete_island> + <complete_island island="uiR2_Forest21" package="f1" continent="r2_forest" xmin="26385" ymin="-12326" xmax="26895" ymax="-11717"> + <zone name="77_GK"/> + <zone name="77_GJ"/> + <zone name="77_GL"/> + <zone name="76_GJ"/> + <zone name="76_GK"/> + <zone name="76_GL"/> + <zone name="75_GJ"/> + <zone name="75_GK"/> + <zone name="75_GL"/> + <zone name="74_GJ"/> + <zone name="74_GK"/> + </complete_island> + <complete_island island="uiR2_Forest22" package="f1" continent="r2_forest" xmin="27025" ymin="-12335" xmax="27686" ymax="-11825"> + <zone name="75_GP"/> + <zone name="76_GO"/> + <zone name="76_GP"/> + <zone name="76_GQ"/> + <zone name="75_GO"/> + <zone name="75_GQ"/> + <zone name="77_GN"/> + <zone name="77_GO"/> + <zone name="77_GP"/> + <zone name="76_GN"/> + <zone name="75_GN"/> + <zone name="77_GQ"/> + </complete_island> + <complete_island island="uiR2_Forest23" package="f1" continent="r2_forest" xmin="27825" ymin="-12290" xmax="28655" ymax="-11857"> + <zone name="76_GT"/> + <zone name="77_GS"/> + <zone name="77_GT"/> + <zone name="76_GS"/> + <zone name="76_GU"/> + <zone name="75_GS"/> + <zone name="75_GT"/> + <zone name="77_GV"/> + <zone name="76_GV"/> + <zone name="75_GV"/> + <zone name="77_GW"/> + <zone name="76_GW"/> + <zone name="75_GW"/> + </complete_island> + <complete_island island="uiR2_Forest24" package="f1" continent="r2_forest" xmin="28826" ymin="-12290" xmax="29444" ymax="-11706"> + <zone name="77_GZ"/> + <zone name="77_HA"/> + <zone name="76_GY"/> + <zone name="76_GZ"/> + <zone name="76_HA"/> + <zone name="76_HB"/> + <zone name="75_GY"/> + <zone name="75_GZ"/> + <zone name="75_HA"/> + <zone name="75_HB"/> + <zone name="74_GZ"/> + <zone name="74_HA"/> + </complete_island> + <complete_island island="uiR2_Forest25" package="f1" continent="r2_forest" xmin="29594" ymin="-12166" xmax="30095" ymax="-11665"> + <zone name="74_HD"/> + <zone name="75_HD"/> + <zone name="75_HE"/> + <zone name="74_HE"/> + <zone name="76_HD"/> + <zone name="76_HE"/> + <zone name="76_HF"/> + <zone name="75_HF"/> + <zone name="74_HF"/> + </complete_island> + <complete_island island="uiR2_Forest26" package="f1" continent="r2_forest" xmin="30270" ymin="-12015" xmax="30884" ymax="-11675"> + <zone name="74_HH"/> + <zone name="75_HH"/> + <zone name="75_HI"/> + <zone name="74_HI"/> + <zone name="75_HJ"/> + <zone name="74_HJ"/> + <zone name="75_HK"/> + <zone name="74_HK"/> + </complete_island> + <complete_island island="uiR2_Forest27" package="f1" continent="r2_forest" xmin="20990" ymin="-12770" xmax="21250" ymax="-12510"> + <zone name="80_FB"/> + <zone name="80_FC"/> + <zone name="79_FB"/> + <zone name="79_FC"/> + </complete_island> + <complete_island island="uiR2_Forest28" package="f1" continent="r2_forest" xmin="21466" ymin="-12805" xmax="21924" ymax="-12465"> + <zone name="80_FE"/> + <zone name="80_FF"/> + <zone name="79_FE"/> + <zone name="79_FF"/> + <zone name="80_FG"/> + <zone name="79_FG"/> + </complete_island> + <complete_island island="uiR2_Forest29" package="f1" continent="r2_forest" xmin="22106" ymin="-12811" xmax="22488" ymax="-12475"> + <zone name="80_FI"/> + <zone name="80_FJ"/> + <zone name="79_FI"/> + <zone name="79_FJ"/> + <zone name="80_FK"/> + <zone name="79_FK"/> + </complete_island> + <complete_island island="uiR2_Forest30" package="f1" continent="r2_forest" xmin="22714" ymin="-13055" xmax="23170" ymax="-12465"> + <zone name="80_FM"/> + <zone name="81_FM"/> + <zone name="81_FN"/> + <zone name="80_FN"/> + <zone name="79_FM"/> + <zone name="79_FN"/> + <zone name="82_FM"/> + <zone name="82_FN"/> + <zone name="80_FO"/> + <zone name="79_FO"/> + </complete_island> + <complete_island island="uiR2_Forest31" package="f1" continent="r2_forest" xmin="23345" ymin="-13126" xmax="24068" ymax="-12475"> + <zone name="82_FT"/> + <zone name="82_FS"/> + <zone name="81_FS"/> + <zone name="81_FT"/> + <zone name="81_FU"/> + <zone name="82_FR"/> + <zone name="81_FR"/> + <zone name="80_FR"/> + <zone name="80_FS"/> + <zone name="80_FT"/> + <zone name="80_FU"/> + <zone name="82_FQ"/> + <zone name="81_FQ"/> + <zone name="80_FQ"/> + <zone name="79_FQ"/> + <zone name="79_FR"/> + <zone name="79_FS"/> + <zone name="79_FT"/> + </complete_island> + <complete_island island="uiR2_Forest32" package="f1" continent="r2_forest" xmin="24475" ymin="-13126" xmax="24934" ymax="-12474"> + <zone name="82_FZ"/> + <zone name="82_FY"/> + <zone name="81_FY"/> + <zone name="81_FZ"/> + <zone name="82_FX"/> + <zone name="81_FX"/> + <zone name="80_FX"/> + <zone name="80_FY"/> + <zone name="80_FZ"/> + <zone name="79_FX"/> + <zone name="79_FY"/> + <zone name="79_FZ"/> + </complete_island> + <complete_island island="uiR2_Forest33" package="f1" continent="r2_forest" xmin="25105" ymin="-13124" xmax="25768" ymax="-12475"> + <zone name="81_GC"/> + <zone name="82_GB"/> + <zone name="82_GC"/> + <zone name="82_GD"/> + <zone name="81_GB"/> + <zone name="81_GD"/> + <zone name="80_GB"/> + <zone name="80_GC"/> + <zone name="80_GD"/> + <zone name="82_GE"/> + <zone name="81_GE"/> + <zone name="80_GE"/> + <zone name="79_GB"/> + <zone name="79_GC"/> + <zone name="79_GD"/> + <zone name="79_GE"/> + </complete_island> + <complete_island island="uiR2_Forest34" package="f1" continent="r2_forest" xmin="26065" ymin="-12963" xmax="26725" ymax="-12472"> + <zone name="81_GH"/> + <zone name="81_GI"/> + <zone name="80_GH"/> + <zone name="80_GI"/> + <zone name="81_GJ"/> + <zone name="80_GJ"/> + <zone name="79_GH"/> + <zone name="79_GI"/> + <zone name="79_GJ"/> + <zone name="81_GK"/> + <zone name="80_GK"/> + <zone name="79_GK"/> + </complete_island> + <complete_island island="uiR2_Forest35" package="f1" continent="r2_forest" xmin="26865" ymin="-13026" xmax="27334" ymax="-12474"> + <zone name="80_GO"/> + <zone name="81_GN"/> + <zone name="81_GO"/> + <zone name="80_GN"/> + <zone name="80_GP"/> + <zone name="79_GN"/> + <zone name="79_GO"/> + <zone name="82_GM"/> + <zone name="82_GN"/> + <zone name="82_GO"/> + <zone name="81_GM"/> + <zone name="80_GM"/> + <zone name="79_GM"/> + </complete_island> + <complete_island island="uiR2_Forest36" package="f1" continent="r2_forest" xmin="27674" ymin="-13135" xmax="28319" ymax="-12454"> + <zone name="82_GU"/> + <zone name="82_GT"/> + <zone name="81_GT"/> + <zone name="81_GU"/> + <zone name="82_GS"/> + <zone name="81_GS"/> + <zone name="80_GS"/> + <zone name="80_GT"/> + <zone name="80_GU"/> + <zone name="82_GR"/> + <zone name="81_GR"/> + <zone name="80_GR"/> + <zone name="79_GR"/> + <zone name="79_GS"/> + <zone name="79_GT"/> + <zone name="79_GU"/> + </complete_island> + <complete_island island="uiR2_Forest37" package="f1" continent="r2_forest" xmin="28476" ymin="-13094" xmax="29094" ymax="-12453"> + <zone name="82_GY"/> + <zone name="82_GZ"/> + <zone name="81_GX"/> + <zone name="81_GY"/> + <zone name="81_GZ"/> + <zone name="81_GW"/> + <zone name="80_GW"/> + <zone name="80_GX"/> + <zone name="80_GY"/> + <zone name="79_GW"/> + </complete_island> + <complete_island island="uiR2_Forest38" package="f1" continent="r2_forest" xmin="29277" ymin="-13123" xmax="29826" ymax="-12477"> + <zone name="80_HB"/> + <zone name="81_HB"/> + <zone name="81_HC"/> + <zone name="80_HC"/> + <zone name="79_HB"/> + <zone name="79_HC"/> + <zone name="82_HB"/> + <zone name="82_HC"/> + <zone name="82_HD"/> + <zone name="81_HD"/> + <zone name="80_HD"/> + <zone name="79_HD"/> + <zone name="82_HE"/> + <zone name="81_HE"/> + <zone name="80_HE"/> + </complete_island> + <complete_island island="uiR2_Forest39" package="f1" continent="r2_forest" xmin="30076" ymin="-13094" xmax="30730" ymax="-12506"> + <zone name="81_HJ"/> + <zone name="82_HI"/> + <zone name="82_HJ"/> + <zone name="81_HI"/> + <zone name="80_HI"/> + <zone name="80_HJ"/> + <zone name="82_HH"/> + <zone name="81_HH"/> + <zone name="80_HH"/> + <zone name="79_HH"/> + <zone name="79_HI"/> + <zone name="79_HJ"/> + <zone name="82_HG"/> + <zone name="81_HG"/> + <zone name="80_HG"/> + <zone name="79_HG"/> + </complete_island> + <complete_island island="uiR2_Forest40" package="f1" continent="r2_forest" xmin="21032" ymin="-13606" xmax="21605" ymax="-13119"> + <zone name="85_FC"/> + <zone name="85_FD"/> + <zone name="84_FB"/> + <zone name="84_FC"/> + <zone name="84_FD"/> + <zone name="85_FE"/> + <zone name="84_FE"/> + <zone name="83_FB"/> + <zone name="83_FC"/> + <zone name="83_FD"/> + <zone name="83_FE"/> + </complete_island> + <complete_island island="uiR2_Forest41" package="f1" continent="r2_forest" xmin="21946" ymin="-13615" xmax="22575" ymax="-12956"> + <zone name="83_FJ"/> + <zone name="84_FI"/> + <zone name="84_FJ"/> + <zone name="84_FK"/> + <zone name="83_FI"/> + <zone name="83_FK"/> + <zone name="82_FI"/> + <zone name="82_FJ"/> + <zone name="85_FI"/> + <zone name="85_FJ"/> + <zone name="84_FH"/> + <zone name="83_FH"/> + <zone name="85_FK"/> + <zone name="82_FH"/> + </complete_island> + <complete_island island="uiR2_Forest42" package="f1" continent="r2_forest" xmin="22712" ymin="-13764" xmax="23457" ymax="-13275"> + <zone name="84_FO"/> + <zone name="85_FN"/> + <zone name="85_FO"/> + <zone name="85_FP"/> + <zone name="84_FN"/> + <zone name="84_FP"/> + <zone name="86_FM"/> + <zone name="86_FN"/> + <zone name="86_FO"/> + <zone name="85_FM"/> + <zone name="84_FM"/> + <zone name="86_FP"/> + <zone name="86_FQ"/> + <zone name="85_FQ"/> + <zone name="84_FQ"/> + </complete_island> + <complete_island island="uiR2_Forest43" package="f1" continent="r2_forest" xmin="23674" ymin="-13925" xmax="24330" ymax="-13275"> + <zone name="85_FV"/> + <zone name="86_FU"/> + <zone name="86_FV"/> + <zone name="85_FU"/> + <zone name="84_FU"/> + <zone name="84_FV"/> + <zone name="87_FT"/> + <zone name="87_FU"/> + <zone name="86_FT"/> + <zone name="85_FT"/> + <zone name="84_FT"/> + <zone name="86_FS"/> + <zone name="85_FS"/> + <zone name="84_FS"/> + </complete_island> + <complete_island island="uiR2_Forest44" package="f1" continent="r2_forest" xmin="24465" ymin="-14878" xmax="25094" ymax="-13282"> + <zone name="89_FY"/> + <zone name="90_FX"/> + <zone name="90_FY"/> + <zone name="90_FZ"/> + <zone name="89_FX"/> + <zone name="89_FZ"/> + <zone name="88_FX"/> + <zone name="88_FY"/> + <zone name="91_FY"/> + <zone name="91_FZ"/> + <zone name="90_GA"/> + <zone name="89_GA"/> + <zone name="87_FX"/> + <zone name="87_FY"/> + <zone name="87_FZ"/> + <zone name="92_FZ"/> + <zone name="86_FX"/> + <zone name="86_FY"/> + <zone name="86_FZ"/> + <zone name="86_GA"/> + <zone name="93_FZ"/> + <zone name="85_FX"/> + <zone name="85_FY"/> + <zone name="85_FZ"/> + <zone name="84_FX"/> + <zone name="84_FY"/> + <zone name="84_FZ"/> + </complete_island> + <complete_island island="uiR2_Forest45" package="f1" continent="r2_forest" xmin="25425" ymin="-14246" xmax="26255" ymax="-13432"> + <zone name="86_GE"/> + <zone name="87_GD"/> + <zone name="87_GE"/> + <zone name="87_GF"/> + <zone name="86_GD"/> + <zone name="86_GF"/> + <zone name="85_GD"/> + <zone name="85_GE"/> + <zone name="85_GF"/> + <zone name="88_GE"/> + <zone name="88_GF"/> + <zone name="88_GG"/> + <zone name="87_GG"/> + <zone name="86_GG"/> + <zone name="85_GG"/> + <zone name="89_GF"/> + <zone name="89_GG"/> + <zone name="89_GH"/> + <zone name="88_GH"/> + <zone name="87_GH"/> + <zone name="86_GH"/> + <zone name="85_GH"/> + </complete_island> + <complete_island island="uiR2_Forest46" package="f1" continent="r2_forest" xmin="26590" ymin="-14566" xmax="28178" ymax="-13425"> + <zone name="87_GO"/> + <zone name="88_GN"/> + <zone name="88_GO"/> + <zone name="88_GP"/> + <zone name="87_GN"/> + <zone name="86_GN"/> + <zone name="86_GO"/> + <zone name="89_GM"/> + <zone name="89_GN"/> + <zone name="89_GO"/> + <zone name="88_GM"/> + <zone name="87_GM"/> + <zone name="89_GQ"/> + <zone name="88_GQ"/> + <zone name="87_GQ"/> + <zone name="86_GM"/> + <zone name="85_GM"/> + <zone name="85_GN"/> + <zone name="89_GL"/> + <zone name="88_GL"/> + <zone name="87_GL"/> + <zone name="86_GL"/> + <zone name="90_GR"/> + <zone name="89_GR"/> + <zone name="88_GR"/> + <zone name="87_GR"/> + <zone name="85_GL"/> + <zone name="86_GK"/> + <zone name="85_GK"/> + <zone name="90_GS"/> + <zone name="89_GS"/> + <zone name="88_GS"/> + <zone name="91_GT"/> + <zone name="90_GT"/> + <zone name="89_GT"/> + <zone name="88_GT"/> + </complete_island> + <complete_island island="uiR2_Forest49" package="f1" continent="r2_forest" xmin="22564" ymin="-14400" xmax="23030" ymax="-14085"> + <zone name="89_FL"/> + <zone name="89_FM"/> + <zone name="89_FN"/> + <zone name="90_FL"/> + <zone name="90_FM"/> + <zone name="90_FN"/> + </complete_island> + <complete_island island="uiR2_Forest50" package="f1" continent="r2_forest" xmin="20965" ymin="-14400" xmax="21430" ymax="-14085"> + <zone name="89_FB"/> + <zone name="89_FC"/> + <zone name="89_FD"/> + <zone name="90_FB"/> + <zone name="90_FC"/> + <zone name="90_FD"/> + </complete_island> + <complete_island island="uiR2_Forest51" package="f1" continent="r2_forest" xmin="23365" ymin="-14400" xmax="23831" ymax="-14085"> + <zone name="89_FQ"/> + <zone name="89_FR"/> + <zone name="89_FS"/> + <zone name="90_FQ"/> + <zone name="90_FR"/> + <zone name="90_FS"/> + </complete_island> + <complete_island island="uiR2_Forest52" package="f1" continent="r2_forest" xmin="21766" ymin="-14400" xmax="22231" ymax="-14085"> + <zone name="89_FG"/> + <zone name="89_FH"/> + <zone name="89_FI"/> + <zone name="90_FG"/> + <zone name="90_FH"/> + <zone name="90_FI"/> + </complete_island> + <complete_island island="uiR2_Forest53" package="f1" continent="r2_forest" xmin="20965" ymin="-14882" xmax="21430" ymax="-14568"> + <zone name="92_FB"/> + <zone name="92_FC"/> + <zone name="92_FD"/> + <zone name="93_FB"/> + <zone name="93_FC"/> + <zone name="93_FD"/> + </complete_island> + <complete_island island="uiR2_Jungle01" package="j1" continent="r2_jungle" xmin="31038" ymin="-11361" xmax="31684" ymax="-10879"> + <zone name="70_HN"/> + <zone name="71_HM"/> + <zone name="71_HN"/> + <zone name="71_HO"/> + <zone name="70_HM"/> + <zone name="70_HO"/> + <zone name="69_HN"/> + <zone name="69_HO"/> + <zone name="70_HP"/> + <zone name="69_HP"/> + </complete_island> + <complete_island island="uiR2_Jungle02" package="j1" continent="r2_jungle" xmin="32002" ymin="-11523" xmax="32646" ymax="-10876"> + <zone name="71_HT"/> + <zone name="72_HS"/> + <zone name="72_HT"/> + <zone name="72_HU"/> + <zone name="71_HS"/> + <zone name="71_HU"/> + <zone name="70_HT"/> + <zone name="70_HU"/> + <zone name="72_HV"/> + <zone name="71_HV"/> + <zone name="70_HV"/> + <zone name="69_HS"/> + <zone name="69_HT"/> + <zone name="69_HU"/> + <zone name="69_HV"/> + </complete_island> + <complete_island island="uiR2_Jungle03" package="j1" continent="r2_jungle" xmin="32793" ymin="-11517" xmax="33446" ymax="-10865"> + <zone name="71_HY"/> + <zone name="72_HX"/> + <zone name="72_HY"/> + <zone name="72_HZ"/> + <zone name="71_HX"/> + <zone name="71_HZ"/> + <zone name="70_HX"/> + <zone name="70_HY"/> + <zone name="70_HZ"/> + <zone name="72_IA"/> + <zone name="71_IA"/> + <zone name="70_IA"/> + <zone name="69_HX"/> + <zone name="69_HY"/> + <zone name="69_HZ"/> + <zone name="69_IA"/> + </complete_island> + <complete_island island="uiR2_Jungle04" package="j1" continent="r2_jungle" xmin="33707" ymin="-11038" xmax="33965" ymax="-10884"> + <zone name="69_ID"/> + <zone name="69_IC"/> + <zone name="69_IE"/> + </complete_island> + <complete_island island="uiR2_Jungle05" package="j1" continent="r2_jungle" xmin="33602" ymin="-11365" xmax="34086" ymax="-11196"> + <zone name="71_ID"/> + <zone name="71_IC"/> + <zone name="71_IE"/> + </complete_island> + <complete_island island="uiR2_Jungle06" package="j1" continent="r2_jungle" xmin="34234" ymin="-11526" xmax="34881" ymax="-10869"> + <zone name="71_IH"/> + <zone name="72_IG"/> + <zone name="72_IH"/> + <zone name="72_II"/> + <zone name="71_IG"/> + <zone name="71_II"/> + <zone name="70_IG"/> + <zone name="70_IH"/> + <zone name="70_II"/> + <zone name="72_IJ"/> + <zone name="71_IJ"/> + <zone name="70_IJ"/> + <zone name="69_IG"/> + <zone name="69_IH"/> + <zone name="69_II"/> + <zone name="69_IJ"/> + </complete_island> + <complete_island island="uiR2_Jungle07" package="j1" continent="r2_jungle" xmin="35030" ymin="-11529" xmax="35690" ymax="-10943"> + <zone name="71_IM"/> + <zone name="72_IL"/> + <zone name="72_IM"/> + <zone name="72_IN"/> + <zone name="71_IL"/> + <zone name="71_IN"/> + <zone name="70_IL"/> + <zone name="70_IM"/> + <zone name="70_IN"/> + <zone name="72_IO"/> + <zone name="71_IO"/> + <zone name="70_IO"/> + <zone name="69_IL"/> + <zone name="69_IM"/> + <zone name="69_IN"/> + <zone name="69_IO"/> + </complete_island> + <complete_island island="uiR2_Jungle08" package="j1" continent="r2_jungle" xmin="35903" ymin="-11525" xmax="36486" ymax="-10942"> + <zone name="71_IS"/> + <zone name="72_IR"/> + <zone name="72_IS"/> + <zone name="72_IT"/> + <zone name="71_IR"/> + <zone name="71_IT"/> + <zone name="70_IR"/> + <zone name="70_IS"/> + <zone name="70_IT"/> + <zone name="71_IQ"/> + <zone name="70_IQ"/> + <zone name="69_IQ"/> + <zone name="69_IR"/> + <zone name="69_IS"/> + </complete_island> + <complete_island island="uiR2_Jungle09" package="j1" continent="r2_jungle" xmin="36636" ymin="-11521" xmax="37278" ymax="-10874"> + <zone name="70_IV"/> + <zone name="71_IV"/> + <zone name="71_IW"/> + <zone name="70_IW"/> + <zone name="69_IV"/> + <zone name="69_IW"/> + <zone name="72_IV"/> + <zone name="72_IW"/> + <zone name="71_IX"/> + <zone name="70_IX"/> + <zone name="72_IY"/> + <zone name="71_IY"/> + <zone name="70_IY"/> + </complete_island> + <complete_island island="uiR2_Jungle11" package="j1" continent="r2_jungle" xmin="38234" ymin="-11371" xmax="38648" ymax="-10870"> + <zone name="71_JG"/> + <zone name="71_JF"/> + <zone name="70_JF"/> + <zone name="70_JG"/> + <zone name="70_JH"/> + <zone name="69_JF"/> + <zone name="69_JG"/> + <zone name="69_JH"/> + </complete_island> + <complete_island island="uiR2_Jungle12" package="j1" continent="r2_jungle" xmin="38878" ymin="-11525" xmax="39526" ymax="-10877"> + <zone name="71_JL"/> + <zone name="72_JK"/> + <zone name="72_JL"/> + <zone name="72_JM"/> + <zone name="71_JK"/> + <zone name="71_JM"/> + <zone name="70_JK"/> + <zone name="70_JL"/> + <zone name="70_JM"/> + <zone name="72_JJ"/> + <zone name="71_JJ"/> + <zone name="70_JJ"/> + <zone name="69_JJ"/> + <zone name="69_JK"/> + <zone name="69_JL"/> + <zone name="69_JM"/> + </complete_island> + <complete_island island="uiR2_Jungle13" package="j1" continent="r2_jungle" xmin="39669" ymin="-11526" xmax="40327" ymax="-10876"> + <zone name="71_JQ"/> + <zone name="72_JP"/> + <zone name="72_JQ"/> + <zone name="72_JR"/> + <zone name="71_JP"/> + <zone name="71_JR"/> + <zone name="70_JP"/> + <zone name="70_JQ"/> + <zone name="70_JR"/> + <zone name="72_JO"/> + <zone name="71_JO"/> + <zone name="70_JO"/> + <zone name="69_JO"/> + <zone name="69_JP"/> + <zone name="69_JQ"/> + <zone name="69_JR"/> + </complete_island> + <complete_island island="uiR2_Jungle14" package="j1" continent="r2_jungle" xmin="40474" ymin="-11531" xmax="40970" ymax="-10875"> + <zone name="71_JU"/> + <zone name="72_JT"/> + <zone name="72_JU"/> + <zone name="72_JV"/> + <zone name="71_JT"/> + <zone name="71_JV"/> + <zone name="70_JT"/> + <zone name="70_JU"/> + <zone name="70_JV"/> + <zone name="69_JT"/> + <zone name="69_JU"/> + <zone name="69_JV"/> + </complete_island> + <complete_island island="uiR2_Jungle15" package="j1" continent="r2_jungle" xmin="31034" ymin="-12327" xmax="31690" ymax="-11676"> + <zone name="76_HN"/> + <zone name="77_HM"/> + <zone name="77_HN"/> + <zone name="77_HO"/> + <zone name="76_HM"/> + <zone name="76_HO"/> + <zone name="75_HM"/> + <zone name="75_HN"/> + <zone name="75_HO"/> + <zone name="77_HP"/> + <zone name="76_HP"/> + <zone name="75_HP"/> + <zone name="74_HM"/> + <zone name="74_HN"/> + <zone name="74_HO"/> + <zone name="74_HP"/> + </complete_island> + <complete_island island="uiR2_Jungle16" package="j1" continent="r2_jungle" xmin="31902" ymin="-12325" xmax="32577" ymax="-11669"> + <zone name="76_HT"/> + <zone name="77_HS"/> + <zone name="77_HT"/> + <zone name="77_HU"/> + <zone name="76_HS"/> + <zone name="76_HU"/> + <zone name="75_HS"/> + <zone name="75_HT"/> + <zone name="75_HU"/> + <zone name="77_HR"/> + <zone name="76_HR"/> + <zone name="77_HV"/> + <zone name="76_HV"/> + <zone name="75_HR"/> + <zone name="75_HV"/> + <zone name="74_HR"/> + <zone name="74_HS"/> + <zone name="74_HT"/> + <zone name="74_HU"/> + <zone name="74_HV"/> + </complete_island> + <complete_island island="uiR2_Jungle17" package="j1" continent="r2_jungle" xmin="32862" ymin="-12258" xmax="33377" ymax="-11670"> + <zone name="76_HY"/> + <zone name="77_HY"/> + <zone name="77_HZ"/> + <zone name="76_HX"/> + <zone name="76_HZ"/> + <zone name="75_HX"/> + <zone name="75_HY"/> + <zone name="75_HZ"/> + <zone name="77_IA"/> + <zone name="76_IA"/> + <zone name="75_IA"/> + <zone name="74_HX"/> + <zone name="74_HY"/> + <zone name="74_HZ"/> + </complete_island> + <complete_island island="uiR2_Jungle18" package="j1" continent="r2_jungle" xmin="33672" ymin="-12331" xmax="34328" ymax="-11743"> + <zone name="76_IE"/> + <zone name="77_ID"/> + <zone name="77_IE"/> + <zone name="77_IF"/> + <zone name="76_ID"/> + <zone name="76_IF"/> + <zone name="75_ID"/> + <zone name="75_IE"/> + <zone name="75_IF"/> + <zone name="77_IC"/> + <zone name="76_IC"/> + <zone name="77_IG"/> + <zone name="76_IG"/> + <zone name="75_IG"/> + <zone name="74_IE"/> + <zone name="74_IF"/> + <zone name="74_IG"/> + </complete_island> + <complete_island island="uiR2_Jungle19" package="j1" continent="r2_jungle" xmin="34622" ymin="-12322" xmax="35366" ymax="-11742"> + <zone name="76_IK"/> + <zone name="77_IJ"/> + <zone name="77_IK"/> + <zone name="77_IL"/> + <zone name="76_IJ"/> + <zone name="76_IL"/> + <zone name="75_IJ"/> + <zone name="75_IK"/> + <zone name="75_IL"/> + <zone name="77_II"/> + <zone name="76_II"/> + <zone name="77_IM"/> + <zone name="76_IM"/> + <zone name="75_II"/> + <zone name="74_II"/> + <zone name="74_IJ"/> + <zone name="74_IK"/> + <zone name="74_IL"/> + </complete_island> + <complete_island island="uiR2_Jungle21" package="j1" continent="r2_jungle" xmin="36316" ymin="-12330" xmax="36970" ymax="-11675"> + <zone name="76_IU"/> + <zone name="77_IT"/> + <zone name="77_IU"/> + <zone name="77_IV"/> + <zone name="76_IT"/> + <zone name="76_IV"/> + <zone name="75_IT"/> + <zone name="75_IU"/> + <zone name="75_IV"/> + <zone name="75_IW"/> + <zone name="74_IT"/> + <zone name="74_IU"/> + <zone name="74_IV"/> + <zone name="74_IW"/> + </complete_island> + <complete_island island="uiR2_Jungle22" package="j1" continent="r2_jungle" xmin="37116" ymin="-12320" xmax="37763" ymax="-11653"> + <zone name="76_IZ"/> + <zone name="77_IY"/> + <zone name="77_IZ"/> + <zone name="77_JA"/> + <zone name="76_IY"/> + <zone name="76_JA"/> + <zone name="75_IY"/> + <zone name="75_IZ"/> + <zone name="75_JA"/> + <zone name="77_JB"/> + <zone name="76_JB"/> + <zone name="75_JB"/> + <zone name="74_IY"/> + <zone name="74_JA"/> + </complete_island> + <complete_island island="uiR2_Jungle23" package="j1" continent="r2_jungle" xmin="37910" ymin="-12097" xmax="38558" ymax="-11675"> + <zone name="76_JE"/> + <zone name="76_JD"/> + <zone name="76_JF"/> + <zone name="75_JD"/> + <zone name="75_JE"/> + <zone name="75_JF"/> + <zone name="75_JG"/> + <zone name="74_JD"/> + <zone name="74_JE"/> + <zone name="74_JF"/> + </complete_island> + <complete_island island="uiR2_Jungle24" package="j1" continent="r2_jungle" xmin="38782" ymin="-12331" xmax="39366" ymax="-11743"> + <zone name="76_JJ"/> + <zone name="77_JI"/> + <zone name="77_JJ"/> + <zone name="77_JK"/> + <zone name="76_JI"/> + <zone name="76_JK"/> + <zone name="75_JI"/> + <zone name="75_JJ"/> + <zone name="75_JK"/> + <zone name="77_JL"/> + <zone name="76_JL"/> + <zone name="75_JL"/> + <zone name="74_JI"/> + <zone name="74_JJ"/> + <zone name="74_JK"/> + </complete_island> + <complete_island island="uiR2_Jungle25" package="j1" continent="r2_jungle" xmin="39514" ymin="-12326" xmax="40161" ymax="-11680"> + <zone name="76_JO"/> + <zone name="77_JP"/> + <zone name="76_JN"/> + <zone name="76_JP"/> + <zone name="75_JO"/> + <zone name="75_JP"/> + <zone name="76_JQ"/> + <zone name="75_JQ"/> + <zone name="74_JO"/> + <zone name="74_JP"/> + <zone name="74_JQ"/> + </complete_island> + <complete_island island="uiR2_Jungle26" package="j1" continent="r2_jungle" xmin="40314" ymin="-12327" xmax="40971" ymax="-11674"> + <zone name="76_JT"/> + <zone name="77_JS"/> + <zone name="77_JT"/> + <zone name="77_JU"/> + <zone name="76_JS"/> + <zone name="76_JU"/> + <zone name="75_JS"/> + <zone name="75_JT"/> + <zone name="75_JU"/> + <zone name="77_JV"/> + <zone name="76_JV"/> + <zone name="75_JV"/> + <zone name="74_JS"/> + <zone name="74_JT"/> + <zone name="74_JU"/> + <zone name="74_JV"/> + </complete_island> + <complete_island island="uiR2_Jungle27" package="j1" continent="r2_jungle" xmin="31102" ymin="-12888" xmax="31370" ymax="-12470"> + <zone name="80_HN"/> + <zone name="81_HM"/> + <zone name="81_HN"/> + <zone name="80_HM"/> + <zone name="79_HM"/> + <zone name="79_HN"/> + </complete_island> + <complete_island island="uiR2_Jungle28" package="j1" continent="r2_jungle" xmin="31514" ymin="-12645" xmax="31845" ymax="-12475"> + <zone name="79_HP"/> + <zone name="79_HQ"/> + </complete_island> + <complete_island island="uiR2_Jungle29" package="j1" continent="r2_jungle" xmin="31514" ymin="-13126" xmax="31998" ymax="-12795"> + <zone name="81_HQ"/> + <zone name="82_HQ"/> + <zone name="81_HP"/> + <zone name="81_HR"/> + </complete_island> + <complete_island island="uiR2_Jungle30" package="j1" continent="r2_jungle" xmin="32154" ymin="-12898" xmax="32577" ymax="-12475"> + <zone name="79_HT"/> + <zone name="80_HT"/> + <zone name="80_HU"/> + <zone name="79_HU"/> + <zone name="81_HT"/> + <zone name="81_HU"/> + <zone name="81_HV"/> + <zone name="80_HV"/> + <zone name="79_HV"/> + </complete_island> + <complete_island island="uiR2_Jungle31" package="j1" continent="r2_jungle" xmin="32954" ymin="-13121" xmax="33277" ymax="-12635"> + <zone name="81_HZ"/> + <zone name="82_HY"/> + <zone name="82_HZ"/> + <zone name="81_HY"/> + <zone name="80_HY"/> + <zone name="80_HZ"/> + </complete_island> + <complete_island island="uiR2_Jungle32" package="j1" continent="r2_jungle" xmin="33502" ymin="-13058" xmax="33930" ymax="-12542"> + <zone name="80_IC"/> + <zone name="81_IB"/> + <zone name="81_IC"/> + <zone name="81_ID"/> + <zone name="80_IB"/> + <zone name="80_ID"/> + <zone name="79_IB"/> + <zone name="79_IC"/> + <zone name="79_ID"/> + <zone name="82_IB"/> + <zone name="82_IC"/> + <zone name="82_ID"/> + </complete_island> + <complete_island island="uiR2_Jungle33" package="j1" continent="r2_jungle" xmin="34052" ymin="-13058" xmax="34488" ymax="-12636"> + <zone name="80_IF"/> + <zone name="81_IF"/> + <zone name="81_IG"/> + <zone name="80_IG"/> + <zone name="82_IF"/> + <zone name="82_IG"/> + <zone name="82_IH"/> + <zone name="81_IH"/> + </complete_island> + <complete_island island="uiR2_Jungle34" package="j1" continent="r2_jungle" xmin="34792" ymin="-13048" xmax="35531" ymax="-12469"> + <zone name="79_IM"/> + <zone name="80_IL"/> + <zone name="80_IM"/> + <zone name="80_IN"/> + <zone name="79_IL"/> + <zone name="79_IN"/> + <zone name="81_IK"/> + <zone name="81_IL"/> + <zone name="81_IM"/> + <zone name="80_IK"/> + <zone name="79_IK"/> + <zone name="81_IN"/> + <zone name="80_IJ"/> + <zone name="82_IM"/> + <zone name="82_IN"/> + <zone name="79_IJ"/> + </complete_island> + <complete_island island="uiR2_Jungle35" package="j1" continent="r2_jungle" xmin="35669" ymin="-13127" xmax="36330" ymax="-12475"> + <zone name="82_IP"/> + <zone name="82_IQ"/> + <zone name="81_IP"/> + <zone name="81_IQ"/> + <zone name="82_IR"/> + <zone name="81_IR"/> + <zone name="80_IP"/> + <zone name="80_IQ"/> + <zone name="80_IR"/> + <zone name="80_IS"/> + <zone name="79_IP"/> + <zone name="79_IQ"/> + <zone name="79_IR"/> + <zone name="79_IS"/> + </complete_island> + <complete_island island="uiR2_Jungle36" package="j1" continent="r2_jungle" xmin="36702" ymin="-13131" xmax="37217" ymax="-12630"> + <zone name="80_IX"/> + <zone name="81_IW"/> + <zone name="81_IX"/> + <zone name="81_IY"/> + <zone name="80_IW"/> + <zone name="80_IY"/> + <zone name="82_IV"/> + <zone name="82_IW"/> + <zone name="82_IX"/> + <zone name="81_IV"/> + <zone name="80_IV"/> + <zone name="82_IY"/> + </complete_island> + <complete_island island="uiR2_Jungle38" package="j1" continent="r2_jungle" xmin="38236" ymin="-13118" xmax="38718" ymax="-12634"> + <zone name="80_JF"/> + <zone name="81_JF"/> + <zone name="81_JG"/> + <zone name="80_JG"/> + <zone name="82_JF"/> + <zone name="82_JG"/> + <zone name="81_JH"/> + </complete_island> + <complete_island island="uiR2_Jungle39" package="j1" continent="r2_jungle" xmin="38873" ymin="-13126" xmax="39526" ymax="-12634"> + <zone name="80_JJ"/> + <zone name="81_JJ"/> + <zone name="81_JK"/> + <zone name="80_JK"/> + <zone name="82_JJ"/> + <zone name="82_JK"/> + <zone name="82_JL"/> + <zone name="81_JL"/> + <zone name="80_JL"/> + <zone name="82_JM"/> + <zone name="81_JM"/> + <zone name="80_JM"/> + </complete_island> + <complete_island island="uiR2_Jungle41" package="j1" continent="r2_jungle" xmin="40552" ymin="-13131" xmax="40897" ymax="-12470"> + <zone name="79_JU"/> + <zone name="80_JT"/> + <zone name="80_JU"/> + <zone name="80_JV"/> + <zone name="79_JT"/> + <zone name="79_JV"/> + <zone name="81_JU"/> + <zone name="81_JV"/> + <zone name="82_JU"/> + <zone name="82_JV"/> + </complete_island> + <complete_island island="uiR2_Jungle42" package="j1" continent="r2_jungle" xmin="31029" ymin="-13758" xmax="31518" ymax="-13192"> + <zone name="84_HM"/> + <zone name="85_HM"/> + <zone name="85_HN"/> + <zone name="84_HN"/> + <zone name="83_HM"/> + <zone name="83_HN"/> + <zone name="86_HM"/> + <zone name="86_HN"/> + <zone name="86_HO"/> + <zone name="85_HO"/> + <zone name="84_HO"/> + </complete_island> + <complete_island island="uiR2_Jungle43" package="j1" continent="r2_jungle" xmin="31674" ymin="-13469" xmax="32002" ymax="-13275"> + <zone name="84_HQ"/> + <zone name="85_HQ"/> + <zone name="85_HR"/> + <zone name="84_HR"/> + <zone name="86_HQ"/> + <zone name="86_HR"/> + <zone name="86_HS"/> + <zone name="85_HS"/> + <zone name="84_HS"/> + <zone name="87_HQ"/> + <zone name="87_HR"/> + <zone name="87_HS"/> + <zone name="87_HT"/> + <zone name="86_HT"/> + <zone name="85_HT"/> + <zone name="84_HT"/> + </complete_island> + <complete_island island="uiR2_Jungle44" package="j1" continent="r2_jungle" xmin="32552" ymin="-13771" xmax="33057" ymax="-13270"> + <zone name="84_HW"/> + <zone name="85_HV"/> + <zone name="85_HW"/> + <zone name="85_HX"/> + <zone name="84_HV"/> + <zone name="84_HX"/> + <zone name="86_HW"/> + <zone name="86_HX"/> + <zone name="86_HY"/> + <zone name="85_HY"/> + <zone name="84_HY"/> + </complete_island> + <complete_island island="uiR2_Jungle45" package="j1" continent="r2_jungle" xmin="33352" ymin="-13827" xmax="33848" ymax="-13274"> + <zone name="86_IB"/> + <zone name="87_IB"/> + <zone name="87_IC"/> + <zone name="86_IA"/> + <zone name="86_IC"/> + <zone name="85_IA"/> + <zone name="85_IB"/> + <zone name="85_IC"/> + <zone name="85_ID"/> + <zone name="84_IB"/> + <zone name="84_IC"/> + <zone name="84_ID"/> + </complete_island> + <complete_island island="uiR2_Jungle46" package="j1" continent="r2_jungle" xmin="34073" ymin="-14087" xmax="34817" ymax="-13276"> + <zone name="87_IF"/> + <zone name="88_IF"/> + <zone name="88_IG"/> + <zone name="87_IG"/> + <zone name="86_IF"/> + <zone name="86_IG"/> + <zone name="88_IH"/> + <zone name="87_IH"/> + <zone name="86_IH"/> + <zone name="85_IF"/> + <zone name="85_IG"/> + <zone name="85_IH"/> + <zone name="88_II"/> + <zone name="87_II"/> + <zone name="86_II"/> + <zone name="85_II"/> + <zone name="84_IF"/> + <zone name="84_IG"/> + <zone name="84_IH"/> + <zone name="84_II"/> + <zone name="87_IJ"/> + <zone name="86_IJ"/> + <zone name="85_IJ"/> + <zone name="84_IJ"/> + </complete_island> + <complete_island island="uiR2_Jungle47" package="j1" continent="r2_jungle" xmin="35034" ymin="-13765" xmax="35685" ymax="-13274"> + <zone name="84_IO"/> + <zone name="85_IN"/> + <zone name="85_IO"/> + <zone name="84_IN"/> + <zone name="86_IM"/> + <zone name="86_IN"/> + <zone name="86_IO"/> + <zone name="85_IM"/> + <zone name="84_IM"/> + <zone name="86_IL"/> + <zone name="85_IL"/> + <zone name="84_IL"/> + </complete_island> + <complete_island island="uiR2_Jungle48" package="j1" continent="r2_jungle" xmin="35834" ymin="-13858" xmax="36257" ymax="-13275"> + <zone name="84_IQ"/> + <zone name="85_IQ"/> + <zone name="85_IR"/> + <zone name="84_IR"/> + <zone name="86_IQ"/> + <zone name="86_IR"/> + <zone name="86_IS"/> + <zone name="85_IS"/> + <zone name="84_IS"/> + <zone name="87_IQ"/> + <zone name="87_IR"/> + <zone name="87_IS"/> + </complete_island> + <complete_island island="uiR2_Jungle49" package="j1" continent="r2_jungle" xmin="36475" ymin="-13930" xmax="37057" ymax="-13270"> + <zone name="85_IW"/> + <zone name="86_IV"/> + <zone name="86_IW"/> + <zone name="86_IX"/> + <zone name="85_IV"/> + <zone name="85_IX"/> + <zone name="84_IV"/> + <zone name="84_IW"/> + <zone name="84_IX"/> + <zone name="87_IU"/> + <zone name="87_IV"/> + <zone name="87_IW"/> + <zone name="86_IU"/> + <zone name="85_IU"/> + <zone name="87_IX"/> + <zone name="84_IU"/> + </complete_island> + <complete_island island="uiR2_Jungle50" package="j1" continent="r2_jungle" xmin="37270" ymin="-13918" xmax="37764" ymax="-13274"> + <zone name="86_IZ"/> + <zone name="87_JA"/> + <zone name="86_JA"/> + <zone name="85_IZ"/> + <zone name="85_JA"/> + <zone name="87_JB"/> + <zone name="86_JB"/> + <zone name="85_JB"/> + <zone name="84_JB"/> + </complete_island> + <complete_island island="uiR2_Jungle51" package="j1" continent="r2_jungle" xmin="37992" ymin="-14018" xmax="38308" ymax="-13343"> + <zone name="87_JE"/> + <zone name="88_JD"/> + <zone name="88_JE"/> + <zone name="88_JF"/> + <zone name="87_JD"/> + <zone name="87_JF"/> + <zone name="86_JE"/> + <zone name="85_JD"/> + <zone name="85_JE"/> + <zone name="85_JF"/> + <zone name="84_JD"/> + <zone name="84_JE"/> + <zone name="84_JF"/> + </complete_island> + <complete_island island="uiR2_Jungle52" package="j1" continent="r2_jungle" xmin="38622" ymin="-13828" xmax="39205" ymax="-13274"> + <zone name="86_JK"/> + <zone name="87_JJ"/> + <zone name="86_JJ"/> + <zone name="85_JJ"/> + <zone name="85_JK"/> + <zone name="87_JI"/> + <zone name="86_JI"/> + <zone name="85_JI"/> + <zone name="84_JI"/> + <zone name="84_JJ"/> + <zone name="86_JH"/> + <zone name="85_JH"/> + <zone name="84_JH"/> + </complete_island> + <complete_island island="uiR2_Jungle53" package="j1" continent="r2_jungle" xmin="39349" ymin="-13858" xmax="39847" ymax="-13274"> + <zone name="86_JO"/> + <zone name="87_JN"/> + <zone name="87_JO"/> + <zone name="86_JN"/> + <zone name="85_JN"/> + <zone name="85_JO"/> + <zone name="87_JM"/> + <zone name="86_JM"/> + <zone name="85_JM"/> + <zone name="84_JM"/> + <zone name="84_JN"/> + <zone name="84_JO"/> + </complete_island> + <complete_island island="uiR2_Primes01" package="p1" continent="r2_roots" xmin="31033" ymin="-21606" xmax="31367" ymax="-20959"> + <zone name="135_HM"/> + <zone name="135_HN"/> + <zone name="134_HM"/> + <zone name="134_HN"/> + <zone name="133_HM"/> + <zone name="133_HN"/> + <zone name="132_HM"/> + <zone name="132_HN"/> + </complete_island> + <complete_island island="uiR2_Primes03" package="p1" continent="r2_roots" xmin="32153" ymin="-21604" xmax="32807" ymax="-20953"> + <zone name="132_HT"/> + <zone name="133_HT"/> + <zone name="133_HU"/> + <zone name="132_HU"/> + <zone name="134_HT"/> + <zone name="134_HU"/> + <zone name="134_HV"/> + <zone name="133_HV"/> + <zone name="132_HV"/> + <zone name="135_HT"/> + <zone name="135_HU"/> + <zone name="135_HV"/> + <zone name="135_HW"/> + <zone name="134_HW"/> + <zone name="133_HW"/> + <zone name="132_HW"/> + </complete_island> + <complete_island island="uiR2_Primes04" package="p1" continent="r2_roots" xmin="32953" ymin="-21607" xmax="33606" ymax="-20954"> + <zone name="133_IA"/> + <zone name="134_HZ"/> + <zone name="134_IA"/> + <zone name="134_IB"/> + <zone name="133_HZ"/> + <zone name="133_IB"/> + <zone name="132_HZ"/> + <zone name="132_IA"/> + <zone name="132_IB"/> + <zone name="135_HY"/> + <zone name="135_HZ"/> + <zone name="135_IA"/> + <zone name="134_HY"/> + <zone name="133_HY"/> + <zone name="135_IB"/> + <zone name="132_HY"/> + </complete_island> + <complete_island island="uiR2_Primes05" package="p1" continent="r2_roots" xmin="33755" ymin="-21601" xmax="34407" ymax="-20954"> + <zone name="134_IG"/> + <zone name="135_IF"/> + <zone name="135_IG"/> + <zone name="134_IF"/> + <zone name="133_IF"/> + <zone name="133_IG"/> + <zone name="135_IE"/> + <zone name="134_IE"/> + <zone name="133_IE"/> + <zone name="132_IE"/> + <zone name="132_IF"/> + <zone name="132_IG"/> + <zone name="135_ID"/> + <zone name="134_ID"/> + <zone name="133_ID"/> + </complete_island> + <complete_island island="uiR2_Primes06" package="p1" continent="r2_roots" xmin="34554" ymin="-21521" xmax="35046" ymax="-20954"> + <zone name="132_II"/> + <zone name="133_II"/> + <zone name="133_IJ"/> + <zone name="132_IJ"/> + <zone name="134_II"/> + <zone name="134_IJ"/> + <zone name="134_IK"/> + <zone name="133_IK"/> + <zone name="132_IK"/> + <zone name="135_II"/> + <zone name="135_IJ"/> + <zone name="135_IK"/> + </complete_island> + <complete_island island="uiR2_Primes07" package="p1" continent="r2_roots" xmin="35193" ymin="-21615" xmax="35845" ymax="-20954"> + <zone name="134_IM"/> + <zone name="135_IN"/> + <zone name="134_IN"/> + <zone name="133_IM"/> + <zone name="133_IN"/> + <zone name="135_IO"/> + <zone name="134_IO"/> + <zone name="133_IO"/> + <zone name="132_IM"/> + <zone name="132_IN"/> + <zone name="132_IO"/> + <zone name="135_IP"/> + <zone name="134_IP"/> + <zone name="133_IP"/> + <zone name="132_IP"/> + </complete_island> + <complete_island island="uiR2_Primes08" package="p1" continent="r2_roots" xmin="35994" ymin="-21607" xmax="36648" ymax="-20953"> + <zone name="132_IS"/> + <zone name="133_IR"/> + <zone name="133_IS"/> + <zone name="133_IT"/> + <zone name="132_IR"/> + <zone name="132_IT"/> + <zone name="134_IR"/> + <zone name="134_IS"/> + <zone name="134_IT"/> + <zone name="134_IU"/> + <zone name="133_IU"/> + <zone name="132_IU"/> + <zone name="135_IR"/> + <zone name="135_IS"/> + <zone name="135_IT"/> + <zone name="135_IU"/> + </complete_island> + <complete_island island="uiR2_Primes09" package="p1" continent="r2_roots" xmin="36799" ymin="-21446" xmax="37594" ymax="-20953"> + <zone name="133_IW"/> + <zone name="134_IW"/> + <zone name="134_IX"/> + <zone name="133_IX"/> + <zone name="132_IW"/> + <zone name="132_IX"/> + <zone name="134_IY"/> + <zone name="133_IY"/> + <zone name="132_IY"/> + <zone name="134_IZ"/> + <zone name="133_IZ"/> + <zone name="132_IZ"/> + <zone name="134_JA"/> + <zone name="133_JA"/> + <zone name="132_JA"/> + </complete_island> + <complete_island island="uiR2_Primes10" package="p1" continent="r2_roots" xmin="37753" ymin="-21594" xmax="38247" ymax="-20955"> + <zone name="134_JD"/> + <zone name="135_JC"/> + <zone name="135_JD"/> + <zone name="134_JC"/> + <zone name="134_JE"/> + <zone name="133_JC"/> + <zone name="133_JD"/> + <zone name="133_JE"/> + <zone name="132_JC"/> + <zone name="132_JD"/> + <zone name="132_JE"/> + </complete_island> + <complete_island island="uiR2_Primes11" package="p1" continent="r2_roots" xmin="38393" ymin="-21607" xmax="39047" ymax="-20956"> + <zone name="135_JJ"/> + <zone name="135_JI"/> + <zone name="134_JI"/> + <zone name="134_JJ"/> + <zone name="135_JH"/> + <zone name="134_JH"/> + <zone name="133_JH"/> + <zone name="133_JI"/> + <zone name="133_JJ"/> + <zone name="134_JG"/> + <zone name="133_JG"/> + <zone name="132_JG"/> + <zone name="132_JH"/> + <zone name="132_JI"/> + </complete_island> + <complete_island island="uiR2_Primes12" package="p1" continent="r2_roots" xmin="39199" ymin="-21497" xmax="39841" ymax="-21063"> + <zone name="134_JM"/> + <zone name="135_JN"/> + <zone name="134_JL"/> + <zone name="134_JN"/> + <zone name="133_JL"/> + <zone name="133_JM"/> + <zone name="133_JN"/> + <zone name="135_JO"/> + <zone name="134_JO"/> + <zone name="133_JO"/> + <zone name="132_JL"/> + <zone name="132_JM"/> + </complete_island> + <complete_island island="uiR2_Primes13" package="p1" continent="r2_roots" xmin="39995" ymin="-21762" xmax="40641" ymax="-21211"> + <zone name="136_JS"/> + <zone name="136_JR"/> + <zone name="135_JR"/> + <zone name="135_JS"/> + <zone name="135_JT"/> + <zone name="135_JQ"/> + <zone name="134_JQ"/> + <zone name="134_JR"/> + <zone name="134_JS"/> + <zone name="134_JT"/> + <zone name="133_JR"/> + <zone name="133_JS"/> + </complete_island> + <complete_island island="uiR2_Primes14" package="p1" continent="r2_roots" xmin="31033" ymin="-22406" xmax="31685" ymax="-21754"> + <zone name="138_HN"/> + <zone name="139_HM"/> + <zone name="139_HN"/> + <zone name="139_HO"/> + <zone name="138_HM"/> + <zone name="138_HO"/> + <zone name="137_HM"/> + <zone name="137_HN"/> + <zone name="137_HO"/> + <zone name="140_HM"/> + <zone name="140_HN"/> + <zone name="140_HO"/> + <zone name="140_HP"/> + <zone name="139_HP"/> + <zone name="138_HP"/> + <zone name="137_HP"/> + </complete_island> + <complete_island island="uiR2_Primes15" package="p1" continent="r2_roots" xmin="31834" ymin="-22325" xmax="32484" ymax="-21753"> + <zone name="137_HR"/> + <zone name="138_HR"/> + <zone name="138_HS"/> + <zone name="137_HS"/> + <zone name="139_HR"/> + <zone name="139_HS"/> + <zone name="139_HT"/> + <zone name="138_HT"/> + <zone name="137_HT"/> + <zone name="139_HU"/> + <zone name="138_HU"/> + <zone name="137_HU"/> + </complete_island> + <complete_island island="uiR2_Primes16" package="p1" continent="r2_roots" xmin="32635" ymin="-22247" xmax="33127" ymax="-21753"> + <zone name="139_HY"/> + <zone name="139_HX"/> + <zone name="138_HX"/> + <zone name="138_HY"/> + <zone name="139_HW"/> + <zone name="138_HW"/> + <zone name="137_HW"/> + <zone name="137_HX"/> + <zone name="137_HY"/> + </complete_island> + <complete_island island="uiR2_Primes17" package="p1" continent="r2_roots" xmin="33273" ymin="-22401" xmax="33926" ymax="-21754"> + <zone name="138_IC"/> + <zone name="139_IB"/> + <zone name="139_IC"/> + <zone name="139_ID"/> + <zone name="138_IB"/> + <zone name="138_ID"/> + <zone name="137_IB"/> + <zone name="137_IC"/> + <zone name="140_IA"/> + <zone name="140_IB"/> + <zone name="140_IC"/> + <zone name="139_IA"/> + <zone name="138_IA"/> + <zone name="140_ID"/> + <zone name="137_IA"/> + </complete_island> + <complete_island island="uiR2_Primes18" package="p1" continent="r2_roots" xmin="34078" ymin="-22309" xmax="34726" ymax="-21766"> + <zone name="138_II"/> + <zone name="139_IH"/> + <zone name="139_II"/> + <zone name="138_IH"/> + <zone name="137_IH"/> + <zone name="137_II"/> + <zone name="140_IH"/> + <zone name="140_II"/> + <zone name="139_IG"/> + <zone name="138_IG"/> + <zone name="139_IF"/> + <zone name="138_IF"/> + </complete_island> + <complete_island island="uiR2_Primes19" package="p1" continent="r2_roots" xmin="34874" ymin="-22485" xmax="35514" ymax="-21746"> + <zone name="140_IK"/> + <zone name="140_IL"/> + <zone name="139_IK"/> + <zone name="139_IL"/> + <zone name="140_IM"/> + <zone name="139_IM"/> + <zone name="138_IK"/> + <zone name="138_IL"/> + <zone name="138_IM"/> + <zone name="138_IN"/> + <zone name="137_IK"/> + <zone name="137_IL"/> + <zone name="137_IM"/> + <zone name="137_IN"/> + </complete_island> + <complete_island island="uiR2_Primes20" package="p1" continent="r2_roots" xmin="35677" ymin="-22247" xmax="36029" ymax="-21914"> + <zone name="139_IP"/> + <zone name="139_IQ"/> + <zone name="138_IP"/> + <zone name="138_IQ"/> + <zone name="139_IR"/> + <zone name="138_IR"/> + <zone name="139_IS"/> + <zone name="138_IS"/> + </complete_island> + <complete_island island="uiR2_Primes21" package="p1" continent="r2_roots" xmin="36558" ymin="-22407" xmax="37124" ymax="-21753"> + <zone name="139_IX"/> + <zone name="140_IW"/> + <zone name="140_IX"/> + <zone name="139_IW"/> + <zone name="138_IW"/> + <zone name="138_IX"/> + <zone name="140_IV"/> + <zone name="139_IV"/> + <zone name="138_IV"/> + <zone name="137_IV"/> + <zone name="137_IW"/> + <zone name="137_IX"/> + <zone name="140_IU"/> + <zone name="139_IU"/> + <zone name="138_IU"/> + <zone name="137_IU"/> + </complete_island> + <complete_island island="uiR2_Primes22" package="p1" continent="r2_roots" xmin="37275" ymin="-22407" xmax="37767" ymax="-21753"> + <zone name="138_JA"/> + <zone name="139_IZ"/> + <zone name="139_JA"/> + <zone name="139_JB"/> + <zone name="138_IZ"/> + <zone name="138_JB"/> + <zone name="137_IZ"/> + <zone name="137_JA"/> + <zone name="137_JB"/> + <zone name="140_IZ"/> + <zone name="140_JA"/> + <zone name="140_JB"/> + </complete_island> + <complete_island island="uiR2_Primes23" package="p1" continent="r2_roots" xmin="37914" ymin="-22406" xmax="38481" ymax="-21759"> + <zone name="138_JF"/> + <zone name="139_JE"/> + <zone name="139_JF"/> + <zone name="139_JG"/> + <zone name="138_JE"/> + <zone name="138_JG"/> + <zone name="137_JE"/> + <zone name="137_JF"/> + <zone name="137_JG"/> + <zone name="140_JD"/> + <zone name="140_JE"/> + <zone name="140_JF"/> + <zone name="139_JD"/> + <zone name="138_JD"/> + <zone name="140_JG"/> + <zone name="137_JD"/> + </complete_island> + <complete_island island="uiR2_Primes24" package="p1" continent="r2_roots" xmin="38798" ymin="-22407" xmax="39429" ymax="-21753"> + <zone name="137_JL"/> + <zone name="138_JK"/> + <zone name="138_JL"/> + <zone name="138_JM"/> + <zone name="137_JK"/> + <zone name="137_JM"/> + <zone name="139_JJ"/> + <zone name="139_JK"/> + <zone name="138_JJ"/> + <zone name="137_JJ"/> + <zone name="140_JI"/> + <zone name="140_JJ"/> + <zone name="140_JK"/> + <zone name="139_JI"/> + <zone name="138_JI"/> + <zone name="137_JI"/> + </complete_island> + <complete_island island="uiR2_Primes25" package="p1" continent="r2_roots" xmin="39677" ymin="-22406" xmax="40163" ymax="-21913"> + <zone name="140_JP"/> + <zone name="140_JQ"/> + <zone name="139_JO"/> + <zone name="139_JP"/> + <zone name="139_JQ"/> + <zone name="138_JO"/> + <zone name="138_JP"/> + <zone name="138_JQ"/> + </complete_island> + <complete_island island="uiR2_Primes26" package="p1" continent="r2_roots" xmin="40313" ymin="-22406" xmax="40806" ymax="-21914"> + <zone name="139_JT"/> + <zone name="140_JS"/> + <zone name="140_JT"/> + <zone name="140_JU"/> + <zone name="139_JS"/> + <zone name="139_JU"/> + <zone name="138_JS"/> + <zone name="138_JT"/> + <zone name="138_JU"/> + </complete_island> + <complete_island island="uiR2_Primes27" package="p1" continent="r2_roots" xmin="31033" ymin="-23206" xmax="31686" ymax="-22553"> + <zone name="142_HP"/> + <zone name="143_HO"/> + <zone name="143_HP"/> + <zone name="142_HO"/> + <zone name="144_HN"/> + <zone name="144_HO"/> + <zone name="144_HP"/> + <zone name="143_HN"/> + <zone name="142_HN"/> + <zone name="145_HM"/> + <zone name="145_HN"/> + <zone name="145_HO"/> + <zone name="144_HM"/> + <zone name="143_HM"/> + <zone name="145_HP"/> + <zone name="142_HM"/> + </complete_island> + <complete_island island="uiR2_Primes28" package="p1" continent="r2_roots" xmin="31834" ymin="-23207" xmax="32486" ymax="-22559"> + <zone name="144_HT"/> + <zone name="145_HS"/> + <zone name="145_HT"/> + <zone name="145_HU"/> + <zone name="144_HS"/> + <zone name="144_HU"/> + <zone name="143_HS"/> + <zone name="143_HT"/> + <zone name="143_HU"/> + <zone name="145_HR"/> + <zone name="144_HR"/> + <zone name="143_HR"/> + <zone name="142_HR"/> + <zone name="142_HS"/> + <zone name="142_HT"/> + <zone name="142_HU"/> + </complete_island> + <complete_island island="uiR2_Primes29" package="p1" continent="r2_roots" xmin="32633" ymin="-23206" xmax="33287" ymax="-22559"> + <zone name="144_HZ"/> + <zone name="145_HY"/> + <zone name="145_HZ"/> + <zone name="144_HY"/> + <zone name="143_HY"/> + <zone name="143_HZ"/> + <zone name="145_HX"/> + <zone name="144_HX"/> + <zone name="143_HX"/> + <zone name="142_HX"/> + <zone name="142_HY"/> + <zone name="142_HZ"/> + <zone name="145_HW"/> + <zone name="144_HW"/> + <zone name="143_HW"/> + <zone name="142_HW"/> + </complete_island> + <complete_island island="uiR2_Primes30" package="p1" continent="r2_roots" xmin="33519" ymin="-23046" xmax="33927" ymax="-22559"> + <zone name="143_IC"/> + <zone name="144_IB"/> + <zone name="144_IC"/> + <zone name="144_ID"/> + <zone name="143_IB"/> + <zone name="143_ID"/> + <zone name="142_IB"/> + <zone name="142_IC"/> + <zone name="142_ID"/> + </complete_island> +</islands> From be7acd8e2a1d8359578c755e8c1f60d52cf6c58d Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Tue, 24 Oct 2023 18:12:07 +0200 Subject: [PATCH 093/194] Fix updateRpItems --- .../gamedev/interfaces_v3/interaction.lua | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua index 8ef1be2a21..e226ac4d14 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua @@ -262,9 +262,7 @@ game.wantedRpTargets = {} game.wantedRpPositions = {} function game:addRequireRpItemsPosition(x, y, id) - local sx = tostring(math.floor(x/10)) - local sy = tostring(math.floor(y/10)) - game.wantedRpPositions[sx..":"..sy] = id + table.insert(game.wantedRpPositions, {x, y, id}) end function game:addRequireRpItems(left, target, mode, id) @@ -286,6 +284,11 @@ function game:updateRpItems() right = "_" end + local right_no_variant = right + for str in string.gmatch(right, "([a-zA-Z_.]*)[|0-9]*") do + right_no_variant = str + end + if game.updateRpItemsUrl then if game.usedRpLeftItem ~= left or game.usedRpRightItem ~= right then game.usedRpLeftItem = left @@ -294,18 +297,29 @@ function game:updateRpItems() end local target = tostring(getTargetSheet()) - local mode = "" if target ~= "" then mode = tostring(getTargetMode()) end - game:checkRpItemsPosition() + -- game:checkRpItemsPosition() local html = getUI("ui:interface:rpitems_actions"):find("html") for k, v in pairs(game.wantedRpTargets) do local a = html:find("action"..v) if a then - if a:find("but").onclick_l == "lua" and (string.find(k, left..":"..target..":"..mode) or string.find(k, left..":"..target..":")) then + if string.find(left..":"..target..":"..mode..":"..tostring(v), k) ~= nil + or string.find(left..":::"..tostring(v), k) ~= nil + or string.find(left..":"..target.."::"..tostring(v), k) ~= nil + or string.find(left..":"..target..":*:"..tostring(v), k) ~= nil + or string.find(right..":"..target..":"..mode..":"..tostring(v), k) ~= nil + or string.find(right..":::"..tostring(v), k) ~= nil + or string.find(right..":"..target.."::"..tostring(v), k) ~= nil + or string.find(right..":"..target..":*:"..tostring(v), k) ~= nil + or string.find(right_no_variant..":"..target..":"..mode..":"..tostring(v), k) ~= nil + or string.find(right_no_variant..":::"..tostring(v), k) ~= nil + or string.find(right_no_variant..":"..target.."::"..tostring(v), k) ~= nil + or string.find(right_no_variant..":"..target..":*:"..tostring(v), k) ~= nil + then a:find("img").texture = "grey_0.tga" a:find("but").onclick_l = "lua" a:find("but").alpha = 255 From b2bc1706aaeaf8bdc6fd2fc886368a59d005a573 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Tue, 24 Oct 2023 18:15:13 +0200 Subject: [PATCH 094/194] Fix checkRpItemsPosition --- .../data/gamedev/interfaces_v3/interaction.lua | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua index e226ac4d14..39682fc42e 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua @@ -337,20 +337,23 @@ end function game:checkRpItemsPosition() local x,y,z = getPlayerPos() - local sx = tostring(math.floor(x/10)) - local sy = tostring(math.floor(y/10)) local html = getUI("ui:interface:rpitems_actions"):find("html") - for k, v in pairs(game.wantedRpPositions) do - local a = html:find("action"..v) + for _, v in pairs(game.wantedRpPositions) do + vx = v[1] + vy = v[2] + id = v[3] + local a = html:find("action"..id) if a then - if string.find(sx..":"..sy, k) then + if (vx-x)*(vx-x) + (vy-y)*(vy-y) <= 50 then a:find("but").onclick_l = "lua" a:find("img").texture = "grey_0.tga" + a:find("but").alpha = 255 a:find("text").alpha = 255 else - a:find("but").onclick_l = "proc" + a:find("but").onclick_l = "" a:find("img").texture = "r2ed_toolbar_lock_small.tga" - a:find("text").alpha = 200 + a:find("but").alpha = 150 + a:find("text").alpha = 100 end end end From 50f72a4fdfedcb4273fa2535df71f6acbe0c0049 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Wed, 25 Oct 2023 14:29:31 +0200 Subject: [PATCH 095/194] Fix vpx when empty --- ryzom/server/src/ai_service/ai_grp_npc.cpp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/ryzom/server/src/ai_service/ai_grp_npc.cpp b/ryzom/server/src/ai_service/ai_grp_npc.cpp index 7f65297442..02a846e70c 100644 --- a/ryzom/server/src/ai_service/ai_grp_npc.cpp +++ b/ryzom/server/src/ai_service/ai_grp_npc.cpp @@ -404,24 +404,21 @@ void CSpawnGroupNpc::spawnBots(const std::string &name, const std::string &vpx) bot->spawn(); CBotNpc *botnpc = static_cast<CBotNpc*>(bot); - if (botnpc) + if (botnpc && !vpx.empty()) { botnpc->setVisualProperties(vpx); botnpc->sendVisualProperties(); } - if (!ucName.empty()) + CSpawnBot *spawnBot = bot->getSpawnObj(); + if (spawnBot && !ucName.empty()) { - CSpawnBot *spawnBot = bot->getSpawnObj(); - if (spawnBot) - { - TDataSetRow row = spawnBot->dataSetRow(); - NLNET::CMessage msgout("CHARACTER_NAME"); - msgout.serial(row); - msgout.serial(ucName); - sendMessageViaMirror("IOS", msgout); - spawnBot->getPersistent().setCustomName(ucName); - } + TDataSetRow row = spawnBot->dataSetRow(); + NLNET::CMessage msgout("CHARACTER_NAME"); + msgout.serial(row); + msgout.serial(ucName); + sendMessageViaMirror("IOS", msgout); + spawnBot->getPersistent().setCustomName(ucName); } if (_Cell < 0) { From ced2ca3d69ad25ecab8ab1eaf8e3c01380fc53bc Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 27 Oct 2023 15:18:29 +0200 Subject: [PATCH 096/194] Fix left rp items when have 2 hands real items --- ryzom/client/src/player_cl.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ryzom/client/src/player_cl.cpp b/ryzom/client/src/player_cl.cpp index 7437682798..f4cb4ae58b 100644 --- a/ryzom/client/src/player_cl.cpp +++ b/ryzom/client/src/player_cl.cpp @@ -914,8 +914,11 @@ void CPlayerCL::updateVisualPropertyVpa(const NLMISC::TGameCycle &/* gameCycle * // No Valid item in the left hand. equip(SLOTTYPE::LEFT_HAND_SLOT, ""); SLOTTYPE::EVisualSlot slot = SLOTTYPE::LEFT_HAND_SLOT; + + const CEntitySheet *pRight = _Items[SLOTTYPE::RIGHT_HAND_SLOT].Sheet; + CItemSheet *pIsRight = (CItemSheet *)pRight; leftHandTag = getTag(6); - if (!leftHandTag.empty() && leftHandTag != "_") + if ((!pIsRight || (!pIsRight->hasSlot(SLOTTYPE::TWO_HANDS) && !pIsRight->hasSlot(SLOTTYPE::RIGHT_HAND_EXCLUSIVE))) && !leftHandTag.empty() && leftHandTag != "_") { vector<string> tagInfos; splitString(leftHandTag, string("|"), tagInfos); @@ -953,6 +956,7 @@ void CPlayerCL::updateVisualPropertyVpa(const NLMISC::TGameCycle &/* gameCycle * equip(slot, ""); } } + CLuaManager::getInstance().executeLuaScript(toString("game:updateRpItems('%s', '%s')", leftHandTag.c_str(), rightHandTag.c_str()), 0); // Create face @@ -1032,8 +1036,6 @@ void CPlayerCL::updateVisualPropertyVpa(const NLMISC::TGameCycle &/* gameCycle * equip(slot, tagInfos[0], itemSheet); } } - - } else { From effee71fa93df753486188cfeeca16a56f397708 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Fri, 27 Oct 2023 15:21:19 +0200 Subject: [PATCH 097/194] Add debug --- .../player_manager/character_inventory_manipulation.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp b/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp index f754f5075e..285622f06e 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp @@ -3584,8 +3584,10 @@ void CCharacter::applyItemModifiers(const CGameItemPtr &item) } // init all modifiers due to equipment + nlinfo("Current _ParryModifier = Total : %d", _ParryModifier); _DodgeModifier += item->dodgeModifier(); _ParryModifier += item->parryModifier(); + nlinfo("+ Item Parry = Total : + %d = %d", item->parryModifier(), _ParryModifier); _AdversaryDodgeModifier += item->adversaryDodgeModifier(); _AdversaryParryModifier += item->adversaryParryModifier(); // update DB for modifiers From 84d2991c1ff3bcf2e1b7a3fcbe0ee0ced420361e Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 27 Oct 2023 15:28:15 +0200 Subject: [PATCH 098/194] Put payload lua things into client files --- .../client/data/gamedev/interfaces_v3/ark.lua | 64 ++++++++++++++++++- .../data/gamedev/interfaces_v3/compass.lua | 21 +++++- .../data/gamedev/interfaces_v3/compass.xml | 6 +- .../data/gamedev/interfaces_v3/help.lua | 45 ++++++++++++- .../gamedev/interfaces_v3/info_player.lua | 22 +++++-- .../data/gamedev/interfaces_v3/outpost.lua | 25 ++++---- .../data/gamedev/interfaces_v3/player.lua | 40 ++++++++++-- .../data/gamedev/interfaces_v3/taskbar.xml | 2 +- .../data/gamedev/interfaces_v3/web_queue.lua | 4 +- .../gamedev/interfaces_v3/webig_widgets.xml | 5 +- 10 files changed, 197 insertions(+), 37 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark.lua b/ryzom/client/data/gamedev/interfaces_v3/ark.lua index fc9ba53d7c..36b95eb185 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark.lua @@ -78,6 +78,16 @@ if ArkMissionCatalog == nil then } end +function openRyward(folder, event) + folder = "f"..tostring(folder) + event = tostring(event) + if not (rykea_selected_path_B == folder and rykea_selected_path_C == event and getUI("ui:interface:encyclopedia").active == true) then + ArkMissionCatalog:OpenCat("rykea","https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script=10741&command=reset_all") + end + getUI(ArkMissionCatalog.window_id..":content:htmlB"):browse("https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script=10741&command=reset_all&pathB="..folder.."&pathC="..event) + getUI(ArkMissionCatalog.window_id).active = true +end + function ArkMissionCatalog:OpenWindow(urlA, urlB, dont_active) local winframe = getUI(ArkMissionCatalog.window_id) winframe.opened=true @@ -201,6 +211,58 @@ function ArkMissionCatalog:showLegacyEncyclopedia(state) end end + +function ArkMissionCatalog:setup() + debug("Define Mission Catalag url") + if ArkMissionCatalog ~= nil then + ArkMissionCatalog.posxB = 0 + end + + local urlA = "https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script=8746&command=reset_all&no_html_header=1&ig=1" + getUI("ui:interface:encyclopedia:content:htmlA"):browse(urlA) + + ArkMissionCatalog:startResize() + local continent = getContinentSheet() + if continent == "newbieland.continent" then + ArkMissionCatalog:OpenCat("academic","https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script=10700&command=reset_all&no_html_header=1") + else + ArkMissionCatalog:OpenCat("storyline","https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script=8840&command=reset_all&no_html_header=1&show_latest=1") + end + + debug("Open ency") + getUI("ui:interface:encyclopedia").opened = true; + +end + +function translateText(id, script, event) + framewin = getUI("ui:interface:ark_translate_lesson", false) + if framewin == nil then + createRootGroupInstance("webig_browser", "ark_translate_lesson", {h=480, w=980}) + framewin = getUI("ui:interface:ark_translate_lesson", false) + end + + framewin.opened = true + framewin.active = true + framewin.x = math.floor((getUI("ui:interface").w - framewin.w) / 2) + framewin.y = math.floor((getUI("ui:interface").h + framewin.h) / 2) + setTopWindow(framewin) + framewin:find("html"):browse("https://app.ryzom.com/app_arcc/index.php?action=mTrads_Edit&event="..tostring(event).."&trad_name="..tostring(id).."&reload="..script) +end + + +function setupArkUrls() + debug("Setup Lm Events") + local ui = getUI("ui:interface:map:content:map_content:lm_events:html") + ui.home = "https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script=8297&command=reset_all&no_html_header=1&continent="..tostring(game.currentMapContinent) + ui:browse("home") + + debug("Setup Lm Icons") + ui = getUI("ui:interface:map:content:map_content:lm_dynicons:html") + ui.home = "https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script=11158&command=reset_all&no_html_header=1" + ui:browse("home") + game.updateRpItemsUrl = "https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script=11488&command=reset_all" +end + if S2E1 == nil then S2E1 = {} end @@ -623,4 +685,4 @@ end -- VERSION -- -RYZOM_ARK_VERSION = 324 \ No newline at end of file +RYZOM_ARK_VERSION = 324 diff --git a/ryzom/client/data/gamedev/interfaces_v3/compass.lua b/ryzom/client/data/gamedev/interfaces_v3/compass.lua index 9772d4083c..8daf9ab4c7 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/compass.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/compass.lua @@ -4,6 +4,25 @@ if (game==nil) then game= {}; end +if DynE == nil then + DynE = {} + DynE.lastWinUpdate = 0 +end + +if DynE.otherMapPoint == nil then + DynE.otherMapPoints = {} +end + +function DynE:AddOtherMapPoints() + if DynE.otherMapPoints ~= nil then + for k, v in pairs(DynE.otherMapPoints) do + for _, point in pairs(v) do + addLandMark(point[1], point[2], point[3], point[4],"","","","","","") + end + end + end +end + function game:areInSilan() polygons = {{8128,-10208}, {11368,-10208}, {11392,-12392}, {8096,-12368}} @@ -50,4 +69,4 @@ end setOnDraw(getUI("ui:interface:compass"), "game:updateCompass()") -- VERSION -- -RYZOM_COMPASS_VERSION = 324 \ No newline at end of file +RYZOM_COMPASS_VERSION = 324 diff --git a/ryzom/client/data/gamedev/interfaces_v3/compass.xml b/ryzom/client/data/gamedev/interfaces_v3/compass.xml index 131d1e1afb..0b3c538279 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/compass.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/compass.xml @@ -783,7 +783,7 @@ w="24" h="24" x="4" - y="-30"> + y="-20"> <view id="envelop" type="bitmap" texture="calendar.tga" @@ -864,8 +864,8 @@ <!-- show/hide help --> <group id="help" posref="TR TR" - group_onclick_l="show_hide" - group_params_l="cs_browser" + group_onclick_l="lua" + group_params_l="AppZone:handle(1092)" tooltip="uiMk_window8" w="24" h="24" diff --git a/ryzom/client/data/gamedev/interfaces_v3/help.lua b/ryzom/client/data/gamedev/interfaces_v3/help.lua index e5279ccac1..41c1590232 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/help.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/help.lua @@ -139,7 +139,50 @@ function help:continueLesson(id, url) webig:checkUrl(url) end +function help:checkSkipTutorial() + local skip_tutorial = getDbProp("UI:SAVE:SKIP_TUTORIAL") + if skip_tutorial == 0 then + debug("Skip Tutorial") + setDbProp("UI:SAVE:SKIP_TUTORIAL", 1) + help:skipTutorial() + end +end + +function help:checkSkipWelcomeTutorial() + getUI("ui:interface:player").active = true + getUI("ui:interface:target").active = true + + local skip_welcome = getDbProp("UI:SAVE:SKIP_WELCOME") + local skip_tutorial = getDbProp("UI:SAVE:SKIP_TUTORIAL") + debug("Welcome : "..tostring(skip_welcome).." Tuto : "..tostring(skip_tutorial)) + if skip_welcome == 0 or skip_tutorial == 0 then + debug("Skip welcome & tutorial") + help:skipTutorial() + else + debug("Already skiped welcome & tutorial") + function help:checkCapActive() + end + end +end +function help:updateRpbg(slot) + local rpbg_key_file = io.open("save/rpbg_"..slot..".key", "rb") + if rpbg_key_file then + debug("Setup RP BG save/rpbg_"..slot..".key") + rpbg_key = rpbg_key_file:read() + rpbg_key_file:close() + os.remove("save/rpbg_"..slot..".key") + WebQueue:push("https://app.ryzom.com/app_arcc/outgame_rpbg.php?action=save&key="..rpbg_key) + end +end + +function help:checkTutorialMilkoPad() + getUI("ui:interface:cap_popup").active = false + removeOnDbChange(getUI("ui:interface"), "@UI:SAVE:MK_MODE") + if getDbProp("UI:SAVE:SKIP_TUTORIAL") == 0 then + addOnDbChange(getUI("ui:interface"), "@UI:SAVE:MK_MODE", "game:resizeMilkoPad()") + end +end -- VERSION -- -RYZOM_HELP_VERSION = 324 \ No newline at end of file +RYZOM_HELP_VERSION = 324 diff --git a/ryzom/client/data/gamedev/interfaces_v3/info_player.lua b/ryzom/client/data/gamedev/interfaces_v3/info_player.lua index 7cfe901eca..e54a1026a4 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/info_player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/info_player.lua @@ -368,12 +368,20 @@ end function game:onDbChangeAppPage() if getDbProp("UI:VARIABLES:CURRENT_SERVER_TICK") > self.NpcWebPage.Timeout then local npcName = getTargetName() - local message = ucstring() - - local text = game:getOpenAppPageMessage() - message:fromUtf8(text) - displaySystemInfo(message, "AMB") + local text = "" + if game.appNpcMessages[npcName] ~= nil then + text = game.appNpcMessages[npcName] + else + text = game:getOpenAppPageMessage() + end + if text == "" then + text = "w_magic_sep2.tga|" + else + text = findReplaceAll(text, "%s", npcName) + end + message:fromUtf8(game:parseLangText(text)) + displaySystemInfo(message, "ZON") removeOnDbChange(getUI("ui:interface:npc_web_browser"),"@UI:VARIABLES:CURRENT_SERVER_TICK") end end @@ -1617,7 +1625,7 @@ end function game:openMissionsCatalog() - -- Setup this function in webig + getUI("ui:interface:web_transactions"):find("html"):browse("https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script=8747&command=reset_all") end @@ -2198,4 +2206,4 @@ end -- VERSION -- -RYZOM_INFO_PLAYER_VERSION = 324 \ No newline at end of file +RYZOM_INFO_PLAYER_VERSION = 324 diff --git a/ryzom/client/data/gamedev/interfaces_v3/outpost.lua b/ryzom/client/data/gamedev/interfaces_v3/outpost.lua index fba2ce3adb..f09b5e6c3a 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/outpost.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/outpost.lua @@ -93,24 +93,25 @@ end ------------------------------------------------------------------------------------------------------------ function game:outpostBCOpenStateWindow() + getUI("ui:interface:outpost_selected").active = false -- Open the State Window from the BotChat. server msg - runAH(nil, 'outpost_select_from_bc', ''); + runAH(nil, "outpost_select_from_bc", ""); -- Open the window - runAH(nil, 'show', 'outpost_selected'); + runAH(nil, "show", "outpost_selected"); end ------------------------------------------------------------------------------------------------------------ function game:outpostDeclareWar() - -- Send Msg to server - runAH(nil, 'outpost_declare_war_start', ''); - - -- wait a ack from server. Suppose not OK by default - setDbProp("UI:TEMP:OUTPOST:DECLARE_WAR_ACK_RECEIVED", 0); - setDbProp("UI:TEMP:OUTPOST:DECLARE_WAR_ACK_OK", 0); - - -- Open the Declare War window - runAH(nil, "show", "outpost_declare_war"); + local sheetSel = getDbProp("SERVER:OUTPOST_SELECTED:SHEET"); + if sheetSel ~= nil then + local sheetSel = getSheetName(sheetSel) + local timeoffset = "0" + if getTimestampHuman ~= nil then + timeoffset = getTimestampHuman("%z") + end + WebQueue:push("https://app.ryzom.com/app_guild/outposts.php?action=declareWar&script=10149&command=reset_all&outpost="..sheetSel.."&timeoffset="..timeoffset) + end end ------------------------------------------------------------------------------------------------------------ @@ -667,4 +668,4 @@ end -- VERSION -- -RYZOM_OUTPOST_VERSION = 324 \ No newline at end of file +RYZOM_OUTPOST_VERSION = 324 diff --git a/ryzom/client/data/gamedev/interfaces_v3/player.lua b/ryzom/client/data/gamedev/interfaces_v3/player.lua index c662b6edbf..39fd7dbe93 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/player.lua @@ -52,7 +52,6 @@ function game:addScriptPlace(modname, place, id) game.wantedScriptPlaces[modname][place] = id end - function game:checkScriptPlace(place) for modname, vals in pairs(game.wantedScriptPlaces) do if vals[place] ~= nil and game.latestValidScriptPlace ~= place then @@ -62,13 +61,9 @@ function game:checkScriptPlace(place) end end - function game:CheckPosition() - local x,y,z = getPlayerPos() - local sx = tostring(math.floor(x/10)) - local sy = tostring(math.floor(y/10)) - game:checkRpItemsPosition(sx, sy) - local cont, region, places = getPositionInfos() + game:checkRpItemsPosition() + local cont, region, places = game:getPositionInfos() game:checkScriptPlace(cont) game:checkScriptPlace(region) for place, typ in pairs(places) do @@ -76,6 +71,37 @@ function game:CheckPosition() end end +function game:getPositionInfos(x, y) + local player_cont = "" + local player_region = "" + local player_places = {} + if x == nil or y == nil then + x,y,z = getPlayerPos() + end + + if game.World == nil then + return + end + + for cont, c in pairs(game.World) do + player_cont = cont + if point_inside_poly(x, y, c[2]) then + for region, r in pairs(c[3]) do + if point_inside_poly(x, y, r[2]) then + player_region = region + for place, p in pairs(r[3]) do + if point_inside_poly(x, y, p[2]) then + player_places[place] = p[3] + end + end + end + end + end + end + return player_cont, player_region, player_places +end + + ------------------------------------------------------------------------------------------------------------ -- Update player bars in function of what we wants to display (we can hide each one of the 3 bars : sap,stamina and focus) function game:updatePlayerBars() diff --git a/ryzom/client/data/gamedev/interfaces_v3/taskbar.xml b/ryzom/client/data/gamedev/interfaces_v3/taskbar.xml index 59a6819534..fe372658ea 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/taskbar.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/taskbar.xml @@ -865,7 +865,7 @@ <!-- Support --> <instance template="mk_icon_text" id="help2" hardtext="uiMk_window8" posparent="help1" posref="BL TL" - tooltip="uiMk_window8" onclick_l="show_hide" params_l="cs_browser" + tooltip="uiMk_window8" onclick_l="lua" params_l="AppZone:handle(1092)" tx_normal="tb_support.tga" tx_pushed="tb_support.tga" c="%color_purple" /> </group> diff --git a/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua b/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua index f3d1fcfa67..019cf20051 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua @@ -5,7 +5,7 @@ if not WebQueue then end function WebQueue:debug(text) - debugInfo(text) + debug(text) end function WebQueue:push(url, web) @@ -132,4 +132,4 @@ end -- VERSION -- -RYZOM_WEB_QUEUE_VERSION = 324 \ No newline at end of file +RYZOM_WEB_QUEUE_VERSION = 324 diff --git a/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml index e7256c2b3f..40001707cd 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml @@ -282,7 +282,7 @@ </group> </template> - <template name="ark_empty_slot_view" posparent="parent" posref="TL TL" id="" cam_pos="0 24.5 -0.2" cam_tar="0.0 26.5 0.0" shape_pos="26" keep="true" h="150" w="150" x="0" y="0" shape="empty.shape" tooltip="" params_l="" params_over=""> + <template name="ark_empty_slot_view" posparent="parent" posref="TL TL" id="" cam_pos="0 24.5 -0.2" cam_tar="0.0 26.5 0.0" shape_pos="0 26 0.1" shape2_pos="0 25.5 0.1" shape_rot="0 0 0" shape2_rot="0 0 0" keep="true" h="150" w="150" x="0" y="0" shape="empty.shape" shape2="" tooltip="" params_l="" params_over=""> <group id="#id" posref="MM MM" w="#w" h="#h" x="#x" y="#y" sizeref=""> <ctrl type="button" id="selection" button_type="push_button" tx_normal="blank.tga" render_layer="-5" tx_pushed="blank.tga" tx_over="blank.tga" color="50 50 50 0" col_over="50 50 50 0" col_pushed="50 50 50 200" global_color_normal="false" global_color="false" scale="true" posref="MM MM" x="0" y="0" w="#w" h="#h" tooltip="#tooltip" tooltip_posref="BM TM" onclick_l="lua" params_l="#params_l" onover="lua" params_over="#params_over"/> <scene3d id="scene" posparent="#posparent" w="#w" h="#h" x="#x" y="#y" posref="#posref" curcam="cam" curcs="env" user_interaction="false" @@ -290,7 +290,8 @@ <camera id="cam" fov="80" pos="#cam_pos" target="#cam_tar" roll="0" /> <light id="back" pos="0.0 28.2 1.6" color="96 64 32 255" near="2.5" far="4.0" /> <light id="lgt" pos="0.0 25.3 2.48" color="255 255 255" near="3.0" far="4.0" /> - <shape id="shape" name="#shape" pos="0.0 #shape_pos 0.1" rot="0.0 0.0 0.0" /> + <shape id="shape" name="#shape" pos="#shape_pos" rot="#shape_rot" /> + <shape id="shape2" name="#shape2" pos="#shape2_pos" rot="#shape2_rot" /> </scene3d> </group> </template> From bffc468acbf8df757a1c2a8d92de95fd02effcfb Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 27 Oct 2023 17:50:38 +0200 Subject: [PATCH 099/194] New lua versions --- ryzom/client/data/gamedev/interfaces_v3/ark.lua | 2 +- .../interfaces_v3/check_lua_versions.lua | 17 ++++++++--------- .../data/gamedev/interfaces_v3/compass.lua | 2 +- .../client/data/gamedev/interfaces_v3/help.lua | 2 +- .../data/gamedev/interfaces_v3/info_player.lua | 2 +- .../data/gamedev/interfaces_v3/interaction.lua | 2 +- .../data/gamedev/interfaces_v3/outpost.lua | 2 +- .../data/gamedev/interfaces_v3/player.lua | 2 +- .../data/gamedev/interfaces_v3/web_queue.lua | 2 +- 9 files changed, 16 insertions(+), 17 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark.lua b/ryzom/client/data/gamedev/interfaces_v3/ark.lua index 36b95eb185..d1dd01688f 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark.lua @@ -685,4 +685,4 @@ end -- VERSION -- -RYZOM_ARK_VERSION = 324 +RYZOM_ARK_VERSION = 335 diff --git a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua index b3399d95bc..c3f48b9ee0 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua @@ -1,16 +1,16 @@ local ryzom_have_all_good_version = true if RYZOM_APPZONE_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_APPZONE_VERSION, 324, "appzone") end -if RYZOM_ARK_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_ARK_VERSION, 324, "ark") end +if RYZOM_ARK_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_ARK_VERSION, 335, "ark") end if RYZOM_ARK_LESSONS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_ARK_LESSONS_VERSION, 324, "ark_lessons") end if RYZOM_BG_DOWNLOADER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_BG_DOWNLOADER_VERSION, 324, "bg_downloader") end if RYZOM_BOT_CHAT_V4_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_BOT_CHAT_V4_VERSION, 324, "bot_chat_v4") end -if RYZOM_COMPASS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_COMPASS_VERSION, 324, "compass") end +if RYZOM_COMPASS_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_COMPASS_VERSION, 335, "compass") end if RYZOM_GAME_CONFIG_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_GAME_CONFIG_VERSION, 324, "game_config") end if RYZOM_GAME_R2_LOADING_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_GAME_R2_LOADING_VERSION, 324, "game_r2_loading") end if RYZOM_GUILD_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_GUILD_VERSION, 324, "guild") end -if RYZOM_HELP_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_HELP_VERSION, 324, "help") end -if RYZOM_INFO_PLAYER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_INFO_PLAYER_VERSION, 324, "info_player") end -if RYZOM_INTERACTION_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_INTERACTION_VERSION, 324, "interaction") end +if RYZOM_HELP_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_HELP_VERSION, 335, "help") end +if RYZOM_INFO_PLAYER_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_INFO_PLAYER_VERSION, 335, "info_player") end +if RYZOM_INTERACTION_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_INTERACTION_VERSION, 335, "interaction") end if RYZOM_INVENTORY_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_INVENTORY_VERSION, 324, "inventory") end if RYZOM_JSON_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_JSON_VERSION, 324, "json") end if RYZOM_MAP_VERSION ~= 328 then broadcastBadLuaVersions(RYZOM_MAP_VERSION, 328, "map") end @@ -21,8 +21,8 @@ if RYZOM_NAMES_TRYKER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_TR if RYZOM_NAMES_ZORAI_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_ZORAI_VERSION, 324, "names_zorai") end if RYZOM_OUT_V2_APPEAR_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_APPEAR_VERSION, 324, "out_v2_appear") end if RYZOM_OUT_V2_SELECT_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_SELECT_VERSION, 324, "out_v2_select") end -if RYZOM_OUTPOST_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUTPOST_VERSION, 324, "outpost") end -if RYZOM_PLAYER_VERSION ~= 328 then broadcastBadLuaVersions(RYZOM_PLAYER_VERSION, 328, "player") end +if RYZOM_OUTPOST_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_OUTPOST_VERSION, 335, "outpost") end +if RYZOM_PLAYER_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_PLAYER_VERSION, 335, "player") end if RYZOM_PLAYER_TRADE_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_PLAYER_TRADE_VERSION, 324, "player_trade") end if RYZOM_RING_ACCESS_POINT_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RING_ACCESS_POINT_VERSION, 324, "ring_access_point") end if RYZOM_RING_ACCESS_POINT_FILTER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RING_ACCESS_POINT_FILTER_VERSION, 324, "ring_access_point_filter") end @@ -31,7 +31,6 @@ if RYZOM_RYZHOME_TOOLBAR_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RYZHO if RYZOM_SCENEEDIT_VERSION ~= 328 then broadcastBadLuaVersions(RYZOM_SCENEEDIT_VERSION, 328, "sceneedit") end if RYZOM_TASKBAR_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_TASKBAR_VERSION, 324, "taskbar") end if RYZOM_TP_INTERFACE_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_TP_INTERFACE_VERSION, 324, "tp_interface") end -if RYZOM_WEB_QUEUE_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_WEB_QUEUE_VERSION, 324, "web_queue") end +if RYZOM_WEB_QUEUE_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_WEB_QUEUE_VERSION, 335, "web_queue") end if RYZOM_WEBBROWSER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_WEBBROWSER_VERSION, 324, "webbrowser") end if RYZOM_WEBIG_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_WEBIG_VERSION, 324, "webig") end -if not all_good_versions then broadcastBadLuaVersions() end diff --git a/ryzom/client/data/gamedev/interfaces_v3/compass.lua b/ryzom/client/data/gamedev/interfaces_v3/compass.lua index 8daf9ab4c7..93ca89fd96 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/compass.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/compass.lua @@ -69,4 +69,4 @@ end setOnDraw(getUI("ui:interface:compass"), "game:updateCompass()") -- VERSION -- -RYZOM_COMPASS_VERSION = 324 +RYZOM_COMPASS_VERSION = 335 diff --git a/ryzom/client/data/gamedev/interfaces_v3/help.lua b/ryzom/client/data/gamedev/interfaces_v3/help.lua index 41c1590232..1a3e4dd1f8 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/help.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/help.lua @@ -185,4 +185,4 @@ function help:checkTutorialMilkoPad() end -- VERSION -- -RYZOM_HELP_VERSION = 324 +RYZOM_HELP_VERSION = 335 diff --git a/ryzom/client/data/gamedev/interfaces_v3/info_player.lua b/ryzom/client/data/gamedev/interfaces_v3/info_player.lua index e54a1026a4..c02b1143df 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/info_player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/info_player.lua @@ -2206,4 +2206,4 @@ end -- VERSION -- -RYZOM_INFO_PLAYER_VERSION = 324 +RYZOM_INFO_PLAYER_VERSION = 335 diff --git a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua index 39682fc42e..b9a71b3c6a 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua @@ -1318,4 +1318,4 @@ function arkNpcShop:Buy(id) end -- VERSION -- -RYZOM_INTERACTION_VERSION = 324 +RYZOM_INTERACTION_VERSION = 335 diff --git a/ryzom/client/data/gamedev/interfaces_v3/outpost.lua b/ryzom/client/data/gamedev/interfaces_v3/outpost.lua index f09b5e6c3a..b307c5831e 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/outpost.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/outpost.lua @@ -668,4 +668,4 @@ end -- VERSION -- -RYZOM_OUTPOST_VERSION = 324 +RYZOM_OUTPOST_VERSION = 335 diff --git a/ryzom/client/data/gamedev/interfaces_v3/player.lua b/ryzom/client/data/gamedev/interfaces_v3/player.lua index 39fd7dbe93..7aca937557 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/player.lua @@ -1091,4 +1091,4 @@ function game:fixVpx(vpx) end -- VERSION -- -RYZOM_PLAYER_VERSION = 328 +RYZOM_PLAYER_VERSION = 335 diff --git a/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua b/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua index 019cf20051..9edc0cf5d3 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/web_queue.lua @@ -132,4 +132,4 @@ end -- VERSION -- -RYZOM_WEB_QUEUE_VERSION = 324 +RYZOM_WEB_QUEUE_VERSION = 335 From a04be6f2a31b1f8c2d1e873a6edd5442eaece18b Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Sun, 19 Nov 2023 23:38:26 +0100 Subject: [PATCH 100/194] Enable debug of LUA ERROR in all clients --- nel/src/gui/lua_manager.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/nel/src/gui/lua_manager.cpp b/nel/src/gui/lua_manager.cpp index 9bdb002a6e..4b2018957d 100644 --- a/nel/src/gui/lua_manager.cpp +++ b/nel/src/gui/lua_manager.cpp @@ -75,19 +75,15 @@ namespace NLGUI } catch( const ELuaError &e ) { - std::string ryzom_version = RYZOM_VERSION; - if (!FINAL_VERSION || ryzom_version.find("Omega") == std::string::npos) // Omega version are the one used on live servers + nlwarning("--- LUA ERROR ---"); + nlwarning(e.luaWhat().c_str()); + std::vector<std::string> res; + NLMISC::explode(luaScript, std::string("\n"), res); + for(uint k = 0; k < res.size(); ++k) { - nlwarning("--- LUA ERROR ---"); - nlwarning(e.luaWhat().c_str()); - std::vector<std::string> res; - NLMISC::explode(luaScript, std::string("\n"), res); - for(uint k = 0; k < res.size(); ++k) - { - nlwarning("%.05u %s", k, res[k].c_str()); - } - nlwarning("--- ********* ---"); + nlwarning("%.05u %s", k, res[k].c_str()); } + nlwarning("--- ********* ---"); return false; } From ff0efa44bce625ed554a74acd9e777029df08d6e Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Wed, 22 Nov 2023 16:24:34 +0100 Subject: [PATCH 101/194] Fix buyable OP squads. Fix Inventorys access in powos --- .../data/gamedev/interfaces_v3/outpost.lua | 62 +++++++++---------- .../data/gamedev/interfaces_v3/outpost.xml | 9 +-- ryzom/common/src/game_share/outpost.h | 2 +- .../building_manager/room_instance.cpp | 12 +--- .../mission_manager/missions_commands.cpp | 6 ++ .../outpost_manager/outpost.cpp | 2 +- 6 files changed, 45 insertions(+), 48 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/outpost.lua b/ryzom/client/data/gamedev/interfaces_v3/outpost.lua index b307c5831e..8e01dce292 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/outpost.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/outpost.lua @@ -169,63 +169,58 @@ function game:outpostSelectSquadCapitalConfirm() end function game:outpostSetSquad() - local halfIndexSquad= tonumber(getDefine("right_squad_list_index")); - local MaxSquad= tonumber(getDefine("outpost_nb_max_squad_in_list")); - debug(getDbProp("UI:TEMP:OUTPOST:SQUAD_TO_BUY")) - local slot = getDbProp("UI:TEMP:OUTPOST:SQUAD_SLOT_SELECTED") - if slot >= halfIndexSquad then - setDbProp("UI:TEMP:OUTPOST:SQUAD_SLOT_SELECTED", slot - MaxSquad) - end + debug(getDbProp("UI:TEMP:OUTPOST:SQUAD_SLOT_SELECTED")) runAH(nil, "outpost_set_squad", "line=@UI:TEMP:OUTPOST:SQUAD_TO_BUY"); end function game:outpostRemoveSquad() - local Rounds = tonumber(getDefine("right_squad_list_index")); - local MaxSquad= tonumber(getDefine("outpost_nb_max_squad_in_list")); - local slot = getDbProp("UI:TEMP:OUTPOST:SQUAD_SLOT_SELECTED") - if slot >= Rounds then - setDbProp("UI:TEMP:OUTPOST:SQUAD_SLOT_SELECTED", slot - MaxSquad) - end runAH(nil, "outpost_remove_squad", "line=@UI:TEMP:OUTPOST:SQUAD_TO_BUY"); end function game:outpostInsertSquad() - local Rounds= tonumber(getDefine("right_squad_list_index")); - local MaxSquad= tonumber(getDefine("outpost_nb_max_squad_in_list")); - local slot = getDbProp("UI:TEMP:OUTPOST:SQUAD_SLOT_SELECTED") - if slot >= Rounds then - setDbProp("UI:TEMP:OUTPOST:SQUAD_SLOT_SELECTED", slot - MaxSquad) - end runAH(nil, "outpost_insert_squad", "line=@UI:TEMP:OUTPOST:SQUAD_TO_BUY"); end function game:outpostSetMapSquad() - local Rounds= tonumber(getDefine("right_squad_list_index")); - local MaxSquad= tonumber(getDefine("outpost_nb_max_squad_in_list")); - local slot = getDbProp("UI:TEMP:OUTPOST:SQUAD_SLOT_SELECTED") - if slot >= Rounds then - setDbProp("UI:TEMP:OUTPOST:SQUAD_SLOT_SELECTED", slot - MaxSquad) - end runAH(nil, "outpost_squad_map_send", "ui:interface:squad_spawn_map:content:map_content:actual_map") end ------------------------------------------------------------------------------------------------------------ function game:outpostToolTipTrainSquad(dbIndex) - local Rounds= tonumber(getDefine("right_squad_list_index")); + local Rounds = tonumber(getDefine("right_squad_list_index")); -- compute the level at which the squad will spawn. - local lvl; + local lvl + local elm if(dbIndex < Rounds) then - lvl = dbIndex*2 +1 ; -- eg: 0 => 1. 1=> 3 + elm = getUI("ui:interface:outpost:content:squad_setup:list_next_start:list:o"..tostring(dbIndex)) + lvl = math.ceil((dbIndex + 1)*1.3) - 1 -- eg: 0 => 1 + if dbIndex == 3 or dbIndex == 6 then + elm.y = -14 + end else - lvl = (dbIndex-Rounds)*2 +2 ; -- eg: 12 => 2 + elm = getUI("ui:interface:outpost:content:squad_setup:list_next_during:list:o"..tostring(dbIndex)) + lvl = math.ceil((dbIndex - Rounds + 1)*1.3) -- eg: 12 => 1 + if dbIndex == 12 or dbIndex == 15 or dbIndex == 18 then + elm.y = -14 + end end -- set the tooltip - local text = i18n.get('uittOutpostSquadLvl'); + local text = i18n.get("uittOutpostSquadLvl"); text = findReplaceAll(text, "%lvl", tostring(lvl)); setContextHelpText(text); + + if dbIndex == 10 or dbIndex == 11 then + getUI("ui:interface:outpost:content:squad_setup:list_next_start:list:o"..tostring(dbIndex)).active=false + end + + if dbIndex >= 22 then + getUI("ui:interface:outpost:content:squad_setup:list_next_during:list:o"..tostring(dbIndex)).active=false + end + + end @@ -282,6 +277,10 @@ function game:outpostInfoOnDbChange() -- change path for attacker text id uiGroup.global_state.outpost_attacker.name.textid_dblink= path .. ':GUILD:NAME_ATT'; + + for i=0,23 do + game:outpostToolTipTrainSquad(i) + end end ------------------------------------------------------------------------------------------------------------ @@ -415,7 +414,7 @@ function game:outpostGetStatusInfo(statusExpr, dbIndex, isTooltip) if (isTooltip == 'no') then path = self:outpostInfoGetDbPath(uiGroup.parent); else - path = formatUI('SERVER:GUILD:OUTPOST:O#1', math.max(0, dbIndex)); + path = formatUI('SERVER:GUILD:OUTPOST:O#1', math.max(0, tonumber(dbIndex))); end -- Peace @@ -484,7 +483,6 @@ function game:outpostGetStatusInfo(statusExpr, dbIndex, isTooltip) end return uittOutpost; - end ------------------------------------------------------------------------------------------------------------ diff --git a/ryzom/client/data/gamedev/interfaces_v3/outpost.xml b/ryzom/client/data/gamedev/interfaces_v3/outpost.xml index 866b0b5788..669bde569e 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/outpost.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/outpost.xml @@ -466,8 +466,8 @@ <!--***************--> <!-- Should be HALF the value in Database --> -<define id="outpost_nb_max_squad_in_list" value="6" /> -<define id="right_squad_list_index" value="12" /> +<define id="outpost_nb_max_squad_in_list" value="12" /> +<define id="right_squad_list_index" value="12" /> <define id="outpost_selected" value="SERVER:GUILD:OUTPOST:O[UI:TEMP:OUTPOST:SELECTION]" /> <define id="outpost_squad_line_h" value="15" /> <define id="outpost_squad_name_w" value="210" /> @@ -528,8 +528,9 @@ <ctrl style="o_spawn_button" onclick_l="proc" params_l="open_spawn_map|#index" /> </group> - <!-- active the line if the squad slot is here --> - <link expr="ne(@%outpost_selected:SQUADS:T#index:SHEET, 0)" target="#id:active" /> + <!-- active the line if the squad slot is here + <link expr="and(and(and(ne(@%outpost_selected:SQUADS:T#index:SHEET, 0), ne(#index, 10)), ne(#index, 11)), gt(#index, 23))" target="#id:active" /> + --> <!-- name of the squad --> <link expr="getSquadName(@%outpost_selected:SQUADS:T#index:SHEET)" target="#id:name:uc_hardtext" /> <!-- squad cost --> diff --git a/ryzom/common/src/game_share/outpost.h b/ryzom/common/src/game_share/outpost.h index 260410aaea..ea790615fd 100644 --- a/ryzom/common/src/game_share/outpost.h +++ b/ryzom/common/src/game_share/outpost.h @@ -32,7 +32,7 @@ namespace OUTPOSTENUMS const uint32 OUTPOST_MAX_SPAWN_ZONE = 16; // Same as (#y) in the database SERVER:GUILD:OUTPOST:O#x:SPAWN_ZONE:#y see (database.xml) const uint32 OUTPOST_MAX_SQUAD_SHOP = 16; // Same as (#y) in the database SERVER:GUILD:OUTPOST:O#x:SQUAD_SHOP:#y see (database.xml) - const uint32 OUTPOST_NB_BUYABLE_SQUAD_SLOTS = 6; + const uint32 OUTPOST_NB_BUYABLE_SQUAD_SLOTS = 12; const uint32 OUTPOST_NB_SQUAD_SLOTS = 12; const uint32 OUTPOST_MAX_SQUAD_TRAINING = OUTPOST_NB_SQUAD_SLOTS * 2; // Same as (#y) in the database SERVER:GUILD:OUTPOST:SQUADS:SP#y see (database.xml) const uint32 OUTPOST_MAX_SQUAD_SPAWNED = OUTPOST_MAX_SQUAD_TRAINING; // Same as (#y) in the database SERVER:GUILD:OUTPOST:SQUADS:T#y see (database.xml) diff --git a/ryzom/server/src/entities_game_service/building_manager/room_instance.cpp b/ryzom/server/src/entities_game_service/building_manager/room_instance.cpp index ec5ca420b4..a4c872785f 100644 --- a/ryzom/server/src/entities_game_service/building_manager/room_instance.cpp +++ b/ryzom/server/src/entities_game_service/building_manager/room_instance.cpp @@ -116,7 +116,7 @@ void CRoomInstanceGuild::addUser( CCharacter* user, const NLMISC::CEntityId & ow // open guild inventory window PlayerManager.sendImpulseToClient(user->getId(), "GUILD:OPEN_INVENTORY"); - + user->sendUrl("app_ryzhome action=open_guild_room&owner="+ owner.toString()+"&room_name="+guildBuilding->getName()); ++_RefCount; @@ -174,14 +174,6 @@ void CRoomInstancePlayer::addUser( CCharacter* user, const NLMISC::CEntityId & o CBuildingPhysicalPlayer * playerBuilding = dynamic_cast<CBuildingPhysicalPlayer *>( _Building ); BOMB_IF( !playerBuilding, "<BUILDING> building type does not match with room type", return ); - // open room inventory window if not in powo or in powo and have access - if (user->getPowoCell() == 0 || user->getPowoFlag("room_inv")) - PlayerManager.sendImpulseToClient(user->getId(), "ITEM:OPEN_ROOM_INVENTORY"); - - // open guild inventory window if in powo and have access (in powo all are player rooms) - if (user->getPowoCell() != 0 && user->getPowoFlag("guild_inv")) - PlayerManager.sendImpulseToClient(user->getId(), "GUILD:OPEN_INVENTORY"); - if (owner != CEntityId::Unknown) { CCharacter * o = PlayerManager.getChar(owner); @@ -236,7 +228,7 @@ bool IRoomInstance::create( IBuildingPhysical * building, uint16 roomIdx,uint16 nlwarning("<BUILDING> Invalid bot id '%s'%s in destination '%s'", eid.toString().c_str(), CPrimitivesParser::aliasToString(templ.Bots[i]).c_str(), templ.Name.c_str() ); continue; } - + //allocate a new creature static uint64 id64 = 0; NLMISC::CEntityId entityId(RYZOMID::npc, id64++, TServiceId8(NLNET::IService::getInstance()->getServiceId()).get(), NLNET::TServiceId8(NLNET::IService::getInstance()->getServiceId()).get()); diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index 4e51219835..9d510ec882 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -1997,6 +1997,12 @@ NLMISC_COMMAND(accessPowo, "give access to the powo", "<uid> [playername] [insta c->setPowoFlag("room_inv", invFlags[0] == '1'); c->setPowoFlag("guild_inv", invFlags[1] == '1'); + if (c->getPowoFlag("room_inv")) + PlayerManager.sendImpulseToClient(c->getId(), "ITEM:OPEN_ROOM_INVENTORY"); + + if (c->getPowoFlag("guild_inv")) + PlayerManager.sendImpulseToClient(c->getId(), "GUILD:OPEN_INVENTORY"); + if (args.size () > 3 && args[3] != "*") // Change the default exit by exit of instance building { std::vector< std::string > pos; diff --git a/ryzom/server/src/entities_game_service/outpost_manager/outpost.cpp b/ryzom/server/src/entities_game_service/outpost_manager/outpost.cpp index 27dd65e3c1..e617411011 100644 --- a/ryzom/server/src/entities_game_service/outpost_manager/outpost.cpp +++ b/ryzom/server/src/entities_game_service/outpost_manager/outpost.cpp @@ -2453,7 +2453,7 @@ uint32 COutpost::computeSquadCountA(uint32 roundLevel) const if (_PVPType == OUTPOSTENUMS::GVG) coef = OutpostGvGFightSquadCount.get(); - return (uint32)ceil((float)(roundLevel+1)/coef); + return (uint32)floor((float)(roundLevel+2)/coef); } //---------------------------------------------------------------------------- From f300671b7dd779cbb979bd64ac7277bee752a7fa Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Fri, 24 Nov 2023 00:20:19 +0100 Subject: [PATCH 102/194] Added compatibility with Ryzom RC Bridge v6 --- .../guild_manager/guild_manager.cpp | 11 +++++++++++ .../pvp_manager/pvp_manager_2.cpp | 14 +++++++++----- .../src/input_output_service/chat_client.cpp | 8 +++++++- .../src/input_output_service/chat_manager.cpp | 18 +++++++++--------- .../src/input_output_service/messages.cpp | 15 +++++++++++++++ 5 files changed, 51 insertions(+), 15 deletions(-) diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild_manager.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild_manager.cpp index 5f0a89c6f0..cf1e206386 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild_manager.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild_manager.cpp @@ -29,6 +29,7 @@ #include "server_share/mail_forum_validator.h" #include "game_share/persistent_data_tree.h" #include "server_share/log_item_gen.h" +#include "server_share/mongo_wrapper.h" #include "player_manager/player_manager.h" #include "player_manager/player.h" @@ -833,6 +834,7 @@ void CGuildManager::createGuildStep2(uint32 guildId, const ucstring &guildName, // init the guild strings guild->setName(guildName); guild->setDescription(pgc.Description); + // _GuildsAwaitingString.insert( std::make_pair( guildName, guild->getId() ) ); // _GuildsAwaitingString.insert( std::make_pair( pgc.Description, guild->getId() ) ); // NLMISC::CEntityId stringEId = guild->getEId(); @@ -857,6 +859,10 @@ void CGuildManager::createGuildStep2(uint32 guildId, const ucstring &guildName, // broadcast the new guild info IGuildUnifier::getInstance()->guildCreated(guild); +#ifdef HAVE_MONGO + CMongo::insert("ryzom_guilds", toString("{ 'guildId': %u, 'name': '%s', 'created': %" NL_I64 "u }", guildId, guildName.toUtf8().c_str(), CTickEventHandler::getGameCycle())); +#endif + // close guild creation interface PlayerManager.sendImpulseToClient( proxy.getId(),"GUILD:ABORT_CREATION" ); @@ -927,6 +933,11 @@ void CGuildManager::deleteGuild(uint32 id) IShardUnifierEvent::getInstance()->removeGuild(id); } + +#ifdef HAVE_MONGO + CMongo::remove("ryzom_guilds", toString("{'guildId': %u}", id)); +#endif + _Container->deleteFromGuilds(id); // if ( _HighestGuildId == id ) diff --git a/ryzom/server/src/entities_game_service/pvp_manager/pvp_manager_2.cpp b/ryzom/server/src/entities_game_service/pvp_manager/pvp_manager_2.cpp index 369c4974a6..13ef45af50 100644 --- a/ryzom/server/src/entities_game_service/pvp_manager/pvp_manager_2.cpp +++ b/ryzom/server/src/entities_game_service/pvp_manager/pvp_manager_2.cpp @@ -646,7 +646,11 @@ void CPVPManager2::playerConnects(CCharacter * user) if (pos != string::npos) playerName = playerName.substr(0, pos); - CMongo::update("ryzom_users", toString("{'name': '%s'}", playerName.c_str()), toString("{$set: {'cid': %" NL_I64 "u, 'guildId': %d, 'online': true} }", user->getId().getShortId(), user->getGuildId()), true); + CPlayer* player = PlayerManager.getPlayer(PlayerManager.getPlayerId(user->getId())); + if (player == NULL) + CMongo::update("ryzom_users", toString("{'name': '%s'}", playerName.c_str()), toString("{$set: {'cid': %" NL_I64 "u, 'guildId': %d, 'rzlang': 'en', 'online': true} }", user->getId().getShortId(), user->getGuildId()), true); + else + CMongo::update("ryzom_users", toString("{'name': '%s'}", playerName.c_str()), toString("{$set: {'cid': %" NL_I64 "u, 'guildId': %d, 'rzlang': '%s', 'online': true} }", user->getId().getShortId(), user->getGuildId(), player->getUserLanguage().c_str()), true); #endif std::vector<TChanID> currentChannels = getCharacterUserChannels(user); @@ -848,7 +852,7 @@ PVP_RELATION::TPVPRelation CPVPManager2::getPVPRelation( CCharacter * actor, CEn } //////////////////////////////////////////////////////// } - + bool is_ennemy = false; bool is_neutral_op = false; uint i; @@ -867,7 +871,7 @@ PVP_RELATION::TPVPRelation CPVPManager2::getPVPRelation( CCharacter * actor, CEn // Ennemy has the highest priority after outpost if( relationTmp == PVP_RELATION::Ennemy ) is_ennemy = true; - + // Neutral pvp if( relationTmp == PVP_RELATION::NeutralPVP ) relation = PVP_RELATION::NeutralPVP; @@ -876,10 +880,10 @@ PVP_RELATION::TPVPRelation CPVPManager2::getPVPRelation( CCharacter * actor, CEn if (relationTmp == PVP_RELATION::Ally && relation != PVP_RELATION::NeutralPVP) relation = PVP_RELATION::Ally; } - + if (is_neutral_op) return PVP_RELATION::NeutralPVP; - + if (is_ennemy) return PVP_RELATION::Ennemy; diff --git a/ryzom/server/src/input_output_service/chat_client.cpp b/ryzom/server/src/input_output_service/chat_client.cpp index 716b958a13..e35e0fabc4 100644 --- a/ryzom/server/src/input_output_service/chat_client.cpp +++ b/ryzom/server/src/input_output_service/chat_client.cpp @@ -18,7 +18,7 @@ #include "stdpch.h" #include "chat_client.h" #include "input_output_service.h" - +#include "server_share/mongo_wrapper.h" using namespace std; using namespace NLMISC; @@ -145,6 +145,9 @@ void CChatClient::setIgnoreStatus( const NLMISC::CEntityId &id, bool ignored) if( itIgnore == _IgnoreList.end() ) { _IgnoreList.insert( id ); +#ifdef HAVE_MONGO + CMongo::update("ryzom_users", toString("{ 'cid': %d}", TheDataset.getEntityId(_DataSetIndex).getShortId()), toString("{ $push:{ 'ignore': %d } }", id.getShortId())); +#endif } } @@ -153,6 +156,9 @@ void CChatClient::setIgnoreStatus( const NLMISC::CEntityId &id, bool ignored) if( itIgnore != _IgnoreList.end() ) { _IgnoreList.erase( itIgnore ); +#ifdef HAVE_MONGO + CMongo::update("ryzom_users", toString("{ 'cid': %d}", TheDataset.getEntityId(_DataSetIndex).getShortId()), toString("{ $pull:{ 'ignore': %d } }", id.getShortId())); +#endif } } } // ignore // diff --git a/ryzom/server/src/input_output_service/chat_manager.cpp b/ryzom/server/src/input_output_service/chat_manager.cpp index 2f483b6832..fc5f16978d 100644 --- a/ryzom/server/src/input_output_service/chat_manager.cpp +++ b/ryzom/server/src/input_output_service/chat_manager.cpp @@ -667,7 +667,7 @@ void CChatManager::checkNeedDeeplize( const TDataSetRow& sender, const ucstring& else if (ucstr.length() > 5 && ucstr[1] == ':' && ucstr[4] == ':') // Already have filter chatInGroup( grpId, ucstr, sender ); else - chatInGroup( grpId, ucstring(":"+senderLang+":")+ucstr, sender ); // Need filter + chatInGroup( grpId, ucstring(":"+senderLang+": ")+ucstr, sender ); // Need filter } @@ -872,9 +872,9 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr, strin } if (source_lang == "en") // in RC the icon are :gb: - mongoText = ":gb:"+mongoText; + mongoText = ":gb: "+mongoText; else - mongoText = ":"+source_lang+":"+mongoText; + mongoText = ":"+source_lang+": "+mongoText; chatId = "FACTION_EN"; if (usedlang != SM->getLanguageCodeString(ci->Language)) @@ -977,9 +977,9 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr, strin } if (source_lang == "en") // in RC the icon are :gb: - mongoText = ":gb:"+mongoText; + mongoText = ":gb: "+mongoText; else - mongoText = ":"+source_lang+":"+mongoText; + mongoText = ":"+source_lang+": "+mongoText; } chatInGroup( grpId, ucstr.substr(1), sender ); } @@ -1089,9 +1089,9 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr, strin } if (source_lang == "en") // in RC the icon are :gb: - mongoText = ":gb:"+mongoText; + mongoText = ":gb: "+mongoText; else - mongoText = ":"+source_lang+":"+mongoText; + mongoText = ":"+source_lang+": "+mongoText; } } // Send for translation @@ -2113,9 +2113,9 @@ void CChatManager::sendFarChat(const string &name, const ucstring& ucstr, const if (source_lang == "en") // in RC the icon are :gb: - mongoText = ":gb:"+mongoText; + mongoText = ":gb: "+mongoText; else - mongoText = ":"+source_lang+":"+mongoText; + mongoText = ":"+source_lang+": "+mongoText; #ifdef HAVE_MONGO if (endOfOriginal != string::npos) diff --git a/ryzom/server/src/input_output_service/messages.cpp b/ryzom/server/src/input_output_service/messages.cpp index e7ddf8e85e..599087077e 100644 --- a/ryzom/server/src/input_output_service/messages.cpp +++ b/ryzom/server/src/input_output_service/messages.cpp @@ -22,6 +22,7 @@ #include <nel/net/unified_network.h> #include "game_share/ryzom_mirror_properties.h" +#include "server_share/mongo_wrapper.h" #include "input_output_service.h" /*#include "game_share/tick_event_handler.h" @@ -683,6 +684,20 @@ static void cbCharacterNameAndLang(CMessage& msgin, const string &serviceName, T { ci->Language = SM->checkLanguageCode(language); ci->HavePrivilege = havePrivilege; + +#ifdef HAVE_MONGO + string cids = ""; + for ( uint i = 0; i < ignoreList.size(); i++ ) + { + if (i > 0) + cids += toString(",%d", ignoreList[i].getShortId()); + else + cids += toString("%d", ignoreList[i].getShortId()); + } + + CMongo::update("ryzom_users", toString("{ 'cid': %d}", TheDataset.getEntityId(chId).getShortId()), toString("{ $set:{ 'ignore': [%s] } }", cids.c_str())); +#endif + IOS->getChatManager().getClient(chId).setIgnoreList(ignoreList); } From e0aff525183d436f07177335946a249b030fc11a Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Sat, 2 Dec 2023 11:11:37 +0100 Subject: [PATCH 103/194] Added resetDefaultAttackSquads --- .../outpost_manager/outpost_commands.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ryzom/server/src/entities_game_service/outpost_manager/outpost_commands.cpp b/ryzom/server/src/entities_game_service/outpost_manager/outpost_commands.cpp index ff45215f6c..fbae4920b4 100644 --- a/ryzom/server/src/entities_game_service/outpost_manager/outpost_commands.cpp +++ b/ryzom/server/src/entities_game_service/outpost_manager/outpost_commands.cpp @@ -760,6 +760,21 @@ NLMISC_COMMAND(outpostSetTimer0, "Set outpost timer0", "<outpost_id> <Seconds>") return true; } +//---------------------------------------------------------------------------- +NLMISC_COMMAND(resetDefaultAttackSquads, "Reset Attack squads to Default", "<outpost_id>") +{ + if (args.size() != 1) return false; + + // select the wanted outpost + CSmartPtr<COutpost> outpost = getOutpostFromString(args[0], log); + if (outpost == NULL) + return false; + + outpost->resetDefaultAttackSquads(); + return true; +} + + //---------------------------------------------------------------------------- NLMISC_COMMAND(setMemberEntryDate, "Set guild member entry date", "<eid> <entryCycle>") From 2ebcacf597c76d682ffdfe86e6c28db4aa300d46 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Sat, 2 Dec 2023 11:15:45 +0100 Subject: [PATCH 104/194] Send ignorelist to mongo --- .../src/input_output_service/chat_client.cpp | 30 ++++++++++--------- .../src/input_output_service/chat_client.h | 5 ++-- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/ryzom/server/src/input_output_service/chat_client.cpp b/ryzom/server/src/input_output_service/chat_client.cpp index e35e0fabc4..bb80314e59 100644 --- a/ryzom/server/src/input_output_service/chat_client.cpp +++ b/ryzom/server/src/input_output_service/chat_client.cpp @@ -139,14 +139,14 @@ bool CChatClient::isMuted() //----------------------------------------------- void CChatClient::setIgnoreStatus( const NLMISC::CEntityId &id, bool ignored) { - TIgnoreListCont::iterator itIgnore = _IgnoreList.find(id); + TIgnoreListCont::iterator itIgnore = _IgnoreList.find(id.getShortId()); if (ignored) { if( itIgnore == _IgnoreList.end() ) { - _IgnoreList.insert( id ); + _IgnoreList.insert( id.getShortId() ); #ifdef HAVE_MONGO - CMongo::update("ryzom_users", toString("{ 'cid': %d}", TheDataset.getEntityId(_DataSetIndex).getShortId()), toString("{ $push:{ 'ignore': %d } }", id.getShortId())); + CMongo::update("ryzom_users", toString("{ 'cid': %u}", TheDataset.getEntityId(_DataSetIndex).getShortId()), toString("{ $push:{ 'ignore': %u } }", id.getShortId())); #endif } @@ -157,7 +157,7 @@ void CChatClient::setIgnoreStatus( const NLMISC::CEntityId &id, bool ignored) { _IgnoreList.erase( itIgnore ); #ifdef HAVE_MONGO - CMongo::update("ryzom_users", toString("{ 'cid': %d}", TheDataset.getEntityId(_DataSetIndex).getShortId()), toString("{ $pull:{ 'ignore': %d } }", id.getShortId())); + CMongo::update("ryzom_users", toString("{ 'cid': %u}", TheDataset.getEntityId(_DataSetIndex).getShortId()), toString("{ $pull:{ 'ignore': %u } }", id.getShortId())); #endif } } @@ -171,15 +171,7 @@ void CChatClient::setIgnoreStatus( const NLMISC::CEntityId &id, bool ignored) bool CChatClient::isInIgnoreList( const NLMISC::CEntityId &id ) { TIgnoreListCont::const_iterator itIgnore = _IgnoreList.find(id); - if( itIgnore != _IgnoreList.end() ) - { - return true; - } - else - { - return false; - } - + return isInIgnoreList(id.getShortId()); } // isInIgnoreList // @@ -194,11 +186,21 @@ bool CChatClient::isInIgnoreList( const TDataSetRow &id ) return isInIgnoreList(ei); } +//----------------------------------------------- +// isInIgnoreList : +// +//----------------------------------------------- +bool CChatClient::isInIgnoreList( uint32 id ) +{ + TIgnoreListCont::const_iterator itIgnore = _IgnoreList.find(id); + return itIgnore != _IgnoreList.end(); +} + //----------------------------------------------- // setIgnoreList // //----------------------------------------------- -void CChatClient::setIgnoreList(const std::vector<NLMISC::CEntityId> &ignoreList) +void CChatClient::setIgnoreList(const std::vector<uint32> &ignoreList) { TIgnoreListCont ignoreListCont(ignoreList.begin(), ignoreList.end()); _IgnoreList.swap(ignoreListCont); diff --git a/ryzom/server/src/input_output_service/chat_client.h b/ryzom/server/src/input_output_service/chat_client.h index b59e15fadf..045125b1fa 100644 --- a/ryzom/server/src/input_output_service/chat_client.h +++ b/ryzom/server/src/input_output_service/chat_client.h @@ -86,7 +86,7 @@ public : void setIgnoreStatus( const NLMISC::CEntityId &id, bool ignored); // Set the ignore list - void setIgnoreList(const std::vector<NLMISC::CEntityId> &ignoreList); + void setIgnoreList(const std::vector<uint32> &ignoreList); /** * Return true if the character is in the ignore list of this client @@ -95,6 +95,7 @@ public : */ bool isInIgnoreList( const NLMISC::CEntityId &id ); bool isInIgnoreList( const TDataSetRow &id ); + bool isInIgnoreList( uint32 id ); /** * Add or remove a string filter @@ -228,7 +229,7 @@ private : /// mute delay (in min) sint32 _MuteDelay; - typedef std::set<NLMISC::CEntityId> TIgnoreListCont; + typedef std::set<uint32> TIgnoreListCont; /// this client won't see chat incoming from these characters // std::set<NLMISC::CEntityId> _IgnoreList; TIgnoreListCont _IgnoreList; From 4aecb4ad39b02188cafefc658e07ea26d7ad1a41 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Sat, 2 Dec 2023 11:19:24 +0100 Subject: [PATCH 105/194] Added sendirId into FarTell, manage ignorelist from mongo --- .../src/input_output_service/chat_manager.cpp | 62 ++++++------------- .../src/input_output_service/chat_manager.h | 8 +-- .../src/input_output_service/commands.cpp | 8 ++- .../src/input_output_service/messages.cpp | 12 ++-- 4 files changed, 37 insertions(+), 53 deletions(-) diff --git a/ryzom/server/src/input_output_service/chat_manager.cpp b/ryzom/server/src/input_output_service/chat_manager.cpp index fc5f16978d..fac53ceec2 100644 --- a/ryzom/server/src/input_output_service/chat_manager.cpp +++ b/ryzom/server/src/input_output_service/chat_manager.cpp @@ -1362,7 +1362,7 @@ void CChatManager::chatInGroup( TGroupId& grpId, const ucstring& ucstr, const TD } // chatInGroup // -void CChatManager::farChatInGroup(TGroupId &grpId, uint32 homeSessionId, const ucstring &text, const ucstring &senderName) +void CChatManager::farChatInGroup(TGroupId &grpId, uint32 homeSessionId, const ucstring &text, const ucstring &senderName, uint32 senderCid) { map< TGroupId, CChatGroup >::iterator itGrp = _Groups.find( grpId ); if( itGrp != _Groups.end() ) @@ -1398,7 +1398,7 @@ void CChatManager::farChatInGroup(TGroupId &grpId, uint32 homeSessionId, const u if (EnableDeepL && !usedlang.empty() && usedlang != SM->getLanguageCodeString(charInfo->Language)) continue; - sendFarChat( itGrp->second.Type, *itM, text.substr(startPos), senderName ); + sendFarChat(itGrp->second.Type, *itM, text.substr(startPos), senderName, CEntityId::Unknown, senderCid); } } else @@ -2061,7 +2061,7 @@ void CChatManager::sendChat( CChatGroup::TGroupType senderChatMode, const TDataS } // sendChat // -void CChatManager::sendFarChat(const string &name, const ucstring& ucstr, const string &chan, const string &rocketId) +void CChatManager::sendFarChat(const string &name, const ucstring& ucstr, const string &chan, const string &rocketId, uint32 senderCid) { const TChanID *chanId = _ChanNames.getA(chan); if (chanId || chan == "universe" || chan.substr(0, 6) == "guild:") @@ -2131,13 +2131,13 @@ void CChatManager::sendFarChat(const string &name, const ucstring& ucstr, const if (chan == "universe") { TGroupId grpId = CEntityId(RYZOMID::chatGroup, 0); - farChatInGroup(grpId, 0, ucstr, ucstring("~")+ucstring(name)); + farChatInGroup(grpId, 0, ucstr, ucstring("~"+name), senderCid); } else if (chan.substr(0, 6) == "guild:") { - TGroupId groupId = CEntityId::Unknown; - groupId.fromString(chan.substr(6).c_str()); - farChatInGroup(groupId, 0, ucstr, ucstring("~")+ucstring(name)); + TGroupId grpId = CEntityId::Unknown; + grpId.fromString(chan.substr(6).c_str()); + farChatInGroup(grpId, 0, ucstr, ucstring("~"+name), senderCid); } else { @@ -2145,18 +2145,17 @@ void CChatManager::sendFarChat(const string &name, const ucstring& ucstr, const CDynChatSession *dcc = _DynChat.getChan(*chanId)->getFirstSession(); while (dcc) { - NLMISC::CEntityId receiverId = TheDataset.getEntityId(dcc->getClient()->getID()); CCharacterInfos* co = IOS->getCharInfos(receiverId); if (!EnableDeepL || usedlang.empty() || (co != NULL && usedlang == SM->getLanguageCodeString(co->Language))) - sendFarChat((CChatGroup::TGroupType)12, dcc->getClient()->getID(), ucstr.substr(startPos), ucstring("~")+ucstring(name), *chanId); + sendFarChat((CChatGroup::TGroupType)12, dcc->getClient()->getID(), ucstr.substr(startPos), ucstring("~"+name), *chanId, senderCid); dcc = dcc->getNextChannelSession(); // next session in this channel } } } } -void CChatManager::sendFarChat( CChatGroup::TGroupType senderChatMode, const TDataSetRow &receiver, const ucstring& ucstr, const ucstring &senderName, TChanID chanID) +void CChatManager::sendFarChat( CChatGroup::TGroupType senderChatMode, const TDataSetRow &receiver, const ucstring& ucstr, const ucstring &senderName, TChanID chanID, uint32 senderCid) { CCharacterInfos * receiverInfos = IOS->getCharInfos( TheDataset.getEntityId(receiver) ); if( receiverInfos ) @@ -2166,6 +2165,9 @@ void CChatManager::sendFarChat( CChatGroup::TGroupType senderChatMode, const TDa { if (itCl->second->getId().getType() == RYZOMID::player) { + if (senderCid > 0 && itCl->second->isInIgnoreList(senderCid)) + return; + uint32 senderNameIndex = SM->storeString( senderName ); // send the string to FE @@ -2753,34 +2755,6 @@ void CChatManager::farTell( const NLMISC::CEntityId &senderCharId, const ucstrin // check if the sender is CSR is not in the ignore list of the receiver if((senderInfos && senderInfos->HavePrivilege) || !itCl->second->isInIgnoreList(senderCharId) ) { - // check if user is afk -// if ( receiverInfos->DataSetIndex.isValid() && TheDataset.isDataSetRowStillValid( receiverInfos->DataSetIndex ) ) -// { -// CMirrorPropValue<uint16> mirrorValue( TheDataset, receiverInfos->DataSetIndex, DSPropertyCONTEXTUAL ); -// CProperties prop(mirrorValue); -// if ( prop.afk() ) -// { -// // send special message to user -// SM_STATIC_PARAMS_1( vect, STRING_MANAGER::player ); -// vect[0].setEId( receiverInfos->EntityId ); -// uint32 phraseId = STRING_MANAGER::sendStringToClient( senderInfos->DataSetIndex, "TELL_PLAYER_AFK", vect, &IosLocalSender ); -// sendChat2Ex( CChatGroup::tell, senderInfos->DataSetIndex, phraseId ); -// return; -// } -// if ( _UsersIgnoringTells.find( receiverInfos->EntityId ) != _UsersIgnoringTells.end() ) -// { -// // send special message to user (same message as if the receiver was offline) -// SM_STATIC_PARAMS_1( vect, STRING_MANAGER::literal ); -// vect[0].Literal = ucstring( receiver ); -// uint32 phraseId = STRING_MANAGER::sendStringToClient( senderInfos->DataSetIndex, "TELL_PLAYER_UNKNOWN", vect, &IosLocalSender ); -// sendChat2Ex( CChatGroup::tell, senderInfos->DataSetIndex, phraseId ); -// return; -// } -// } - - // info for log the chat message -// string senderName = senderInfos->Name.toString(); - // info for log the chat message string receiverName = receiverInfos->Name.toString(); @@ -3134,6 +3108,7 @@ void CChatManager::update() string chatId; string rocketId; string usedlang; + uint32 sender_cid; double date; bool ig; @@ -3143,6 +3118,7 @@ void CChatManager::update() chatId = obj.getStringField("chatId"); rocketId = obj.getStringField("rocketId"); usedlang = obj.getStringField("lang"); + sender_cid = obj.getIntField("sender_cid"); date = obj.getField("date").numberDouble(); if(date > last_mongo_chat_date) @@ -3169,7 +3145,7 @@ void CChatManager::update() { if (EnableDeepL && chatId.substr(0, 8) == "FACTION_") { - _Log.displayNL("[%s]%s|%s|*|%s-*|%s", rocketId.c_str(), chatId.c_str(), string("~"+name).c_str(), toLower(usedlang).c_str(), text.toUtf8().c_str()); + _Log.displayNL("[%s]%s|~%s#%u|*|%s-*|%s", rocketId.c_str(), chatId.c_str(), name.c_str(), sender_cid, toLower(usedlang).c_str(), text.toUtf8().c_str()); } else { @@ -3185,7 +3161,7 @@ void CChatManager::update() { CDynChatClient *dccClient = dcc->getClient(); if (dccClient) - sendFarChat((CChatGroup::TGroupType)12, dccClient->getID(), text, ucstring("~")+ucstring(name), *chanId); + sendFarChat((CChatGroup::TGroupType)12, dccClient->getID(), text, ucstring("~"+name), *chanId, sender_cid); dcc = dcc->getNextChannelSession(); // next session in this channel } @@ -3199,7 +3175,7 @@ void CChatManager::update() // Send to Deepl if (EnableDeepL) { - _Log.displayNL("[%s]%s|%s|wk|wk-*|%s", rocketId.c_str(), "universe", name.c_str(), chat.c_str()); + _Log.displayNL("[%s]universe|%s#%u|wk|wk-*|%s", rocketId.c_str(), sender_cid, name.c_str(), chat.c_str()); continue; } } @@ -3210,12 +3186,12 @@ void CChatManager::update() else chatId = chatId+"(Atys)"; - farTell(CEntityId(uint64(0)), ucstring("~")+ucstring(name), false, ucstring(chatId), text); + farTell(CEntityId(0, uint64(sender_cid)), ucstring("~"+name), false, ucstring(chatId), text); continue; } if (chatId != "user-unmuted" && chatId != "user-muted") - farChatInGroup(grpId, 0, text, ucstring("~")+ucstring(name)); + farChatInGroup(grpId, 0, text, ucstring("~"+name), sender_cid); } } catch(const DBException& e) diff --git a/ryzom/server/src/input_output_service/chat_manager.h b/ryzom/server/src/input_output_service/chat_manager.h index f8699978b8..f44e3c2b37 100644 --- a/ryzom/server/src/input_output_service/chat_manager.h +++ b/ryzom/server/src/input_output_service/chat_manager.h @@ -179,7 +179,7 @@ public : /** * Transmit a far chat message to a group */ - void farChatInGroup(TGroupId &grpId, uint32 homeSessionId, const ucstring &text, const ucstring &senderName); + void farChatInGroup(TGroupId &grpId, uint32 homeSessionId, const ucstring &text, const ucstring &senderName, uint32 senderCid = 0); /** * Transmit a chat message to the receiver @@ -191,7 +191,7 @@ public : /** * Transmit a chat message to the receiver */ - void farTell( const NLMISC::CEntityId &senderCharId, const ucstring &senderName, bool havePrivilege, const ucstring& receiver, const ucstring& ucstr ); + void farTell( const NLMISC::CEntityId &senderCharId, const ucstring &senderName, bool havePrivilege, const ucstring& receiver, const ucstring& ucstr); /** * Transmit a chat message to the receiver * \param sender is the id of the speaking char @@ -395,8 +395,8 @@ private : /** * Send a far chat message */ - void sendFarChat(const std::string &name, const ucstring& ucstr, const std::string &chan, const std::string &rocketId = ""); - void sendFarChat( CChatGroup::TGroupType senderChatMode, const TDataSetRow &receiver, const ucstring& ucstr, const ucstring &senderName, TChanID chanID = NLMISC::CEntityId::Unknown); + void sendFarChat(const std::string &name, const ucstring& ucstr, const std::string &chan, const std::string &rocketId = "", uint32 senderCid = 0); + void sendFarChat( CChatGroup::TGroupType senderChatMode, const TDataSetRow &receiver, const ucstring& ucstr, const ucstring &senderName, TChanID chanID = NLMISC::CEntityId::Unknown, uint32 senderCid = 0); /** * Send a chat message diff --git a/ryzom/server/src/input_output_service/commands.cpp b/ryzom/server/src/input_output_service/commands.cpp index 02821eeb00..32e75b2481 100644 --- a/ryzom/server/src/input_output_service/commands.cpp +++ b/ryzom/server/src/input_output_service/commands.cpp @@ -771,15 +771,21 @@ NLMISC_COMMAND(farChat, "send far message chat", "<char_name> <chat_id> <message return false; uint32 id; + uint32 senderCid = 0; ucstring ucstr; string rocketId = ""; string name = args[0]; + vector<string> sname; + NLMISC::splitString(name, "#", sname); + if (sname.size() == 2) + NLMISC::fromString(sname[1], senderCid); + ucstr.fromUtf8(args[2]); if (args.size() > 3) rocketId = args[3]; - IOS->getChatManager().sendFarChat(name, ucstr, args[1], rocketId); + IOS->getChatManager().sendFarChat(sname[0], ucstr, args[1], rocketId, senderCid); return true; } diff --git a/ryzom/server/src/input_output_service/messages.cpp b/ryzom/server/src/input_output_service/messages.cpp index 599087077e..cfe3062e28 100644 --- a/ryzom/server/src/input_output_service/messages.cpp +++ b/ryzom/server/src/input_output_service/messages.cpp @@ -650,7 +650,8 @@ static void cbCharacterNameAndLang(CMessage& msgin, const string &serviceName, T ucstring name; TSessionId sessionId; string language; - std::vector<NLMISC::CEntityId> ignoreList; + std::vector<NLMISC::CEntityId> _ignoreList; + std::vector<uint32> ignoreList; bool havePrivilege; try { @@ -667,7 +668,7 @@ static void cbCharacterNameAndLang(CMessage& msgin, const string &serviceName, T msgin.serial(language); // ignoreList - msgin.serialCont(ignoreList); + msgin.serialCont(_ignoreList); // privilege msgin.serial( havePrivilege ); @@ -687,12 +688,13 @@ static void cbCharacterNameAndLang(CMessage& msgin, const string &serviceName, T #ifdef HAVE_MONGO string cids = ""; - for ( uint i = 0; i < ignoreList.size(); i++ ) + for ( uint i = 0; i < _ignoreList.size(); i++ ) { + ignoreList.push_back((uint32)_ignoreList[i].getShortId()); if (i > 0) - cids += toString(",%d", ignoreList[i].getShortId()); + cids += toString(",%u", _ignoreList[i].getShortId()); else - cids += toString("%d", ignoreList[i].getShortId()); + cids += toString("%u", _ignoreList[i].getShortId()); } CMongo::update("ryzom_users", toString("{ 'cid': %d}", TheDataset.getEntityId(chId).getShortId()), toString("{ $set:{ 'ignore': [%s] } }", cids.c_str())); From 4912606d35af79b5bd94f18498cd03e214a1b77e Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Tue, 5 Dec 2023 20:01:29 +0100 Subject: [PATCH 106/194] Fixed issue where items can recover the full HP after stacking --- .../entities_game_service/game_item_manager/game_item.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/game_item_manager/game_item.cpp b/ryzom/server/src/entities_game_service/game_item_manager/game_item.cpp index d94ef48054..0413bff070 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/game_item.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/game_item.cpp @@ -1276,7 +1276,10 @@ CGameItemPtr CGameItem::getItemCopy() item->_RefInventorySlot = INVENTORIES::INVALID_INVENTORY_SLOT; item->_CreatorId = _CreatorId; item->_LockCount = 0; - item->_HP = item->maxDurability(); + if (_HP == 0) + item->_HP = item->maxDurability(); + else + item->_HP = _HP; item->_LatencyEndDate = _LatencyEndDate; item->_Enchantment = _Enchantment; From 1ee03c946686d1b44a09813c169a79292c2b3aa5 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Wed, 6 Dec 2023 03:17:36 +0100 Subject: [PATCH 107/194] Fixed crash on send post form if the select are empty --- nel/src/gui/group_html.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/nel/src/gui/group_html.cpp b/nel/src/gui/group_html.cpp index 5b43c895e1..47f5a4bc16 100644 --- a/nel/src/gui/group_html.cpp +++ b/nel/src/gui/group_html.cpp @@ -3508,8 +3508,14 @@ namespace NLGUI else if (form.Entries[i].ComboBox) { CDBGroupComboBox *cb = form.Entries[i].ComboBox; - entryData = form.Entries[i].SelectValues[cb->getSelection()]; - addEntry = true; + if (cb) + { + if (form.Entries[i].SelectValues.size() > 0) + { + entryData = form.Entries[i].SelectValues[cb->getSelection()]; + addEntry = true; + } + } } else if (form.Entries[i].SelectBox) { From 801742a73e7c950099557b8ae7546b5bc22f0d52 Mon Sep 17 00:00:00 2001 From: nimetu <nimetu@gmail.com> Date: Wed, 6 Dec 2023 15:17:35 +0200 Subject: [PATCH 108/194] Fix non-pow-2 html background textures in directx showing as white --- nel/src/gui/group_html.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nel/src/gui/group_html.cpp b/nel/src/gui/group_html.cpp index 5b43c895e1..0d9b3a0cbe 100644 --- a/nel/src/gui/group_html.cpp +++ b/nel/src/gui/group_html.cpp @@ -366,7 +366,7 @@ namespace NLGUI CViewRenderer &rVR = *CViewRenderer::getInstance(); for(uint i = 0; i < TextureIds.size(); i++) { - rVR.reloadTexture(TextureIds[i].first, dest); + rVR.reloadTexture(TextureIds[i].first, dest, false); TextureIds[i].second->invalidateCoords(); } } @@ -767,7 +767,7 @@ namespace NLGUI // data:image/png;base64,AA...== if (startsWith(url, "data:image/")) { - texId = rVR.createTextureFromDataURL(url); + texId = rVR.createTextureFromDataURL(url, false); return NULL; } @@ -775,7 +775,7 @@ namespace NLGUI // load the image from local files/bnp if (lookupLocalFile(finalUrl, std::string(CFile::getPath(url) + CFile::getFilenameWithoutExtension(url) + ".tga").c_str(), false)) { - texId = rVR.createTexture(finalUrl); + texId = rVR.createTexture(finalUrl, 0, 0, -1, -1, false); return NULL; } @@ -786,7 +786,7 @@ namespace NLGUI LOG_DL("add to download '%s' dest '%s'", finalUrl.c_str(), dest.c_str()); if (CFile::fileExists(dest) && CFile::getFileSize(dest) > 0) - texId = rVR.createTexture(dest); + texId = rVR.createTexture(dest, 0, 0, -1, -1, false); else texId = rVR.newTextureId(dest); From 1b703b7a58cc8a9ca599873069f86b82779dfca2 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Wed, 6 Dec 2023 15:49:31 +0100 Subject: [PATCH 109/194] Added lua functions for Ark Editor --- .../client/data/gamedev/interfaces_v3/ark.lua | 77 ++++++++++++++++++- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark.lua b/ryzom/client/data/gamedev/interfaces_v3/ark.lua index d1dd01688f..93149d59c5 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark.lua @@ -231,10 +231,9 @@ function ArkMissionCatalog:setup() debug("Open ency") getUI("ui:interface:encyclopedia").opened = true; - end -function translateText(id, script, event) +function translateText(id, script, event, dst_lang) framewin = getUI("ui:interface:ark_translate_lesson", false) if framewin == nil then createRootGroupInstance("webig_browser", "ark_translate_lesson", {h=480, w=980}) @@ -246,7 +245,10 @@ function translateText(id, script, event) framewin.x = math.floor((getUI("ui:interface").w - framewin.w) / 2) framewin.y = math.floor((getUI("ui:interface").h + framewin.h) / 2) setTopWindow(framewin) - framewin:find("html"):browse("https://app.ryzom.com/app_arcc/index.php?action=mTrads_Edit&event="..tostring(event).."&trad_name="..tostring(id).."&reload="..script) + if dst_lang then + dst_lang = "&dst_lang="..dst_lang + end + framewin:find("html"):browse("https://app.ryzom.com/app_arcc/index.php?action=mTrads_Edit&event="..tostring(event).."&trad_name="..tostring(id).."&reload="..script..dst_lang) end @@ -263,6 +265,75 @@ function setupArkUrls() game.updateRpItemsUrl = "https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script=11488&command=reset_all" end + +-------------------------------------------------------------------------------- +--- ARK EDITOR --- +-------------------------------------------------------------------------------- + +function ArkSwitchAdvEdition(prefix) + if ArkSwitchAdvEditionSwitch then + ArkSwitchAdvEditionSwitch = false + getUICaller():showDiv("advEditionDiv"..prefix, false) + else + ArkSwitchAdvEditionSwitch = true + getUICaller():showDiv("advEditionDiv"..prefix, true) + end +end + +function ArkShowStageDiv(name, state) + getUICaller():showDiv(name, state) +end + +function ArkSelectRyform(curwin, id, mod) + e = ArkGetStageEdit(__CURRENT_WINDOW__):find(id..":eb") + e.input_string = mod + ArkGetStageEdit(__CURRENT_WINDOW__):find("send:b"):runLeftClickAction() +end + +function ArkSendForm(name) + ArkGetStageEdit(__CURRENT_WINDOW__):find(name.."__command:eb").input_string = "reset" + ArkGetStageEdit(__CURRENT_WINDOW__):find("send:b"):runLeftClickAction() +end + +function ArkGetStageEdit(curwin) + local sid = string.split(curwin, ":") + local eid = sid[#sid] + table.remove(sid, #sid) + local id = sid[1] + for i = 2, #sid do + id = id .. ":" .. sid[i] + end + return getUI(id):find(eid) +end + +function ArkFindUI(name) + local i = 0 + local ui = getUICaller() + while true do + local found = ui:find(name) + if found ~= nil then + return found + else + ui = ui.parent + end + i = i +1 + if i >= 100 then + return nil + end + end +end + +function ArkOnSelectChanged(name) + local text = ArkRyformV5[name][getUICaller().selection+1] + ArkFindUI(name..":eb").input_string = text +end + + + + + + + if S2E1 == nil then S2E1 = {} end From 5ff37f6e1bd2da5bbb9916597844c44c1043d536 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 8 Dec 2023 00:34:00 +0100 Subject: [PATCH 110/194] Fixe --- ryzom/server/src/input_output_service/chat_client.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/ryzom/server/src/input_output_service/chat_client.cpp b/ryzom/server/src/input_output_service/chat_client.cpp index bb80314e59..293d2bba17 100644 --- a/ryzom/server/src/input_output_service/chat_client.cpp +++ b/ryzom/server/src/input_output_service/chat_client.cpp @@ -170,7 +170,6 @@ void CChatClient::setIgnoreStatus( const NLMISC::CEntityId &id, bool ignored) //----------------------------------------------- bool CChatClient::isInIgnoreList( const NLMISC::CEntityId &id ) { - TIgnoreListCont::const_iterator itIgnore = _IgnoreList.find(id); return isInIgnoreList(id.getShortId()); } // isInIgnoreList // From 137eb7532149acfe7f4d99b1dc002f6121f821b4 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 8 Dec 2023 20:45:19 +0100 Subject: [PATCH 111/194] Added server tools services --- .../tools/services/_startup/Arma/AppCMD | 14 ++ .../tools/services/_startup/Arma/Ch2Web | 8 + .../tools/services/_startup/Arma/DeepL_DE | 16 ++ .../tools/services/_startup/Arma/DeepL_EN | 16 ++ .../tools/services/_startup/Arma/DeepL_ES | 16 ++ .../tools/services/_startup/Arma/DeepL_FR | 16 ++ .../tools/services/_startup/Arma/DeepL_RU | 16 ++ .../tools/services/_startup/Arma/EgsLogs | 7 + .../tools/services/_startup/Arma/KillRAS | 27 +++ .../server/tools/services/_startup/Arma/Logs | 11 + .../server/tools/services/_startup/Arma/RIBS | 4 + .../server/tools/services/_startup/screen.rc | 13 ++ .../tools/services/_startup/start_all.sh | 29 +++ ryzom/server/tools/services/deepl.py | 212 ++++++++++++++++++ ryzom/server/tools/services/kill_ras.sh | 23 ++ 15 files changed, 428 insertions(+) create mode 100755 ryzom/server/tools/services/_startup/Arma/AppCMD create mode 100755 ryzom/server/tools/services/_startup/Arma/Ch2Web create mode 100755 ryzom/server/tools/services/_startup/Arma/DeepL_DE create mode 100755 ryzom/server/tools/services/_startup/Arma/DeepL_EN create mode 100755 ryzom/server/tools/services/_startup/Arma/DeepL_ES create mode 100755 ryzom/server/tools/services/_startup/Arma/DeepL_FR create mode 100755 ryzom/server/tools/services/_startup/Arma/DeepL_RU create mode 100755 ryzom/server/tools/services/_startup/Arma/EgsLogs create mode 100755 ryzom/server/tools/services/_startup/Arma/KillRAS create mode 100755 ryzom/server/tools/services/_startup/Arma/Logs create mode 100755 ryzom/server/tools/services/_startup/Arma/RIBS create mode 100644 ryzom/server/tools/services/_startup/screen.rc create mode 100755 ryzom/server/tools/services/_startup/start_all.sh create mode 100644 ryzom/server/tools/services/deepl.py create mode 100755 ryzom/server/tools/services/kill_ras.sh diff --git a/ryzom/server/tools/services/_startup/Arma/AppCMD b/ryzom/server/tools/services/_startup/Arma/AppCMD new file mode 100755 index 0000000000..7d3ed27f79 --- /dev/null +++ b/ryzom/server/tools/services/_startup/Arma/AppCMD @@ -0,0 +1,14 @@ +#!/bin/sh + +cd /home/nevrax/tmp/xml_chars/ +while true +do + inotifywait -e close_write from_appadmin + echo "------------" + echo "New command :" + cat from_appadmin + echo "------------" + sh from_appadmin + echo "" > from_appadmin +done + diff --git a/ryzom/server/tools/services/_startup/Arma/Ch2Web b/ryzom/server/tools/services/_startup/Arma/Ch2Web new file mode 100755 index 0000000000..b86f842fd2 --- /dev/null +++ b/ryzom/server/tools/services/_startup/Arma/Ch2Web @@ -0,0 +1,8 @@ +#!/bin/sh +mkdir -p /run/user/1000/chweb/ + +while true +do + cd $SHARD_PATH/tools/send_characters_to_web + bash send_characters_to_web.sh +done diff --git a/ryzom/server/tools/services/_startup/Arma/DeepL_DE b/ryzom/server/tools/services/_startup/Arma/DeepL_DE new file mode 100755 index 0000000000..109313b854 --- /dev/null +++ b/ryzom/server/tools/services/_startup/Arma/DeepL_DE @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=de + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG atys +done diff --git a/ryzom/server/tools/services/_startup/Arma/DeepL_EN b/ryzom/server/tools/services/_startup/Arma/DeepL_EN new file mode 100755 index 0000000000..77e6339e5c --- /dev/null +++ b/ryzom/server/tools/services/_startup/Arma/DeepL_EN @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=en + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG atys +done diff --git a/ryzom/server/tools/services/_startup/Arma/DeepL_ES b/ryzom/server/tools/services/_startup/Arma/DeepL_ES new file mode 100755 index 0000000000..ee1bc2d0b0 --- /dev/null +++ b/ryzom/server/tools/services/_startup/Arma/DeepL_ES @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=es + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG atys +done diff --git a/ryzom/server/tools/services/_startup/Arma/DeepL_FR b/ryzom/server/tools/services/_startup/Arma/DeepL_FR new file mode 100755 index 0000000000..9d0afc728e --- /dev/null +++ b/ryzom/server/tools/services/_startup/Arma/DeepL_FR @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +#trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=fr + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG atys +done diff --git a/ryzom/server/tools/services/_startup/Arma/DeepL_RU b/ryzom/server/tools/services/_startup/Arma/DeepL_RU new file mode 100755 index 0000000000..757e0d4f72 --- /dev/null +++ b/ryzom/server/tools/services/_startup/Arma/DeepL_RU @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=ru + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG atys +done diff --git a/ryzom/server/tools/services/_startup/Arma/EgsLogs b/ryzom/server/tools/services/_startup/Arma/EgsLogs new file mode 100755 index 0000000000..08ad16933d --- /dev/null +++ b/ryzom/server/tools/services/_startup/Arma/EgsLogs @@ -0,0 +1,7 @@ +#!/bin/sh + +while true +do + python3 ../../check_outpost_logs.py /home/nevrax/shard/logs/entities_game_service.log +done + diff --git a/ryzom/server/tools/services/_startup/Arma/KillRAS b/ryzom/server/tools/services/_startup/Arma/KillRAS new file mode 100755 index 0000000000..e0b9e91a23 --- /dev/null +++ b/ryzom/server/tools/services/_startup/Arma/KillRAS @@ -0,0 +1,27 @@ +#!/bin/bash +echo "0" > /tmp/killras.count +while true +do + RAS_PID=$(ps aux | grep "/sbin/ryzom_admin_service --" | grep -v "bash" | grep -v grep | awk '{print $2}') + RAS_CPU=$(top -b -n 1 -p $RAS_PID | tail -1 | awk '{print $9}' | cut -d"," -f1) + echo -n "$RAS_CPU " + if (( RAS_CPU >= 150 )) + then + count=$(cat /tmp/killras.count) + if (( count > 5 )) + then + date + echo "$RAS_PID : KILLED!" + kill $RAS_PID + echo "0" > /tmp/killras.count + else + date + echo "$RAS_PID $RAS_CPU : HOT" + let count++ + echo "$count" > /tmp/killras.count + fi + else + echo "0" > /tmp/killras.count + fi + sleep 1 +done diff --git a/ryzom/server/tools/services/_startup/Arma/Logs b/ryzom/server/tools/services/_startup/Arma/Logs new file mode 100755 index 0000000000..15a0012fce --- /dev/null +++ b/ryzom/server/tools/services/_startup/Arma/Logs @@ -0,0 +1,11 @@ +#!/bin/sh + +while true +do + DAY=$(date +%d) + MONTH=$(date +%m) + YEAR=$(date +%Y) + python3 ../../rocket_logs_errors.py /home/nevrax/logs/login/$YEAR/$MONTH/error.$DAY.log LOGIN + sleep 10 +done + diff --git a/ryzom/server/tools/services/_startup/Arma/RIBS b/ryzom/server/tools/services/_startup/Arma/RIBS new file mode 100755 index 0000000000..91e31f882b --- /dev/null +++ b/ryzom/server/tools/services/_startup/Arma/RIBS @@ -0,0 +1,4 @@ +#!/bin/bash + +cd ~/ribs/server +./start_server.sh diff --git a/ryzom/server/tools/services/_startup/screen.rc b/ryzom/server/tools/services/_startup/screen.rc new file mode 100644 index 0000000000..f10fa9c30d --- /dev/null +++ b/ryzom/server/tools/services/_startup/screen.rc @@ -0,0 +1,13 @@ +defscrollback 5000 +mousetrack on +hardstatus on +hardstatus alwayslastline +# hardstatus string "%{.kW}%-w%{.bW}%t [%n]%{-}%+w %=%{..G} %H %{..Y} %Y/%m/%d %c" +hardstatus string "%{= kG}[%{G}%H%? %1`%?%{g}][%= %{= kw}%-w%{+b yk} %n*%t%?(%u)%? %{-}%+w %=%{g}][%{B}%m/%d %{W}%C%A%{g}]" + +# quickly switch between regions using tab and arrows +bindkey "^[[1;5D" prev +bindkey "^[[1;5C" next + +termcapinfo xterm* 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007:ti@:te@' + diff --git a/ryzom/server/tools/services/_startup/start_all.sh b/ryzom/server/tools/services/_startup/start_all.sh new file mode 100755 index 0000000000..28aec4cb3d --- /dev/null +++ b/ryzom/server/tools/services/_startup/start_all.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +# Check if screen is runnning +cd $(dirname "$0")/services + +SHARD=$(hostname -s) + +if [ $(screen -list | grep \\\.services | wc -l) != 1 ] +then + echo "Services Screen not running. Starting..." + screen -dmS services -c ../screen.rc +else + echo "Good! Services Screen is running" +fi + +# Check if each services is running in a screen window +WINDOWS=$(screen -S services -Q windows) +for service in * +do + CHECK=$(echo "$WINDOWS" | grep "$service") + if [ -z "$CHECK" ] + then + echo "Service '$service' need be started! Do it..." + screen -S services -p bash -X stuff "cd ~/scripts/_startup/$SHARD && screen -t $service ./$service\n" + else + echo "Good! Service '$service' is up" + fi +done + diff --git a/ryzom/server/tools/services/deepl.py b/ryzom/server/tools/services/deepl.py new file mode 100644 index 0000000000..908a16bffd --- /dev/null +++ b/ryzom/server/tools/services/deepl.py @@ -0,0 +1,212 @@ +#!/bin/env python3 + +import os, sys, json, time, subprocess +import importlib.util +import urllib.request +import urllib.parse +import pyinotify +import pymongo + +from admin_modules_itf import queryShard + +mongoclient = pymongo.MongoClient("mongodb://arma.ryzom.com:22110/") +mongodb = mongoclient["megacorp_live"] +ryzom_chats = mongodb["ryzom_chats"] + +ALL_LANGS = ["de", "en", "es", "fr", "ru"] + +logfilename="/home/nevrax/shard/logs/chat/chat.log" +def getLang(lang): + return ":"+lang+":" + +def getDeepLang(lang): + return lang.upper() + +dirs = os.listdir("/home/nevrax/shard/logs/chat/") + +def follow(thefile): + thefile.seek(0,os.SEEK_END) + file_size = os.stat(logfilename).st_size + while True: + line = thefile.readline() + if line: + yield line + else: + size = os.stat(logfilename).st_size + if file_size > size: + sys.exit() + file_size = size + time.sleep(0.01) + continue + +only_lang = sys.argv[1] +shard_domain = "("+sys.argv[2][0].upper()+sys.argv[2][1:]+")" +print("Translating only in "+only_lang.upper()+" from "+shard_domain[1:-1]+"..") + +# load all terms +terms = {} +for src in ALL_LANGS: + if only_lang != src: + terms[src] = {} + with open("deepl_terms/"+src+"-"+only_lang+".json") as f: + content = json.load(f) + for term in content: + terms[src][term[0].lower()] = term[1] + +logfile = open(logfilename, "r", encoding="utf-8", errors="replace") +loglines = follow(logfile) +for line in loglines: + + sline = line.split(" : ") + + orig = " : ".join(sline[1:]).split("|") + if len(orig) >= 5: + print("-------------------------------------------------------") + print(orig) + print("---") + + + command = "chat" + prefix = ">" + domain = shard_domain + + ### CHANNEL ### + channel = orig[0] + rocket_id = "" + if channel[0] == "[": + schannel = channel[1:].split("]") + rocket_id = schannel[0] + channel = schannel[1] + + + if channel[0] == "#": + channel = channel[1:] + is_dynamic = True + else: + is_dynamic = False + + if channel in ("FACTION_EN", "FACTION_ES", "FACTION_DE", "FACTION_FR", "FACTION_RU") : + channel = "universe" + + if channel in ("FACTION_RF-EN", "FACTION_RF-ES", "FACTION_RF-DE", "FACTION_RF-FR", "FACTION_RF-RU") : + channel = "FACTION_RF" + + if not channel in ("say", "shout", "arround", "universe", "FACTION_RF") and channel[:7] != "region:" and channel[:6] != "guild:" and channel[:5] != "team:" and channel[:8] != "FACTION_" and channel[:7] != "league_": + print("bye...") + continue + + print("Channel:", channel) + print("RocketId:", rocket_id) + + ### USER ### + suser = orig[1].split("$")[0].split("@") + username = orig[1].split("$")[0] + if len(suser) == 2: + user = suser[1].lower() + else: + user = suser[0].lower() + if "(" in user: + user = user.split("(")[0] + + if user[0] == "~": # it's a rocket chat message, send it as far message + user = user[1:] + command = "farChat" + domain = "" + prefix = "" + + print("User:", user) + print("Command:", command) + + ### NBR RECEIVERS ### + nbr_receivers = orig[2] + + ### LANGS ### + langs = orig[3].split("-") + source = langs[0] + + if not source in ALL_LANGS: + source = "" + + print("Source:", source) + + ### TEXT ### + text = "|".join(orig[4:]).strip() + if not text or text == " ": + continue + + original_text = text.replace('"', '\'\'') + + print("Text: [", original_text, "]") + + if source == "": + # User lang factions, send only one test + if only_lang == "en": + queryShard("ios", command+" "+user+domain+" "+channel+" \""+prefix+original_text+"\"", False) + else: + + if channel[:12] != "FACTION_USR_": + if channel == "arround": + text = text[5:] + + if len(langs) > 1 and langs[1] == "*": + langs = [source] + ALL_LANGS + + for lang in langs[1:]: + if lang != source and lang == only_lang: + stext = text.split(" ") + final_text = [] + for word in stext: + w = word.lower() + if w in terms[source]: + final_text.append("<x>"+terms[source][w]+"</x>") + else: + final_text.append(word) + text = " ".join(final_text) + + data = { + "auth_key": "d8d46b41-5a26-d1d2-90e0-b3ab3e736fe6", + "tag_handling": "xml", + "ignore_tags": "x", + "text": text, + "target_lang": getDeepLang(lang) + } + + if source: + data["source_lang"] = getDeepLang(source) + + data = urllib.parse.urlencode(data) + data = data.encode("utf-8") + + try: + with urllib.request.urlopen("https://api.deepl.com/v2/translate", data, timeout=2) as f: + response = f.read() + translated = json.loads(response.decode("utf-8")) + source_lang = translated["translations"][0]["detected_source_language"].lower() + translated = translated["translations"][0]["text"].replace('"', '\'\'') + except Exception as e: + print("DeepL Error...", e) + translated = text + source_lang = lang + + translated = translated.replace("<x>", "").replace("</x>", "") + + # UNUSED + if not source_lang in ("en", "de", "es", "fr", "ru"): + source_lang = "en" + + print("[%s] => [%s] : %s" % (source_lang, lang, translated)) + print("---") + print(command+" "+user+domain+" "+channel+" \""+prefix+"{"+getLang(lang)+original_text+"}@{ "+translated+"\"") + print("") + if channel == "arround": + queryShard("ios", command+" "+user+domain+" "+channel+" \""+prefix+getLang(lang)+"&EMT&{"+getLang(source_lang)+original_text+"}@{ "+translated+"\" "+rocket_id, False) + else: + queryShard("ios", command+" "+user+domain+" "+channel+" \""+prefix+getLang(lang)+"{"+getLang(source_lang)+original_text+"}@{ "+translated+"\" "+rocket_id, False) + + if source == only_lang and (channel == "universe" or channel[:8] == "FACTION_" or channel[:7] == "league_"): + queryShard("ios", command+" "+user+domain+" "+channel+" \""+prefix+getLang(source)+original_text+"\" "+rocket_id, False) + + if source == only_lang and channel[:6] == "guild:": + chat = { "_id": rocket_id, "username": username, "chat": getLang(source)+original_text, "chatType": "guildId", "chatId": int(channel[9:19], 16)-268435456, "date": time.time()*1000, "ig": True, "autoSub": 1} + ryzom_chats.insert_one(chat) + diff --git a/ryzom/server/tools/services/kill_ras.sh b/ryzom/server/tools/services/kill_ras.sh new file mode 100755 index 0000000000..3375eccbc9 --- /dev/null +++ b/ryzom/server/tools/services/kill_ras.sh @@ -0,0 +1,23 @@ +#!/bin/bash +echo "0" > /tmp/killras.count +while true +do + RAS_PID=$(ps aux | grep "/sbin/ryzom_admin_service --" | grep -v "bash" | grep -v grep | awk '{print $2}') + RAS_CPU=$(top -b -n 1 -p $RAS_PID | tail -1 | awk '{print $9}' | cut -d"," -f1) + echo -n "$RAS_CPU " + + count=$(cat /tmp/killras.count) + if (( count > 5 )) + then + date + echo "$RAS_PID : KILLED!" + kill $RAS_PID + echo "0" > /tmp/killras.count + else + date + echo "$RAS_PID $RAS_CPU : HOT" + let count++ + echo "$count" > /tmp/killras.count + fi + sleep 1 +done From a770385dd3ae6a31ce5b739b660670fb60fdee29 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 8 Dec 2023 20:50:20 +0100 Subject: [PATCH 112/194] Added server tools services --- .../tools/services/_startup/Gingo/Ais_R | 16 +++++ .../tools/services/_startup/Gingo/AutoRibs | 60 +++++++++++++++++++ .../tools/services/_startup/Gingo/DeepL_DE | 16 +++++ .../tools/services/_startup/Gingo/DeepL_EN | 16 +++++ .../tools/services/_startup/Gingo/DeepL_ES | 16 +++++ .../tools/services/_startup/Gingo/DeepL_FR | 16 +++++ .../tools/services/_startup/Gingo/DeepL_RU | 16 +++++ .../server/tools/services/_startup/Gingo/RIBS | 4 ++ .../tools/services/_startup/Yubo/AutoRibs | 60 +++++++++++++++++++ .../tools/services/_startup/Yubo/DeepL_DE | 16 +++++ .../tools/services/_startup/Yubo/DeepL_EN | 16 +++++ .../tools/services/_startup/Yubo/DeepL_ES | 16 +++++ .../tools/services/_startup/Yubo/DeepL_FR | 16 +++++ .../tools/services/_startup/Yubo/DeepL_RU | 16 +++++ ryzom/server/tools/services/_startup/Yubo/RC | 12 ++++ .../server/tools/services/_startup/Yubo/RIBS | 4 ++ ryzom/server/tools/services/deepl.py | 11 +++- .../tools/services/update_deepl_terms.sh | 12 ++++ 18 files changed, 337 insertions(+), 2 deletions(-) create mode 100755 ryzom/server/tools/services/_startup/Gingo/Ais_R create mode 100755 ryzom/server/tools/services/_startup/Gingo/AutoRibs create mode 100755 ryzom/server/tools/services/_startup/Gingo/DeepL_DE create mode 100755 ryzom/server/tools/services/_startup/Gingo/DeepL_EN create mode 100755 ryzom/server/tools/services/_startup/Gingo/DeepL_ES create mode 100755 ryzom/server/tools/services/_startup/Gingo/DeepL_FR create mode 100755 ryzom/server/tools/services/_startup/Gingo/DeepL_RU create mode 100755 ryzom/server/tools/services/_startup/Gingo/RIBS create mode 100755 ryzom/server/tools/services/_startup/Yubo/AutoRibs create mode 100755 ryzom/server/tools/services/_startup/Yubo/DeepL_DE create mode 100755 ryzom/server/tools/services/_startup/Yubo/DeepL_EN create mode 100755 ryzom/server/tools/services/_startup/Yubo/DeepL_ES create mode 100755 ryzom/server/tools/services/_startup/Yubo/DeepL_FR create mode 100755 ryzom/server/tools/services/_startup/Yubo/DeepL_RU create mode 100755 ryzom/server/tools/services/_startup/Yubo/RC create mode 100755 ryzom/server/tools/services/_startup/Yubo/RIBS create mode 100644 ryzom/server/tools/services/update_deepl_terms.sh diff --git a/ryzom/server/tools/services/_startup/Gingo/Ais_R b/ryzom/server/tools/services/_startup/Gingo/Ais_R new file mode 100755 index 0000000000..f274f0fb6f --- /dev/null +++ b/ryzom/server/tools/services/_startup/Gingo/Ais_R @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +AIS=ais_roots + +while true +do + touch $SHARD_PATH/logs/ai_service_${AIS}.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 ais_check.py $SHARD_PATH/logs/ai_service_${AIS}.log $AIS $(hostname -s) +done diff --git a/ryzom/server/tools/services/_startup/Gingo/AutoRibs b/ryzom/server/tools/services/_startup/Gingo/AutoRibs new file mode 100755 index 0000000000..8a646170f6 --- /dev/null +++ b/ryzom/server/tools/services/_startup/Gingo/AutoRibs @@ -0,0 +1,60 @@ +#!/bin/bash + +echo "Checking /home/nevrax/www/public_html/ribs_hook.cmd ..." +tail -n 0 --follow=name /home/nevrax/www/public_html/ribs_hook.cmd | while read LINE0 +do + cmd=${LINE0} + echo "Getting command: $cmd" + + if [ "$cmd" == "client" ] + then + cd /home/nevrax/repos/ryzom-core + BRANCH=$(git branch | grep \* | cut -d ' ' -f2) + REMOTE=$(git ls-remote -q --heads | grep "refs/heads/$BRANCH" | awk '{ print $1 }') + LOCAL=$(git rev-parse HEAD) + + echo "$LOCAL vs $REMOTE" + FILES=$(git diff --name-only $REMOTE $LOCAL) + echo "$FILES" > /home/nevrax/files.txt + + if [ "$LOCAL" == "$REMOTE" ] + then + echo "Latest version, no need update..." + else + git pull + + if [[ ! $(grep -c '^ryzom/nel' /home/nevrax/files.txt) == 0 || ! $(grep -c '^ryzom/client' /home/nevrax/files.txt) == 0 || ! $(grep -c '^ryzom/common' /home/nevrax/files.txt) == 0 ]] + then + echo -e -n "build/ryzom_build_client.sh|Run|64 Windows Linux\ndata/generate_client_data.sh|Run|Clients\ndata/patch_client.sh|Run|-" >> /home/nevrax/www/public_html/autoribs_hook.cmd + fi + + if [[ ! $(grep -c '^ryzom/nel' /home/nevrax/files.txt) == 0 || ! $(grep -c '^ryzom/server' /home/nevrax/files.txt) == 0 || ! $(grep -c '^ryzom/common' /home/nevrax/files.txt) == 0 ]] + then + echo -e -n "build/ryzom_build_server.sh|Run|Nel" >> /home/nevrax/www/public_html/autoribs_hook.cmd + fi + fi + + elif [ "$cmd" == "client-data" ] + then + cd /home/nevrax/repos/ryzom-data + BRANCH=$(git branch | grep \* | cut -d ' ' -f2) + REMOTE=$(git ls-remote -q --heads | grep "refs/heads/$BRANCH" | awk '{ print $1 }') + LOCAL=$(git rev-parse HEAD) + + echo "$LOCAL vs $REMOTE" + if [ "$LOCAL" == "$REMOTE" ] + then + echo "Latest version, no need update..." + else + git pull + echo -e -n "data/generate_client_data.sh|Run|Data\ndata/patch_client.sh|Run|-" >> /home/nevrax/www/public_html/autoribs_hook.cmd + fi + elif [ "$cmd" == "restart-shard" ] + then + cd /home/nevrax/ribs/server + #sh run_ribs.sh shard/ryzom_stop_shard.sh Run kickall + #1sh run_ribs.sh shard/ryzom_start_shard.sh Run Silent + #sh run_ribs.sh shard/ryzom_open_shard.sh Run - + fi +done + diff --git a/ryzom/server/tools/services/_startup/Gingo/DeepL_DE b/ryzom/server/tools/services/_startup/Gingo/DeepL_DE new file mode 100755 index 0000000000..5f4dea0f19 --- /dev/null +++ b/ryzom/server/tools/services/_startup/Gingo/DeepL_DE @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=de + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG $(hostname -s) +done diff --git a/ryzom/server/tools/services/_startup/Gingo/DeepL_EN b/ryzom/server/tools/services/_startup/Gingo/DeepL_EN new file mode 100755 index 0000000000..3c60cb1b13 --- /dev/null +++ b/ryzom/server/tools/services/_startup/Gingo/DeepL_EN @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=en + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG $(hostname -s) +done diff --git a/ryzom/server/tools/services/_startup/Gingo/DeepL_ES b/ryzom/server/tools/services/_startup/Gingo/DeepL_ES new file mode 100755 index 0000000000..0f5334852f --- /dev/null +++ b/ryzom/server/tools/services/_startup/Gingo/DeepL_ES @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=es + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG $(hostname -s) +done diff --git a/ryzom/server/tools/services/_startup/Gingo/DeepL_FR b/ryzom/server/tools/services/_startup/Gingo/DeepL_FR new file mode 100755 index 0000000000..8e73301b5e --- /dev/null +++ b/ryzom/server/tools/services/_startup/Gingo/DeepL_FR @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=fr + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG $(hostname -s) +done diff --git a/ryzom/server/tools/services/_startup/Gingo/DeepL_RU b/ryzom/server/tools/services/_startup/Gingo/DeepL_RU new file mode 100755 index 0000000000..9fdfb72237 --- /dev/null +++ b/ryzom/server/tools/services/_startup/Gingo/DeepL_RU @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=ru + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG $(hostname -s) +done diff --git a/ryzom/server/tools/services/_startup/Gingo/RIBS b/ryzom/server/tools/services/_startup/Gingo/RIBS new file mode 100755 index 0000000000..91e31f882b --- /dev/null +++ b/ryzom/server/tools/services/_startup/Gingo/RIBS @@ -0,0 +1,4 @@ +#!/bin/bash + +cd ~/ribs/server +./start_server.sh diff --git a/ryzom/server/tools/services/_startup/Yubo/AutoRibs b/ryzom/server/tools/services/_startup/Yubo/AutoRibs new file mode 100755 index 0000000000..56904c1b68 --- /dev/null +++ b/ryzom/server/tools/services/_startup/Yubo/AutoRibs @@ -0,0 +1,60 @@ +#!/bin/bash + +echo "Checking /home/nevrax/www/public_html/ribs_hook.cmd ..." +tail -n 0 --follow=name /home/nevrax/www/public_html/ribs_hook.cmd | while read LINE0 +do + cmd=${LINE0} + echo "Getting command: $cmd" + + if [ "$cmd" == "client" ] + then + cd /home/nevrax/repos/ryzom-core + BRANCH=$(git branch | grep \* | cut -d ' ' -f2) + REMOTE=$(git ls-remote -q --heads | grep "refs/heads/$BRANCH" | awk '{ print $1 }') + LOCAL=$(git rev-parse HEAD) + + echo "$LOCAL vs $REMOTE" + FILES=$(git diff --name-only $REMOTE $LOCAL) + echo "$FILES" > /home/nevrax/files.txt + + if [ "$LOCAL" == "$REMOTE" ] + then + echo "Latest version, no need update..." + else + git pull + + if [[ ! $(grep -c '^ryzom/nel' /home/nevrax/files.txt) == 0 || ! $(grep -c '^ryzom/client' /home/nevrax/files.txt) == 0 || ! $(grep -c '^ryzom/common' /home/nevrax/files.txt) == 0 ]] + then + echo -e -n "build/ryzom_build_client.sh|Run|64 Windows Linux\ndata/generate_client_data.sh|Run|Clients\ndata/patch_client.sh|Run|-" >> /home/nevrax/www/public_html/autoribs_hook.cmd + fi + + if [[ ! $(grep -c '^ryzom/nel' /home/nevrax/files.txt) == 0 || ! $(grep -c '^ryzom/server' /home/nevrax/files.txt) == 0 || ! $(grep -c '^ryzom/common' /home/nevrax/files.txt) == 0 ]] + then + echo -e -n "build/ryzom_build_server.sh|Run|Nel" >> /home/nevrax/www/public_html/autoribs_hook.cmd + fi + fi + + elif [ "$cmd" == "client-data" ] + then + cd /home/nevrax/repos/ryzom-data + BRANCH=$(git branch | grep \* | cut -d ' ' -f2) + REMOTE=$(git ls-remote -q --heads | grep "refs/heads/$BRANCH" | awk '{ print $1 }') + LOCAL=$(git rev-parse HEAD) + + echo "$LOCAL vs $REMOTE" + if [ "$LOCAL" == "$REMOTE" ] + then + echo "Latest version, no need update..." + else + git pull + echo -e -n "data/generate_client_data.sh|Run|Data\ndata/patch_client.sh|Run|-" >> /home/nevrax/www/public_html/autoribs_hook.cmd + fi + elif [ "$cmd" == "restart-shard" ] + then + cd /home/nevrax/ribs/server + sh run_ribs.sh shard/ryzom_stop_shard.sh Run kickall + sh run_ribs.sh shard/ryzom_start_shard.sh Run Silent + sh run_ribs.sh shard/ryzom_open_shard.sh Run - + fi +done + diff --git a/ryzom/server/tools/services/_startup/Yubo/DeepL_DE b/ryzom/server/tools/services/_startup/Yubo/DeepL_DE new file mode 100755 index 0000000000..b50e80b750 --- /dev/null +++ b/ryzom/server/tools/services/_startup/Yubo/DeepL_DE @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=de + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG yubo +done diff --git a/ryzom/server/tools/services/_startup/Yubo/DeepL_EN b/ryzom/server/tools/services/_startup/Yubo/DeepL_EN new file mode 100755 index 0000000000..9e96b17c8a --- /dev/null +++ b/ryzom/server/tools/services/_startup/Yubo/DeepL_EN @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=en + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG yubo +done diff --git a/ryzom/server/tools/services/_startup/Yubo/DeepL_ES b/ryzom/server/tools/services/_startup/Yubo/DeepL_ES new file mode 100755 index 0000000000..3ce48746bb --- /dev/null +++ b/ryzom/server/tools/services/_startup/Yubo/DeepL_ES @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=es + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG yubo +done diff --git a/ryzom/server/tools/services/_startup/Yubo/DeepL_FR b/ryzom/server/tools/services/_startup/Yubo/DeepL_FR new file mode 100755 index 0000000000..c6426d41eb --- /dev/null +++ b/ryzom/server/tools/services/_startup/Yubo/DeepL_FR @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=fr + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG yubo +done diff --git a/ryzom/server/tools/services/_startup/Yubo/DeepL_RU b/ryzom/server/tools/services/_startup/Yubo/DeepL_RU new file mode 100755 index 0000000000..898dbfb0c7 --- /dev/null +++ b/ryzom/server/tools/services/_startup/Yubo/DeepL_RU @@ -0,0 +1,16 @@ +#!/bin/bash + +# Trap interrupts and exit instead of continuing the loop +trap "echo Exited!; exit;" SIGINT SIGTERM + +cd ~/scripts/ + +LANG=ru + +while true +do + touch $SHARD_PATH/logs/chat/chat.log + export PYTHONPATH=$PYTHONPATH:$SHARD_PATH/tools + export PYTHONIOENCODING=UTF-8 + python3 deepl.py $LANG yubo +done diff --git a/ryzom/server/tools/services/_startup/Yubo/RC b/ryzom/server/tools/services/_startup/Yubo/RC new file mode 100755 index 0000000000..0ba2c2afaa --- /dev/null +++ b/ryzom/server/tools/services/_startup/Yubo/RC @@ -0,0 +1,12 @@ +#!/bin/sh +cd /home/nevrax/scripts/Rocket.Chat + +export INSTANCE_IP=127.0.0.1 +export NODE_ENV=production +export ROOT_URL=https://chatdev.ryzom.com +export MONGO_URL=mongodb://arma.ryzom.com:22110/megacorp_test?replicaSet=mc +export PORT=3000 +export MONGO_OPLOG_URL=mongodb://arma.ryzom.com:22110/local?replicaSet=mc +export METEOR_SETTINGS='{ "local-console-debug":true }' +node main.js --mobile-server https://chatdev.ryzom.com + diff --git a/ryzom/server/tools/services/_startup/Yubo/RIBS b/ryzom/server/tools/services/_startup/Yubo/RIBS new file mode 100755 index 0000000000..91e31f882b --- /dev/null +++ b/ryzom/server/tools/services/_startup/Yubo/RIBS @@ -0,0 +1,4 @@ +#!/bin/bash + +cd ~/ribs/server +./start_server.sh diff --git a/ryzom/server/tools/services/deepl.py b/ryzom/server/tools/services/deepl.py index 908a16bffd..7286d3aca5 100644 --- a/ryzom/server/tools/services/deepl.py +++ b/ryzom/server/tools/services/deepl.py @@ -10,7 +10,7 @@ from admin_modules_itf import queryShard mongoclient = pymongo.MongoClient("mongodb://arma.ryzom.com:22110/") -mongodb = mongoclient["megacorp_live"] +mongodb = mongoclient["megacorp_test"] ryzom_chats = mongodb["ryzom_chats"] ALL_LANGS = ["de", "en", "es", "fr", "ru"] @@ -114,6 +114,13 @@ def follow(thefile): domain = "" prefix = "" + # suser = user.split("#") + # user = suser[0] + # if len(suser) == 2: + # user_cid = suser[1] + # else: + # user_cid = 0 + print("User:", user) print("Command:", command) @@ -205,7 +212,7 @@ def follow(thefile): if source == only_lang and (channel == "universe" or channel[:8] == "FACTION_" or channel[:7] == "league_"): queryShard("ios", command+" "+user+domain+" "+channel+" \""+prefix+getLang(source)+original_text+"\" "+rocket_id, False) - + if source == only_lang and channel[:6] == "guild:": chat = { "_id": rocket_id, "username": username, "chat": getLang(source)+original_text, "chatType": "guildId", "chatId": int(channel[9:19], 16)-268435456, "date": time.time()*1000, "ig": True, "autoSub": 1} ryzom_chats.insert_one(chat) diff --git a/ryzom/server/tools/services/update_deepl_terms.sh b/ryzom/server/tools/services/update_deepl_terms.sh new file mode 100644 index 0000000000..0d0a41cf82 --- /dev/null +++ b/ryzom/server/tools/services/update_deepl_terms.sh @@ -0,0 +1,12 @@ +for src in "de" "en" "es" "fr" "ru" +do + for dst in "de" "en" "es" "fr" "ru" + do + if [ $src != $dst ] + then + echo "$src $dst" + wget -O deepl_terms/$src-$dst.json "http://tears.family/STABLE/deeplist/term-export.php?src=$src&dst=$dst&modules=deepl_alang;deepl_atys;deepl_gaming;deepl_homin;deepl_locations;deepl_mobs;deepl_op;deepl_organizations;deepl_others;deepl_places;deepl_r2;&format=JSON" + fi + done +done + From b1c7fa91d9d19d2627dcdc1d67a2b8c3d46d4072 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <ulukyn@ryzom.com> Date: Tue, 12 Dec 2023 13:54:05 +0100 Subject: [PATCH 113/194] Adding and updating tools --- ryzom/server/tools/restore_process.sh | 12 + .../launch_send_characters_to_web.sh | 5 + .../send_character_to_web.sh | 16 + .../send_characters_to_web.sh | 38 ++ ryzom/server/tools/send_logs_2_web.py | 345 ++++++++++ ryzom/server/tools/start_restore_process.sh | 1 + ryzom/server/tools/start_sync_rrd_graphs.sh | 2 + ryzom/server/tools/sync_rrd_graphs.sh | 13 + ryzom/server/www/libs/nel_message.php | 592 +++++++++--------- ryzom/server/www/tools/broadcast.php | 9 +- ryzom/server/www/tools/manage_shard.php | 23 +- ryzom/server/www/tools/utils.php | 1 + 12 files changed, 751 insertions(+), 306 deletions(-) create mode 100755 ryzom/server/tools/restore_process.sh create mode 100755 ryzom/server/tools/send_characters_to_web/launch_send_characters_to_web.sh create mode 100755 ryzom/server/tools/send_characters_to_web/send_character_to_web.sh create mode 100755 ryzom/server/tools/send_characters_to_web/send_characters_to_web.sh create mode 100755 ryzom/server/tools/send_logs_2_web.py create mode 100755 ryzom/server/tools/start_restore_process.sh create mode 100755 ryzom/server/tools/start_sync_rrd_graphs.sh create mode 100755 ryzom/server/tools/sync_rrd_graphs.sh diff --git a/ryzom/server/tools/restore_process.sh b/ryzom/server/tools/restore_process.sh new file mode 100755 index 0000000000..209d86976c --- /dev/null +++ b/ryzom/server/tools/restore_process.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +echo Launched: $(date) + +cd /home/nevrax/tmp/move/ +while true +do + inotifywait -e close_write from_appadmin + sh from_appadmin > out.log + echo "" > from_appadmin +done + diff --git a/ryzom/server/tools/send_characters_to_web/launch_send_characters_to_web.sh b/ryzom/server/tools/send_characters_to_web/launch_send_characters_to_web.sh new file mode 100755 index 0000000000..9a4eb7881f --- /dev/null +++ b/ryzom/server/tools/send_characters_to_web/launch_send_characters_to_web.sh @@ -0,0 +1,5 @@ +#!/bin/sh - + +cd $SHARD_PATH/tools/send_characters_to_web + +nohup ./send_characters_to_web.sh & diff --git a/ryzom/server/tools/send_characters_to_web/send_character_to_web.sh b/ryzom/server/tools/send_characters_to_web/send_character_to_web.sh new file mode 100755 index 0000000000..24e832f468 --- /dev/null +++ b/ryzom/server/tools/send_characters_to_web/send_character_to_web.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +SUBID=$1 +FILE=$2 +cd $SHARD_PATH/run + + +mkdir -p sc2w + +cp $SHARD_PATH/$SUBID/$FILE sc2w/ +pdr_util -x -s/$SHARD_PATH/common/data_leveldesign/leveldesign/Game_elem/sheet_id.bin sc2w/$FILE +rm sc2w/$FILE + +scp -p -C -r sc2w/* app@app.ryzom.com:/home/api/public_html/server/scripts/achievement_script/new_xml/ +rm sc2w/* + diff --git a/ryzom/server/tools/send_characters_to_web/send_characters_to_web.sh b/ryzom/server/tools/send_characters_to_web/send_characters_to_web.sh new file mode 100755 index 0000000000..5276c70709 --- /dev/null +++ b/ryzom/server/tools/send_characters_to_web/send_characters_to_web.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +TEMP_PATH=/run/user/1000/chweb +mkdir -p $TEMP_PATH + +F=$SHARD_PATH/save/new_save.txt +TP=$TEMP_PATH/toprocess.txt + +while inotifywait -e close_write $F; do + echo "File changed..." + mv $F $TP + touch $F + + for SRC in `sort -u $TP` + do + SRC=$SHARD_PATH/run/$SRC + FN=`basename $SRC .bin` + echo " Xmlize $FN" + if [[ ${SRC} != *"offline_commands"* ]] + then + cp $SRC $TEMP_PATH/ + pdr2xml $TEMP_PATH/$FN.bin > /dev/null + if [ ! -e $TEMP_PATH/$FN.xml ] + then + # TODO sent mail or rocket message + echo "BAD !!!" + exit 1 + fi + fi + done + #rm $TP + rm $TEMP_PATH/*.bin + echo " Sent to app server" + scp -p -C -r $TEMP_PATH/* app@app.ryzom.com:/home/app/www/api/server/scripts/achievement_script/new_xml/ + + rm -f $TEMP_PATH/* +done + diff --git a/ryzom/server/tools/send_logs_2_web.py b/ryzom/server/tools/send_logs_2_web.py new file mode 100755 index 0000000000..7a7e1dc2df --- /dev/null +++ b/ryzom/server/tools/send_logs_2_web.py @@ -0,0 +1,345 @@ +#!/usr/bin/python + +import os, time +import collections +import urllib +import urllib2 + +class SlackClient(object): + + BASE_URL = 'https://ryzom.slack.com/api' + + def __init__(self, token): + self.token = token + + def _make_request(self, method, params): + """Make request to API endpoint + + Note: Ignoring SSL cert validation due to intermittent failures + http://requests.readthedocs.org/en/latest/user/advanced/#ssl-cert-verification + """ + url = "%s/%s" % (SlackClient.BASE_URL, method) + params['token'] = self.token + data = urllib.urlencode(params) + #result = requests.post(url, data=params, verify=False).json() + req = urllib2.Request(url, data) + result = urllib2.urlopen(req) + return result.read() + + def chat_post_message(self, channel, text, username=None, icon=':rage2:', parse=None, link_names=None): + """chat.postMessage + + This method posts a message to a channel. + + https://api.slack.com/methods/chat.postMessage + """ + method = 'chat.postMessage' + params = { + 'channel': channel, + 'text': text, + 'icon_emoji': icon, + } + if username is not None: + params['username'] = username + if parse is not None: + params['parse'] = parse + if link_names is not None: + params['link_names'] = link_names + return self._make_request(method, params) + + + +critic_commands = ("renameplayer", "position", "exchange item", "hp", "createiteminbag","createitemintmpinv","createnamediteminbag","createfullarmorset","aggro","god","money","invulnerable","changevar","addxptoskill","learnallbricks","learnallforagephrases","learnallphrases","learnbrick","learnphrase","summonpet","summon","allowsummonpet", "setfameplayer") + +#2013/05/17 03:34:51 INF 3073373952 newshard.ryzom.com/EGS-139 admin.cpp 3160 cbClientAdmin : ADMIN: Player ((0x0000a70890:00:00:89),Placio(atys)) will execute client admin command 'lockItem (0x0000a70890:00:00:89) bag 28 1' on target Himself +#2013/05/17 21:25:02 INF 3073373952 newshard.ryzom.com/EGS-139 admin.cpp 3278 cbClientAdminOffline : ADMINOFFLINE: Player ((0x00006dd281:00:00:89),Kemen(atys)) will execute client admin command 'addXPToSkill (0x00006dd281:00:00:00) 500 SMOEAEM 5' on target ((0x00006dd281:00:00:00),kemen(atys)) +#2014/11/02 01:30:19 INF 4146730752 newshard.ryzom.com/EGS-132 character.cpp 10983 acceptExchange : ADMIN: CSR ((0x00007ac5b0:00:00:8b),Tamarea(Atys)) exchange ic_candy_stick.sitem Q1 with Aleeskandaro(Atys) +admin_commands = {} +global_commands = {} +new_sorbot_commands = {} + +#data = urllib.urlencode({"t" : ".t ulukyn Running"}) +#req = urllib2.Request('http://app.ryzom.com/sorbot/index.php?'+data) +#r = urllib2.urlopen(req) + +def sorbot_old(line, ctype, name, command, command_args): + global new_sorbot_commands + new_sorbot_commands.append(line) + if not line in sorbot_commands: + data = urllib.urlencode({"t" : ".t ulukyn Player ["+name+"] using '/"+ctype+" "+command+" "+command_args+"' on target: "+line.split("' on target ")[-1][25:-7]+" http://app.ryzom.com/app_admin/player_stats.php?char_name="+name+"&stat=commands"}) + req = urllib2.Request('http://app.ryzom.com/sorbot/index.php?'+data) + r = urllib2.urlopen(req) + +def sorbot(line, ctype, name, command, command_args, target): + if (name == 'Moondev'): + return + + global new_sorbot_commands, sorbot_commands + new_sorbot_commands.append(line) + if (target == "" or target[:2] == 'on'): + if ctype != "a" or command.lower() != "position": + message = '<http://app.ryzom.com/app_admin/player_stats.php?char_name='+name+'&stat=commands|'+name+'> using \'/'+ctype+' '+command+' '+command_args+'\' '+target + else: + message = "" + icon = ':suspect:' + else: + if ctype == " ": + message = '<http://app.ryzom.com/app_admin/player_stats.php?char_name='+name+'&stat=commands|'+name+'> '+command+' '+command_args+'\' with <http://app.ryzom.com/app_admin/player_stats.php?char_name='+target+'|'+target+'>' + elif ctype != "a" or command.lower() != "position": + message = '<http://app.ryzom.com/app_admin/player_stats.php?char_name='+name+'&stat=commands|'+name+'> using \'/'+ctype+' '+command+' '+command_args+'\' on <http://app.ryzom.com/app_admin/player_stats.php?char_name='+target+'|'+target+'>' + else: + message = "" + icon = ':rage2:' + print target, message + if message: + if not line in sorbot_commands: + print "SLACKIT!" + client = SlackClient('xoxb-56970050663-z8Q1WyKLPh1m2K4iRMR4YsPI') + print "RESPONSE:", client.chat_post_message('command-logs', line[:20]+message, 'EGS', icon) + print "SLACK: ", line[:20]+message + else: + print "USED : ", line + else: + print "----" + + +def writelogs(admin_commands, is_current=False, base_path="logged/"): + global global_commands + base = "logs/commands/"+base_path + for player, commands in admin_commands.items(): + s_player = str(player) + if len(s_player) < 2: + s_player = "0"+s_player + if len(s_player) < 3: + s_player = "0"+s_player + + fid = s_player[-1] + if not os.path.isdir(base): + os.mkdir(base) + if not os.path.isdir(base+fid): + os.mkdir(base+fid) + fid2 = s_player[-2] + if not os.path.isdir(base+fid+"/"+fid2): + os.mkdir(base+fid+"/"+fid2) + fid3 = s_player[-3] + if not os.path.isdir(base+fid+"/"+fid2+"/"+fid3): + os.mkdir(base+fid+"/"+fid2+"/"+fid3) + if not os.path.isdir(base+fid+"/"+fid2+"/"+fid3+"/"+str(player)): + os.mkdir(base+fid+"/"+fid2+"/"+fid3+"/"+str(player)) + for mouth, command in commands.items(): + if mouth != "name" and mouth != "total": + if is_current: + open(base+fid+"/"+fid2+"/"+fid3+"/"+str(player)+"/current.log", "w").write(command+"\n") + else: + if os.path.isfile(base+fid+"/"+fid2+"/"+fid3+"/"+str(player)+"/"+mouth.replace("/", "_")+".log"): + previous = open(base+fid+"/"+fid2+"/"+fid3+"/"+str(player)+"/"+mouth.replace("/", "_")+".log").read() + else: + previous = "" + open(base+fid+"/"+fid2+"/"+fid3+"/"+str(player)+"/"+mouth.replace("/", "_")+".log", "w").write(command+"\n"+previous) + + base = "logs/commands/" + for mouth, command in global_commands.items(): + if not os.path.isdir(base+"global"): + os.mkdir(base+"global") + if is_current: + open(base+"global/current.log", "w").write(command+"\n") + else: + if os.path.isfile(base+"global/"+mouth.replace("/", "_")+".log"): + previous = open(base+"global/"+mouth.replace("/", "_")+".log").read() + else: + previsous = "" + open(base+"global/"+mouth.replace("/", "_")+".log", "w").write(command+"\n"+previous) + +def parse(filename): + global global_commands, admin_commands, sorbot_commands, new_sorbot_commands + file = open(filename).read().split("\n") + last_commands = {} + for line in file: + sline = line.split(" ") +# if len(sline) >= 10 and ((sline[9] == "ADMIN:" and sline[10] == "Player") or sline[9] == "ADMINOFFLINE:"): + if "cbClientAdmin : ADMIN: " in line or "ADMINOFFLINE" in line or "ADMIN: CSR" in line : + if "tried to execute a no valid client admin command" in line : + continue + sline = line.split("' on target ") + #Only get text before "on target" + real_line = sline[0] + sline = real_line.split(" ") + day = sline[0] + mouth = day[:4]+day[5:7] + hour = sline[1] + player = sline[11] + splayer = player.split(",") + if splayer[0][4:-10] != '': + cid = int(splayer[0][4:-10], 16) + else: + cid = 0 + if (len(splayer) == 2): + name = splayer[1][:-7] + else: + name = "<undefined>" + + + if "ADMIN: CSR" in line : + print "Exchange :", sline + command = "exchange item" + command_args = sline[13]+" "+sline[14] + target = sline[16] + target_name = sline[16].split("(")[0] + ctype = " " + else: + #Get text between ' and ' + sline = real_line.split("'") + full_command = "'".join(sline[1:]) + + if full_command[-1] == "'": + full_command = full_command[:-1] + scommand = full_command.split(" ") + command = scommand[0] + command_args = " ".join(scommand[2:]) + + if (len(scommand) > 1): + target = scommand[1] + else: + target = "<none>" + target_name = "" + ctype = "c" + if target == "(0x0000000000:ff:00:00)": + target = "<none>" + target_name = "on Nothing" + elif target[:-6] == "(0x"+splayer[0][4:-10]+":00:": + target = "<self>" + target_name = "" + ctype = "a" + elif target[-6:-4] != "00" : + target = "<mob_npc>" + target_name = "on a Mob or Npc" + ctype = "b" + elif len(target) > 20 : + target = "#"+str(int(target[4:-10], 16)) + target_name = line.split(",")[-1].split("(")[0].capitalize() + ctype = "b" + else: + ctype = "a" + + if line[100:120] == "ADMINOFFLINE: Player": + ctype = "c" + sorbot(line, ctype, name, command, command_args, target_name) + + if not cid in admin_commands: + admin_commands[cid] = {} + admin_commands[cid]["total"] = 0 + admin_commands[cid]["name"] = name + if not mouth in admin_commands[cid]: + admin_commands[cid][mouth] = "" + admin_commands[cid][mouth] = "|".join((day, hour, ctype, command, target, command_args))+"\n" + admin_commands[cid][mouth] + admin_commands[cid]["total"] += 1 + +# print command.lower() + if command.lower() in critic_commands: + print command, command_args + if not name in last_commands or not command.lower() in ("addxptoskill","learnbrick","learnphrase"): + print "Setting..." + last_commands[name] = [None, None, None, None, None] + last_commands[name][0] = command + last_commands[name][1] = 1 + last_commands[name][2] = [line, ctype, name, command, command_args, target_name] + last_commands[name][3] = "|".join((str(cid), name, day, hour, ctype, command, target, command_args)) + last_commands[name][4] = mouth + + if command.lower() in ("addxptoskill","learnbrick","learnphrase") and command == last_commands[name][0]: + print "+1" + last_commands[name][1] += 1 + last_commands[name][2] = [line, ctype, name, command, command_args, target_name] + last_commands[name][3] = "|".join((str(cid), name, day, hour, ctype, command, target, command_args)) + last_commands[name][4] = mouth + else : + if last_commands[name][1] > 1 : + print "More than 1 time" + last_commands[name][2][4] = "*"+str(last_commands[name][1])+" times*" + last_commands[name][2][0] += "*"+str(last_commands[name][1])+" times*" + else: + last_commands[name][2][4] = command_args + sorbot(last_commands[name][2][0], last_commands[name][2][1], last_commands[name][2][2], last_commands[name][2][3], last_commands[name][2][4], last_commands[name][2][5]) + print "Sorbot: ", last_commands[name][2], last_commands[name][1] + if not last_commands[name][4] in global_commands: + global_commands[last_commands[name][4]] = "" + global_commands[last_commands[name][4]] = last_commands[name][3]+"\n"+global_commands[last_commands[name][4]] + del(last_commands[name]) + + + for name, last_command in last_commands.items(): + if last_command[1] > 1: + last_command[2][4] += " ["+str(last_command[1])+" times the same command]" + #last_command[2][0] += "*"+str(last_command[1])+" times*" + sorbot(last_command[2][0], last_command[2][1], last_command[2][2], last_command[2][3], last_command[2][4], last_command[2][5]) + print "Sorbot ", last_command[2], last_command[1] + if not last_command[4] in global_commands: + global_commands[last_command[4]] = "" + global_commands[mouth] = last_command[3]+"\n"+global_commands[last_command[4]] + + +BASE_PATH = "logs/commands/" + +if not os.path.isdir(BASE_PATH): + os.mkdir(BASE_PATH) + +if not os.path.isdir(BASE_PATH+"backup"): + os.mkdir(BASE_PATH+"backup") + +if not os.path.isdir(BASE_PATH+"global"): + os.mkdir(BASE_PATH+"global") + + +if not os.path.isfile(BASE_PATH+"last_log"): + open(BASE_PATH+"last_log", "w").write("0") + +if not os.path.isfile("cache/commands"): + open("cache/commands", "w").write("") + + +last_log = int(open(BASE_PATH+"last_log").read()) +sorbot_commands = [] +sorbot_commands = open("cache/commands").read().split("\n") +new_sorbot_commands = [] + +print "Last Log with date : ", last_log +files = os.listdir("logs/") +files.sort() +higher_time = last_log +for filename in files: + if len(filename) > 25 and filename.split(".")[1] == "log" and filename.split(".")[0][:21] == "entities_game_service": + if int(os.path.getmtime("logs/"+filename)) > last_log: + if int(os.path.getmtime("logs/"+filename)) > higher_time: + higher_time = os.path.getmtime("logs/"+filename) + print filename, " NEED PARSING" + parse("logs/"+filename) + +logged_players = len(admin_commands) + +print "Write logs..." +writelogs(admin_commands, False) + +admin_commands = {} +global_commands = {} +filename = "entities_game_service.log" +print filename, " <NEED PARSING!>" +parse("logs/"+filename) +logged_players += len(admin_commands) +open(BASE_PATH+"global/current.log", "w").write("") +writelogs(admin_commands, True, "current/") + +open(BASE_PATH+"last_log", "w").write(str(int(higher_time))) +open("cache/commands", 'w').write("\n".join(new_sorbot_commands)) + + +print "Send logs to web..." +os.system("scp -r "+BASE_PATH+"logged/ nevrax@newweb.ryzom.com:/mnt/tmp/cache/ > /dev/null") +print "Backup..." +os.system("cp -r "+BASE_PATH+"logged/* "+BASE_PATH+"backup") +print "Clean..." +os.system("rm -rf "+BASE_PATH+"logged/*") +print "Send current..." +#os.system("scp -r current/* nevrax@newweb.ryzom.com:/mnt/tmp/cache/logged/ > /dev/null") +print "Done!" + +#os.system("rsync -avz -e ssh logged/ nevrax@web.ryzom.com:/mnt/tmp/cache/logged/") diff --git a/ryzom/server/tools/start_restore_process.sh b/ryzom/server/tools/start_restore_process.sh new file mode 100755 index 0000000000..9bffedf627 --- /dev/null +++ b/ryzom/server/tools/start_restore_process.sh @@ -0,0 +1 @@ +nohup /bin/sh $SHARD_PATH/scripts/restore_process.sh & diff --git a/ryzom/server/tools/start_sync_rrd_graphs.sh b/ryzom/server/tools/start_sync_rrd_graphs.sh new file mode 100755 index 0000000000..2fe8482282 --- /dev/null +++ b/ryzom/server/tools/start_sync_rrd_graphs.sh @@ -0,0 +1,2 @@ +cd $SHARD_PATH/tools +nohup /bin/sh sync_rrd_graphs.sh & diff --git a/ryzom/server/tools/sync_rrd_graphs.sh b/ryzom/server/tools/sync_rrd_graphs.sh new file mode 100755 index 0000000000..66ff5c7833 --- /dev/null +++ b/ryzom/server/tools/sync_rrd_graphs.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +echo Launched: $(date) +while true +do + cd $SHARD_PATH/save/rrd_graphs + + rsync -t * app@app.ryzom.com:/home/admin.atrium/rrd_graphs/ + + # display a groovy message + echo Finished rsync: $(date) + sleep 60 +done diff --git a/ryzom/server/www/libs/nel_message.php b/ryzom/server/www/libs/nel_message.php index 65a415ddf0..d8669f1e44 100644 --- a/ryzom/server/www/libs/nel_message.php +++ b/ryzom/server/www/libs/nel_message.php @@ -1,296 +1,296 @@ -<?php - - $SockTimeOut = 10; - - function debug($text) - { -// flush(); -// echo $text; - } - - class CMemStream - { - var $Buffer; - var $InputStream; - var $Pos; - - function CMemStream () - { - $this->InputStream = false; - $this->Pos = 0; - $this->Buffer = ""; - debug("A : ".gettype($this->Buffer)."<br>"); - } - - function setBuffer ($Buffer) - { - $this->InputStream = true; - $this->Buffer = $Buffer; - $this->Pos = 0; - } - - function isReading () { return $this->InputStream; } - - function serialUInt8 (&$val) - { - if ($this->isReading()) - { - $val = ord($this->Buffer[$this->Pos++]); - debug(sprintf ("read uint8 '%d'<br>\n", $val)); - } - else - { - debug("B".gettype($this->Buffer)."<br>"); - debug(sprintf ("write uint8 Buffer size before = %u<br>\n", strlen($this->Buffer))); - $this->Buffer = $this->Buffer . chr($val & 0xFF); - $this->Pos++; - debug("C".gettype($this->Buffer)."<br>"); - debug(sprintf ("write uint8 '%d' %d<br>\n", $val, $this->Pos)); - debug(sprintf ("write uint8 Buffer size after = %u<br>\n", strlen($this->Buffer))); - } - } - - function serialUInt32 (&$val) - { - if ($this->isReading()) - { - $val = ord($this->Buffer[$this->Pos++]); - $val += ord($this->Buffer[$this->Pos++])*256; - $val += ord($this->Buffer[$this->Pos++])*(double)256*256; - $val += ord($this->Buffer[$this->Pos++])*(double)256*256*256; - debug(sprintf ("read uint32 '%d'<br>\n", $val)); -// var_dump($val); - } - else - { - debug("D".gettype($this->Buffer)."<br>"); - $this->Buffer .= chr($val & 0xFF); - $this->Buffer .= chr(($val>>8) & 0xFF); - $this->Buffer .= chr(($val>>16) & 0xFF); - $this->Buffer .= chr(($val>>24) & 0xFF); - $this->Pos += 4; - debug("E".gettype($this->Buffer)."<br>"); - debug(sprintf ("write uint32 '%d' %d<br>\n", $val, $this->Pos)); - } - } - - function serialString (&$val) - { - if ($this->isReading()) - { - $this->serialUInt32($size); - debug(sprintf ("read string : size = %u<br>\n", $size)); - $val = substr ($this->Buffer, $this->Pos, $size); - debug(sprintf ("read string '%s'<br>\n", $val)); - $this->Pos += strlen($val); - } - else - { - $valLen = strlen($val); - $this->serialUInt32($valLen); - $this->Buffer .= $val; - $this->Pos += $valLen; - debug(sprintf ("write string '%s' %d<br>\n", $val, $this->Pos)); - } - } - function serialEnum (&$val) - { - if ($this->isReading()) - { - $intValue = 0; - $this->serialUInt32($intValue); - $val->fromInt((int)$intValue); - debug(sprintf ("read enum '%s'<br>\n", $val->toString())); - } - else - { - $intValue = $val->toInt(); - $this->serialUInt32($intValue); - debug(sprintf ("write enum '%s' %d<br>\n", $val->toString(), $this->Pos)); - } - } - } - - class CMessage extends CMemStream - { - var $MsgName; - - function CMessage() - { - $this->CMemStream(); - } - - function setName($name) - { - $this->MsgName = $name; - } - } - - class CCallbackClient - { - var $ConSock = false; - - var $MsgNum = 0; - - function connect($addr, $port, &$res) - { - global $SockTimeOut; - - debug(sprintf("Connect<br>")); - $this->MsgNum = 0; - - $this->ConSock = fsockopen ($addr, $port, $errno, $errstr, $SockTimeOut); - debug("H".gettype($this->ConSock)."<br>"); - - if (!$this->ConSock) - { - $res = "Can't connect to the callback server '$addr:$port' ($errno: $errstr)"; - - return false; - } - else - { - // set time out on the socket to 2 secondes - stream_set_timeout($this->ConSock, $SockTimeOut); - $res = ""; - return true; - } - } - - function close() - { - if ($this->ConSock) - { - fclose($this->ConSock); - debug(sprintf("Close<br>")); - } - else - debug(sprintf("Already Closed !<br>")); - } - - function sendMessage(&$message) - { - if (!$this->ConSock) - { - debug(sprintf ("Socket is not valid\n")); - return false; - } - debug(sprintf ("sendMessage : message Buffer is '%d'<br>\n", $message->Pos)); - debug(sprintf ("sendMessage : message Buffer is '%d'<br>\n", strlen($message->Buffer))); - $hd = new CMemStream; - debug(sprintf("SendMessage number %u<br>", $this->MsgNum)); - $hd->serialUInt32 ($this->MsgNum); // number the packet - $this->MsgNum += 1; - debug(sprintf("After SendMessage, number %u<br>", $this->MsgNum)); - $messageType = 0; - $hd->serialUInt8 ($messageType); - $hd->serialString ($message->MsgName); - - debug(sprintf ("sendMessage : header size is '%d'<br>\n", $hd->Pos)); - -// $sb .= $message->Buffer; - - $size = $hd->Pos + $message->Pos; - $Buffer = (string) chr(($size>>24)&0xFF); - $Buffer .= chr(($size>>16)&0xFF); - $Buffer .= chr(($size>>8)&0xFF); - $Buffer .= chr($size&0xFF); - debug( "E".gettype($hd->Buffer)."<br>"); - debug("F".gettype($message->Buffer)."<br>"); - $Buffer .= (string) $hd->Buffer; - $Buffer .= (string) $message->Buffer; - - debug("G".gettype($this->ConSock)."<br>"); - - if (!fwrite ($this->ConSock, $Buffer)) - { - debug(sprintf ("Error writing to socket\n")); - return false; - } - debug(sprintf ("sent packet size '%d' (written size = %d) <br>\n", strlen($Buffer), $size)); - fflush ($this->ConSock); - - return true; - } - - function waitMessage() - { - if (!$this->ConSock) - { - debug(sprintf ("Socket is not valid\n")); - return false; - } - - - $size = 0; - $val = fread ($this->ConSock, 1); - $info = stream_get_meta_data($this->ConSock); - if ($info['timed_out']) - { - debug('Connection timed out!'); - return false; - } - $size = ord($val) << 24; - $val = fread ($this->ConSock, 1); - $info = stream_get_meta_data($this->ConSock); - if ($info['timed_out']) - { - debug('Connection timed out!'); - return false; - } - $size = ord($val) << 16; - $val = fread ($this->ConSock, 1); - $info = stream_get_meta_data($this->ConSock); - if ($info['timed_out']) - { - debug('Connection timed out!'); - return false; - } - $size += ord($val) << 8; - $val = fread ($this->ConSock, 1); - $info = stream_get_meta_data($this->ConSock); - if ($info['timed_out']) - { - debug('Connection timed out!'); - return false; - } - $size += ord($val); - debug(sprintf ("receive packet size '%d'<br>\n", $size)); - $fake = fread ($this->ConSock, 5); - $info = stream_get_meta_data($this->ConSock); - if ($info['timed_out']) - { - debug('Connection timed out!'); - return false; - } - $size -= 5; // remove the fake - - $Buffer = ""; - while ($size > 0 && strlen($Buffer) != $size) - { - $Buffer .= fread ($this->ConSock, $size - strlen($Buffer)); - $info = stream_get_meta_data($this->ConSock); - if ($info['timed_out']) - { - debug('Connection timed out!'); - return false; - } - } - $msgin = new CMemStream; - $msgin->setBuffer ($Buffer); - - // decode msg name - $msgin->serialString($name); - - debug(sprintf("Message name = '%s'<BR>", $name)); - $message = new CMessage; - $message->setBuffer(substr($msgin->Buffer, $msgin->Pos)); - $message->setName($name); - - debug(sprintf("In message name = '%s'<br>", $message->MsgName)); - - return $message; - } - } - -?> +<?php + + $SockTimeOut = 10; + + function debug($text) + { +// flush(); +// echo $text; + } + + class CMemStream + { + var $Buffer; + var $InputStream; + var $Pos; + + function CMemStream () + { + $this->InputStream = false; + $this->Pos = 0; + $this->Buffer = ""; + debug("A : ".gettype($this->Buffer)."<br>"); + } + + function setBuffer ($Buffer) + { + $this->InputStream = true; + $this->Buffer = $Buffer; + $this->Pos = 0; + } + + function isReading () { return $this->InputStream; } + + function serialUInt8 (&$val) + { + if ($this->isReading()) + { + $val = ord($this->Buffer{$this->Pos++}); + debug(sprintf ("read uint8 '%d'<br>\n", $val)); + } + else + { + debug("B".gettype($this->Buffer)."<br>"); + debug(sprintf ("write uint8 Buffer size before = %u<br>\n", strlen($this->Buffer))); + $this->Buffer = $this->Buffer . chr($val & 0xFF); + $this->Pos++; + debug("C".gettype($this->Buffer)."<br>"); + debug(sprintf ("write uint8 '%d' %d<br>\n", $val, $this->Pos)); + debug(sprintf ("write uint8 Buffer size after = %u<br>\n", strlen($this->Buffer))); + } + } + + function serialUInt32 (&$val) + { + if ($this->isReading()) + { + $val = ord($this->Buffer{$this->Pos++}); + $val += ord($this->Buffer{$this->Pos++})*256; + $val += ord($this->Buffer{$this->Pos++})*(double)256*256; + $val += ord($this->Buffer{$this->Pos++})*(double)256*256*256; + debug(sprintf ("read uint32 '%d'<br>\n", $val)); +// var_dump($val); + } + else + { + debug("D".gettype($this->Buffer)."<br>"); + $this->Buffer .= chr($val & 0xFF); + $this->Buffer .= chr(($val>>8) & 0xFF); + $this->Buffer .= chr(($val>>16) & 0xFF); + $this->Buffer .= chr(($val>>24) & 0xFF); + $this->Pos += 4; + debug("E".gettype($this->Buffer)."<br>"); + debug(sprintf ("write uint32 '%d' %d<br>\n", $val, $this->Pos)); + } + } + + function serialString (&$val) + { + if ($this->isReading()) + { + $this->serialUInt32($size); + debug(sprintf ("read string : size = %u<br>\n", $size)); + $val = substr ($this->Buffer, $this->Pos, $size); + debug(sprintf ("read string '%s'<br>\n", $val)); + $this->Pos += strlen($val); + } + else + { + $valLen = strlen($val); + $this->serialUInt32($valLen); + $this->Buffer .= $val; + $this->Pos += $valLen; + debug(sprintf ("write string '%s' %d<br>\n", $val, $this->Pos)); + } + } + function serialEnum (&$val) + { + if ($this->isReading()) + { + $intValue = 0; + $this->serialUInt32($intValue); + $val->fromInt((int)$intValue); + debug(sprintf ("read enum '%s'<br>\n", $val->toString())); + } + else + { + $intValue = $val->toInt(); + $this->serialUInt32($intValue); + debug(sprintf ("write enum '%s' %d<br>\n", $val->toString(), $this->Pos)); + } + } + } + + class CMessage extends CMemStream + { + var $MsgName; + + function CMessage() + { + $this->CMemStream(); + } + + function setName($name) + { + $this->MsgName = $name; + } + } + + class CCallbackClient + { + var $ConSock = false; + + var $MsgNum = 0; + + function connect($addr, $port, &$res) + { + global $SockTimeOut; + + debug(sprintf("Connect<br>")); + $this->MsgNum = 0; + + $this->ConSock = fsockopen ($addr, $port, $errno, $errstr, $SockTimeOut); + debug("H".gettype($this->ConSock)."<br>"); + + if (!$this->ConSock) + { + $res = "Can't connect to the callback server '$addr:$port' ($errno: $errstr)"; + + return false; + } + else + { + // set time out on the socket to 2 secondes + stream_set_timeout($this->ConSock, $SockTimeOut); + $res = ""; + return true; + } + } + + function close() + { + if ($this->ConSock) + { + fclose($this->ConSock); + debug(sprintf("Close<br>")); + } + else + debug(sprintf("Already Closed !<br>")); + } + + function sendMessage(&$message) + { + if (!$this->ConSock) + { + debug(sprintf ("Socket is not valid\n")); + return false; + } + debug(sprintf ("sendMessage : message Buffer is '%d'<br>\n", $message->Pos)); + debug(sprintf ("sendMessage : message Buffer is '%d'<br>\n", strlen($message->Buffer))); + $hd = new CMemStream; + debug(sprintf("SendMessage number %u<br>", $this->MsgNum)); + $hd->serialUInt32 ($this->MsgNum); // number the packet + $this->MsgNum += 1; + debug(sprintf("After SendMessage, number %u<br>", $this->MsgNum)); + $messageType = 0; + $hd->serialUInt8 ($messageType); + $hd->serialString ($message->MsgName); + + debug(sprintf ("sendMessage : header size is '%d'<br>\n", $hd->Pos)); + +// $sb .= $message->Buffer; + + $size = $hd->Pos + $message->Pos; + $Buffer = (string) chr(($size>>24)&0xFF); + $Buffer .= chr(($size>>16)&0xFF); + $Buffer .= chr(($size>>8)&0xFF); + $Buffer .= chr($size&0xFF); + debug( "E".gettype($hd->Buffer)."<br>"); + debug("F".gettype($message->Buffer)."<br>"); + $Buffer .= (string) $hd->Buffer; + $Buffer .= (string) $message->Buffer; + + debug("G".gettype($this->ConSock)."<br>"); + + if (!fwrite ($this->ConSock, $Buffer)) + { + debug(sprintf ("Error writing to socket\n")); + return false; + } + debug(sprintf ("sent packet size '%d' (written size = %d) <br>\n", strlen($Buffer), $size)); + fflush ($this->ConSock); + + return true; + } + + function waitMessage() + { + if (!$this->ConSock) + { + debug(sprintf ("Socket is not valid\n")); + return false; + } + + + $size = 0; + $val = fread ($this->ConSock, 1); + $info = stream_get_meta_data($this->ConSock); + if ($info['timed_out']) + { + debug('Connection timed out!'); + return false; + } + $size = ord($val) << 24; + $val = fread ($this->ConSock, 1); + $info = stream_get_meta_data($this->ConSock); + if ($info['timed_out']) + { + debug('Connection timed out!'); + return false; + } + $size = ord($val) << 16; + $val = fread ($this->ConSock, 1); + $info = stream_get_meta_data($this->ConSock); + if ($info['timed_out']) + { + debug('Connection timed out!'); + return false; + } + $size += ord($val) << 8; + $val = fread ($this->ConSock, 1); + $info = stream_get_meta_data($this->ConSock); + if ($info['timed_out']) + { + debug('Connection timed out!'); + return false; + } + $size += ord($val); + debug(sprintf ("receive packet size '%d'<br>\n", $size)); + $fake = fread ($this->ConSock, 5); + $info = stream_get_meta_data($this->ConSock); + if ($info['timed_out']) + { + debug('Connection timed out!'); + return false; + } + $size -= 5; // remove the fake + + $Buffer = ""; + while ($size > 0 && strlen($Buffer) != $size) + { + $Buffer .= fread ($this->ConSock, $size - strlen($Buffer)); + $info = stream_get_meta_data($this->ConSock); + if ($info['timed_out']) + { + debug('Connection timed out!'); + return false; + } + } + $msgin = new CMemStream; + $msgin->setBuffer ($Buffer); + + // decode msg name + $msgin->serialString($name); + + debug(sprintf("Message name = '%s'<BR>", $name)); + $message = new CMessage; + $message->setBuffer(substr($msgin->Buffer, $msgin->Pos)); + $message->setName($name); + + debug(sprintf("In message name = '%s'<br>", $message->MsgName)); + + return $message; + } + } + +?> diff --git a/ryzom/server/www/tools/broadcast.php b/ryzom/server/www/tools/broadcast.php index f9384a7512..ac545ace5b 100644 --- a/ryzom/server/www/tools/broadcast.php +++ b/ryzom/server/www/tools/broadcast.php @@ -12,11 +12,7 @@ case 'live': sendToChat('is starting the Shard Restart Sequence...', '#pub-general', $ShardName, ':recycle:'); sendToChat('is broadcasting to players', '#pub-general', $ShardName, ':loudspeaker:'); - sendToChat('Le serveur va redémarrer dans 10 minutes. Merci de vous déconnecter en lieu sûr.', '#pub-uni-fr', 'Stagiaire d\''.$ShardName, ':loudspeaker:'); - sendToChat('Der Server wird in 10 Minuten heruntergefahren. Findet eine sichere Stelle und logt aus.', '#pub-uni-de', $ShardName.'\' Praktikantin', ':loudspeaker:'); - sendToChat('The shard will go down in 10 minutes. Please find a safe location and log out.', '#pub-uni-en', $ShardName.'\' Intern', ':loudspeaker:'); - sendToChat('The shard will go down in 10 minutes. Please find a safe location and log out.', '#pub-uni', $ShardName.' Intern', ':loudspeaker:'); - sendToChat('El servidor se cerrará en 10 minutos. Por favor, encuentre un lugar seguro y cierre la sesión.', '#pub-uni-es', 'Pasante de '.$ShardName, ':loudspeaker:'); + sendToChat('The shard will go down in 10 minutes. Please find a safe location and log out.', '#pub-universe', $ShardName.'\' Intern', ':loudspeaker:'); if (!$message) { $message = '@{F00F}[de]Der Server wird in $minutes$ Minuten heruntergefahren.\n@{FF0F}Findet eine sichere Stelle und logt aus.'; @@ -24,8 +20,9 @@ $message .= '[fr]Le serveur va redémarrer dans $minutes$ minutes.\n@{FF0F}Merci de vous déconnecter en lieu sûr.'; $message .= '[es]El servidor se cerrará en $minutos$ minutos.\n@{FF0F}Por favor, encuentre un lugar seguro y cierre la sesión.'; } + @queryShard('egs', 'broadcast repeat=11 every=60 '.$message); - $timer=60; + $timer = 60; break; case 'dev': diff --git a/ryzom/server/www/tools/manage_shard.php b/ryzom/server/www/tools/manage_shard.php index 6bc74e45bc..f09df32460 100644 --- a/ryzom/server/www/tools/manage_shard.php +++ b/ryzom/server/www/tools/manage_shard.php @@ -9,16 +9,28 @@ switch($command) { + case 'test': + echo 'TEST...'; + echo sendToChat('Atys are processing a reboot...', '#pub-general', 'Stagiaire d\'Atys', ':upside_down:'); + break; + case 'lock': @queryShard('su', 'rsm.setWSState '. $ShardId .' RESTRICTED ""'); break; + case 'stopEgs': + @queryShard('egs', 'stopService', 'stopService', true, true); + break; + + case 'open': + @queryShard('su', 'rsm.setWSState '. $ShardId .' OPEN ""'); if ($option == 'players') { - sendToChat('The shard is open for o/_--[ EVERYBODY ]--_\o', '#pub-uni', 'Stagiaire d\''.$AS_ShardName, ':tada:'); - sendToChat('is now open to ALL players \o/', '#pub-general', $AS_ShardName, ':tada:'); + file_put_contents('/home/nevrax/www/login/server_open_status', 'ds_open'."\n"); + sendToChat('The shard is open for o/_--[ EVERYBODY ]--_\o', '#pub-uni', 'Stagiaire d\''.$ShardName, ':tada:'); + sendToChat('is now open to ALL players \o/', '#pub-general', $ShardName, ':tada:'); } else { - @queryShard('su', 'rsm.setWSState '. $ShardId .' OPEN ""'); + file_put_contents('/home/nevrax/www/login/server_open_status', 'ds_restricted'."\n"); if ($option != 'silent') { sendToChat('The shard is open for RYZOM TEAM', '#pub-uni', $ShardName.'\' Intern', ':raised_hands:'); sendToChat('is now in the hands of the Customer Support Team.', '#pub-general', $ShardName, ':raised_hands:'); @@ -29,14 +41,17 @@ case 'kick_them_all': $ret = queryShard('egs', 'displayPlayers'); $out = explode("\n", $ret['raw'][0]); + $have_player = false; foreach($out as $i => $id) { $sid = explode(' ', $id); if ($sid[0] == 'Player:') { queryShard('egs', 'disconnectPlayer '.$sid[1], false); echo $sid[3].' has been kicked!'."\n"; + $have_player = true; } } - sendToChat('is killing all services...', '#pub-general', $ShardName, ':broken_heart:'); + if ($have_player) + sendToChat('is killing all services...', '#pub-general', $ShardName, ':broken_heart:'); break; } diff --git a/ryzom/server/www/tools/utils.php b/ryzom/server/www/tools/utils.php index edaab0228e..33ffe5dc05 100644 --- a/ryzom/server/www/tools/utils.php +++ b/ryzom/server/www/tools/utils.php @@ -5,6 +5,7 @@ function sendToChat($message, $channel='', $username='', $icon='') { global $RocketChatHook; + global $RocketChatServer; if ($RocketChatHook) { $data = json_encode(array( 'channel' => $channel, From 9e875a8a0b96d6eb1d061cb8661b3a60774bbcdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <ulukyn@ryzom.com> Date: Tue, 12 Dec 2023 13:59:14 +0100 Subject: [PATCH 114/194] Removed useless file --- ryzom/server/tools/send_logs_2_web.py | 345 -------------------------- 1 file changed, 345 deletions(-) delete mode 100755 ryzom/server/tools/send_logs_2_web.py diff --git a/ryzom/server/tools/send_logs_2_web.py b/ryzom/server/tools/send_logs_2_web.py deleted file mode 100755 index 7a7e1dc2df..0000000000 --- a/ryzom/server/tools/send_logs_2_web.py +++ /dev/null @@ -1,345 +0,0 @@ -#!/usr/bin/python - -import os, time -import collections -import urllib -import urllib2 - -class SlackClient(object): - - BASE_URL = 'https://ryzom.slack.com/api' - - def __init__(self, token): - self.token = token - - def _make_request(self, method, params): - """Make request to API endpoint - - Note: Ignoring SSL cert validation due to intermittent failures - http://requests.readthedocs.org/en/latest/user/advanced/#ssl-cert-verification - """ - url = "%s/%s" % (SlackClient.BASE_URL, method) - params['token'] = self.token - data = urllib.urlencode(params) - #result = requests.post(url, data=params, verify=False).json() - req = urllib2.Request(url, data) - result = urllib2.urlopen(req) - return result.read() - - def chat_post_message(self, channel, text, username=None, icon=':rage2:', parse=None, link_names=None): - """chat.postMessage - - This method posts a message to a channel. - - https://api.slack.com/methods/chat.postMessage - """ - method = 'chat.postMessage' - params = { - 'channel': channel, - 'text': text, - 'icon_emoji': icon, - } - if username is not None: - params['username'] = username - if parse is not None: - params['parse'] = parse - if link_names is not None: - params['link_names'] = link_names - return self._make_request(method, params) - - - -critic_commands = ("renameplayer", "position", "exchange item", "hp", "createiteminbag","createitemintmpinv","createnamediteminbag","createfullarmorset","aggro","god","money","invulnerable","changevar","addxptoskill","learnallbricks","learnallforagephrases","learnallphrases","learnbrick","learnphrase","summonpet","summon","allowsummonpet", "setfameplayer") - -#2013/05/17 03:34:51 INF 3073373952 newshard.ryzom.com/EGS-139 admin.cpp 3160 cbClientAdmin : ADMIN: Player ((0x0000a70890:00:00:89),Placio(atys)) will execute client admin command 'lockItem (0x0000a70890:00:00:89) bag 28 1' on target Himself -#2013/05/17 21:25:02 INF 3073373952 newshard.ryzom.com/EGS-139 admin.cpp 3278 cbClientAdminOffline : ADMINOFFLINE: Player ((0x00006dd281:00:00:89),Kemen(atys)) will execute client admin command 'addXPToSkill (0x00006dd281:00:00:00) 500 SMOEAEM 5' on target ((0x00006dd281:00:00:00),kemen(atys)) -#2014/11/02 01:30:19 INF 4146730752 newshard.ryzom.com/EGS-132 character.cpp 10983 acceptExchange : ADMIN: CSR ((0x00007ac5b0:00:00:8b),Tamarea(Atys)) exchange ic_candy_stick.sitem Q1 with Aleeskandaro(Atys) -admin_commands = {} -global_commands = {} -new_sorbot_commands = {} - -#data = urllib.urlencode({"t" : ".t ulukyn Running"}) -#req = urllib2.Request('http://app.ryzom.com/sorbot/index.php?'+data) -#r = urllib2.urlopen(req) - -def sorbot_old(line, ctype, name, command, command_args): - global new_sorbot_commands - new_sorbot_commands.append(line) - if not line in sorbot_commands: - data = urllib.urlencode({"t" : ".t ulukyn Player ["+name+"] using '/"+ctype+" "+command+" "+command_args+"' on target: "+line.split("' on target ")[-1][25:-7]+" http://app.ryzom.com/app_admin/player_stats.php?char_name="+name+"&stat=commands"}) - req = urllib2.Request('http://app.ryzom.com/sorbot/index.php?'+data) - r = urllib2.urlopen(req) - -def sorbot(line, ctype, name, command, command_args, target): - if (name == 'Moondev'): - return - - global new_sorbot_commands, sorbot_commands - new_sorbot_commands.append(line) - if (target == "" or target[:2] == 'on'): - if ctype != "a" or command.lower() != "position": - message = '<http://app.ryzom.com/app_admin/player_stats.php?char_name='+name+'&stat=commands|'+name+'> using \'/'+ctype+' '+command+' '+command_args+'\' '+target - else: - message = "" - icon = ':suspect:' - else: - if ctype == " ": - message = '<http://app.ryzom.com/app_admin/player_stats.php?char_name='+name+'&stat=commands|'+name+'> '+command+' '+command_args+'\' with <http://app.ryzom.com/app_admin/player_stats.php?char_name='+target+'|'+target+'>' - elif ctype != "a" or command.lower() != "position": - message = '<http://app.ryzom.com/app_admin/player_stats.php?char_name='+name+'&stat=commands|'+name+'> using \'/'+ctype+' '+command+' '+command_args+'\' on <http://app.ryzom.com/app_admin/player_stats.php?char_name='+target+'|'+target+'>' - else: - message = "" - icon = ':rage2:' - print target, message - if message: - if not line in sorbot_commands: - print "SLACKIT!" - client = SlackClient('xoxb-56970050663-z8Q1WyKLPh1m2K4iRMR4YsPI') - print "RESPONSE:", client.chat_post_message('command-logs', line[:20]+message, 'EGS', icon) - print "SLACK: ", line[:20]+message - else: - print "USED : ", line - else: - print "----" - - -def writelogs(admin_commands, is_current=False, base_path="logged/"): - global global_commands - base = "logs/commands/"+base_path - for player, commands in admin_commands.items(): - s_player = str(player) - if len(s_player) < 2: - s_player = "0"+s_player - if len(s_player) < 3: - s_player = "0"+s_player - - fid = s_player[-1] - if not os.path.isdir(base): - os.mkdir(base) - if not os.path.isdir(base+fid): - os.mkdir(base+fid) - fid2 = s_player[-2] - if not os.path.isdir(base+fid+"/"+fid2): - os.mkdir(base+fid+"/"+fid2) - fid3 = s_player[-3] - if not os.path.isdir(base+fid+"/"+fid2+"/"+fid3): - os.mkdir(base+fid+"/"+fid2+"/"+fid3) - if not os.path.isdir(base+fid+"/"+fid2+"/"+fid3+"/"+str(player)): - os.mkdir(base+fid+"/"+fid2+"/"+fid3+"/"+str(player)) - for mouth, command in commands.items(): - if mouth != "name" and mouth != "total": - if is_current: - open(base+fid+"/"+fid2+"/"+fid3+"/"+str(player)+"/current.log", "w").write(command+"\n") - else: - if os.path.isfile(base+fid+"/"+fid2+"/"+fid3+"/"+str(player)+"/"+mouth.replace("/", "_")+".log"): - previous = open(base+fid+"/"+fid2+"/"+fid3+"/"+str(player)+"/"+mouth.replace("/", "_")+".log").read() - else: - previous = "" - open(base+fid+"/"+fid2+"/"+fid3+"/"+str(player)+"/"+mouth.replace("/", "_")+".log", "w").write(command+"\n"+previous) - - base = "logs/commands/" - for mouth, command in global_commands.items(): - if not os.path.isdir(base+"global"): - os.mkdir(base+"global") - if is_current: - open(base+"global/current.log", "w").write(command+"\n") - else: - if os.path.isfile(base+"global/"+mouth.replace("/", "_")+".log"): - previous = open(base+"global/"+mouth.replace("/", "_")+".log").read() - else: - previsous = "" - open(base+"global/"+mouth.replace("/", "_")+".log", "w").write(command+"\n"+previous) - -def parse(filename): - global global_commands, admin_commands, sorbot_commands, new_sorbot_commands - file = open(filename).read().split("\n") - last_commands = {} - for line in file: - sline = line.split(" ") -# if len(sline) >= 10 and ((sline[9] == "ADMIN:" and sline[10] == "Player") or sline[9] == "ADMINOFFLINE:"): - if "cbClientAdmin : ADMIN: " in line or "ADMINOFFLINE" in line or "ADMIN: CSR" in line : - if "tried to execute a no valid client admin command" in line : - continue - sline = line.split("' on target ") - #Only get text before "on target" - real_line = sline[0] - sline = real_line.split(" ") - day = sline[0] - mouth = day[:4]+day[5:7] - hour = sline[1] - player = sline[11] - splayer = player.split(",") - if splayer[0][4:-10] != '': - cid = int(splayer[0][4:-10], 16) - else: - cid = 0 - if (len(splayer) == 2): - name = splayer[1][:-7] - else: - name = "<undefined>" - - - if "ADMIN: CSR" in line : - print "Exchange :", sline - command = "exchange item" - command_args = sline[13]+" "+sline[14] - target = sline[16] - target_name = sline[16].split("(")[0] - ctype = " " - else: - #Get text between ' and ' - sline = real_line.split("'") - full_command = "'".join(sline[1:]) - - if full_command[-1] == "'": - full_command = full_command[:-1] - scommand = full_command.split(" ") - command = scommand[0] - command_args = " ".join(scommand[2:]) - - if (len(scommand) > 1): - target = scommand[1] - else: - target = "<none>" - target_name = "" - ctype = "c" - if target == "(0x0000000000:ff:00:00)": - target = "<none>" - target_name = "on Nothing" - elif target[:-6] == "(0x"+splayer[0][4:-10]+":00:": - target = "<self>" - target_name = "" - ctype = "a" - elif target[-6:-4] != "00" : - target = "<mob_npc>" - target_name = "on a Mob or Npc" - ctype = "b" - elif len(target) > 20 : - target = "#"+str(int(target[4:-10], 16)) - target_name = line.split(",")[-1].split("(")[0].capitalize() - ctype = "b" - else: - ctype = "a" - - if line[100:120] == "ADMINOFFLINE: Player": - ctype = "c" - sorbot(line, ctype, name, command, command_args, target_name) - - if not cid in admin_commands: - admin_commands[cid] = {} - admin_commands[cid]["total"] = 0 - admin_commands[cid]["name"] = name - if not mouth in admin_commands[cid]: - admin_commands[cid][mouth] = "" - admin_commands[cid][mouth] = "|".join((day, hour, ctype, command, target, command_args))+"\n" + admin_commands[cid][mouth] - admin_commands[cid]["total"] += 1 - -# print command.lower() - if command.lower() in critic_commands: - print command, command_args - if not name in last_commands or not command.lower() in ("addxptoskill","learnbrick","learnphrase"): - print "Setting..." - last_commands[name] = [None, None, None, None, None] - last_commands[name][0] = command - last_commands[name][1] = 1 - last_commands[name][2] = [line, ctype, name, command, command_args, target_name] - last_commands[name][3] = "|".join((str(cid), name, day, hour, ctype, command, target, command_args)) - last_commands[name][4] = mouth - - if command.lower() in ("addxptoskill","learnbrick","learnphrase") and command == last_commands[name][0]: - print "+1" - last_commands[name][1] += 1 - last_commands[name][2] = [line, ctype, name, command, command_args, target_name] - last_commands[name][3] = "|".join((str(cid), name, day, hour, ctype, command, target, command_args)) - last_commands[name][4] = mouth - else : - if last_commands[name][1] > 1 : - print "More than 1 time" - last_commands[name][2][4] = "*"+str(last_commands[name][1])+" times*" - last_commands[name][2][0] += "*"+str(last_commands[name][1])+" times*" - else: - last_commands[name][2][4] = command_args - sorbot(last_commands[name][2][0], last_commands[name][2][1], last_commands[name][2][2], last_commands[name][2][3], last_commands[name][2][4], last_commands[name][2][5]) - print "Sorbot: ", last_commands[name][2], last_commands[name][1] - if not last_commands[name][4] in global_commands: - global_commands[last_commands[name][4]] = "" - global_commands[last_commands[name][4]] = last_commands[name][3]+"\n"+global_commands[last_commands[name][4]] - del(last_commands[name]) - - - for name, last_command in last_commands.items(): - if last_command[1] > 1: - last_command[2][4] += " ["+str(last_command[1])+" times the same command]" - #last_command[2][0] += "*"+str(last_command[1])+" times*" - sorbot(last_command[2][0], last_command[2][1], last_command[2][2], last_command[2][3], last_command[2][4], last_command[2][5]) - print "Sorbot ", last_command[2], last_command[1] - if not last_command[4] in global_commands: - global_commands[last_command[4]] = "" - global_commands[mouth] = last_command[3]+"\n"+global_commands[last_command[4]] - - -BASE_PATH = "logs/commands/" - -if not os.path.isdir(BASE_PATH): - os.mkdir(BASE_PATH) - -if not os.path.isdir(BASE_PATH+"backup"): - os.mkdir(BASE_PATH+"backup") - -if not os.path.isdir(BASE_PATH+"global"): - os.mkdir(BASE_PATH+"global") - - -if not os.path.isfile(BASE_PATH+"last_log"): - open(BASE_PATH+"last_log", "w").write("0") - -if not os.path.isfile("cache/commands"): - open("cache/commands", "w").write("") - - -last_log = int(open(BASE_PATH+"last_log").read()) -sorbot_commands = [] -sorbot_commands = open("cache/commands").read().split("\n") -new_sorbot_commands = [] - -print "Last Log with date : ", last_log -files = os.listdir("logs/") -files.sort() -higher_time = last_log -for filename in files: - if len(filename) > 25 and filename.split(".")[1] == "log" and filename.split(".")[0][:21] == "entities_game_service": - if int(os.path.getmtime("logs/"+filename)) > last_log: - if int(os.path.getmtime("logs/"+filename)) > higher_time: - higher_time = os.path.getmtime("logs/"+filename) - print filename, " NEED PARSING" - parse("logs/"+filename) - -logged_players = len(admin_commands) - -print "Write logs..." -writelogs(admin_commands, False) - -admin_commands = {} -global_commands = {} -filename = "entities_game_service.log" -print filename, " <NEED PARSING!>" -parse("logs/"+filename) -logged_players += len(admin_commands) -open(BASE_PATH+"global/current.log", "w").write("") -writelogs(admin_commands, True, "current/") - -open(BASE_PATH+"last_log", "w").write(str(int(higher_time))) -open("cache/commands", 'w').write("\n".join(new_sorbot_commands)) - - -print "Send logs to web..." -os.system("scp -r "+BASE_PATH+"logged/ nevrax@newweb.ryzom.com:/mnt/tmp/cache/ > /dev/null") -print "Backup..." -os.system("cp -r "+BASE_PATH+"logged/* "+BASE_PATH+"backup") -print "Clean..." -os.system("rm -rf "+BASE_PATH+"logged/*") -print "Send current..." -#os.system("scp -r current/* nevrax@newweb.ryzom.com:/mnt/tmp/cache/logged/ > /dev/null") -print "Done!" - -#os.system("rsync -avz -e ssh logged/ nevrax@web.ryzom.com:/mnt/tmp/cache/logged/") From 9d7e55c34bf31910bffc9b3a6c88ad72fb8923a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <ulukyn@ryzom.com> Date: Tue, 12 Dec 2023 15:20:01 +0100 Subject: [PATCH 115/194] Update tools --- ryzom/server/www/config_example.php | 3 ++- ryzom/server/www/tools/broadcast.php | 6 +++--- ryzom/server/www/tools/manage_shard.php | 12 ++++++------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ryzom/server/www/config_example.php b/ryzom/server/www/config_example.php index ff2e02fe9e..ddb270adcc 100644 --- a/ryzom/server/www/config_example.php +++ b/ryzom/server/www/config_example.php @@ -24,4 +24,5 @@ $RocketChatHook = ''; $RocketChatServer = ''; - +$RocketChatGeneral = '#General'; +$RocketChatUniverse = '#Universe'; diff --git a/ryzom/server/www/tools/broadcast.php b/ryzom/server/www/tools/broadcast.php index ac545ace5b..495e8d45d6 100644 --- a/ryzom/server/www/tools/broadcast.php +++ b/ryzom/server/www/tools/broadcast.php @@ -10,9 +10,9 @@ switch($shard) { case 'live': - sendToChat('is starting the Shard Restart Sequence...', '#pub-general', $ShardName, ':recycle:'); - sendToChat('is broadcasting to players', '#pub-general', $ShardName, ':loudspeaker:'); - sendToChat('The shard will go down in 10 minutes. Please find a safe location and log out.', '#pub-universe', $ShardName.'\' Intern', ':loudspeaker:'); + sendToChat('The server is starting the Shard Restart Sequence...', $RocketChatGeneral, $ShardName.'\' Intern', ':recycle:'); + sendToChat('The server is broadcasting to players to keep a safe place', $RocketChatGeneral, $ShardName.'\' Intern', ':loudspeaker:'); + sendToChat('The shard will go down in 10 minutes. Please find a safe location and log out.', $RocketChatUniverse, $ShardName.'\' Intern', ':loudspeaker:'); if (!$message) { $message = '@{F00F}[de]Der Server wird in $minutes$ Minuten heruntergefahren.\n@{FF0F}Findet eine sichere Stelle und logt aus.'; diff --git a/ryzom/server/www/tools/manage_shard.php b/ryzom/server/www/tools/manage_shard.php index f09df32460..5b2d003909 100644 --- a/ryzom/server/www/tools/manage_shard.php +++ b/ryzom/server/www/tools/manage_shard.php @@ -11,7 +11,7 @@ case 'test': echo 'TEST...'; - echo sendToChat('Atys are processing a reboot...', '#pub-general', 'Stagiaire d\'Atys', ':upside_down:'); + echo sendToChat('Atys are processing a reboot...', $RocketChatGeneral, $ShardName.'\' Intern', ':upside_down:'); break; case 'lock': @@ -27,13 +27,13 @@ @queryShard('su', 'rsm.setWSState '. $ShardId .' OPEN ""'); if ($option == 'players') { file_put_contents('/home/nevrax/www/login/server_open_status', 'ds_open'."\n"); - sendToChat('The shard is open for o/_--[ EVERYBODY ]--_\o', '#pub-uni', 'Stagiaire d\''.$ShardName, ':tada:'); - sendToChat('is now open to ALL players \o/', '#pub-general', $ShardName, ':tada:'); + sendToChat('The server is open for o/_--[ EVERYBODY ]--_\o', $RocketChatUniverse , $ShardName.'\' Intern', ':tada:'); + sendToChat('The server is now open to ALL players \o/', $RocketChatGeneral, $ShardName.'\' Intern', ':tada:'); } else { file_put_contents('/home/nevrax/www/login/server_open_status', 'ds_restricted'."\n"); if ($option != 'silent') { - sendToChat('The shard is open for RYZOM TEAM', '#pub-uni', $ShardName.'\' Intern', ':raised_hands:'); - sendToChat('is now in the hands of the Customer Support Team.', '#pub-general', $ShardName, ':raised_hands:'); + sendToChat('The server is open for RYZOM TEAM', $RocketChatUniverse, $ShardName.'\' Intern', ':raised_hands:'); + sendToChat('The server is now in the hands of the Customer Support Team.', $RocketChatGeneral, $ShardName.'\' Intern', ':raised_hands:'); } } break; @@ -51,7 +51,7 @@ } } if ($have_player) - sendToChat('is killing all services...', '#pub-general', $ShardName, ':broken_heart:'); + sendToChat('is killing all services...', $RocketChatGeneral, $ShardName, ':broken_heart:'); break; } From e1502ef868f734b2c532fd585fa84951f21b1884 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Sat, 16 Dec 2023 13:43:43 +0100 Subject: [PATCH 116/194] Added EnableEventsBnp and EnableOccsBnp cfg options and a way to activate OCC bnps --- nel/src/misc/path.cpp | 11 ++-- ryzom/client/client_default.cfg | 3 + .../interfaces_v3/check_lua_versions.lua | 1 + .../gamedev/interfaces_v3/game_config.xml | 40 +++++++++--- .../gamedev/interfaces_v3/out_v2_connect.xml | 12 +++- .../gamedev/interfaces_v3/out_v2_intro.lua | 9 +++ .../gamedev/interfaces_v3/out_v2_intro.xml | 61 ++++++++++--------- ryzom/client/src/client_cfg.cpp | 22 ++++--- ryzom/client/src/client_cfg.h | 3 + ryzom/client/src/init.cpp | 15 ++++- 10 files changed, 123 insertions(+), 54 deletions(-) create mode 100644 ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua diff --git a/nel/src/misc/path.cpp b/nel/src/misc/path.cpp index ce787b1960..f2f97567dd 100644 --- a/nel/src/misc/path.cpp +++ b/nel/src/misc/path.cpp @@ -1107,9 +1107,6 @@ void CFileContainer::addSearchPath (const string &path, bool recurse, bool alter progressCallBack->pushCropedValues ((float)f/(float)filesToProcess.size(), (float)(f+1)/(float)filesToProcess.size()); } - string filename = CFile::getFilename (filesToProcess[f]); - string filepath = CFile::getPath (filesToProcess[f]); -// insertFileInMap (filename, filepath, false, CFile::getExtension(filename)); addSearchFile (filesToProcess[f], false, "", progressCallBack); // Progress bar @@ -1168,6 +1165,12 @@ void CFileContainer::addSearchFile (const string &file, bool remap, const string return; } + string filename = CFile::getFilename (newFile); + string filepath = CFile::getPath (newFile); + map<string, string>::iterator itss = _RemappedFiles.find(filename); + if (itss != _RemappedFiles.end()) + newFile = filepath+"/"+itss->second; + std::string fileExtension = CFile::getExtension(newFile); // check if it s a big file @@ -1195,7 +1198,7 @@ void CFileContainer::addSearchFile (const string &file, bool remap, const string } string filenamewoext = CFile::getFilenameWithoutExtension (newFile); - string filename, ext; + string ext; if (virtual_ext.empty()) { diff --git a/ryzom/client/client_default.cfg b/ryzom/client/client_default.cfg index 1ca844e63b..ddd0d8745d 100644 --- a/ryzom/client/client_default.cfg +++ b/ryzom/client/client_default.cfg @@ -308,6 +308,9 @@ HDEntityTexture = 1; HDTextureInstalled = 1; WaitVBL = 0; // 0 or 1 to wait Vertical Sync. +EnableEventsBnp = 1; +EnableOccsBnp = 0; + ////////////////// // GAME OPTIONS // ////////////////// diff --git a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua index c3f48b9ee0..9e1c6d2f7a 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua @@ -20,6 +20,7 @@ if RYZOM_NAMES_MATIS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_MAT if RYZOM_NAMES_TRYKER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_TRYKER_VERSION, 324, "names_tryker") end if RYZOM_NAMES_ZORAI_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_ZORAI_VERSION, 324, "names_zorai") end if RYZOM_OUT_V2_APPEAR_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_APPEAR_VERSION, 324, "out_v2_appear") end +if RYZOM_OUT_V2_INTRO_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_INTRO_VERSION, 324, "out_v2_intro") end if RYZOM_OUT_V2_SELECT_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_SELECT_VERSION, 324, "out_v2_select") end if RYZOM_OUTPOST_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_OUTPOST_VERSION, 335, "outpost") end if RYZOM_PLAYER_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_PLAYER_VERSION, 335, "player") end diff --git a/ryzom/client/data/gamedev/interfaces_v3/game_config.xml b/ryzom/client/data/gamedev/interfaces_v3/game_config.xml index 184d6bf0d7..a42f4d5a10 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/game_config.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/game_config.xml @@ -645,7 +645,7 @@ handler="lua" params="game:configShowOne('landmark_colors')" fontsize="10" - y_decal="-1" /> + y_decal="-1" /> <node id="help" name="uimHelp" handler="lua" @@ -918,13 +918,27 @@ posref="BL TL" x="0" y="-2" /> + <instance template="tgcw_checkbox" + id="occeventbnps" + text="uiOccEventBnps" + posparent="window_snap_invert" + posref="BL TL" + x="-20" + y="-28" /> + <instance template="tgcw_checkbox" + id="occitems" + text="uiOccItems" + posref="BR BL" + posparent="occeventbnps" + x="5" + y="0" /> <!-- wait vbl --> <instance template="tgcw_checkbox" id="waitvbl" text="uiWaitVBL" - posparent="window_snap_invert" + posparent="occeventbnps" posref="BL TL" - x="-20" + x="0" y="-28" /> <!-- Special case for video modes --> <group id="fullscreen" @@ -1527,7 +1541,7 @@ </group> <link expr="@UI:TEMP:LANGUAGE" action="game_config_change_language" /> - + <view style="sgc_title" type="text" id="translation_header_text" @@ -2624,7 +2638,7 @@ posref="BL TL" posparent="is_enemy_title" x="0" - y="-4" /> + y="-4" /> <instance template="tgcw_checkbox" id="is_enemy_guild_name" text="uigcGuildName" @@ -3376,7 +3390,7 @@ posparent="crop" posref="TL TR" x="-8" - y="0" /> + y="0" /> <!-- *** --> <group id="help" active="false" @@ -3453,6 +3467,16 @@ realtime="true" widget="boolbut" link="WaitVBL" /> + <param ui="general:occeventbnps:c" + type="cfg" + realtime="false" + widget="boolbut" + link="EnableEventsBnp" /> + <param ui="general:occitems:c" + type="cfg" + realtime="false" + widget="boolbut" + link="EnableOccsBnp" /> <param ui="general:window_snap_distance:c" type="cfg" realtime="true" @@ -3811,7 +3835,7 @@ link="UI:SAVE:TRANSLATION:REGION:DISABLE" realtime="true" /> - + <param ui="chat_colors:cc_say:c" type="db" widget="colbut" @@ -4549,7 +4573,7 @@ widget="colbut" link="UI:SAVE:LANDMARK:COLORS:TELEPORTER" realtime="true" /> - + <param ui="help:context_help:c" type="db" widget="boolbut" diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_connect.xml b/ryzom/client/data/gamedev/interfaces_v3/out_v2_connect.xml index 8acbe7d4e2..c9659f995e 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_connect.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_connect.xml @@ -23,6 +23,7 @@ <proc id="proc_startall_connect" > <action handler="anim_start" params="anim=anim_connection_intro" /> + <action handler="lua" params="get_occ_events()" /> </proc> <proc id="proc_restart_connect" > @@ -36,10 +37,10 @@ <group id="connecting" w="1024" h="768" posref="MM MM" on_active="proc" on_active_params="proc_startall_connect" > <!-- JENA BACK --> - <view type="bitmap" id="jena" render_layer="-1" + <view type="bitmap" id="jena" render_layer="-1" global_color="false" color="255 255 255 255" posref="TL TL" x="0" y="0" texture="new_launcher_bg.tga" /> - + <!-- Quit Button --> <ctrl style="valid_txt_button" id="finish_but" posref="BR BR" x="-40" y="130" hardtext="uiQuit" onover="play_sound" params_over="name=charsel_quit_over" @@ -47,11 +48,16 @@ <view type="text" id="title" posref="MM MM" y="24" hardtext="uiConnecting" fontsize="20"/> - + <!-- BLACK SCREEN FADE --> <view type="bitmap" id="black_screen" posref="TL TL" x="0" y="0" render_layer="4" texture="blank.tga" color="0 0 0 255" sizeref="wh" scale="true" global_color="false" /> + <group id="html" type="webig_html" posref="MM MM" title_prefix="" sizeref="wh" x="0" y="0" w="-40" h="-40" error_color="255 240 48 255" link_color="240 155 100 255" text_color="210 210 210 255" h1_color="255 255 255 255" h2_color="255 255 255 255" h3_color="255 255 255 255" h4_color="255 255 255 255" h5_color="255 255 255 255" h6_color="255 255 255 255" text_font_size="10" h1_font_size="20" h2_font_size="18" h3_font_size="16" h4_font_size="14" h5_font_size="12" h6_font_size="12" paragraph_begin_space="12" multi_line_space_factor="0.25" td_begin_space="0" li_begin_space="4" ul_begin_space="12" li_indent="-10" ul_indent="30" checkbox_bitmap_normal="w_slot_on.tga" checkbox_bitmap_pushed="w_opacity_on.tga" checkbox_bitmap_over="" background_bitmap_view="background_bitmap" browse_next_time="false" form_text_area_group="edit_box_widget_multiline"> + <group id="black" posref="BR BR" sizeref="hw" w="0" h="0" inherit_gc_alpha="true" /> + <view id="background_bitmap" type="bitmap" posparent="black" posref="MM MM" sizeref="wh" w="0" h="0" inherit_gc_alpha="true" scale="true" texture="blank.tga" color="0 0 0 0" global_color="false" /> + <group id="text_list" type="list" fontsize="9" posref="TL TL" posparent="black" x="0" y="0" space="0" sizeref="hw" w="0" h="0" maxelements="2000" /> + </group> diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua new file mode 100644 index 0000000000..681a35bd1a --- /dev/null +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua @@ -0,0 +1,9 @@ +function get_occ_events() + getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/ma.png">debug('ok')</object>]]) +end + + + + +-- VERSION -- +RYZOM_OUT_V2_INTRO_VERSION = 335 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.xml b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.xml index 04bc3cd19d..7386625bc2 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.xml @@ -1,6 +1,7 @@ <interface_config> <root id="outgame" x="0" y="0" w="800" h="600" active="false" /> + <variable entry="UI:TEMP:INTROCLICKSTEP" type="sint64" value="-1"/> <!-- ***************** --> @@ -22,9 +23,9 @@ <!-- check if we have to skip the intro --> <proc id="proc_active_intro_logo"> - <action handler="proc" cond="eq(@UI:TEMP:SKIP_INTRO,0)" params="proc_active_intro_logo_noskip" /> + <action handler="proc" cond="eq(@UI:TEMP:SKIP_INTRO,0)" params="proc_active_intro_logo_noskip" /> <action handler="set" params="target_property=ui:outgame:global_background:active|value=1" /> - <action handler="proc" cond="ne(@UI:TEMP:SKIP_INTRO,0)" params="proc_intro_skip" /> + <action handler="proc" cond="ne(@UI:TEMP:SKIP_INTRO,0)" params="proc_intro_skip" /> </proc> <proc id="proc_intro_next_step"> @@ -42,7 +43,7 @@ <proc id="proc_tryton_fadeout_finished"> <action handler="set" cond="ne(@UI:TEMP:INTROCLICKSTEP,0)" params="target_property=ui:outgame:logo_intro:back:active|value=1" /> <action handler="set" cond="ne(@UI:TEMP:INTROCLICKSTEP,0)" params="target_property=ui:outgame:logo_intro:back_txt:active|value=1" /> - + <action handler="set" cond="eq(@UI:TEMP:INTROCLICKSTEP,0)" params="target_property=ui:outgame:logo_intro:back:active|value=0" /> <action handler="set" cond="eq(@UI:TEMP:INTROCLICKSTEP,0)" params="target_property=ui:outgame:logo_intro:back_txt:active|value=0" /> <action handler="proc" params="proc_tryton_fadeout_finished2" /> @@ -85,21 +86,20 @@ <!-- ***************** --> <!-- * INTRODUCTION * --> <!-- ***************** --> - + <group id="logo_intro" sizeref="wh" w="0" h="0" on_active="" on_active_params="" > <!-- BLACK BACK --> <view type="bitmap" id="bg" posref="MM MM" x="0" y="0" render_layer="0" texture="blank.tga" color="0 0 0 255" scale="true" global_color="false" /> - - + <!-- <view type="bitmap" id="nevrax" render_layer="1" txtoffsetx="0" txtoffsety="0" txtwidth="352" txtheight="48" global_color="false" color="255 255 255 255" posref="MM MM" x="0" y="0" texture="logos_intro.tga" /> <view type="bitmap" id="presents" render_layer="1" txtoffsetx="0" txtoffsety="176" txtwidth="128" txtheight="32" global_color="false" color="255 255 255 255" posref="MM MM" x="0" y="0" texture="logos_intro.tga" /> - + <view type="bitmap" id="ryzom" render_layer="1" txtoffsetx="0" txtoffsety="48" txtwidth="400" txtheight="128" global_color="false" color="255 255 255 0" posref="MM MM" x="0" y="0" texture="logos_intro.tga" /> --> @@ -109,30 +109,30 @@ <ctrl type="button" id="skip" button_type="push_button" posref="TR TR" x="-8" y="-16" tx_normal="button_next.tga" tx_pushed="button_next_over.tga" tx_over="button_next_over.tga" color="255 128 0 255" onclick_l="proc" params_l="proc_intro_skip" tooltip="uiSkipIntro" /> - - <view type="text" id="skip_txt" posparent="skip" posref="MR MR" x="-36" y="-1" hardtext="uiSkipTryton" shadow="true" fontsize="16" color="255 255 255 255" render_layer="2" /> - + + <view type="text" id="skip_txt" posparent="skip" posref="MR MR" x="-36" y="-1" hardtext="uiSkipTryton" shadow="true" fontsize="16" color="255 255 255 255" render_layer="2" /> + <ctrl type="button" id="next" button_type="push_button" posref="BR BR" x="-8" y="16" tx_normal="button_next.tga" tx_pushed="button_next_over.tga" tx_over="button_next_over.tga" color="255 255 255 255" onclick_l="proc" params_l="proc_intro_next_step" tooltip="uiNextStep" /> - - <view type="text" id="next_txt" posparent="next" posref="MR MR" x="-36" y="-1" hardtext="uiNextTryton" shadow="true" fontsize="16" color="255 255 255 255" render_layer="2" /> - + + <view type="text" id="next_txt" posparent="next" posref="MR MR" x="-36" y="-1" hardtext="uiNextTryton" shadow="true" fontsize="16" color="255 255 255 255" render_layer="2" /> + <ctrl type="button" id="back" button_type="push_button" posref="BL BL" x="8" y="16" tx_normal="button_back.tga" tx_pushed="button_back_over.tga" tx_over="button_back_over.tga" color="255 255 255 0" onclick_l="proc" params_l="proc_intro_back_step" tooltip="uiPrevStep" /> - - <view type="text" id="back_txt" posparent="back" posref="ML ML" x="36" y="-1" hardtext="uiBackTryton" shadow="true" fontsize="16" color="255 255 255 255" render_layer="2" /> + + <view type="text" id="back_txt" posparent="back" posref="ML ML" x="36" y="-1" hardtext="uiBackTryton" shadow="true" fontsize="16" color="255 255 255 255" render_layer="2" /> --> - - + + <!-- TRYTON's TEXT --> <!-- <group type="scroll_text" id="tryton_text" sizeref="w" w="-200" child_resize_h="true" child_resize_wmargin="16" child_resize_hmargin="16" posref="MM MM" x="0" y="0" min_height="64" max_height="500" active="true" > <group id="black" posref="TL TL" sizeref="hw" w="0" h="0" /> - <group type="list" id="text_list" hardtext="uiTryton1" shadow="true" fontsize="36" justification="justified" color="255 255 255 255" space="3" + <group type="list" id="text_list" hardtext="uiTryton1" shadow="true" fontsize="36" justification="justified" color="255 255 255 255" space="3" posref="TL TL" posparent="black" x="8" y="-8" sizeref="hw" w="-16" h="-16" /> - </group> + </group> --> <!-- <view type="bitmap" id="tryton_text" render_layer="1" global_color="false" color="255 255 255 255" @@ -152,17 +152,17 @@ <!-- <anim id="anim_intro_logo" duration="60.0" disable_buttons="false" > - + <track type="linear" target="global_background:back3d:cam:posx"> <key time="0.0" value="-5.0" /> <key time="60.0" value="-3.18"/> </track> - + <track type="linear" target="global_background:back3d:cam:tgtx"> <key time="0.0" value="-25.0" /> <key time="60.0" value="-3.23"/> </track> - + <track type="linear" target="global_background:back3d:cam:tgtz"> <key time="0.0" value="20.0" /> <key time="60.0" value="0"/> @@ -172,7 +172,7 @@ <key time="0.0" value="-45.0" /> <key time="60.0" value="-13.0"/> </track> - + </anim> @@ -181,12 +181,12 @@ <key time="0.0" value="0" /> <key time="1.0" value="255"/> </track> - + <track type="linear" target="logo_intro:next:alpha,logo_intro:next_txt:alpha"> <key time="0.0" value="0" /> <key time="1.0" value="255"/> </track> - + <track type="linear" target="logo_intro:back:alpha,logo_intro:back_txt:alpha"> <key time="0.0" value="0" /> <key time="1.0" value="255"/> @@ -208,19 +208,19 @@ <key time="3.0" value="0"/> <key time="4.0" value="255"/> </track> - + <track type="linear" target="logo_intro:skip:alpha,logo_intro:skip_txt:alpha"> <key time="0.0" value="0" /> <key time="3.0" value="0"/> <key time="4.0" value="255"/> </track> - + <track type="linear" target="logo_intro:next:alpha,logo_intro:next_txt:alpha"> <key time="0.0" value="0" /> <key time="3.0" value="0"/> <key time="4.0" value="255"/> </track> - + </anim> @@ -229,12 +229,12 @@ <key time="0.0" value="255" /> <key time="1.0" value="0"/> </track> - + <track type="linear" target="logo_intro:next:alpha,logo_intro:next_txt:alpha"> <key time="0.0" value="255" /> <key time="1.0" value="0"/> </track> - + <track type="linear" target="logo_intro:back:alpha,logo_intro:back_txt:alpha"> <key time="0.0" value="255" /> <key time="1.0" value="0"/> @@ -243,6 +243,7 @@ --> +<lua file="out_v2_intro.lua" /> </interface_config> diff --git a/ryzom/client/src/client_cfg.cpp b/ryzom/client/src/client_cfg.cpp index e5a8b662ba..954bcb0ebd 100644 --- a/ryzom/client/src/client_cfg.cpp +++ b/ryzom/client/src/client_cfg.cpp @@ -487,6 +487,9 @@ CClientConfig::CClientConfig() MediaPlayerDirectory = "music"; MediaPlayerAutoPlay = false; + EnableEventsBnp = true; + EnableOccsBnp = false; + // PreDataPath.push_back("data/gamedev/language/"); // Default Path for the language data // DataPath.push_back("data/"); // Default Path for the Data. @@ -916,21 +919,21 @@ void CClientConfig::setValues() READ_STRING_FV(FSHost) READ_BOOL_DEV(DisplayAccountButtons) - - + + READ_STRING_FV(CreateAccountURL) READ_STRING_FV(EditAccountURL) READ_STRING_FV(ForgetPwdURL) - + READ_STRING_DEV(BetaAccountURL) READ_STRING_DEV(FreeTrialURL) // defined in client_default.cfg READ_STRING_FV(LoginSupportURL) - + // read NamingPolicyURL from client_default.cfg //READ_STRING_FV(NamingPolicyURL) - + std::string languageCo = "wk"; CConfigFile::CVar *languageCodeVarPtr = ClientCfg.ConfigFile.getVarPtr("LanguageCode"); @@ -960,7 +963,7 @@ void CClientConfig::setValues() } } } - + // read NamingPolicyURL from client_default.cfg //READ_STRING_FV(ConditionsTermsURL) CConfigFile::CVar *coturl = ClientCfg.ConfigFile.getVarPtr("ConditionsTermsURL"); @@ -970,7 +973,7 @@ void CClientConfig::setValues() for (uint i = 0; i < coturl->size(); ++i) { std::string entry = coturl->asString(i); - + if (entry.size() >= languageCo.size()) { if (nlstricmp(entry.substr(0, languageCo.size()), languageCo) == 0) @@ -985,7 +988,7 @@ void CClientConfig::setValues() } } } - + #ifndef RZ_NO_CLIENT // if cookie is not empty, it means that the client was launch @@ -1372,6 +1375,9 @@ void CClientConfig::setValues() ////////// // MISC // + READ_BOOL_FV(EnableEventsBnp); + READ_BOOL_FV(EnableOccsBnp); + // Pre Data Path. READ_STRINGVECTOR_FV(PreDataPath); diff --git a/ryzom/client/src/client_cfg.h b/ryzom/client/src/client_cfg.h index b17e82e8ae..9486393d99 100644 --- a/ryzom/client/src/client_cfg.h +++ b/ryzom/client/src/client_cfg.h @@ -389,6 +389,9 @@ struct CClientConfig string MediaPlayerDirectory; bool MediaPlayerAutoPlay; + bool EnableEventsBnp; + bool EnableOccsBnp; + /// Pre Data Path. std::vector<string> PreDataPath; /// Data Path. diff --git a/ryzom/client/src/init.cpp b/ryzom/client/src/init.cpp index bb1d9405cd..2f436f1475 100644 --- a/ryzom/client/src/init.cpp +++ b/ryzom/client/src/init.cpp @@ -772,6 +772,19 @@ void addPreDataPaths(NLMISC::IProgressCallback &progress) H_AUTO(InitRZAddSearchPaths); + std::vector<string> UserDataPath; + UserDataPath.push_back("user"); + addPaths(progress, UserDataPath, true); + + // if want occ event: + if (ClientCfg.EnableEventsBnp) + CPath::loadRemappedFiles("enable_events_bnp.csv"); + // if want occ stuff: + if (ClientCfg.EnableOccsBnp) + CPath::loadRemappedFiles("enable_occs_bnp.csv"); + + + addPaths(progress, ClientCfg.PreDataPath, true); //nlinfo ("PROFILE: %d seconds for Add search paths Predata", (uint32)(ryzomGetLocalTime ()-initPaths)/1000); @@ -850,7 +863,7 @@ void initLog() rlp2.rlim_cur = std::min(value, rlp.rlim_max); rlp2.rlim_max = rlp.rlim_max; - + if (setrlimit(RLIMIT_NOFILE, &rlp2)) { if (errno == EINVAL) From e56f0d8f0f1012ef7d82265dbf53d4ff243306df Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Sat, 16 Dec 2023 13:43:43 +0100 Subject: [PATCH 117/194] Added EnableEventsBnp and EnableOccsBnp cfg options and a way to activate OCC bnps --- nel/src/misc/path.cpp | 11 ++-- ryzom/client/client_default.cfg | 3 + .../interfaces_v3/check_lua_versions.lua | 1 + .../gamedev/interfaces_v3/game_config.xml | 40 +++++++++--- .../gamedev/interfaces_v3/out_v2_connect.xml | 12 +++- .../gamedev/interfaces_v3/out_v2_intro.lua | 9 +++ .../gamedev/interfaces_v3/out_v2_intro.xml | 61 ++++++++++--------- ryzom/client/src/client_cfg.cpp | 22 ++++--- ryzom/client/src/client_cfg.h | 3 + ryzom/client/src/init.cpp | 15 ++++- 10 files changed, 123 insertions(+), 54 deletions(-) create mode 100644 ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua diff --git a/nel/src/misc/path.cpp b/nel/src/misc/path.cpp index ce787b1960..f2f97567dd 100644 --- a/nel/src/misc/path.cpp +++ b/nel/src/misc/path.cpp @@ -1107,9 +1107,6 @@ void CFileContainer::addSearchPath (const string &path, bool recurse, bool alter progressCallBack->pushCropedValues ((float)f/(float)filesToProcess.size(), (float)(f+1)/(float)filesToProcess.size()); } - string filename = CFile::getFilename (filesToProcess[f]); - string filepath = CFile::getPath (filesToProcess[f]); -// insertFileInMap (filename, filepath, false, CFile::getExtension(filename)); addSearchFile (filesToProcess[f], false, "", progressCallBack); // Progress bar @@ -1168,6 +1165,12 @@ void CFileContainer::addSearchFile (const string &file, bool remap, const string return; } + string filename = CFile::getFilename (newFile); + string filepath = CFile::getPath (newFile); + map<string, string>::iterator itss = _RemappedFiles.find(filename); + if (itss != _RemappedFiles.end()) + newFile = filepath+"/"+itss->second; + std::string fileExtension = CFile::getExtension(newFile); // check if it s a big file @@ -1195,7 +1198,7 @@ void CFileContainer::addSearchFile (const string &file, bool remap, const string } string filenamewoext = CFile::getFilenameWithoutExtension (newFile); - string filename, ext; + string ext; if (virtual_ext.empty()) { diff --git a/ryzom/client/client_default.cfg b/ryzom/client/client_default.cfg index 1ca844e63b..ddd0d8745d 100644 --- a/ryzom/client/client_default.cfg +++ b/ryzom/client/client_default.cfg @@ -308,6 +308,9 @@ HDEntityTexture = 1; HDTextureInstalled = 1; WaitVBL = 0; // 0 or 1 to wait Vertical Sync. +EnableEventsBnp = 1; +EnableOccsBnp = 0; + ////////////////// // GAME OPTIONS // ////////////////// diff --git a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua index c3f48b9ee0..9e1c6d2f7a 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua @@ -20,6 +20,7 @@ if RYZOM_NAMES_MATIS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_MAT if RYZOM_NAMES_TRYKER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_TRYKER_VERSION, 324, "names_tryker") end if RYZOM_NAMES_ZORAI_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_ZORAI_VERSION, 324, "names_zorai") end if RYZOM_OUT_V2_APPEAR_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_APPEAR_VERSION, 324, "out_v2_appear") end +if RYZOM_OUT_V2_INTRO_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_INTRO_VERSION, 324, "out_v2_intro") end if RYZOM_OUT_V2_SELECT_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_SELECT_VERSION, 324, "out_v2_select") end if RYZOM_OUTPOST_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_OUTPOST_VERSION, 335, "outpost") end if RYZOM_PLAYER_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_PLAYER_VERSION, 335, "player") end diff --git a/ryzom/client/data/gamedev/interfaces_v3/game_config.xml b/ryzom/client/data/gamedev/interfaces_v3/game_config.xml index 184d6bf0d7..a42f4d5a10 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/game_config.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/game_config.xml @@ -645,7 +645,7 @@ handler="lua" params="game:configShowOne('landmark_colors')" fontsize="10" - y_decal="-1" /> + y_decal="-1" /> <node id="help" name="uimHelp" handler="lua" @@ -918,13 +918,27 @@ posref="BL TL" x="0" y="-2" /> + <instance template="tgcw_checkbox" + id="occeventbnps" + text="uiOccEventBnps" + posparent="window_snap_invert" + posref="BL TL" + x="-20" + y="-28" /> + <instance template="tgcw_checkbox" + id="occitems" + text="uiOccItems" + posref="BR BL" + posparent="occeventbnps" + x="5" + y="0" /> <!-- wait vbl --> <instance template="tgcw_checkbox" id="waitvbl" text="uiWaitVBL" - posparent="window_snap_invert" + posparent="occeventbnps" posref="BL TL" - x="-20" + x="0" y="-28" /> <!-- Special case for video modes --> <group id="fullscreen" @@ -1527,7 +1541,7 @@ </group> <link expr="@UI:TEMP:LANGUAGE" action="game_config_change_language" /> - + <view style="sgc_title" type="text" id="translation_header_text" @@ -2624,7 +2638,7 @@ posref="BL TL" posparent="is_enemy_title" x="0" - y="-4" /> + y="-4" /> <instance template="tgcw_checkbox" id="is_enemy_guild_name" text="uigcGuildName" @@ -3376,7 +3390,7 @@ posparent="crop" posref="TL TR" x="-8" - y="0" /> + y="0" /> <!-- *** --> <group id="help" active="false" @@ -3453,6 +3467,16 @@ realtime="true" widget="boolbut" link="WaitVBL" /> + <param ui="general:occeventbnps:c" + type="cfg" + realtime="false" + widget="boolbut" + link="EnableEventsBnp" /> + <param ui="general:occitems:c" + type="cfg" + realtime="false" + widget="boolbut" + link="EnableOccsBnp" /> <param ui="general:window_snap_distance:c" type="cfg" realtime="true" @@ -3811,7 +3835,7 @@ link="UI:SAVE:TRANSLATION:REGION:DISABLE" realtime="true" /> - + <param ui="chat_colors:cc_say:c" type="db" widget="colbut" @@ -4549,7 +4573,7 @@ widget="colbut" link="UI:SAVE:LANDMARK:COLORS:TELEPORTER" realtime="true" /> - + <param ui="help:context_help:c" type="db" widget="boolbut" diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_connect.xml b/ryzom/client/data/gamedev/interfaces_v3/out_v2_connect.xml index 8acbe7d4e2..c9659f995e 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_connect.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_connect.xml @@ -23,6 +23,7 @@ <proc id="proc_startall_connect" > <action handler="anim_start" params="anim=anim_connection_intro" /> + <action handler="lua" params="get_occ_events()" /> </proc> <proc id="proc_restart_connect" > @@ -36,10 +37,10 @@ <group id="connecting" w="1024" h="768" posref="MM MM" on_active="proc" on_active_params="proc_startall_connect" > <!-- JENA BACK --> - <view type="bitmap" id="jena" render_layer="-1" + <view type="bitmap" id="jena" render_layer="-1" global_color="false" color="255 255 255 255" posref="TL TL" x="0" y="0" texture="new_launcher_bg.tga" /> - + <!-- Quit Button --> <ctrl style="valid_txt_button" id="finish_but" posref="BR BR" x="-40" y="130" hardtext="uiQuit" onover="play_sound" params_over="name=charsel_quit_over" @@ -47,11 +48,16 @@ <view type="text" id="title" posref="MM MM" y="24" hardtext="uiConnecting" fontsize="20"/> - + <!-- BLACK SCREEN FADE --> <view type="bitmap" id="black_screen" posref="TL TL" x="0" y="0" render_layer="4" texture="blank.tga" color="0 0 0 255" sizeref="wh" scale="true" global_color="false" /> + <group id="html" type="webig_html" posref="MM MM" title_prefix="" sizeref="wh" x="0" y="0" w="-40" h="-40" error_color="255 240 48 255" link_color="240 155 100 255" text_color="210 210 210 255" h1_color="255 255 255 255" h2_color="255 255 255 255" h3_color="255 255 255 255" h4_color="255 255 255 255" h5_color="255 255 255 255" h6_color="255 255 255 255" text_font_size="10" h1_font_size="20" h2_font_size="18" h3_font_size="16" h4_font_size="14" h5_font_size="12" h6_font_size="12" paragraph_begin_space="12" multi_line_space_factor="0.25" td_begin_space="0" li_begin_space="4" ul_begin_space="12" li_indent="-10" ul_indent="30" checkbox_bitmap_normal="w_slot_on.tga" checkbox_bitmap_pushed="w_opacity_on.tga" checkbox_bitmap_over="" background_bitmap_view="background_bitmap" browse_next_time="false" form_text_area_group="edit_box_widget_multiline"> + <group id="black" posref="BR BR" sizeref="hw" w="0" h="0" inherit_gc_alpha="true" /> + <view id="background_bitmap" type="bitmap" posparent="black" posref="MM MM" sizeref="wh" w="0" h="0" inherit_gc_alpha="true" scale="true" texture="blank.tga" color="0 0 0 0" global_color="false" /> + <group id="text_list" type="list" fontsize="9" posref="TL TL" posparent="black" x="0" y="0" space="0" sizeref="hw" w="0" h="0" maxelements="2000" /> + </group> diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua new file mode 100644 index 0000000000..681a35bd1a --- /dev/null +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua @@ -0,0 +1,9 @@ +function get_occ_events() + getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/ma.png">debug('ok')</object>]]) +end + + + + +-- VERSION -- +RYZOM_OUT_V2_INTRO_VERSION = 335 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.xml b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.xml index 04bc3cd19d..7386625bc2 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.xml @@ -1,6 +1,7 @@ <interface_config> <root id="outgame" x="0" y="0" w="800" h="600" active="false" /> + <variable entry="UI:TEMP:INTROCLICKSTEP" type="sint64" value="-1"/> <!-- ***************** --> @@ -22,9 +23,9 @@ <!-- check if we have to skip the intro --> <proc id="proc_active_intro_logo"> - <action handler="proc" cond="eq(@UI:TEMP:SKIP_INTRO,0)" params="proc_active_intro_logo_noskip" /> + <action handler="proc" cond="eq(@UI:TEMP:SKIP_INTRO,0)" params="proc_active_intro_logo_noskip" /> <action handler="set" params="target_property=ui:outgame:global_background:active|value=1" /> - <action handler="proc" cond="ne(@UI:TEMP:SKIP_INTRO,0)" params="proc_intro_skip" /> + <action handler="proc" cond="ne(@UI:TEMP:SKIP_INTRO,0)" params="proc_intro_skip" /> </proc> <proc id="proc_intro_next_step"> @@ -42,7 +43,7 @@ <proc id="proc_tryton_fadeout_finished"> <action handler="set" cond="ne(@UI:TEMP:INTROCLICKSTEP,0)" params="target_property=ui:outgame:logo_intro:back:active|value=1" /> <action handler="set" cond="ne(@UI:TEMP:INTROCLICKSTEP,0)" params="target_property=ui:outgame:logo_intro:back_txt:active|value=1" /> - + <action handler="set" cond="eq(@UI:TEMP:INTROCLICKSTEP,0)" params="target_property=ui:outgame:logo_intro:back:active|value=0" /> <action handler="set" cond="eq(@UI:TEMP:INTROCLICKSTEP,0)" params="target_property=ui:outgame:logo_intro:back_txt:active|value=0" /> <action handler="proc" params="proc_tryton_fadeout_finished2" /> @@ -85,21 +86,20 @@ <!-- ***************** --> <!-- * INTRODUCTION * --> <!-- ***************** --> - + <group id="logo_intro" sizeref="wh" w="0" h="0" on_active="" on_active_params="" > <!-- BLACK BACK --> <view type="bitmap" id="bg" posref="MM MM" x="0" y="0" render_layer="0" texture="blank.tga" color="0 0 0 255" scale="true" global_color="false" /> - - + <!-- <view type="bitmap" id="nevrax" render_layer="1" txtoffsetx="0" txtoffsety="0" txtwidth="352" txtheight="48" global_color="false" color="255 255 255 255" posref="MM MM" x="0" y="0" texture="logos_intro.tga" /> <view type="bitmap" id="presents" render_layer="1" txtoffsetx="0" txtoffsety="176" txtwidth="128" txtheight="32" global_color="false" color="255 255 255 255" posref="MM MM" x="0" y="0" texture="logos_intro.tga" /> - + <view type="bitmap" id="ryzom" render_layer="1" txtoffsetx="0" txtoffsety="48" txtwidth="400" txtheight="128" global_color="false" color="255 255 255 0" posref="MM MM" x="0" y="0" texture="logos_intro.tga" /> --> @@ -109,30 +109,30 @@ <ctrl type="button" id="skip" button_type="push_button" posref="TR TR" x="-8" y="-16" tx_normal="button_next.tga" tx_pushed="button_next_over.tga" tx_over="button_next_over.tga" color="255 128 0 255" onclick_l="proc" params_l="proc_intro_skip" tooltip="uiSkipIntro" /> - - <view type="text" id="skip_txt" posparent="skip" posref="MR MR" x="-36" y="-1" hardtext="uiSkipTryton" shadow="true" fontsize="16" color="255 255 255 255" render_layer="2" /> - + + <view type="text" id="skip_txt" posparent="skip" posref="MR MR" x="-36" y="-1" hardtext="uiSkipTryton" shadow="true" fontsize="16" color="255 255 255 255" render_layer="2" /> + <ctrl type="button" id="next" button_type="push_button" posref="BR BR" x="-8" y="16" tx_normal="button_next.tga" tx_pushed="button_next_over.tga" tx_over="button_next_over.tga" color="255 255 255 255" onclick_l="proc" params_l="proc_intro_next_step" tooltip="uiNextStep" /> - - <view type="text" id="next_txt" posparent="next" posref="MR MR" x="-36" y="-1" hardtext="uiNextTryton" shadow="true" fontsize="16" color="255 255 255 255" render_layer="2" /> - + + <view type="text" id="next_txt" posparent="next" posref="MR MR" x="-36" y="-1" hardtext="uiNextTryton" shadow="true" fontsize="16" color="255 255 255 255" render_layer="2" /> + <ctrl type="button" id="back" button_type="push_button" posref="BL BL" x="8" y="16" tx_normal="button_back.tga" tx_pushed="button_back_over.tga" tx_over="button_back_over.tga" color="255 255 255 0" onclick_l="proc" params_l="proc_intro_back_step" tooltip="uiPrevStep" /> - - <view type="text" id="back_txt" posparent="back" posref="ML ML" x="36" y="-1" hardtext="uiBackTryton" shadow="true" fontsize="16" color="255 255 255 255" render_layer="2" /> + + <view type="text" id="back_txt" posparent="back" posref="ML ML" x="36" y="-1" hardtext="uiBackTryton" shadow="true" fontsize="16" color="255 255 255 255" render_layer="2" /> --> - - + + <!-- TRYTON's TEXT --> <!-- <group type="scroll_text" id="tryton_text" sizeref="w" w="-200" child_resize_h="true" child_resize_wmargin="16" child_resize_hmargin="16" posref="MM MM" x="0" y="0" min_height="64" max_height="500" active="true" > <group id="black" posref="TL TL" sizeref="hw" w="0" h="0" /> - <group type="list" id="text_list" hardtext="uiTryton1" shadow="true" fontsize="36" justification="justified" color="255 255 255 255" space="3" + <group type="list" id="text_list" hardtext="uiTryton1" shadow="true" fontsize="36" justification="justified" color="255 255 255 255" space="3" posref="TL TL" posparent="black" x="8" y="-8" sizeref="hw" w="-16" h="-16" /> - </group> + </group> --> <!-- <view type="bitmap" id="tryton_text" render_layer="1" global_color="false" color="255 255 255 255" @@ -152,17 +152,17 @@ <!-- <anim id="anim_intro_logo" duration="60.0" disable_buttons="false" > - + <track type="linear" target="global_background:back3d:cam:posx"> <key time="0.0" value="-5.0" /> <key time="60.0" value="-3.18"/> </track> - + <track type="linear" target="global_background:back3d:cam:tgtx"> <key time="0.0" value="-25.0" /> <key time="60.0" value="-3.23"/> </track> - + <track type="linear" target="global_background:back3d:cam:tgtz"> <key time="0.0" value="20.0" /> <key time="60.0" value="0"/> @@ -172,7 +172,7 @@ <key time="0.0" value="-45.0" /> <key time="60.0" value="-13.0"/> </track> - + </anim> @@ -181,12 +181,12 @@ <key time="0.0" value="0" /> <key time="1.0" value="255"/> </track> - + <track type="linear" target="logo_intro:next:alpha,logo_intro:next_txt:alpha"> <key time="0.0" value="0" /> <key time="1.0" value="255"/> </track> - + <track type="linear" target="logo_intro:back:alpha,logo_intro:back_txt:alpha"> <key time="0.0" value="0" /> <key time="1.0" value="255"/> @@ -208,19 +208,19 @@ <key time="3.0" value="0"/> <key time="4.0" value="255"/> </track> - + <track type="linear" target="logo_intro:skip:alpha,logo_intro:skip_txt:alpha"> <key time="0.0" value="0" /> <key time="3.0" value="0"/> <key time="4.0" value="255"/> </track> - + <track type="linear" target="logo_intro:next:alpha,logo_intro:next_txt:alpha"> <key time="0.0" value="0" /> <key time="3.0" value="0"/> <key time="4.0" value="255"/> </track> - + </anim> @@ -229,12 +229,12 @@ <key time="0.0" value="255" /> <key time="1.0" value="0"/> </track> - + <track type="linear" target="logo_intro:next:alpha,logo_intro:next_txt:alpha"> <key time="0.0" value="255" /> <key time="1.0" value="0"/> </track> - + <track type="linear" target="logo_intro:back:alpha,logo_intro:back_txt:alpha"> <key time="0.0" value="255" /> <key time="1.0" value="0"/> @@ -243,6 +243,7 @@ --> +<lua file="out_v2_intro.lua" /> </interface_config> diff --git a/ryzom/client/src/client_cfg.cpp b/ryzom/client/src/client_cfg.cpp index e5a8b662ba..954bcb0ebd 100644 --- a/ryzom/client/src/client_cfg.cpp +++ b/ryzom/client/src/client_cfg.cpp @@ -487,6 +487,9 @@ CClientConfig::CClientConfig() MediaPlayerDirectory = "music"; MediaPlayerAutoPlay = false; + EnableEventsBnp = true; + EnableOccsBnp = false; + // PreDataPath.push_back("data/gamedev/language/"); // Default Path for the language data // DataPath.push_back("data/"); // Default Path for the Data. @@ -916,21 +919,21 @@ void CClientConfig::setValues() READ_STRING_FV(FSHost) READ_BOOL_DEV(DisplayAccountButtons) - - + + READ_STRING_FV(CreateAccountURL) READ_STRING_FV(EditAccountURL) READ_STRING_FV(ForgetPwdURL) - + READ_STRING_DEV(BetaAccountURL) READ_STRING_DEV(FreeTrialURL) // defined in client_default.cfg READ_STRING_FV(LoginSupportURL) - + // read NamingPolicyURL from client_default.cfg //READ_STRING_FV(NamingPolicyURL) - + std::string languageCo = "wk"; CConfigFile::CVar *languageCodeVarPtr = ClientCfg.ConfigFile.getVarPtr("LanguageCode"); @@ -960,7 +963,7 @@ void CClientConfig::setValues() } } } - + // read NamingPolicyURL from client_default.cfg //READ_STRING_FV(ConditionsTermsURL) CConfigFile::CVar *coturl = ClientCfg.ConfigFile.getVarPtr("ConditionsTermsURL"); @@ -970,7 +973,7 @@ void CClientConfig::setValues() for (uint i = 0; i < coturl->size(); ++i) { std::string entry = coturl->asString(i); - + if (entry.size() >= languageCo.size()) { if (nlstricmp(entry.substr(0, languageCo.size()), languageCo) == 0) @@ -985,7 +988,7 @@ void CClientConfig::setValues() } } } - + #ifndef RZ_NO_CLIENT // if cookie is not empty, it means that the client was launch @@ -1372,6 +1375,9 @@ void CClientConfig::setValues() ////////// // MISC // + READ_BOOL_FV(EnableEventsBnp); + READ_BOOL_FV(EnableOccsBnp); + // Pre Data Path. READ_STRINGVECTOR_FV(PreDataPath); diff --git a/ryzom/client/src/client_cfg.h b/ryzom/client/src/client_cfg.h index b17e82e8ae..9486393d99 100644 --- a/ryzom/client/src/client_cfg.h +++ b/ryzom/client/src/client_cfg.h @@ -389,6 +389,9 @@ struct CClientConfig string MediaPlayerDirectory; bool MediaPlayerAutoPlay; + bool EnableEventsBnp; + bool EnableOccsBnp; + /// Pre Data Path. std::vector<string> PreDataPath; /// Data Path. diff --git a/ryzom/client/src/init.cpp b/ryzom/client/src/init.cpp index bb1d9405cd..2f436f1475 100644 --- a/ryzom/client/src/init.cpp +++ b/ryzom/client/src/init.cpp @@ -772,6 +772,19 @@ void addPreDataPaths(NLMISC::IProgressCallback &progress) H_AUTO(InitRZAddSearchPaths); + std::vector<string> UserDataPath; + UserDataPath.push_back("user"); + addPaths(progress, UserDataPath, true); + + // if want occ event: + if (ClientCfg.EnableEventsBnp) + CPath::loadRemappedFiles("enable_events_bnp.csv"); + // if want occ stuff: + if (ClientCfg.EnableOccsBnp) + CPath::loadRemappedFiles("enable_occs_bnp.csv"); + + + addPaths(progress, ClientCfg.PreDataPath, true); //nlinfo ("PROFILE: %d seconds for Add search paths Predata", (uint32)(ryzomGetLocalTime ()-initPaths)/1000); @@ -850,7 +863,7 @@ void initLog() rlp2.rlim_cur = std::min(value, rlp.rlim_max); rlp2.rlim_max = rlp.rlim_max; - + if (setrlimit(RLIMIT_NOFILE, &rlp2)) { if (errno == EINVAL) From 5a75a32b12e339fccf8d48474b023ebecdee7433 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Sat, 16 Dec 2023 13:45:29 +0100 Subject: [PATCH 118/194] Update lua versions --- ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua index 9e1c6d2f7a..1655b31188 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua @@ -20,7 +20,7 @@ if RYZOM_NAMES_MATIS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_MAT if RYZOM_NAMES_TRYKER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_TRYKER_VERSION, 324, "names_tryker") end if RYZOM_NAMES_ZORAI_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_ZORAI_VERSION, 324, "names_zorai") end if RYZOM_OUT_V2_APPEAR_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_APPEAR_VERSION, 324, "out_v2_appear") end -if RYZOM_OUT_V2_INTRO_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_INTRO_VERSION, 324, "out_v2_intro") end +if RYZOM_OUT_V2_INTRO_VERSION ~= 341 then broadcastBadLuaVersions(RYZOM_OUT_V2_INTRO_VERSION, 341, "out_v2_intro") end if RYZOM_OUT_V2_SELECT_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_SELECT_VERSION, 324, "out_v2_select") end if RYZOM_OUTPOST_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_OUTPOST_VERSION, 335, "outpost") end if RYZOM_PLAYER_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_PLAYER_VERSION, 335, "player") end diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua index 681a35bd1a..d87c13febc 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua @@ -6,4 +6,4 @@ end -- VERSION -- -RYZOM_OUT_V2_INTRO_VERSION = 335 \ No newline at end of file +RYZOM_OUT_V2_INTRO_VERSION = 341 \ No newline at end of file From cc42c36d3c17fa6e51d4a4afbf183aec7632ce4b Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Sat, 16 Dec 2023 20:19:10 +0100 Subject: [PATCH 119/194] Fixed --- ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua index d87c13febc..111b4c0ee3 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua @@ -1,9 +1,11 @@ function get_occ_events() - getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/ma.png">debug('ok')</object>]]) + local application = getClientCfgVar("Application") + getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[["/enable_events_bnp.csv></object>]]) + getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[["/enable_occs_bnp.csv></object>]]) end -- VERSION -- -RYZOM_OUT_V2_INTRO_VERSION = 341 \ No newline at end of file +RYZOM_OUT_V2_INTRO_VERSION = 341 From dd67de21532c81db6b4ee37bc405bda282b22573 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Sat, 16 Dec 2023 20:53:15 +0100 Subject: [PATCH 120/194] Fix --- ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua index 111b4c0ee3..28b07990fd 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua @@ -1,7 +1,7 @@ function get_occ_events() local application = getClientCfgVar("Application") - getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[["/enable_events_bnp.csv></object>]]) - getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[["/enable_occs_bnp.csv></object>]]) + getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[[/enable_events_bnp.csv></object>]]) + getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[[/enable_occs_bnp.csv></object>]]) end From 980de8ef36f06bfb2fddf8b2dc6a9831d4b90d93 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Sat, 16 Dec 2023 21:07:41 +0100 Subject: [PATCH 121/194] Fixed --- ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua index 28b07990fd..57e09cf266 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua @@ -1,7 +1,7 @@ function get_occ_events() local application = getClientCfgVar("Application") - getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[[/enable_events_bnp.csv></object>]]) - getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[[/enable_occs_bnp.csv></object>]]) + getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[[/enable_events_bnp.csv"></object>]]) + getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[[/enable_occs_bnp.csv"></object>]]) end From f57fa8356b3a182a3e735e5f2d8f6eea574a26af Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Sat, 16 Dec 2023 21:21:39 +0100 Subject: [PATCH 122/194] Fix --- ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua index 57e09cf266..16f09014d9 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua @@ -1,11 +1,10 @@ function get_occ_events() local application = getClientCfgVar("Application") - getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[[/enable_events_bnp.csv"></object>]]) - getUI("ui:outgame:connecting:html"):renderHtml([[<object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[[/enable_occs_bnp.csv"></object>]]) + getUI("ui:outgame:connecting:html"):renderHtml([[ + <object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[[/enable_events_bnp.csv"></object> + <object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[[/enable_occs_bnp.csv"></object> + ]]) end - - - -- VERSION -- RYZOM_OUT_V2_INTRO_VERSION = 341 From c691befb754b1007d8f9a95e628882b4c68b245f Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Sun, 17 Dec 2023 02:45:35 +0100 Subject: [PATCH 123/194] Fixed get_occ_events (better way). Added CurlCABundle to all Curl download --- .../data/gamedev/interfaces_v3/out_v2_appear.lua | 3 +-- .../data/gamedev/interfaces_v3/out_v2_connect.xml | 9 --------- .../client/data/gamedev/interfaces_v3/out_v2_intro.lua | 10 ---------- .../client/data/gamedev/interfaces_v3/out_v2_intro.xml | 5 ----- ryzom/client/src/client_cfg.cpp | 2 +- ryzom/client/src/init.cpp | 7 +++++++ ryzom/client/src/init_main_loop.cpp | 2 +- ryzom/client/src/login_patch.cpp | 4 ++-- ryzom/client/src/login_patch.h | 6 ++++-- 9 files changed, 16 insertions(+), 32 deletions(-) delete mode 100644 ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua b/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua index 016bb1d2ee..62343406d4 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua @@ -436,8 +436,7 @@ function outgame:loadRPBGPage() sex = "f" end getUI("ui:outgame:appear:job_options:rpbg:html"):browse("https://app.ryzom.com/app_arcc/outgame_rpbg.php?lang="..lang.."&slot="..tostring(slot).."&sex="..sex.."&key="..rpbg_key) - getUI("https://app.ryzom.com/app_arcc/outgame_rpbg.php?lang="..lang.."&slot="..tostring(slot).."&sex="..sex.."&key="..rpbg_key) end -- VERSION -- -RYZOM_OUT_V2_APPEAR_VERSION = 324 \ No newline at end of file +RYZOM_OUT_V2_APPEAR_VERSION = 324 diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_connect.xml b/ryzom/client/data/gamedev/interfaces_v3/out_v2_connect.xml index c9659f995e..a038a133c1 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_connect.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_connect.xml @@ -23,7 +23,6 @@ <proc id="proc_startall_connect" > <action handler="anim_start" params="anim=anim_connection_intro" /> - <action handler="lua" params="get_occ_events()" /> </proc> <proc id="proc_restart_connect" > @@ -53,14 +52,6 @@ <view type="bitmap" id="black_screen" posref="TL TL" x="0" y="0" render_layer="4" texture="blank.tga" color="0 0 0 255" sizeref="wh" scale="true" global_color="false" /> - <group id="html" type="webig_html" posref="MM MM" title_prefix="" sizeref="wh" x="0" y="0" w="-40" h="-40" error_color="255 240 48 255" link_color="240 155 100 255" text_color="210 210 210 255" h1_color="255 255 255 255" h2_color="255 255 255 255" h3_color="255 255 255 255" h4_color="255 255 255 255" h5_color="255 255 255 255" h6_color="255 255 255 255" text_font_size="10" h1_font_size="20" h2_font_size="18" h3_font_size="16" h4_font_size="14" h5_font_size="12" h6_font_size="12" paragraph_begin_space="12" multi_line_space_factor="0.25" td_begin_space="0" li_begin_space="4" ul_begin_space="12" li_indent="-10" ul_indent="30" checkbox_bitmap_normal="w_slot_on.tga" checkbox_bitmap_pushed="w_opacity_on.tga" checkbox_bitmap_over="" background_bitmap_view="background_bitmap" browse_next_time="false" form_text_area_group="edit_box_widget_multiline"> - <group id="black" posref="BR BR" sizeref="hw" w="0" h="0" inherit_gc_alpha="true" /> - <view id="background_bitmap" type="bitmap" posparent="black" posref="MM MM" sizeref="wh" w="0" h="0" inherit_gc_alpha="true" scale="true" texture="blank.tga" color="0 0 0 0" global_color="false" /> - <group id="text_list" type="list" fontsize="9" posref="TL TL" posparent="black" x="0" y="0" space="0" sizeref="hw" w="0" h="0" maxelements="2000" /> - </group> - - - </group> <!-- This link is used to display the right screen among the outgame screens --> diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua deleted file mode 100644 index 16f09014d9..0000000000 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.lua +++ /dev/null @@ -1,10 +0,0 @@ -function get_occ_events() - local application = getClientCfgVar("Application") - getUI("ui:outgame:connecting:html"):renderHtml([[ - <object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[[/enable_events_bnp.csv"></object> - <object type="application/ryzom-data" standby="override" data="https://]]..getClientCfgVar("WebIgMainDomain")..[[/data/]]..tostring(application["0"])..[[/enable_occs_bnp.csv"></object> - ]]) -end - --- VERSION -- -RYZOM_OUT_V2_INTRO_VERSION = 341 diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.xml b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.xml index 7386625bc2..9a341b3fc8 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_intro.xml @@ -241,10 +241,5 @@ </track> </anim> --> - - -<lua file="out_v2_intro.lua" /> - - </interface_config> diff --git a/ryzom/client/src/client_cfg.cpp b/ryzom/client/src/client_cfg.cpp index 954bcb0ebd..aa4d3abfcf 100644 --- a/ryzom/client/src/client_cfg.cpp +++ b/ryzom/client/src/client_cfg.cpp @@ -1180,7 +1180,7 @@ void CClientConfig::setValues() READ_STRING_FV(WebIgMainDomain); if (ClientCfg.WebIgMainDomain.find("http://") == std::string::npos || ClientCfg.WebIgMainDomain.find("https://") == std::string::npos) - ClientCfg.WebIgMainDomain = "http://" + ClientCfg.WebIgMainDomain; + ClientCfg.WebIgMainDomain = "https://" + ClientCfg.WebIgMainDomain; READ_STRINGVECTOR_FV(WebIgTrustedDomains); READ_INT_FV(WebIgNotifInterval); READ_INT_FV(CurlMaxConnections); diff --git a/ryzom/client/src/init.cpp b/ryzom/client/src/init.cpp index 2f436f1475..164dce5e26 100644 --- a/ryzom/client/src/init.cpp +++ b/ryzom/client/src/init.cpp @@ -57,6 +57,7 @@ #include "init.h" #include "input.h" #include "client_cfg.h" // Configuration of the client. +#include "login_patch.h" #include "actions_client.h" #include "color_slot_manager.h" #include "movie_shooter.h" @@ -772,6 +773,12 @@ void addPreDataPaths(NLMISC::IProgressCallback &progress) H_AUTO(InitRZAddSearchPaths); + CConfigFile *cf = &ClientCfg.ConfigFile; + std::string appName = cf->getVarPtr("Application") ? cf->getVar("Application").asString(0) : "ryzom_live"; + CPatchManager *pPM = CPatchManager::getInstance(); + pPM->downloadFileWithCurl(ClientCfg.WebIgMainDomain+"/data/"+appName+"/enable_events_bnp.csv", "user/enable_events_bnp.csv"); + pPM->downloadFileWithCurl(ClientCfg.WebIgMainDomain+"/data/"+appName+"/enable_occs_bnp.csv", "user/enable_occs_bnp.csv"); + std::vector<string> UserDataPath; UserDataPath.push_back("user"); addPaths(progress, UserDataPath, true); diff --git a/ryzom/client/src/init_main_loop.cpp b/ryzom/client/src/init_main_loop.cpp index 9d1ebf784f..0ae38afe9a 100644 --- a/ryzom/client/src/init_main_loop.cpp +++ b/ryzom/client/src/init_main_loop.cpp @@ -194,7 +194,7 @@ struct CStatThread : public NLMISC::IRunnable curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); if (url.length() > 8 && (url[4] == 's' || url[4] == 'S')) // 01234 https { - NLWEB::CCurlCertificates::addCertificateFile("cacert.pem"); + NLWEB::CCurlCertificates::addCertificateFile(ClientCfg.CurlCABundle); NLWEB::CCurlCertificates::useCertificates(curl); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); diff --git a/ryzom/client/src/login_patch.cpp b/ryzom/client/src/login_patch.cpp index b97d410bef..8f7be03cb4 100644 --- a/ryzom/client/src/login_patch.cpp +++ b/ryzom/client/src/login_patch.cpp @@ -625,7 +625,7 @@ void CPatchManager::startPatchThread(const vector<string> &CategoriesSelected, b // Close opened big files CBigFile::getInstance().remove(FilesToPatch[k].FileName); - + if (NLMISC::startsWith(FilesToPatch[k].FileName, "sound")) { // Stop sound playback @@ -1457,7 +1457,7 @@ void CPatchManager::downloadFileWithCurl (const string &source, const string &de curl_easy_setopt(curl, CURLOPT_URL, source.c_str()); if (source.length() > 8 && (source[4] == 's' || source[4] == 'S')) // 01234 https { - NLWEB::CCurlCertificates::addCertificateFile("cacert.pem"); + NLWEB::CCurlCertificates::addCertificateFile(ClientCfg.CurlCABundle); NLWEB::CCurlCertificates::useCertificates(curl); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); diff --git a/ryzom/client/src/login_patch.h b/ryzom/client/src/login_patch.h index 89c848f0c6..7bfaa022e8 100644 --- a/ryzom/client/src/login_patch.h +++ b/ryzom/client/src/login_patch.h @@ -275,6 +275,10 @@ class CPatchManager bool bnpUnpack(const std::string &srcBigfile, const std::string &dstPath, std::vector<std::string> &vFilenames); const std::string & getServerVersion () { return ServerVersion; } + void downloadFileWithCurl (const std::string &source, const std::string &dest, NLMISC::IProgressCallback *progress = NULL); + void downloadFile (const std::string &source, const std::string &dest, NLMISC::IProgressCallback *progress = NULL); + + private: // Methods used by patch & check threads @@ -316,8 +320,6 @@ class CPatchManager // Get a file from the server and decompress it if zipped void getServerFile (const std::string &name, bool bZipped = false, const std::string& destName="", NLMISC::IProgressCallback *progress = NULL); - void downloadFileWithCurl (const std::string &source, const std::string &dest, NLMISC::IProgressCallback *progress = NULL); - void downloadFile (const std::string &source, const std::string &dest, NLMISC::IProgressCallback *progress = NULL); // Decompress zipped file override destination file void decompressFile (const std::string &filename); void applyDate (const std::string &sFilename, uint32 nDate); From 6e4a54e3e9a2e146a1fbef645f571cd42d3096c9 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Mon, 18 Dec 2023 20:02:16 +0100 Subject: [PATCH 124/194] Added bnpe as file patched by client --- ryzom/client/src/login_patch.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/client/src/login_patch.cpp b/ryzom/client/src/login_patch.cpp index 8f7be03cb4..4da9bdf65c 100644 --- a/ryzom/client/src/login_patch.cpp +++ b/ryzom/client/src/login_patch.cpp @@ -2532,7 +2532,7 @@ void CPatchThread::run() CPatchManager::SFileToPatch &rFTP = AllFilesToPatch[i]; string ext = NLMISC::CFile::getExtension(rFTP.FileName); - if (ext == "bnp" || ext == "snp") + if (ext == "bnp" || ext == "snp" || ext == "bnpe") { float oldCurrentFilePatched = CurrentFilePatched; processFile (rFTP); From 6fba56dc37d8d505801bcc754e976ccfe0ee89c1 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Wed, 27 Dec 2023 12:36:15 +0100 Subject: [PATCH 125/194] Changed: added secound edit_box and call search_command on onchange --- ryzom/client/data/gamedev/interfaces_v3/widgets.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml index 293033d0dd..f8013155c5 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml @@ -707,8 +707,11 @@ <!-- ********************* --> <!-- * EDIT BOX WIDGET * --> <!-- ********************* --> - <template name="edit_box_widget" active="true" posref="TL TL" text_x="0" text_y="0" text_ref="BL BL" child_resize_h="true" child_resize_hmargin="0" multi_line="false" x="0" y="0" w="0" h="0" sizeref="" id="eb" posparent="parent" onenter="chat_box_entry" params="" reset_focus_on_hide="true" enter_loose_focus="true" prompt=">" enter_recover_focus="true" max_num_chars="255" menu_r="" onchange="" onchange_params="" entry_type="text" keep="true" max_historic="40" fontsize="10" shadow="true" shadow_x="1" shadow_y="1" shadow_color="0 0 0 255" shadow_outline="false" backup_father_container_pos="false" want_return="false" clear_on_escape="false" color="255 255 255 255" continuous_text_update="false" bg_texture="W_box_blank.tga" on_focus_lost="" on_focus_lost_params="" max_float_prec="5" tooltip="" tooltip_parent="" negative_filter="" render_layer="0"> + <template name="edit_box_widget" active="true" posref="TL TL" text_x="0" text_y="0" text_ref="BL BL" child_resize_h="true" child_resize_hmargin="0" multi_line="false" x="0" y="0" w="0" h="0" sizeref="" id="eb" posparent="parent" onenter="chat_box_entry" params="" reset_focus_on_hide="true" enter_loose_focus="true" prompt=">" enter_recover_focus="true" max_num_chars="255" menu_r="" onchange="lua" onchange_params="search_command(getUICaller().id)" entry_type="text" keep="true" max_historic="40" fontsize="10" shadow="true" shadow_x="1" shadow_y="1" shadow_color="0 0 0 255" shadow_outline="false" backup_father_container_pos="false" want_return="false" clear_on_escape="false" color="255 255 255 255" continuous_text_update="false" bg_texture="W_box_blank.tga" on_focus_lost="" on_focus_lost_params="" max_float_prec="5" tooltip="" tooltip_parent="" negative_filter="" render_layer="0"> <group id="#id" active="#active" posref="#posref" x="#x" y="#y" posparent="#posparent" child_resize_h="#child_resize_h" child_resize_hmargin="#child_resize_hmargin" sizeref="#sizeref" w="#w" h="#h" render_layer="#render_layer" > + <group type="edit_box" sizeref="w" w="-8" id="ebh" posref="TL TL" x="4" y="-4" child_resize_h="true" onenter="#onenter" params="#params" onchange="#onchange" onchange_params="#onchange_params" max_num_chars="#max_num_chars" prompt="#prompt" enter_loose_focus="#enter_loose_focus" enter_recover_focus="#enter_recover_focus" entry_type="#entry_type" reset_focus_on_hide="#reset_focus_on_hide" menu_r="#menu_r" max_historic="#max_historic" want_return="#want_return" clear_on_escape="#clear_on_escape" backup_father_container_pos="#backup_father_container_pos" on_focus_lost="#on_focus_lost" on_focus_lost_params="#on_focus_lost_params" max_float_prec="#max_float_prec" tooltip="#tooltip" tooltip_parent="#tooltip_parent" negative_filter="#negative_filter" render_layer="#render_layer"> + <view id="edit_texth" type="text" continuous_update="#continuous_text_update" x="#text_x" y="#text_y" posref="#text_ref" multi_line="#multi_line" multi_line_space="0" fontsize="#fontsize" color="255 255 255 50" shadow="#shadow" shadow_x="#shadow_x" shadow_y="#shadow_y" shadow_color="#shadow_color" shadow_outline="#shadow_outline" hardtext="" global_color="false" render_layer="#render_layer" /> + </group> <group type="edit_box" sizeref="w" w="-8" id="eb" posref="TL TL" x="4" y="-4" child_resize_h="true" onenter="#onenter" params="#params" onchange="#onchange" onchange_params="#onchange_params" max_num_chars="#max_num_chars" prompt="#prompt" enter_loose_focus="#enter_loose_focus" enter_recover_focus="#enter_recover_focus" entry_type="#entry_type" reset_focus_on_hide="#reset_focus_on_hide" menu_r="#menu_r" max_historic="#max_historic" want_return="#want_return" clear_on_escape="#clear_on_escape" backup_father_container_pos="#backup_father_container_pos" on_focus_lost="#on_focus_lost" on_focus_lost_params="#on_focus_lost_params" max_float_prec="#max_float_prec" tooltip="#tooltip" tooltip_parent="#tooltip_parent" negative_filter="#negative_filter" render_layer="#render_layer"> <view type="bitmap" id="bg" scale="true" sizeref="hw" h="0" w="0" texture="#bg_texture" inherit_gc_alpha="true" render_layer="#render_layer" /> <view id="edit_text" type="text" continuous_update="#continuous_text_update" x="#text_x" y="#text_y" posref="#text_ref" multi_line="#multi_line" multi_line_space="0" fontsize="#fontsize" color="#color" shadow="#shadow" shadow_x="#shadow_x" shadow_y="#shadow_y" shadow_color="#shadow_color" shadow_outline="#shadow_outline" hardtext="" global_color="false" render_layer="#render_layer" /> From 4dd137a32e953262f48d2fa271e92676480fd6e8 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Wed, 27 Dec 2023 16:18:43 +0100 Subject: [PATCH 126/194] Fix ebh --- ryzom/client/data/gamedev/interfaces_v3/widgets.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml index f8013155c5..33d76d4a13 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml @@ -447,11 +447,11 @@ child_resize_h="true" display_empty_slot="true" onclick_l="inv_drop" - params_l="src=ctrl_launch_modal" - onclick_r="open_help_auto" - lmargin="10" rmargin="6" - tmargin="10" bmargin="6" - column_max="4" + params_l="src=ctrl_launch_modal" + onclick_r="open_help_auto" + lmargin="10" rmargin="6" + tmargin="10" bmargin="6" + column_max="4" rowmax="6" maxitem="%max_bag_invslot" > <!-- the scroll --> @@ -710,7 +710,7 @@ <template name="edit_box_widget" active="true" posref="TL TL" text_x="0" text_y="0" text_ref="BL BL" child_resize_h="true" child_resize_hmargin="0" multi_line="false" x="0" y="0" w="0" h="0" sizeref="" id="eb" posparent="parent" onenter="chat_box_entry" params="" reset_focus_on_hide="true" enter_loose_focus="true" prompt=">" enter_recover_focus="true" max_num_chars="255" menu_r="" onchange="lua" onchange_params="search_command(getUICaller().id)" entry_type="text" keep="true" max_historic="40" fontsize="10" shadow="true" shadow_x="1" shadow_y="1" shadow_color="0 0 0 255" shadow_outline="false" backup_father_container_pos="false" want_return="false" clear_on_escape="false" color="255 255 255 255" continuous_text_update="false" bg_texture="W_box_blank.tga" on_focus_lost="" on_focus_lost_params="" max_float_prec="5" tooltip="" tooltip_parent="" negative_filter="" render_layer="0"> <group id="#id" active="#active" posref="#posref" x="#x" y="#y" posparent="#posparent" child_resize_h="#child_resize_h" child_resize_hmargin="#child_resize_hmargin" sizeref="#sizeref" w="#w" h="#h" render_layer="#render_layer" > <group type="edit_box" sizeref="w" w="-8" id="ebh" posref="TL TL" x="4" y="-4" child_resize_h="true" onenter="#onenter" params="#params" onchange="#onchange" onchange_params="#onchange_params" max_num_chars="#max_num_chars" prompt="#prompt" enter_loose_focus="#enter_loose_focus" enter_recover_focus="#enter_recover_focus" entry_type="#entry_type" reset_focus_on_hide="#reset_focus_on_hide" menu_r="#menu_r" max_historic="#max_historic" want_return="#want_return" clear_on_escape="#clear_on_escape" backup_father_container_pos="#backup_father_container_pos" on_focus_lost="#on_focus_lost" on_focus_lost_params="#on_focus_lost_params" max_float_prec="#max_float_prec" tooltip="#tooltip" tooltip_parent="#tooltip_parent" negative_filter="#negative_filter" render_layer="#render_layer"> - <view id="edit_texth" type="text" continuous_update="#continuous_text_update" x="#text_x" y="#text_y" posref="#text_ref" multi_line="#multi_line" multi_line_space="0" fontsize="#fontsize" color="255 255 255 50" shadow="#shadow" shadow_x="#shadow_x" shadow_y="#shadow_y" shadow_color="#shadow_color" shadow_outline="#shadow_outline" hardtext="" global_color="false" render_layer="#render_layer" /> + <view id="edit_text" type="text" continuous_update="#continuous_text_update" x="#text_x" y="#text_y" posref="#text_ref" multi_line="#multi_line" multi_line_space="0" fontsize="#fontsize" color="255 255 255 50" shadow="#shadow" shadow_x="#shadow_x" shadow_y="#shadow_y" shadow_color="#shadow_color" shadow_outline="#shadow_outline" hardtext="" global_color="false" render_layer="#render_layer" /> </group> <group type="edit_box" sizeref="w" w="-8" id="eb" posref="TL TL" x="4" y="-4" child_resize_h="true" onenter="#onenter" params="#params" onchange="#onchange" onchange_params="#onchange_params" max_num_chars="#max_num_chars" prompt="#prompt" enter_loose_focus="#enter_loose_focus" enter_recover_focus="#enter_recover_focus" entry_type="#entry_type" reset_focus_on_hide="#reset_focus_on_hide" menu_r="#menu_r" max_historic="#max_historic" want_return="#want_return" clear_on_escape="#clear_on_escape" backup_father_container_pos="#backup_father_container_pos" on_focus_lost="#on_focus_lost" on_focus_lost_params="#on_focus_lost_params" max_float_prec="#max_float_prec" tooltip="#tooltip" tooltip_parent="#tooltip_parent" negative_filter="#negative_filter" render_layer="#render_layer"> <view type="bitmap" id="bg" scale="true" sizeref="hw" h="0" w="0" texture="#bg_texture" inherit_gc_alpha="true" render_layer="#render_layer" /> From c244c54ac21167e90ec03e6beabe4381ec94a6d9 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Wed, 3 Jan 2024 20:28:37 +0100 Subject: [PATCH 127/194] Added: new lua commands for search command function --- .../client/src/interface_v3/lua_ihm_ryzom.cpp | 21 +++++++++++++++++++ ryzom/client/src/interface_v3/lua_ihm_ryzom.h | 3 +++ .../src/interfaces_manager/chat_input.cpp | 19 +++++++++-------- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp b/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp index 981305b502..923607b12e 100644 --- a/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp +++ b/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp @@ -482,6 +482,7 @@ void CLuaIHMRyzom::RegisterRyzomFunctions(NLGUI::CLuaState &ls) ls.registerFunc("getMouseRightDown", getMouseRightDown), ls.registerFunc("isShiftDown", isShiftDown), ls.registerFunc("isCtrlDown", isCtrlDown), + ls.registerFunc("isTabDown", isTabDown), ls.registerFunc("getShapeIdAt", getShapeIdAt), ls.registerFunc("getPlayerFront", getPlayerFront); ls.registerFunc("getPlayerDirection", getPlayerDirection); @@ -517,6 +518,7 @@ void CLuaIHMRyzom::RegisterRyzomFunctions(NLGUI::CLuaState &ls) ls.registerFunc("isPlayerFreeTrial", isPlayerFreeTrial); ls.registerFunc("isPlayerNewbie", isPlayerNewbie); ls.registerFunc("isInRingMode", isInRingMode); + ls.registerFunc("isPlayerPrivilege", isPlayerPrivilege); ls.registerFunc("getUserRace", getUserRace); ls.registerFunc("getSheet2idx", getSheet2idx); ls.registerFunc("getTargetSlot", getTargetSlot); @@ -1367,6 +1369,12 @@ int CLuaIHMRyzom::isCtrlDown(CLuaState &ls) return 1; } +int CLuaIHMRyzom::isTabDown(CLuaState &ls) +{ + ls.push(Driver->AsyncListener.isKeyDown(KeyTAB)); + return 1; +} + int CLuaIHMRyzom::getShapeIdAt(CLuaState &ls) @@ -1755,6 +1763,19 @@ int CLuaIHMRyzom::isInRingMode(CLuaState &ls) return 1; } +// *************************************************************************** +int CLuaIHMRyzom::isPlayerPrivilege(CLuaState &ls) +{ + bool hasPlayerPrivilege = (hasPrivilegeDEV() || hasPrivilegeSGM() || hasPrivilegeGM() || hasPrivilegeVG() || hasPrivilegeSG() || hasPrivilegeG() || hasPrivilegeEM() || hasPrivilegeEG()); + if(hasPlayerPrivilege) + { + return 1; + } + else{ + return 0; + } +} + // *************************************************************************** int CLuaIHMRyzom::getUserRace(CLuaState &ls) { diff --git a/ryzom/client/src/interface_v3/lua_ihm_ryzom.h b/ryzom/client/src/interface_v3/lua_ihm_ryzom.h index 517519ee09..068d452e43 100644 --- a/ryzom/client/src/interface_v3/lua_ihm_ryzom.h +++ b/ryzom/client/src/interface_v3/lua_ihm_ryzom.h @@ -50,6 +50,7 @@ class CLuaIHMRyzom static int updateAllLocalisedElements(CLuaState &ls); static int isShiftDown(CLuaState &ls); static int isCtrlDown(CLuaState &ls); + static int isTabDown(CLuaState &ls); static int getTimestampHuman(CLuaState &ls); static int breakPoint(CLuaState &ls); static int i18n(CLuaState &ls); // retrieve an unicode string from CI18N @@ -106,6 +107,7 @@ class CLuaIHMRyzom static int isPlayerFreeTrial(CLuaState &ls); static int isPlayerNewbie(CLuaState &ls); static int isInRingMode(CLuaState &ls); + static int isPlayerPrivilege(CLuaState &ls); static int getUserRace(CLuaState &ls); static int getSheet2idx(CLuaState &ls); static int getTargetSlot(CLuaState &ls); @@ -137,6 +139,7 @@ class CLuaIHMRyzom static int getShapeColOrient(CLuaState &ls); static int deleteShape(CLuaState &ls); + ///////////////////////////// Standard Lua stuff ends here ////////////////////////////////////////////// static sint32 getDbProp(const std::string &dbProp); // return 0 if not found. diff --git a/ryzom/client/src/interfaces_manager/chat_input.cpp b/ryzom/client/src/interfaces_manager/chat_input.cpp index 6d4ae4119f..a11bfce8eb 100644 --- a/ryzom/client/src/interfaces_manager/chat_input.cpp +++ b/ryzom/client/src/interfaces_manager/chat_input.cpp @@ -126,15 +126,16 @@ void CChatInput::operator()(const CEvent& event) // TAB case KeyTAB: - if(insert()) - { - if(!_Str.empty() && _Str[0] == '/') - { - string command = _Str.toString().substr(1); - ICommand::expand(command); - _Str = '/' + command; - } - } + //comment out because no one used it and will be replaces with a lua function search_command() + //if(insert()) + //{ + // if(!_Str.empty() && _Str[0] == '/') + // { + // string command = _Str.toString().substr(1); + // ICommand::expand(command); + // _Str = '/' + command; + // } + //} break; // ESCAPE From afe7cb3dc3bd4055d2639a0094c83723edec3d47 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Thu, 4 Jan 2024 19:12:06 +0100 Subject: [PATCH 128/194] Changed: add new interface window for menu to select autocomplet --- ryzom/client/data/gamedev/interfaces_v3/widgets.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml index 33d76d4a13..edd8b47528 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml @@ -707,7 +707,8 @@ <!-- ********************* --> <!-- * EDIT BOX WIDGET * --> <!-- ********************* --> - <template name="edit_box_widget" active="true" posref="TL TL" text_x="0" text_y="0" text_ref="BL BL" child_resize_h="true" child_resize_hmargin="0" multi_line="false" x="0" y="0" w="0" h="0" sizeref="" id="eb" posparent="parent" onenter="chat_box_entry" params="" reset_focus_on_hide="true" enter_loose_focus="true" prompt=">" enter_recover_focus="true" max_num_chars="255" menu_r="" onchange="lua" onchange_params="search_command(getUICaller().id)" entry_type="text" keep="true" max_historic="40" fontsize="10" shadow="true" shadow_x="1" shadow_y="1" shadow_color="0 0 0 255" shadow_outline="false" backup_father_container_pos="false" want_return="false" clear_on_escape="false" color="255 255 255 255" continuous_text_update="false" bg_texture="W_box_blank.tga" on_focus_lost="" on_focus_lost_params="" max_float_prec="5" tooltip="" tooltip_parent="" negative_filter="" render_layer="0"> + <group type="menu" id="search_command_add_menu" extends="base_menu" mouse_pos="true"></group> + <template name="edit_box_widget" active="true" posref="TL TL" text_x="0" text_y="0" text_ref="BL BL" child_resize_h="true" child_resize_hmargin="0" multi_line="false" x="0" y="0" w="0" h="0" sizeref="" id="eb" posparent="parent" onenter="chat_box_entry" params="" reset_focus_on_hide="true" enter_loose_focus="true" prompt=">" enter_recover_focus="true" max_num_chars="255" menu_r="" onchange="lua" onchange_params="SearchCommand:search(getUICaller().id)" entry_type="text" keep="true" max_historic="40" fontsize="10" shadow="true" shadow_x="1" shadow_y="1" shadow_color="0 0 0 255" shadow_outline="false" backup_father_container_pos="false" want_return="false" clear_on_escape="false" color="255 255 255 255" continuous_text_update="false" bg_texture="W_box_blank.tga" on_focus_lost="" on_focus_lost_params="" max_float_prec="5" tooltip="" tooltip_parent="" negative_filter="" render_layer="0"> <group id="#id" active="#active" posref="#posref" x="#x" y="#y" posparent="#posparent" child_resize_h="#child_resize_h" child_resize_hmargin="#child_resize_hmargin" sizeref="#sizeref" w="#w" h="#h" render_layer="#render_layer" > <group type="edit_box" sizeref="w" w="-8" id="ebh" posref="TL TL" x="4" y="-4" child_resize_h="true" onenter="#onenter" params="#params" onchange="#onchange" onchange_params="#onchange_params" max_num_chars="#max_num_chars" prompt="#prompt" enter_loose_focus="#enter_loose_focus" enter_recover_focus="#enter_recover_focus" entry_type="#entry_type" reset_focus_on_hide="#reset_focus_on_hide" menu_r="#menu_r" max_historic="#max_historic" want_return="#want_return" clear_on_escape="#clear_on_escape" backup_father_container_pos="#backup_father_container_pos" on_focus_lost="#on_focus_lost" on_focus_lost_params="#on_focus_lost_params" max_float_prec="#max_float_prec" tooltip="#tooltip" tooltip_parent="#tooltip_parent" negative_filter="#negative_filter" render_layer="#render_layer"> <view id="edit_text" type="text" continuous_update="#continuous_text_update" x="#text_x" y="#text_y" posref="#text_ref" multi_line="#multi_line" multi_line_space="0" fontsize="#fontsize" color="255 255 255 50" shadow="#shadow" shadow_x="#shadow_x" shadow_y="#shadow_y" shadow_color="#shadow_color" shadow_outline="#shadow_outline" hardtext="" global_color="false" render_layer="#render_layer" /> From f05ca425cd991a95d8ad2ee836f2a2edf5b8f42a Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Fri, 5 Jan 2024 11:02:04 +0100 Subject: [PATCH 129/194] Changed: added new command ? --- ryzom/client/data/gamedev/interfaces_v3/widgets.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml index edd8b47528..54e538f3e6 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml @@ -708,6 +708,7 @@ <!-- * EDIT BOX WIDGET * --> <!-- ********************* --> <group type="menu" id="search_command_add_menu" extends="base_menu" mouse_pos="true"></group> + <command name="?" action="lua" params="SearchCommand:help(getUICaller().id,'+')"/> <template name="edit_box_widget" active="true" posref="TL TL" text_x="0" text_y="0" text_ref="BL BL" child_resize_h="true" child_resize_hmargin="0" multi_line="false" x="0" y="0" w="0" h="0" sizeref="" id="eb" posparent="parent" onenter="chat_box_entry" params="" reset_focus_on_hide="true" enter_loose_focus="true" prompt=">" enter_recover_focus="true" max_num_chars="255" menu_r="" onchange="lua" onchange_params="SearchCommand:search(getUICaller().id)" entry_type="text" keep="true" max_historic="40" fontsize="10" shadow="true" shadow_x="1" shadow_y="1" shadow_color="0 0 0 255" shadow_outline="false" backup_father_container_pos="false" want_return="false" clear_on_escape="false" color="255 255 255 255" continuous_text_update="false" bg_texture="W_box_blank.tga" on_focus_lost="" on_focus_lost_params="" max_float_prec="5" tooltip="" tooltip_parent="" negative_filter="" render_layer="0"> <group id="#id" active="#active" posref="#posref" x="#x" y="#y" posparent="#posparent" child_resize_h="#child_resize_h" child_resize_hmargin="#child_resize_hmargin" sizeref="#sizeref" w="#w" h="#h" render_layer="#render_layer" > <group type="edit_box" sizeref="w" w="-8" id="ebh" posref="TL TL" x="4" y="-4" child_resize_h="true" onenter="#onenter" params="#params" onchange="#onchange" onchange_params="#onchange_params" max_num_chars="#max_num_chars" prompt="#prompt" enter_loose_focus="#enter_loose_focus" enter_recover_focus="#enter_recover_focus" entry_type="#entry_type" reset_focus_on_hide="#reset_focus_on_hide" menu_r="#menu_r" max_historic="#max_historic" want_return="#want_return" clear_on_escape="#clear_on_escape" backup_father_container_pos="#backup_father_container_pos" on_focus_lost="#on_focus_lost" on_focus_lost_params="#on_focus_lost_params" max_float_prec="#max_float_prec" tooltip="#tooltip" tooltip_parent="#tooltip_parent" negative_filter="#negative_filter" render_layer="#render_layer"> From e18fbebeb29d52fa3aa9422c6fe57cfcbd4c75a7 Mon Sep 17 00:00:00 2001 From: Tobias Peters <tobias.peters@kreativeffekt.at> Date: Fri, 29 Dec 2023 08:39:31 +0100 Subject: [PATCH 130/194] Merge pull request #694 from zerotacg/feature/fix-cmake-subdirs-deprecation replace deprecated cmake subdirs command with add_subdirectory --- nel/include/CMakeLists.txt | 3 +- nel/include/nel/CMakeLists.txt | 18 ++--- nel/tools/3d/CMakeLists.txt | 80 +++++++++---------- nel/tools/logic/CMakeLists.txt | 3 +- nel/tools/memory/CMakeLists.txt | 2 +- nel/tools/misc/CMakeLists.txt | 18 ++--- .../misc/log_analyser_plug_ins/CMakeLists.txt | 2 +- 7 files changed, 60 insertions(+), 66 deletions(-) diff --git a/nel/include/CMakeLists.txt b/nel/include/CMakeLists.txt index b234f8fdeb..62534522c4 100644 --- a/nel/include/CMakeLists.txt +++ b/nel/include/CMakeLists.txt @@ -1,2 +1 @@ -SUBDIRS(nel) - +add_subdirectory(nel) \ No newline at end of file diff --git a/nel/include/nel/CMakeLists.txt b/nel/include/nel/CMakeLists.txt index fda0ddbe92..8e50f3e7ef 100644 --- a/nel/include/nel/CMakeLists.txt +++ b/nel/include/nel/CMakeLists.txt @@ -1,7 +1,7 @@ -SUBDIRS(misc) +ADD_SUBDIRECTORY(misc) IF(WITH_3D) - SUBDIRS(3d) + ADD_SUBDIRECTORY(3d) ENDIF() IF(WITH_WEB OR WITH_GUI) @@ -13,29 +13,29 @@ IF(WITH_GUI) ENDIF() IF(WITH_GEORGES) - SUBDIRS(georges) + ADD_SUBDIRECTORY(georges) ENDIF() IF(WITH_LIGO) - SUBDIRS(ligo) + ADD_SUBDIRECTORY(ligo) ENDIF() IF(WITH_LOGIC) - SUBDIRS(logic) + ADD_SUBDIRECTORY(logic) ENDIF() IF(WITH_NET) - SUBDIRS(net) + ADD_SUBDIRECTORY(net) ENDIF() IF(WITH_SOUND) - SUBDIRS(sound) + ADD_SUBDIRECTORY(sound) ENDIF() IF(WITH_PACS) - SUBDIRS(pacs) + ADD_SUBDIRECTORY(pacs) ENDIF() IF(WITH_NEL_CEGUI) - SUBDIRS(cegui) + ADD_SUBDIRECTORY(cegui) ENDIF() diff --git a/nel/tools/3d/CMakeLists.txt b/nel/tools/3d/CMakeLists.txt index 8bf56b6c81..bad0382bf8 100644 --- a/nel/tools/3d/CMakeLists.txt +++ b/nel/tools/3d/CMakeLists.txt @@ -2,52 +2,48 @@ IF(WITH_NEL_TOOLS) IF(WITH_3D) IF(WITH_ASSIMP) - SUBDIRS( - mesh_utils - mesh_export) + ADD_SUBDIRECTORY(mesh_utils) + ADD_SUBDIRECTORY(mesh_export) ENDIF() IF(WITH_LIBGSF) - SUBDIRS( - pipeline_max - pipeline_max_dump - pipeline_max_rewrite_assets) + ADD_SUBDIRECTORY(pipeline_max) + ADD_SUBDIRECTORY(pipeline_max_dump) + ADD_SUBDIRECTORY(pipeline_max_rewrite_assets) ENDIF() - SUBDIRS( - anim_builder - animation_set_builder - build_clod_bank - build_clodtex - build_coarse_mesh - build_far_bank - build_shadow_skin - build_smallbank - cluster_viewer - file_info - ig_add - ig_elevation - ig_info - ig_lighter - lightmap_optimizer - zone_dependencies - zone_ig_lighter - zone_lighter - zone_welder - unbuild_elevation - zone_elevation - shapes_exporter - shape2obj - zone_check_bind - zone_dump - zviewer) + ADD_SUBDIRECTORY(anim_builder) + ADD_SUBDIRECTORY(animation_set_builder) + ADD_SUBDIRECTORY(build_clod_bank) + ADD_SUBDIRECTORY(build_clodtex) + ADD_SUBDIRECTORY(build_coarse_mesh) + ADD_SUBDIRECTORY(build_far_bank) + ADD_SUBDIRECTORY(build_shadow_skin) + ADD_SUBDIRECTORY(build_smallbank) + ADD_SUBDIRECTORY(cluster_viewer) + ADD_SUBDIRECTORY(file_info) + ADD_SUBDIRECTORY(ig_add) + ADD_SUBDIRECTORY(ig_elevation) + ADD_SUBDIRECTORY(ig_info) + ADD_SUBDIRECTORY(ig_lighter) + ADD_SUBDIRECTORY(lightmap_optimizer) + ADD_SUBDIRECTORY(zone_dependencies) + ADD_SUBDIRECTORY(zone_ig_lighter) + ADD_SUBDIRECTORY(zone_lighter) + ADD_SUBDIRECTORY(zone_welder) + ADD_SUBDIRECTORY(unbuild_elevation) + ADD_SUBDIRECTORY(zone_elevation) + ADD_SUBDIRECTORY(shapes_exporter) + ADD_SUBDIRECTORY(shape2obj) + ADD_SUBDIRECTORY(zone_check_bind) + ADD_SUBDIRECTORY(zone_dump) + ADD_SUBDIRECTORY(zviewer) ENDIF() - SUBDIRS( - build_interface - unbuild_interface - get_neighbors - textures_optimizer - textures_tool - tga_cut - tga_resize) + ADD_SUBDIRECTORY(build_interface) + ADD_SUBDIRECTORY(unbuild_interface) + ADD_SUBDIRECTORY(get_neighbors) + ADD_SUBDIRECTORY(textures_optimizer) + ADD_SUBDIRECTORY(textures_tool) + ADD_SUBDIRECTORY(tga_cut) + ADD_SUBDIRECTORY(tga_resize) ENDIF() # For tools selection of only max plugins diff --git a/nel/tools/logic/CMakeLists.txt b/nel/tools/logic/CMakeLists.txt index 0f65ab8f67..520a057702 100644 --- a/nel/tools/logic/CMakeLists.txt +++ b/nel/tools/logic/CMakeLists.txt @@ -1,3 +1,4 @@ IF(MFC_FOUND) - SUBDIRS(logic_editor_dll logic_editor_exe) + ADD_SUBDIRECTORY(logic_editor_dll) + ADD_SUBDIRECTORY(logic_editor_exe) ENDIF() diff --git a/nel/tools/memory/CMakeLists.txt b/nel/tools/memory/CMakeLists.txt index 458a4cc668..66dc4b6e8d 100644 --- a/nel/tools/memory/CMakeLists.txt +++ b/nel/tools/memory/CMakeLists.txt @@ -1 +1 @@ -SUBDIRS(memlog) +ADD_SUBDIRECTORY(memlog) diff --git a/nel/tools/misc/CMakeLists.txt b/nel/tools/misc/CMakeLists.txt index dbe814d3fc..c1f6bdfb7e 100644 --- a/nel/tools/misc/CMakeLists.txt +++ b/nel/tools/misc/CMakeLists.txt @@ -4,16 +4,14 @@ IF(WITH_QT OR WITH_QT5) ENDIF() IF(WITH_NEL_TOOLS) - SUBDIRS( - bnp_make - snp_make - disp_sheet_id - extract_filename - lock - make_sheet_id - xml_packer - utf_generator - ) + ADD_SUBDIRECTORY(bnp_make) + ADD_SUBDIRECTORY(snp_make) + ADD_SUBDIRECTORY(disp_sheet_id) + ADD_SUBDIRECTORY(extract_filename) + ADD_SUBDIRECTORY(lock) + ADD_SUBDIRECTORY(make_sheet_id) + ADD_SUBDIRECTORY(xml_packer) + ADD_SUBDIRECTORY(utf_generator) IF(WITH_QT OR WITH_QT5) ADD_SUBDIRECTORY(words_dic_qt) diff --git a/nel/tools/misc/log_analyser_plug_ins/CMakeLists.txt b/nel/tools/misc/log_analyser_plug_ins/CMakeLists.txt index c773742110..a6ffad5815 100644 --- a/nel/tools/misc/log_analyser_plug_ins/CMakeLists.txt +++ b/nel/tools/misc/log_analyser_plug_ins/CMakeLists.txt @@ -1 +1 @@ -SUBDIRS(extract_warnings) +ADD_SUBDIRECTORY(extract_warnings) From 6bacee167778dc4ee5037621f795e9c8afd58c47 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Sun, 7 Jan 2024 22:08:36 +0100 Subject: [PATCH 131/194] Changed: moved lua code to client, add new getPlayerPrivs lua command --- .../gamedev/interfaces_v3/search_command.lua | 778 ++++++++++++++++++ .../data/gamedev/interfaces_v3/widgets.xml | 3 +- .../client/src/interface_v3/lua_ihm_ryzom.cpp | 21 + ryzom/client/src/interface_v3/lua_ihm_ryzom.h | 1 + 4 files changed, 802 insertions(+), 1 deletion(-) create mode 100644 ryzom/client/data/gamedev/interfaces_v3/search_command.lua diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua new file mode 100644 index 0000000000..7b1be6fdee --- /dev/null +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -0,0 +1,778 @@ +if not SearchCommand then + --global SearchCommand class + SearchCommand = { + identifier_found = {}, + command_self = "", + command_parameter_list = {}, + valid_commands_list = {}, + commands_list = {}, + key_tab_down = 0, + modal_open=0, + process_list={} + } +end + +--setup data +--commands_list[x] = {"type(client/shard)","priv(player/privs)","uitranslation for description","command", "parameter1(playername/text/number)", "parameter2(playername/text/number)" ..} +SearchCommand.commands_list = {} + +local player_priv = isPlayerPrivilege() +if(player_priv)then + table.insert(SearchCommand.commands_list,{"client", "player", "help_desc", "?", {{"text:<Command>",""}, {"all","help_all_desc"}}, {{"client/shard",""}}}) +else + table.insert(SearchCommand.commands_list,{"client", "player", "help_desc", "?", {{"text:<Command>",""}, {"all","help_all_desc"}}}) +end + +--client commands +table.insert(SearchCommand.commands_list,{"client", "player", "time_desc", "time"}) +table.insert(SearchCommand.commands_list,{"client", "player", "version_desc", "version"}) +table.insert(SearchCommand.commands_list,{"client", "player", "where_desc", "where"}) +table.insert(SearchCommand.commands_list,{"client", "player", "playedTime_desc", "playedTime"}) +table.insert(SearchCommand.commands_list,{"client", "player", "who_desc", "who", {{"gm","who_gm_desc"}}, {{"channel","who_channel_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guildinvite_desc", "guildinvite",{{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guildmotd_desc", "guildmotd",{{"text:<Message>","guildmotd_message_desc"},{"?","guildmotd_?_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "league_desc", "league",{{"text:<leaguename>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "leagueinvite_desc", "leagueinvite",{{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "leaguequit_desc", "leaguequit"}) +table.insert(SearchCommand.commands_list,{"client", "player", "leaguekick_desc", "leaguekick",{{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "afk_desc", "afk",{{"text:<autoresponse>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "assist_desc", "assist"}) +table.insert(SearchCommand.commands_list,{"client", "player", "assist_desc", "as"}) +table.insert(SearchCommand.commands_list,{"client", "player", "self_desc", "self"}) +table.insert(SearchCommand.commands_list,{"client", "player", "brutalQuit_desc", "brutalQuit"}) +table.insert(SearchCommand.commands_list,{"client", "player", "chatLog_desc", "chatLog"}) +table.insert(SearchCommand.commands_list,{"client", "player", "follow_desc", "follow"}) +table.insert(SearchCommand.commands_list,{"client", "player", "ignore_desc", "ignore",{{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "invite_desc", "invite",{{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "mount_desc", "mount"}) +table.insert(SearchCommand.commands_list,{"client", "player", "unmount_desc", "unmount"}) +table.insert(SearchCommand.commands_list,{"client", "player", "random_desc", "random", {{"number:<lowest_number>",""}}, {{"number:<highest_number>",""}}, {{"hide ",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "skiptutorial_desc", "skiptutorial"}) +table.insert(SearchCommand.commands_list,{"client", "player", "sleep_desc", "sleep", {{"number:<number>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "tar_desc", "tar", {{"text:<name>",""}}, {{"|quiet=true","tar_quiet_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "target_quiet_desc", "target_quiet"}) +table.insert(SearchCommand.commands_list,{"client", "player", "target_quiet_desc", "tarq"}) +table.insert(SearchCommand.commands_list,{"client", "player", "lmtar_desc", "lmtar", {{"text:<name>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "chat_desc", "chat"}) +table.insert(SearchCommand.commands_list,{"client", "player", "go_desc", "go"}) +table.insert(SearchCommand.commands_list,{"client", "player", "appzone_desc", "appzone", {{"number:<AppId>","appzone_AppId_desc"},{"hide","appzone_hide_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "setuiscale_desc", "setuiscale", {{"number:<ScaleFactor>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "createGroup_desc", "createGroup", {{"text:<OutfitGroupName>","createGroup_OutfitGroupName_desc"},{"true","createGroup_true_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "moveGroup_desc", "moveGroup", {{"text:<OutfitGroupName>",""}},{{"text:<PetAnimal1>",""},{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "equipGroup_desc", "equipGroup", {{"text:<OutfitGroupName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "deleteGroup_desc", "deleteGroup", {{"text:<OutfitGroupName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "naked_desc", "naked"}) +table.insert(SearchCommand.commands_list,{"client", "player", "nude_desc", "nude"}) +table.insert(SearchCommand.commands_list,{"client", "player", "listGroup_desc", "listGroup"}) +table.insert(SearchCommand.commands_list,{"client", "player", "say_desc", "say",{{">","s_param1_desc"}}, {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "say_desc", "s",{{">","s_param1_desc"}}, {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "shout", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "sh", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "y", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "yell", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "guild", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "g", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "gu", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "region", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "r", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "re", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "team", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "te", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "party", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "p", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "universe_desc", "universe", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "universe_desc", "u", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "0_desc", "0", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "1_desc", "1", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "2_desc", "2", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "3_desc", "3", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "4_desc", "4", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "channel_desc", "channel",{{"text:<channelname>",""}}, {{"text:<password>",""},{"*","channel_leave_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "tell",{{"text:<PlayerName>",""}}, {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "t",{{"text:<PlayerName>",""}}, {{"text:<Message>",""}}}) +--END client commands + + +--shard commands +table.insert(SearchCommand.commands_list,{"shard", "player", "a_desc", "a", {{"text:<Command>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "privs", "b_desc", "b", {{"text:<Command>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "privs", "c_desc", "c", {{"text:<TargetName>",""}}, {{"text:<Command>",""}}}) + +table.insert(SearchCommand.commands_list,{"shard", "player", "showOnline_desc", "showOnline", {{"1","showOnline_1_desc"}, {"2","showOnline_2_desc"},{"0","showOnline_0_desc"}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "roomInvite_desc", "roomInvite", {{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "setDontTranslateLangs_desc", "setDontTranslateLangs", {{"codelang|codelang","setDontTranslateLangs_codelang_desc"}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "connectLangChannel_desc", "connectLangChannel",{{"fr",""},{"en",""},{"de",""},{"es",""},{"ru",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "privs", "Position_desc", "Position", {{"number:<posx>,<posy>[,<posz>]",""},{"text:<bot name>",""},{"text:<PlayerName>",""}}}) +--END shard commands + +function SearchCommand:find(tbl, value) + for k, v in pairs(tbl) do + if v == value then + return k + end + end + return nil +end + +function SearchCommand:help_show_all(parameter) + local player_priv = isPlayerPrivilege() + + debug("help parameter: "..parameter) + + if(parameter == "all")then + displaySystemInfo(ucstring("######################## command help all #######################"), "AROUND") + else + displaySystemInfo(ucstring("######################## command help all / filter '"..parameter.."' #######################"), "AROUND") + end + + for c = 1, #self.commands_list do + local command_are_allowed = 0 + if(self.commands_list[c][2] == "player")then + command_are_allowed = 1 + else + if(player_priv)then + command_are_allowed = 1 + end + end + + if(command_are_allowed == 1)then + if(self.commands_list[c][1] == parameter or parameter == "all")then + local arg_display="" + displaySystemInfo(ucstring(""), "AROUND") + + max_arguments = #self.commands_list[c] - 4 + for ad = 1, max_arguments do + if(ad > 1)then + arg_display=arg_display.." [arg"..ad.."]" + else + arg_display="[arg"..ad.."]" + end + end + + displaySystemInfo(ucstring(c..". "..self.commands_list[c][4].." "..arg_display.." '"..self.commands_list[c][3].."'"), "AROUND") + displaySystemInfo(ucstring(" type: "..self.commands_list[c][1]), "AROUND") + + for ac = 1, max_arguments do + displaySystemInfo(ucstring(" arg"..ac.." :"), "AROUND") + for pc = 1, #self.commands_list[c][4+ac] do + if(self.commands_list[c][4+ac][pc][2] == "")then + displaySystemInfo(ucstring(" "..self.commands_list[c][4+ac][pc][1]), "AROUND") + else + displaySystemInfo(ucstring(" "..self.commands_list[c][4+ac][pc][1].." '"..self.commands_list[c][4+ac][pc][2].."'"), "AROUND") + end + end + end + if(self.commands_list[c][4] ~= "a" and self.commands_list[c][4] ~= "b" and self.commands_list[c][4] ~= "c")then + if(self.commands_list[c][1] == "shard")then + displaySystemInfo(ucstring(" example: /a "..self.commands_list[c][4].." , /c riasan "..self.commands_list[c][4]), "AROUND") + end + end + end + end + end + + displaySystemInfo(ucstring(""), "AROUND") + displaySystemInfo(ucstring("############################ end ##########################"), "AROUND") +end + +function SearchCommand:help(uiId,input) + --debug("search_input: "..input) + + local command_split = {} + + if(input ~= "all")then + for substring in input:gmatch("%S+") do + table.insert(command_split, substring) + end + else + command_split[1]="all" + command_split[2]="" + end + + if(command_split[1] == "all")then + if(command_split[2] == "")then + SearchCommand:help_show_all(command_split[1]) + else + SearchCommand:help_show_all(command_split[2]) + end + else + --show help for command input + local command_found = 0 + for c = 1, #self.commands_list do + local command_are_allowed = 0 + if(self.commands_list[c][4] == command_split[1])then + command_found = 1 + displaySystemInfo(ucstring("######################## command help "..command_split[1].." #######################"), "AROUND") + + local player_priv = isPlayerPrivilege() + if(self.commands_list[c][2] == "player")then + command_are_allowed = 1 + else + if(player_priv)then + command_are_allowed = 1 + end + end + + if(command_are_allowed == 1)then + local arg_display="" + displaySystemInfo(ucstring(""), "AROUND") + + max_arguments = #self.commands_list[c] - 4 + for ad = 1, max_arguments do + if(ad > 1)then + arg_display=arg_display.." [arg"..ad.."]" + else + arg_display="[arg"..ad.."]" + end + end + displaySystemInfo(ucstring("desc: "..self.commands_list[c][3]), "AROUND") + displaySystemInfo(ucstring("type: "..self.commands_list[c][1]), "AROUND") + displaySystemInfo(ucstring(""), "AROUND") + displaySystemInfo(ucstring(self.commands_list[c][4].." "..arg_display), "AROUND") + + for ac = 1, max_arguments do + displaySystemInfo(ucstring(" arg"..ac.." :"), "AROUND") + for pc = 1, #self.commands_list[c][4+ac] do + if(self.commands_list[c][4+ac][pc][2] == "")then + displaySystemInfo(ucstring(" "..self.commands_list[c][4+ac][pc][1]), "AROUND") + else + displaySystemInfo(ucstring(" "..self.commands_list[c][4+ac][pc][1].." '"..self.commands_list[c][4+ac][pc][2].."'"), "AROUND") + end + end + end + if(self.commands_list[c][4] ~= "a" and self.commands_list[c][4] ~= "b" and self.commands_list[c][4] ~= "c")then + if(self.commands_list[c][1] == "shard")then + displaySystemInfo(ucstring(" example: /a "..self.commands_list[c][4].." , /c riasan "..self.commands_list[c][4]), "AROUND") + end + end + displaySystemInfo(ucstring(""), "AROUND") + displaySystemInfo(ucstring("############################ end ############################"), "AROUND") + end + end + end + if(command_found == 0)then + displaySystemInfo(ucstring("Command not found"), "AROUND") + end + end +end + +function SearchCommand:check_autocomplet(uiId) + --debug("try_autocomplte") + if(self.modal_open==1)then + if next(self.valid_commands_list)then + --debug("check_autocomplet"..self.valid_commands_list[1]) + SearchCommand:finish_commands(self.valid_commands_list[1],uiId) + end + end +end + +function SearchCommand:key_trigger(uiId) + base_window_id = string.sub(uiId,0,string.len(uiId)-15); + local check_window = getUI(base_window_id) + + if(check_window.active == false)then + --debug("window closed") + local timer_function_on_ui_window = getUI(uiId) + removeOnDbChange(timer_function_on_ui_window,"@UI:VARIABLES:CURRENT_SERVER_TICK") + end + + is_tab_down = isTabDown() + if(key_tab_down == 1)then + key_tab_down = 0 + SearchCommand:check_autocomplet(uiId) + elseif(is_tab_down)then + key_tab_down = 0 + SearchCommand:check_autocomplet(uiId) + end + + --check is input are empty if yes cancel all stuff + local text_from_input = getUI(uiId) + if(text_from_input.input_string == "")then + SearchCommand:search(uiId) + end + +end + +function SearchCommand:update_process_list(uiId,p_status) + local found_process_status=0 + + --check if we already have a process status for this window + if next(self.process_list)then + for pc = 1, #self.process_list do + if(self.process_list[pc][1] == uiId)then + found_process_status=1 + end + end + end + + if(found_process_status == 0)then + table.insert(self.process_list,{uiId, p_status}) + else + if next(self.process_list)then + for pc = 1, #self.process_list do + if(self.process_list[pc][1] == uiId)then + self.process_list[pc][2]=p_status + end + end + end + end +end + +function SearchCommand:read_process_status(uiId) + local process_status = 0 + if next(self.process_list)then + for pc = 1, #self.process_list do + if(self.process_list[pc][1] == uiId)then + process_status=self.process_list[pc][2] + end + end + end + return process_status +end + +function SearchCommand:search(uiId) + is_tab_down = isTabDown() + if(is_tab_down)then + key_tab_down = 1 + end + --trigger command by onchange a singel input + + self.command_parameter_list = {} + local text_from_input = getUI(uiId) + command_identifier = string.sub(text_from_input.input_string, 0, 1) + + --check if first char are a "/" from text_from_input + if(command_identifier == "/")then + --debug("identifier found") + + if(SearchCommand:find(self.identifier_found, uiId) == nil)then + table.insert(self.identifier_found, uiId) + + local timer_str = "@UI:VARIABLES:CURRENT_SERVER_TICK" + local timer_function_on_ui_window = getUI(uiId) + addOnDbChange(timer_function_on_ui_window, timer_str, "SearchCommand:key_trigger('"..uiId.."')") + end + + + + max_string_count = string.len(text_from_input.input_string) + + if(max_string_count == 1)then + self.command_self="" + SearchCommand:write_command_help(uiId,"/<command> or /? all") + SearchCommand:close_modal() + + --update process_status + SearchCommand:update_process_list(uiId,0) + else + local command_first = string.sub(text_from_input.input_string, 2, (max_string_count)) + --split text to commands + for substring in command_first:gmatch("%S+") do + table.insert(self.command_parameter_list, substring) + end + + self.command_self=self.command_parameter_list[1] + + --update process_status + SearchCommand:update_process_list(uiId,#self.command_parameter_list) + + --go and search we found a mathing command + SearchCommand:write_command_help_clear(uiId) + SearchCommand:build_command_helper(uiId) + end + else + --check if we found the identifier + if(SearchCommand:find(self.identifier_found, uiId) ~= nil)then + --debug("clear all") + --run clear functions here + + table.remove(self.identifier_found, SearchCommand:find(self.identifier_found, uiId)) + local timer_function_on_ui_window = getUI(uiId) + removeOnDbChange(timer_function_on_ui_window,"@UI:VARIABLES:CURRENT_SERVER_TICK") + + SearchCommand:close_modal() + SearchCommand:write_command_help_clear(uiId) + end + end +end + +function SearchCommand:build_valid_command_list(command_input) + self.valid_commands_list = {} + local player_priv = isPlayerPrivilege() + local count_found=0 + local found_command=0 + + for c = 1, #self.commands_list do + local command_are_allowed = 0 + if(self.commands_list[c][2] == "player")then + command_are_allowed = 1 + else + if(player_priv)then + command_are_allowed = 1 + end + end + + --check if we want used a client or shared command + if(self.command_self == "a" or self.command_self == "b" or self.command_self == "c")then + if(self.commands_list[c][1] == "shard")then + command_are_allowed = 1 + else + command_are_allowed = 0 + end + else + if(self.commands_list[c][1] == "shard")then + if(self.command_self == "?")then + command_are_allowed = 1 + else + command_are_allowed = 0 + end + end + end + + if(command_are_allowed == 1)then + if(command_input ~= "")then + if(string.lower(self.commands_list[c][4]) == string.lower(command_input))then + found_command=c + count_found=1 + else + if string.find(string.lower(self.commands_list[c][4]), string.lower(command_input))then + table.insert(self.valid_commands_list,self.commands_list[c][4]) + count_found=count_found+1 + end + end + end + end + end + + if(count_found == 0)then + --debug("no_command_found_close_modal") + SearchCommand:close_modal() + end + return found_command +end + +function SearchCommand:build_valid_player_list(playername_input) + player_list = {} + player_list[1] = "rias" + player_list[2] = "uluk" + player_list[3] = "riasan" + player_list[4] = "Limay" + player_list[5] = "Neira" + player_list[6] = "Beastie" + player_list[7] = "Audeva" + player_list[8] = "Decacaon" + player_list[9] = "Livege" + player_list[10] = "Purg" + player_list[11] = "Xxramusxx" + player_list[12] = "Kronoss" + player_list[13] = "Livan" + player_list[14] = "Mifisto" + player_list[15] = "Progulschik" + player_list[16] = "Darwyn" + player_list[17] = "Aprak" + player_list[18] = "Dorothee" + player_list[19] = "Zillah" + + self.valid_commands_list = {} + local count_found=0 + local found_playername=0 + + for c = 1, #player_list do + if(playername_input ~= "")then + if(string.lower(player_list[c]) == string.lower(playername_input))then + found_playername=c + count_found=1 + else + if string.find(string.lower(player_list[c]), string.lower(playername_input))then + table.insert(self.valid_commands_list,player_list[c]) + count_found=count_found+1 + end + end + end + end + + if(count_found == 0)then + SearchCommand:close_modal() + end + return found_playername +end + +function SearchCommand:search_build_player_list(uiId,playername) + local found_player=0 + local found_command=0 + found_player=SearchCommand:build_valid_player_list(playername) + + SearchCommand:search_build_argument_list(uiId,self.command_self) + + if(found_player ~= 0)then + SearchCommand:close_modal() + else + if next(self.valid_commands_list) ~= nil then + SearchCommand:show_more_options(uiId) + end + end +end + +function SearchCommand:search_build_command_list(uiId,command,show_argument_help) + local found_command=0 + --debug("search_build_command_list") + + found_command=SearchCommand:build_valid_command_list(command) + + if(found_command ~= 0)then + SearchCommand:close_modal() + else + if next(self.valid_commands_list) ~= nil then + SearchCommand:show_more_options(uiId) + end + end + + if(show_argument_help)then + if(found_command ~= 0)then + SearchCommand:search_build_argument_list(uiId,command) + end + else + SearchCommand:search_build_argument_list(uiId,self.command_self) + end +end + +function SearchCommand:search_build_argument_list(uiId,command_to_show_argument) + local argument_help="" + local command_index=0 + local max_arguments=0 + local current_args=0 + local special_offset=0 + + if(command_to_show_argument == "a")then + if(#self.command_parameter_list >= 2)then + command_to_show_argument=self.command_parameter_list[2] + special_offset=1 + end + end + + if(command_to_show_argument == "b")then + if(#self.command_parameter_list >= 2)then + command_to_show_argument=self.command_parameter_list[2] + special_offset=1 + end + end + + if(command_to_show_argument == "c")then + if(#self.command_parameter_list >= 3)then + command_to_show_argument=self.command_parameter_list[3] + special_offset=2 + end + end + + for c = 1, #self.commands_list do + if(self.commands_list[c][4] == command_to_show_argument)then + command_index=c + end + end + + if(command_index ~= 0)then + + max_arguments = #self.commands_list[command_index] - 4 + + for ac = 1, max_arguments do + max_args=#self.command_parameter_list + current_args=max_args - 1 + --debug("p: "..#self.command_parameter_list.." l: "..ac) + + if(special_offset ~= 0)then + max_args=max_args - special_offset + current_args=max_args - 1 + end + + if(max_args == ac or max_args == 1)then + for pc = 1, #self.commands_list[command_index][4+ac] do + if(pc > 1)then + argument_help=argument_help.."/"..self.commands_list[command_index][4+ac][pc][1] + else + argument_help=argument_help.." "..self.commands_list[command_index][4+ac][pc][1] + end + end + else + argument_help=argument_help.." "..self.command_parameter_list[ac+1+special_offset] + end + end + + if(current_args > max_arguments)then + diff=current_args-max_arguments + + for ma = 1, diff do + if(self.command_self == "a")then + argument_help=argument_help.." "..self.command_parameter_list[max_arguments+2+ma] + elseif(self.command_self == "b")then + argument_help=argument_help.." "..self.command_parameter_list[max_arguments+2+ma] + elseif(self.command_self == "c")then + argument_help=argument_help.." "..self.command_parameter_list[max_arguments+3+ma] + else + argument_help=argument_help.." "..self.command_parameter_list[max_arguments+1+ma] + end + end + + argument_help=argument_help.." Warning to many Arguments" + end + + if(self.command_self == "a" and #self.command_parameter_list >= 2)then + SearchCommand:write_command_help(uiId,"/"..self.command_parameter_list[1].." "..self.command_parameter_list[2]..""..argument_help) + elseif(self.command_self == "b" and #self.command_parameter_list >= 2)then + SearchCommand:write_command_help(uiId,"/"..self.command_parameter_list[1].." "..self.command_parameter_list[2]..""..argument_help) + elseif(self.command_self == "c" and #self.command_parameter_list >= 3)then + SearchCommand:write_command_help(uiId,"/"..self.command_parameter_list[1].." "..self.command_parameter_list[2].." "..self.command_parameter_list[3]..""..argument_help) + else + SearchCommand:write_command_help(uiId,"/"..self.commands_list[command_index][4]..""..argument_help) + end + end +end + +function SearchCommand:find_argument(command,uiId) + --debug("find_argument") + local argument_name = "" + local special_offset = 0 + local current_parm = 0 + local max_command_args = 0 + + if(command == "a")then + if(#self.command_parameter_list > 2)then + command=self.command_parameter_list[2] + special_offset=2 + end + end + + if(command == "b")then + if(#self.command_parameter_list > 2)then + command=self.command_parameter_list[2] + special_offset=2 + end + end + + if(command == "c")then + if(#self.command_parameter_list > 3)then + command=self.command_parameter_list[3] + special_offset=3 + end + end + + --debug("special_offset: "..special_offset.." command: "..command) + + for c = 1, #self.commands_list do + if(self.commands_list[c][4] == command)then + if(special_offset ~= 0)then + current_parm=SearchCommand:read_process_status(uiId) - special_offset + else + current_parm=SearchCommand:read_process_status(uiId) - 1 + end + + max_command_args = #self.commands_list[c] - 4 + + if(current_parm <= max_command_args)then + for pc = 1, #self.commands_list[c][4+current_parm] do + argument_name=argument_name..","..self.commands_list[c][4+current_parm][pc][1] + end + end + end + end + return argument_name +end + + +function SearchCommand:build_command_helper(uiId) + --read process_list + local player_priv = isPlayerPrivilege() + local argu_name = "" + local process_status=SearchCommand:read_process_status(uiId) + + --debug("process_status: "..process_status) + --process_status == 0 only / identifyer found + --process_status == 1 try for command + --process_status > 1 try for parameter + + if(process_status == 1)then + --initlial command + SearchCommand:search_build_command_list(uiId,self.command_self,true) + else + --debug("process_args") + argu_name = SearchCommand:find_argument(self.command_self,uiId) + --debug("argu_name: "..argu_name) + + + --check if argument can be a command or a playername + if(string.find(string.lower(argu_name), string.lower("<command>")))then + --debug("parm is a command") + SearchCommand:search_build_command_list(uiId,self.command_parameter_list[process_status],false) + elseif(string.find(string.lower(argu_name), string.lower("<PlayerName>")) or string.find(string.lower(argu_name), string.lower("<TargetName>")))then + --debug("parm is a playername") + if(player_priv)then + SearchCommand:search_build_player_list(uiId,self.command_parameter_list[process_status]) + else + SearchCommand:search_build_argument_list(uiId,self.command_self) + end + else + SearchCommand:search_build_argument_list(uiId,self.command_self) + end + end +end + +function SearchCommand:write_command_help(uiId,text) + --debug("write_command_help: "..text) + local behind_help_text = getUI(uiId.."h") + behind_help_text.input_string = text +end + +function SearchCommand:write_command_help_clear(uiId) + local behind_help_text = getUI(uiId.."h") + behind_help_text.input_string = "" +end + +function SearchCommand:close_modal() + self.modal_open=0 + --debug("close_modal") + runAH(nil, "leave_modal", "group=ui:interface:search_command_add_menu") +end + +function SearchCommand:show_more_options(uiId) + self.modal_open=1 + --debug("build_menu") + launchContextMenuInGame("ui:interface:search_command_add_menu") + menu = getUI("ui:interface:search_command_add_menu") + + menu:setMinW(85) + menu:updateCoords() + menu = menu:getRootMenu() + menu:reset() + + menu:addLine(ucstring("Options..."), "", "", "") + + for c = 1, #self.valid_commands_list do + menu:addLine(ucstring(self.valid_commands_list[c]), "lua", "SearchCommand:finish_commands('"..self.valid_commands_list[c].."','"..uiId.."')", "") + end +end + +function SearchCommand:finish_commands(command_name,uiId) + local process_status=SearchCommand:read_process_status(uiId) + local input_search_string = getUI(uiId) + local final_command="" + + for fc = 1, process_status do + if(fc == process_status)then + self.command_parameter_list[fc]=command_name + end + end + + for pc = 1, #self.command_parameter_list do + if(final_command == "")then + final_command = self.command_parameter_list[pc] + else + final_command = final_command.." "..self.command_parameter_list[pc] + end + end + + input_search_string.input_string = "/"..final_command + + input_search_string:setFocusOnText() + + SearchCommand:close_modal() + SearchCommand:search(uiId) +end \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml index 54e538f3e6..105283adc2 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml @@ -3,6 +3,7 @@ <!-- ****************************************** --> <interface_config> <root id="interface" x="0" y="0" w="800" h="600" active="true" /> + <lua file="search_command.lua" /> <proc id="proc_nothing"></proc> <!-- a text with border --> <template name="bc_border_text" keep="true" posref="TM TM" posparent="parent" x="0" y="-20" w="-4"> @@ -712,7 +713,7 @@ <template name="edit_box_widget" active="true" posref="TL TL" text_x="0" text_y="0" text_ref="BL BL" child_resize_h="true" child_resize_hmargin="0" multi_line="false" x="0" y="0" w="0" h="0" sizeref="" id="eb" posparent="parent" onenter="chat_box_entry" params="" reset_focus_on_hide="true" enter_loose_focus="true" prompt=">" enter_recover_focus="true" max_num_chars="255" menu_r="" onchange="lua" onchange_params="SearchCommand:search(getUICaller().id)" entry_type="text" keep="true" max_historic="40" fontsize="10" shadow="true" shadow_x="1" shadow_y="1" shadow_color="0 0 0 255" shadow_outline="false" backup_father_container_pos="false" want_return="false" clear_on_escape="false" color="255 255 255 255" continuous_text_update="false" bg_texture="W_box_blank.tga" on_focus_lost="" on_focus_lost_params="" max_float_prec="5" tooltip="" tooltip_parent="" negative_filter="" render_layer="0"> <group id="#id" active="#active" posref="#posref" x="#x" y="#y" posparent="#posparent" child_resize_h="#child_resize_h" child_resize_hmargin="#child_resize_hmargin" sizeref="#sizeref" w="#w" h="#h" render_layer="#render_layer" > <group type="edit_box" sizeref="w" w="-8" id="ebh" posref="TL TL" x="4" y="-4" child_resize_h="true" onenter="#onenter" params="#params" onchange="#onchange" onchange_params="#onchange_params" max_num_chars="#max_num_chars" prompt="#prompt" enter_loose_focus="#enter_loose_focus" enter_recover_focus="#enter_recover_focus" entry_type="#entry_type" reset_focus_on_hide="#reset_focus_on_hide" menu_r="#menu_r" max_historic="#max_historic" want_return="#want_return" clear_on_escape="#clear_on_escape" backup_father_container_pos="#backup_father_container_pos" on_focus_lost="#on_focus_lost" on_focus_lost_params="#on_focus_lost_params" max_float_prec="#max_float_prec" tooltip="#tooltip" tooltip_parent="#tooltip_parent" negative_filter="#negative_filter" render_layer="#render_layer"> - <view id="edit_text" type="text" continuous_update="#continuous_text_update" x="#text_x" y="#text_y" posref="#text_ref" multi_line="#multi_line" multi_line_space="0" fontsize="#fontsize" color="255 255 255 50" shadow="#shadow" shadow_x="#shadow_x" shadow_y="#shadow_y" shadow_color="#shadow_color" shadow_outline="#shadow_outline" hardtext="" global_color="false" render_layer="#render_layer" /> + <view id="edit_text" type="text" continuous_update="#continuous_text_update" x="#text_x" y="#text_y" posref="#text_ref" multi_line="#multi_line" multi_line_space="0" fontsize="#fontsize" color="255 255 255 100" shadow="#shadow" shadow_x="#shadow_x" shadow_y="#shadow_y" shadow_color="#shadow_color" shadow_outline="#shadow_outline" hardtext="" global_color="false" render_layer="#render_layer" /> </group> <group type="edit_box" sizeref="w" w="-8" id="eb" posref="TL TL" x="4" y="-4" child_resize_h="true" onenter="#onenter" params="#params" onchange="#onchange" onchange_params="#onchange_params" max_num_chars="#max_num_chars" prompt="#prompt" enter_loose_focus="#enter_loose_focus" enter_recover_focus="#enter_recover_focus" entry_type="#entry_type" reset_focus_on_hide="#reset_focus_on_hide" menu_r="#menu_r" max_historic="#max_historic" want_return="#want_return" clear_on_escape="#clear_on_escape" backup_father_container_pos="#backup_father_container_pos" on_focus_lost="#on_focus_lost" on_focus_lost_params="#on_focus_lost_params" max_float_prec="#max_float_prec" tooltip="#tooltip" tooltip_parent="#tooltip_parent" negative_filter="#negative_filter" render_layer="#render_layer"> <view type="bitmap" id="bg" scale="true" sizeref="hw" h="0" w="0" texture="#bg_texture" inherit_gc_alpha="true" render_layer="#render_layer" /> diff --git a/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp b/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp index 923607b12e..cf87a3bf0a 100644 --- a/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp +++ b/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp @@ -492,6 +492,7 @@ void CLuaIHMRyzom::RegisterRyzomFunctions(NLGUI::CLuaState &ls) ls.registerFunc("getPlayerTitle", getPlayerTitle); ls.registerFunc("getPlayerTag", getPlayerTag); ls.registerFunc("getPlayerMode", getPlayerMode); + ls.registerFunc("getPlayerPrivs", getPlayerPrivs); ls.registerFunc("getTargetPos", getTargetPos); ls.registerFunc("getTargetFront", getTargetFront); ls.registerFunc("getTargetDirection", getTargetDirection); @@ -1554,6 +1555,26 @@ int CLuaIHMRyzom::getPlayerMode(CLuaState &ls) return 1; } +// *************************************************************************** +int CLuaIHMRyzom::getPlayerPrivs(CLuaState &ls) +{ + std::string privsString = ""; + + if (hasPrivilegeDEV()) privsString=":DEV"; + if (hasPrivilegeSGM()) privsString+=":SGM"; + if (hasPrivilegeGM()) privsString+=":GM"; + if (hasPrivilegeVG()) privsString+=":VG"; + if (hasPrivilegeSG()) privsString+=":SG"; + if (hasPrivilegeG()) privsString+=":G"; + if (hasPrivilegeEM()) privsString+=":EM"; + if (hasPrivilegeEG()) privsString+=":EG"; + if (hasPrivilegeOBSERVER()) privsString+=":OBSERVER"; + if (hasPrivilegeOBSERVER()) privsString+=":TESTER"; + + ls.push(privsString+=":"); + return 1; +} + // *************************************************************************** int CLuaIHMRyzom::getTargetPos(CLuaState &ls) { diff --git a/ryzom/client/src/interface_v3/lua_ihm_ryzom.h b/ryzom/client/src/interface_v3/lua_ihm_ryzom.h index 068d452e43..b30f1c1af2 100644 --- a/ryzom/client/src/interface_v3/lua_ihm_ryzom.h +++ b/ryzom/client/src/interface_v3/lua_ihm_ryzom.h @@ -92,6 +92,7 @@ class CLuaIHMRyzom static int getPlayerTitle(CLuaState &ls); static int getPlayerTag(CLuaState &ls); static int getPlayerMode(CLuaState &ls); + static int getPlayerPrivs(CLuaState &ls); static int getTargetPos(CLuaState &ls); static int getTargetFront(CLuaState &ls); static int getTargetDirection(CLuaState &ls); From bc9dec37336fc7229b430ef11e3c254d2799cd86 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Tue, 9 Jan 2024 22:40:56 +0100 Subject: [PATCH 132/194] Changes: allow expand by /tell remove old build in autocomplete --- nel/src/gui/group_editbox.cpp | 12 +- .../gamedev/interfaces_v3/search_command.lua | 392 ++++++++++++++---- .../data/gamedev/interfaces_v3/widgets.xml | 4 +- .../src/interface_v3/action_handler_edit.cpp | 4 +- .../client/src/interface_v3/lua_ihm_ryzom.cpp | 9 +- 5 files changed, 326 insertions(+), 95 deletions(-) diff --git a/nel/src/gui/group_editbox.cpp b/nel/src/gui/group_editbox.cpp index 1410e2cb1b..fb0a5a23f3 100644 --- a/nel/src/gui/group_editbox.cpp +++ b/nel/src/gui/group_editbox.cpp @@ -1305,13 +1305,13 @@ namespace NLGUI { makeTopWindow(); // for french, deutsch and russian, be aware of unicode - std::string command = CUtfStringView(_InputString.substr(1)).toUtf8(); - ICommand::expand(command); + //std::string command = CUtfStringView(_InputString.substr(1)).toUtf8(); + //ICommand::expand(command); // then back to u32string - _InputString = CUtfStringView('/' + command).toUtf32(); - _InputString = _InputString; - _CursorPos = (sint32)_InputString.length(); - _CursorAtPreviousLineEnd = false; + //_InputString = CUtfStringView('/' + command).toUtf32(); + //_InputString = _InputString; + //_CursorPos = (sint32)_InputString.length(); + //_CursorAtPreviousLineEnd = false; triggerOnChangeAH(); return true; } diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index 7b1be6fdee..2a758b600a 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -7,8 +7,8 @@ if not SearchCommand then valid_commands_list = {}, commands_list = {}, key_tab_down = 0, - modal_open=0, - process_list={} + modal_open_list = {}, + process_list = {} } end @@ -18,7 +18,7 @@ SearchCommand.commands_list = {} local player_priv = isPlayerPrivilege() if(player_priv)then - table.insert(SearchCommand.commands_list,{"client", "player", "help_desc", "?", {{"text:<Command>",""}, {"all","help_all_desc"}}, {{"client/shard",""}}}) + table.insert(SearchCommand.commands_list,{"client", "player", "help_desc", "?", {{"text:<Command>",""}, {"all","help_all_desc"}}, {{"shard",""},{"client",""},{"eScript",""}}}) else table.insert(SearchCommand.commands_list,{"client", "player", "help_desc", "?", {{"text:<Command>",""}, {"all","help_all_desc"}}}) end @@ -95,16 +95,22 @@ table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "t",{ --shard commands table.insert(SearchCommand.commands_list,{"shard", "player", "a_desc", "a", {{"text:<Command>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", "privs", "b_desc", "b", {{"text:<Command>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", "privs", "c_desc", "c", {{"text:<TargetName>",""}}, {{"text:<Command>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "b_desc", "b", {{"text:<Command>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "c_desc", "c", {{"text:<TargetName>",""}}, {{"text:<Command>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "showOnline_desc", "showOnline", {{"1","showOnline_1_desc"}, {"2","showOnline_2_desc"},{"0","showOnline_0_desc"}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "roomInvite_desc", "roomInvite", {{"text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "setDontTranslateLangs_desc", "setDontTranslateLangs", {{"codelang|codelang","setDontTranslateLangs_codelang_desc"}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "connectLangChannel_desc", "connectLangChannel",{{"fr",""},{"en",""},{"de",""},{"es",""},{"ru",""}}}) -table.insert(SearchCommand.commands_list,{"shard", "privs", "Position_desc", "Position", {{"number:<posx>,<posy>[,<posz>]",""},{"text:<bot name>",""},{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:", "Position_desc", "Position", {{"number:<posx>,<posy>[,<posz>]",""},{"text:<bot name>",""},{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eScript_desc", "eScript", {{"text:<ContinentName>@text:<EventNpcGroup>",""}}, {{"text:<ScriptCommand>",""}}}) --END shard commands +--eScript commands +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setActivity_desc", "()setActivity(\"text:<faction>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAggro_desc", "()setAggro(number:<25>,number:<10>)"}) +--END eScript commands + function SearchCommand:find(tbl, value) for k, v in pairs(tbl) do if v == value then @@ -114,15 +120,62 @@ function SearchCommand:find(tbl, value) return nil end -function SearchCommand:help_show_all(parameter) +function SearchCommand:check_prvis(command_privs) local player_priv = isPlayerPrivilege() + local command_allowed = 0 - debug("help parameter: "..parameter) + if(command_privs == "player" or command_privs == "")then + return 0 + else + if(player_priv)then + local prvis = getPlayerPrivs() + for prvissubstring in prvis:gmatch("[^: ]+") do + for substring in command_privs:gmatch("[^: ]+") do + if(substring == prvissubstring)then + command_allowed = 1 + end + end + end + return command_allowed + else + return 0 + end + end +end + +function SearchCommand:htmlentities(text) + local html_help_content="" + + html_help_content = text:gsub("<", "<") + + return html_help_content +end + +function SearchCommand:pars_help_on_window(content_of_window,height) + local whm = getUI("ui:interface:web_transactions") + local whm_html = getUI("ui:interface:web_transactions:content:html") + + local html_help_content="" + html_help_content=[[<table width="100%" border="0"><tr><td>]]..content_of_window..[[</td></tr></table>]] + + whm.title = "command help" + whm.active = true + whm.w = 750 + whm.h = height + whm_html:renderHtml(html_help_content) +end + + +function SearchCommand:help_show_all(parameter) + local count = 0 + local build_content = "" + --debug("help parameter: "..parameter) + build_content=build_content.."<table width='100%' border=0>" if(parameter == "all")then - displaySystemInfo(ucstring("######################## command help all #######################"), "AROUND") + build_content=build_content.."<tr><td colspan=4>######################## command help all #######################</td></tr>" else - displaySystemInfo(ucstring("######################## command help all / filter '"..parameter.."' #######################"), "AROUND") + build_content=build_content.."<tr><td colspan=4>######################## command help all / filter '"..SearchCommand:htmlentities(parameter).."' #######################</td></tr>" end for c = 1, #self.commands_list do @@ -130,7 +183,7 @@ function SearchCommand:help_show_all(parameter) if(self.commands_list[c][2] == "player")then command_are_allowed = 1 else - if(player_priv)then + if(SearchCommand:check_prvis(self.commands_list[c][2]))then command_are_allowed = 1 end end @@ -138,7 +191,8 @@ function SearchCommand:help_show_all(parameter) if(command_are_allowed == 1)then if(self.commands_list[c][1] == parameter or parameter == "all")then local arg_display="" - displaySystemInfo(ucstring(""), "AROUND") + build_content=build_content.."<tr><td><table width='100%' border=0>" + build_content=build_content.."<tr><td colspan=3> </td></tr>" max_arguments = #self.commands_list[c] - 4 for ad = 1, max_arguments do @@ -149,35 +203,40 @@ function SearchCommand:help_show_all(parameter) end end - displaySystemInfo(ucstring(c..". "..self.commands_list[c][4].." "..arg_display.." '"..self.commands_list[c][3].."'"), "AROUND") - displaySystemInfo(ucstring(" type: "..self.commands_list[c][1]), "AROUND") + count=count+1 + + build_content=build_content.."<tr><td width='10px'>"..count..".</td><td colspan=3>"..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.." '"..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][3]))).."'</td></tr>" + build_content=build_content.."<tr><td> </td><td>type: "..SearchCommand:htmlentities(self.commands_list[c][1]).."</td></tr>" for ac = 1, max_arguments do - displaySystemInfo(ucstring(" arg"..ac.." :"), "AROUND") + build_content=build_content.."<tr><td> </td><td> arg"..ac.." :</td></tr>" for pc = 1, #self.commands_list[c][4+ac] do if(self.commands_list[c][4+ac][pc][2] == "")then - displaySystemInfo(ucstring(" "..self.commands_list[c][4+ac][pc][1]), "AROUND") + build_content=build_content.."<tr><td> </td><td>         "..SearchCommand:htmlentities(self.commands_list[c][4+ac][pc][1]).."</td></tr>" else - displaySystemInfo(ucstring(" "..self.commands_list[c][4+ac][pc][1].." '"..self.commands_list[c][4+ac][pc][2].."'"), "AROUND") + build_content=build_content.."<tr><td> </td><td>         "..SearchCommand:htmlentities(self.commands_list[c][4+ac][pc][1]).." '"..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][4+ac][pc][2]))).."'</td></tr>" end end end if(self.commands_list[c][4] ~= "a" and self.commands_list[c][4] ~= "b" and self.commands_list[c][4] ~= "c")then if(self.commands_list[c][1] == "shard")then - displaySystemInfo(ucstring(" example: /a "..self.commands_list[c][4].." , /c riasan "..self.commands_list[c][4]), "AROUND") + build_content=build_content.."<tr><td> </td><td colspan=3>example: /a "..SearchCommand:htmlentities(self.commands_list[c][4]).." , /c riasan "..SearchCommand:htmlentities(self.commands_list[c][4]).."</td></tr>" end end end + build_content=build_content.."</table></td></tr>" end end - displaySystemInfo(ucstring(""), "AROUND") - displaySystemInfo(ucstring("############################ end ##########################"), "AROUND") + build_content=build_content.."<tr><td colspan=3> </td></tr>" + build_content=build_content.."<tr><td colspan=3>############################ end ##########################</td></tr>" + build_content=build_content.."</table>" + SearchCommand:pars_help_on_window(build_content, 600) end function SearchCommand:help(uiId,input) --debug("search_input: "..input) - + local build_content = "" local command_split = {} if(input ~= "all")then @@ -196,26 +255,27 @@ function SearchCommand:help(uiId,input) SearchCommand:help_show_all(command_split[2]) end else + build_content=build_content.."<table width='100%' border=0>" --show help for command input local command_found = 0 for c = 1, #self.commands_list do local command_are_allowed = 0 if(self.commands_list[c][4] == command_split[1])then command_found = 1 - displaySystemInfo(ucstring("######################## command help "..command_split[1].." #######################"), "AROUND") + build_content=build_content.."<tr><td colspan=3>######################## command help '"..command_split[1].."' #######################</td></tr>" - local player_priv = isPlayerPrivilege() if(self.commands_list[c][2] == "player")then command_are_allowed = 1 else - if(player_priv)then + if(SearchCommand:check_prvis(self.commands_list[c][2]))then command_are_allowed = 1 end end if(command_are_allowed == 1)then local arg_display="" - displaySystemInfo(ucstring(""), "AROUND") + build_content=build_content.."<tr><td> </td></tr>" + build_content=build_content.."<tr><td><table width='100%' border=0>" max_arguments = #self.commands_list[c] - 4 for ad = 1, max_arguments do @@ -225,43 +285,80 @@ function SearchCommand:help(uiId,input) arg_display="[arg"..ad.."]" end end - displaySystemInfo(ucstring("desc: "..self.commands_list[c][3]), "AROUND") - displaySystemInfo(ucstring("type: "..self.commands_list[c][1]), "AROUND") - displaySystemInfo(ucstring(""), "AROUND") - displaySystemInfo(ucstring(self.commands_list[c][4].." "..arg_display), "AROUND") + build_content=build_content.."<tr><td>desc: "..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][3]))).."</td></tr>" + build_content=build_content.."<tr><td>type: "..SearchCommand:htmlentities(self.commands_list[c][1]).."</td></tr>" + build_content=build_content.."<tr><td> </td></tr>" + build_content=build_content.."<tr><td>"..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.."</td></tr>" for ac = 1, max_arguments do - displaySystemInfo(ucstring(" arg"..ac.." :"), "AROUND") + build_content=build_content.."<tr><td> arg"..ac.." :</td></tr>" for pc = 1, #self.commands_list[c][4+ac] do if(self.commands_list[c][4+ac][pc][2] == "")then - displaySystemInfo(ucstring(" "..self.commands_list[c][4+ac][pc][1]), "AROUND") + build_content=build_content.."<tr><td>         "..SearchCommand:htmlentities(self.commands_list[c][4+ac][pc][1]).."</td></tr>" else - displaySystemInfo(ucstring(" "..self.commands_list[c][4+ac][pc][1].." '"..self.commands_list[c][4+ac][pc][2].."'"), "AROUND") + build_content=build_content.."<tr><td>         "..SearchCommand:htmlentities(self.commands_list[c][4+ac][pc][1]).." '"..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][4+ac][pc][2]))).."'</td></tr>" end end end if(self.commands_list[c][4] ~= "a" and self.commands_list[c][4] ~= "b" and self.commands_list[c][4] ~= "c")then if(self.commands_list[c][1] == "shard")then - displaySystemInfo(ucstring(" example: /a "..self.commands_list[c][4].." , /c riasan "..self.commands_list[c][4]), "AROUND") + build_content=build_content.."<tr><td>example: /a "..SearchCommand:htmlentities(self.commands_list[c][4]).." , /c riasan "..SearchCommand:htmlentities(self.commands_list[c][4]).."</td></tr>" end end - displaySystemInfo(ucstring(""), "AROUND") - displaySystemInfo(ucstring("############################ end ############################"), "AROUND") end + build_content=build_content.."</table></td></tr>" end end + + build_content=build_content.."<tr><td colspan=3> </td></tr>" + build_content=build_content.."<tr><td colspan=3>############################ end ############################</td></tr>" + if(command_found == 0)then displaySystemInfo(ucstring("Command not found"), "AROUND") + else + --debug("pars_help") + SearchCommand:pars_help_on_window(build_content, 350) end end end function SearchCommand:check_autocomplet(uiId) - --debug("try_autocomplte") - if(self.modal_open==1)then - if next(self.valid_commands_list)then - --debug("check_autocomplet"..self.valid_commands_list[1]) - SearchCommand:finish_commands(self.valid_commands_list[1],uiId) + local modal_open_list = SearchCommand:read_modal_open_list(uiId) + local menu = getUI("ui:interface:search_command_add_menu") + + if (menu.active) then + --debug("try_autocomplte: "..uiId.." modal_open_list: "..modal_open_list) + if(modal_open_list == 1)then + if next(self.valid_commands_list)then + --debug("check_autocomplet"..self.valid_commands_list[1]) + SearchCommand:finish_commands(self.valid_commands_list[1],uiId) + end + end + end +end + +function SearchCommand:check_autocomplet_number(uiId) + local modal_open_list = SearchCommand:read_modal_open_list(uiId) + local menu = getUI("ui:interface:search_command_add_menu") + local text_from_input = getUI(uiId) + local input_text = text_from_input.input_string + + max_string_count = string.len(input_text) + + local get_last_char_from_input = tonumber(string.sub(input_text, (max_string_count), -1)) + if(type(get_last_char_from_input) == "number")then + --debug("last_input_is_a_number: "..get_last_char_from_input) + + if(get_last_char_from_input <= #self.valid_commands_list)then + if (menu.active) then + --debug("try_autocomplte: "..uiId.." modal_open_list: "..modal_open_list) + if(modal_open_list == 1)then + if next(self.valid_commands_list)then + --debug("check_autocomplet"..self.valid_commands_list[get_last_char_from_input]) + SearchCommand:finish_commands(self.valid_commands_list[get_last_char_from_input],uiId) + end + end + end end end end @@ -276,21 +373,48 @@ function SearchCommand:key_trigger(uiId) removeOnDbChange(timer_function_on_ui_window,"@UI:VARIABLES:CURRENT_SERVER_TICK") end - is_tab_down = isTabDown() - if(key_tab_down == 1)then - key_tab_down = 0 - SearchCommand:check_autocomplet(uiId) - elseif(is_tab_down)then - key_tab_down = 0 - SearchCommand:check_autocomplet(uiId) - end - --check is input are empty if yes cancel all stuff local text_from_input = getUI(uiId) if(text_from_input.input_string == "")then SearchCommand:search(uiId) end +end + +function SearchCommand:update_modal_open_list(uiId,p_status) + local found_modal_open=0 + + --check if we already have a process status for this window + if next(self.modal_open_list)then + for pc = 1, #self.modal_open_list do + if(self.modal_open_list[pc][1] == uiId)then + found_modal_open=1 + end + end + end + if(found_modal_open == 0)then + table.insert(self.modal_open_list,{uiId, p_status}) + else + if next(self.modal_open_list)then + for mc = 1, #self.modal_open_list do + if(self.modal_open_list[mc][1] == uiId)then + self.modal_open_list[mc][2]=p_status + end + end + end + end +end + +function SearchCommand:read_modal_open_list(uiId) + local found_modal_open = 0 + if next(self.process_list)then + for mc = 1, #self.modal_open_list do + if(self.modal_open_list[mc][1] == uiId)then + found_modal_open=self.modal_open_list[mc][2] + end + end + end + return found_modal_open end function SearchCommand:update_process_list(uiId,p_status) @@ -331,15 +455,19 @@ function SearchCommand:read_process_status(uiId) end function SearchCommand:search(uiId) + --debug("now_onchange "..uiId) is_tab_down = isTabDown() if(is_tab_down)then - key_tab_down = 1 + --debug("key_tab_down") + SearchCommand:check_autocomplet(uiId) end --trigger command by onchange a singel input - self.command_parameter_list = {} + SearchCommand:check_autocomplet_number(uiId) + local text_from_input = getUI(uiId) - command_identifier = string.sub(text_from_input.input_string, 0, 1) + local input_text = text_from_input.input_string + command_identifier = string.sub(input_text, 0, 1) --check if first char are a "/" from text_from_input if(command_identifier == "/")then @@ -353,19 +481,20 @@ function SearchCommand:search(uiId) addOnDbChange(timer_function_on_ui_window, timer_str, "SearchCommand:key_trigger('"..uiId.."')") end - - - max_string_count = string.len(text_from_input.input_string) + --reset command_parameter_list for fresh input + self.command_parameter_list = {} + --END reset command_parameter_list for fresh input if(max_string_count == 1)then self.command_self="" SearchCommand:write_command_help(uiId,"/<command> or /? all") - SearchCommand:close_modal() + SearchCommand:close_modal(uiId) --update process_status SearchCommand:update_process_list(uiId,0) else - local command_first = string.sub(text_from_input.input_string, 2, (max_string_count)) + SearchCommand:close_modal(uiId) + local command_first = string.sub(input_text, 2, (max_string_count)) --split text to commands for substring in command_first:gmatch("%S+") do table.insert(self.command_parameter_list, substring) @@ -396,9 +525,8 @@ function SearchCommand:search(uiId) end end -function SearchCommand:build_valid_command_list(command_input) +function SearchCommand:build_valid_command_list(command_input,uiId) self.valid_commands_list = {} - local player_priv = isPlayerPrivilege() local count_found=0 local found_command=0 @@ -407,15 +535,22 @@ function SearchCommand:build_valid_command_list(command_input) if(self.commands_list[c][2] == "player")then command_are_allowed = 1 else - if(player_priv)then + if(SearchCommand:check_prvis(self.commands_list[c][2]))then command_are_allowed = 1 end end --check if we want used a client or shared command if(self.command_self == "a" or self.command_self == "b" or self.command_self == "c")then - if(self.commands_list[c][1] == "shard")then + --debug(self.commands_list[c][1]) + if(self.commands_list[c][1] == "shard" and self.command_parameter_list[2] ~= "eScript")then command_are_allowed = 1 + elseif(self.commands_list[c][1] == "eScript")then + if(self.command_parameter_list[2] == "eScript")then + command_are_allowed = 1 + else + command_are_allowed = 0 + end else command_are_allowed = 0 end @@ -426,6 +561,8 @@ function SearchCommand:build_valid_command_list(command_input) else command_are_allowed = 0 end + elseif(self.commands_list[c][1] == "eScript")then + command_are_allowed = 0 end end @@ -446,12 +583,12 @@ function SearchCommand:build_valid_command_list(command_input) if(count_found == 0)then --debug("no_command_found_close_modal") - SearchCommand:close_modal() + SearchCommand:close_modal(uiId) end return found_command end -function SearchCommand:build_valid_player_list(playername_input) +function SearchCommand:build_valid_player_list(playername_input,uiId) player_list = {} player_list[1] = "rias" player_list[2] = "uluk" @@ -492,7 +629,7 @@ function SearchCommand:build_valid_player_list(playername_input) end if(count_found == 0)then - SearchCommand:close_modal() + SearchCommand:close_modal(uiId) end return found_playername end @@ -500,12 +637,12 @@ end function SearchCommand:search_build_player_list(uiId,playername) local found_player=0 local found_command=0 - found_player=SearchCommand:build_valid_player_list(playername) + found_player=SearchCommand:build_valid_player_list(playername,uiId) SearchCommand:search_build_argument_list(uiId,self.command_self) if(found_player ~= 0)then - SearchCommand:close_modal() + SearchCommand:close_modal(uiId) else if next(self.valid_commands_list) ~= nil then SearchCommand:show_more_options(uiId) @@ -517,12 +654,12 @@ function SearchCommand:search_build_command_list(uiId,command,show_argument_help local found_command=0 --debug("search_build_command_list") - found_command=SearchCommand:build_valid_command_list(command) + found_command=SearchCommand:build_valid_command_list(command,uiId) if(found_command ~= 0)then - SearchCommand:close_modal() + SearchCommand:close_modal(uiId) else - if next(self.valid_commands_list) ~= nil then + if next(self.valid_commands_list) then SearchCommand:show_more_options(uiId) end end @@ -699,7 +836,7 @@ function SearchCommand:build_command_helper(uiId) --check if argument can be a command or a playername - if(string.find(string.lower(argu_name), string.lower("<command>")))then + if(string.find(string.lower(argu_name), string.lower("<Command>")))then --debug("parm is a command") SearchCommand:search_build_command_list(uiId,self.command_parameter_list[process_status],false) elseif(string.find(string.lower(argu_name), string.lower("<PlayerName>")) or string.find(string.lower(argu_name), string.lower("<TargetName>")))then @@ -709,6 +846,8 @@ function SearchCommand:build_command_helper(uiId) else SearchCommand:search_build_argument_list(uiId,self.command_self) end + elseif(string.find(string.lower(argu_name), string.lower("<ScriptCommand>")))then + SearchCommand:search_build_command_list(uiId,self.command_parameter_list[process_status],false) else SearchCommand:search_build_argument_list(uiId,self.command_self) end @@ -726,38 +865,124 @@ function SearchCommand:write_command_help_clear(uiId) behind_help_text.input_string = "" end -function SearchCommand:close_modal() - self.modal_open=0 +function SearchCommand:close_modal(uiId) --debug("close_modal") + + SearchCommand:update_modal_open_list(uiId,0) runAH(nil, "leave_modal", "group=ui:interface:search_command_add_menu") end function SearchCommand:show_more_options(uiId) - self.modal_open=1 + SearchCommand:update_modal_open_list(uiId,1) --debug("build_menu") - launchContextMenuInGame("ui:interface:search_command_add_menu") - menu = getUI("ui:interface:search_command_add_menu") + local display_max_found = 0 + local calc_manu_hight = 0 + local up_ok = 0 + local down_ok = 0 + + table.sort(self.valid_commands_list) + + + base_main_chat_id = string.sub(uiId,0,string.len(uiId)-3) + local check_main_window = getUI(base_main_chat_id) + + base_window_id = string.sub(uiId,0,string.len(uiId)-15) + local check_window = getUI(base_window_id) + + local interface_window = getUI("ui:interface") + local interface_window_h = interface_window.h + local interface_window_w = interface_window.w - menu:setMinW(85) + local offset_h_down = 20 + local offset_h_up = 35 + local offest_x = 0 + + if(check_main_window.x == 0)then + offest_x = 18 + else + offest_x = check_main_window.x + 10 + end + + local new_modal_pos_x = check_window.x + offest_x + local new_modal_pos_y = check_window.y - check_window.h + + if(#self.valid_commands_list > 9)then + display_max_found = 9 + calc_manu_hight = (display_max_found * 16) + 39 + else + display_max_found = #self.valid_commands_list + calc_manu_hight = (display_max_found * 16) + 23 + end + + --check we need spawn menu up or down + local cal_needed_space_up = (check_window.y - check_window.h) + calc_manu_hight + offset_h_up + local cal_needed_space_down = (check_window.y - check_window.h) - calc_manu_hight - offset_h_down + + if(cal_needed_space_up > interface_window_h)then + up_ok = 0 + else + up_ok = 1 + end + + if(cal_needed_space_down < 0)then + down_ok = 0 + else + down_ok = 1 + end + + if(down_ok == 1 and up_ok == 1)then + if(cal_needed_space_up < cal_needed_space_down)then + up_ok = 1 + down_ok = 0 + else + up_ok = 0 + down_ok = 1 + end + end + if(up_ok == 1)then + new_modal_pos_y = (check_window.y - check_window.h) + offset_h_up + end + if(down_ok == 1)then + new_modal_pos_y = (check_window.y - check_window.h) - calc_manu_hight + end + + --setup menu window + menu = getUI("ui:interface:search_command_add_menu") + menu.active = true + menu.y = new_modal_pos_y + menu.x = new_modal_pos_x menu:updateCoords() menu = menu:getRootMenu() menu:reset() + --END setup menu window + + --fill menu window + menu:addLine(ucstring("Found: "..#self.valid_commands_list), "", "", "") - menu:addLine(ucstring("Options..."), "", "", "") + for c = 1, display_max_found do + menu:addLine(ucstring(c..". "..self.valid_commands_list[c]), "lua", "SearchCommand:finish_commands('"..self.valid_commands_list[c].."','"..uiId.."')", "") + end - for c = 1, #self.valid_commands_list do - menu:addLine(ucstring(self.valid_commands_list[c]), "lua", "SearchCommand:finish_commands('"..self.valid_commands_list[c].."','"..uiId.."')", "") + if(#self.valid_commands_list > 9)then + menu:addLine(ucstring("..."), "", "", "") end + --END fill menu window + + --launche menu window + launchContextMenuInGame("ui:interface:search_command_add_menu") + --END launche menu window end function SearchCommand:finish_commands(command_name,uiId) - local process_status=SearchCommand:read_process_status(uiId) + local process_status = SearchCommand:read_process_status(uiId) local input_search_string = getUI(uiId) - local final_command="" + local final_command = "" + + debug("process_status: "..process_status) for fc = 1, process_status do if(fc == process_status)then - self.command_parameter_list[fc]=command_name + self.command_parameter_list[fc] = command_name end end @@ -770,9 +995,10 @@ function SearchCommand:finish_commands(command_name,uiId) end input_search_string.input_string = "/"..final_command + debug("/"..final_command) input_search_string:setFocusOnText() - SearchCommand:close_modal() + SearchCommand:close_modal(uiId) SearchCommand:search(uiId) end \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml index 105283adc2..eb57025bc1 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml @@ -3,7 +3,7 @@ <!-- ****************************************** --> <interface_config> <root id="interface" x="0" y="0" w="800" h="600" active="true" /> - <lua file="search_command.lua" /> + <lua file="search_command.lua" <proc id="proc_nothing"></proc> <!-- a text with border --> <template name="bc_border_text" keep="true" posref="TM TM" posparent="parent" x="0" y="-20" w="-4"> @@ -708,7 +708,7 @@ <!-- ********************* --> <!-- * EDIT BOX WIDGET * --> <!-- ********************* --> - <group type="menu" id="search_command_add_menu" extends="base_menu" mouse_pos="true"></group> + <group type="menu" id="search_command_add_menu" extends="base_menu" mouse_pos="false"></group> <command name="?" action="lua" params="SearchCommand:help(getUICaller().id,'+')"/> <template name="edit_box_widget" active="true" posref="TL TL" text_x="0" text_y="0" text_ref="BL BL" child_resize_h="true" child_resize_hmargin="0" multi_line="false" x="0" y="0" w="0" h="0" sizeref="" id="eb" posparent="parent" onenter="chat_box_entry" params="" reset_focus_on_hide="true" enter_loose_focus="true" prompt=">" enter_recover_focus="true" max_num_chars="255" menu_r="" onchange="lua" onchange_params="SearchCommand:search(getUICaller().id)" entry_type="text" keep="true" max_historic="40" fontsize="10" shadow="true" shadow_x="1" shadow_y="1" shadow_color="0 0 0 255" shadow_outline="false" backup_father_container_pos="false" want_return="false" clear_on_escape="false" color="255 255 255 255" continuous_text_update="false" bg_texture="W_box_blank.tga" on_focus_lost="" on_focus_lost_params="" max_float_prec="5" tooltip="" tooltip_parent="" negative_filter="" render_layer="0"> <group id="#id" active="#active" posref="#posref" x="#x" y="#y" posparent="#posparent" child_resize_h="#child_resize_h" child_resize_hmargin="#child_resize_hmargin" sizeref="#sizeref" w="#w" h="#h" render_layer="#render_layer" > diff --git a/ryzom/client/src/interface_v3/action_handler_edit.cpp b/ryzom/client/src/interface_v3/action_handler_edit.cpp index d3fd022ad6..ebd7919067 100644 --- a/ryzom/client/src/interface_v3/action_handler_edit.cpp +++ b/ryzom/client/src/interface_v3/action_handler_edit.cpp @@ -639,8 +639,8 @@ class CAHEditExpandOrCycleTell : public CAHEdit } void actionPart () { - // If the line starts with '/tell ', do not try to expand - if (!NLMISC::startsWith(_GroupEdit->getInputString(), "/tell ")) + // If the line starts with '/', try to expand + if (NLMISC::startsWith(_GroupEdit->getInputString(), "/")) { if (_GroupEdit->expand()) return; } diff --git a/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp b/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp index cf87a3bf0a..19b016b897 100644 --- a/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp +++ b/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp @@ -1571,8 +1571,13 @@ int CLuaIHMRyzom::getPlayerPrivs(CLuaState &ls) if (hasPrivilegeOBSERVER()) privsString+=":OBSERVER"; if (hasPrivilegeOBSERVER()) privsString+=":TESTER"; - ls.push(privsString+=":"); - return 1; + if(privsString == ""){ + return 0; + } + else{ + ls.push(privsString+=":"); + return 1; + } } // *************************************************************************** From ac5233c0cc7ac6bfce9a6503f8d9be67b55a80eb Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Tue, 9 Jan 2024 22:45:43 +0100 Subject: [PATCH 133/194] Fixed: bad commit --- ryzom/client/data/gamedev/interfaces_v3/widgets.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml index eb57025bc1..b7cf67ee7c 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml @@ -3,7 +3,7 @@ <!-- ****************************************** --> <interface_config> <root id="interface" x="0" y="0" w="800" h="600" active="true" /> - <lua file="search_command.lua" + <lua file="search_command.lua" /> <proc id="proc_nothing"></proc> <!-- a text with border --> <template name="bc_border_text" keep="true" posref="TM TM" posparent="parent" x="0" y="-20" w="-4"> From afd571304e7f85a2af1e737763b8e2a06297202c Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Wed, 10 Jan 2024 15:15:03 +0100 Subject: [PATCH 134/194] Changes: add way to read/write prompt and other changes --- nel/include/nel/gui/group_editbox.h | 1 + .../gamedev/interfaces_v3/search_command.lua | 138 ++++++++++++++---- 2 files changed, 111 insertions(+), 28 deletions(-) diff --git a/nel/include/nel/gui/group_editbox.h b/nel/include/nel/gui/group_editbox.h index 1f4f316fc9..0ebf704f25 100644 --- a/nel/include/nel/gui/group_editbox.h +++ b/nel/include/nel/gui/group_editbox.h @@ -194,6 +194,7 @@ namespace NLGUI REFLECT_LUA_METHOD("setFocusOnText", luaSetFocusOnText); REFLECT_LUA_METHOD("cancelFocusOnText", luaCancelFocusOnText); REFLECT_STRING("input_string", getInputString, setInputString); + REFLECT_STRING("prompt", getPrompt, setPrompt); #ifdef RYZOM_LUA_UCSTRING REFLECT_UCSTRING("uc_input_string", getInputStringAsUtf16, setInputStringAsUtf16); // Compatibility #endif diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index 2a758b600a..8c705411e4 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -99,16 +99,80 @@ table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:E table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "c_desc", "c", {{"text:<TargetName>",""}}, {{"text:<Command>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "showOnline_desc", "showOnline", {{"1","showOnline_1_desc"}, {"2","showOnline_2_desc"},{"0","showOnline_0_desc"}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "setLeague_desc", "setLeague", {{"text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "roomInvite_desc", "roomInvite", {{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "roomKick_desc", "roomKick", {{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "dodge_desc", "dodge"}) +table.insert(SearchCommand.commands_list,{"shard", "player", "parry_desc", "parry"}) +table.insert(SearchCommand.commands_list,{"shard", "player", "setPvPTag_desc", "setPvPTag", {{"0",""},{"1",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "clearGuildMessage_desc", "clearGuildMessage"}) +table.insert(SearchCommand.commands_list,{"shard", "player", "setGuildMessage_desc", "setGuildMessage", {{"text:<Message>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "setDontTranslateLangs_desc", "setDontTranslateLangs", {{"codelang|codelang","setDontTranslateLangs_codelang_desc"}}}) -table.insert(SearchCommand.commands_list,{"shard", "player", "connectLangChannel_desc", "connectLangChannel",{{"fr",""},{"en",""},{"de",""},{"es",""},{"ru",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "connectLangChannel_desc", "connectLangChannel",{{"fr",""},{"en",""},{"de",""},{"es",""},{"ru",""}},{{"1","connectLangChannel_1_desc"}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "updateTarget_desc", "updateTarget"}) +table.insert(SearchCommand.commands_list,{"shard", "player", "teamInvite_desc", "teamInvite", {{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "summonPet_desc", "summonPet", {{"number:<PetNumber>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "setTeamLeader_desc", "setTeamLeader", {{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "resetName_desc", "resetName"}) + + +if(player_priv)then + table.insert(SearchCommand.commands_list,{"shard", "player", "connectUserChannel_desc", "connectUserChannel", {{"text:<channelname>",""}}, {{"text:<password>",""},{"*","channel_leave_desc"},{"***","channel_remove_admin_desc"}}}) +else + table.insert(SearchCommand.commands_list,{"shard", "player", "connectUserChannel_desc", "connectUserChannel", {{"text:<channelname>",""}}, {{"text:<password>",""},{"*","channel_leave_desc"}}}) +end + + table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:", "Position_desc", "Position", {{"number:<posx>,<posy>[,<posz>]",""},{"text:<bot name>",""},{"text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eScript_desc", "eScript", {{"text:<ContinentName>@text:<EventNpcGroup>",""}}, {{"text:<ScriptCommand>",""}}}) --END shard commands --eScript commands -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setActivity_desc", "()setActivity(\"text:<faction>\")"}) table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAggro_desc", "()setAggro(number:<25>,number:<10>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setPlayerAttackable_desc", "()setPlayerAttackable(number:<0/1>"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setBotAttackable_desc", "()setBotAttackable(number:<0/1)>"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAttackable_desc", "()setAttackable(number:<0/1)>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setActivity_desc", "()setActivity(\"text:<no_change/escorted/guard/guard_escorted/normal/faction/faction_no_assist/bandit>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setFactionProp_desc", "()setFactionProp(\"text:<faction/ennemyFaction/friendFaction/Player/Predator/outpost:<id>:<side>>\",\"text:<FameName>FameMin|FameName<FameMax>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAggro_desc", "()setAggro(number:<25>,number:<10>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"text:<event_group_killed>\",\"text:<Url>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"text:<event_bot_killed>\",text:<Url>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"text:<running>)\""}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"text:<faction>,text:<Factionname>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"text:<fame_for_guard_attack>\",number:<6000 points per 1 fame>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "removeProfileParameter_desc", "()removeProfileParameter(\"text:<Parameter>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "clearAggroList_desc", "()clearAggroList()"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "startMoving_desc", "()startMoving(number:<XPos>,number:<YPos>,number:<Radius>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "stopMoving_desc", "()stopMoving()"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "startWander_desc", "()startWander(number:<Meter>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAutoSpawn_desc", "()setAutoSpawn(number:<0/1>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setDespawnTime_desc", "()setDespawnTime(number:<Ticks>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setRespawnTime_desc", "()setDespawnTime(number:<Ticks>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "standUp_desc", "()standUp()"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "sitDown_desc", "()sitDown()"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setZoneState_desc", "()setZoneState(\"text:<ZoneName>\",number:<0.0/1.0>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setMode_desc", "()setMode(\"text:<Normal/Sit/Eat/Rest/Alert/Hungry/Death>\""}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "aiActionSelf_desc", "()aiActionSelf(\"text:<name.aiaction>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "aiAction_desc", "()aiAction(\"text:<name.aiaction>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "emote_desc", "()emote(\"text:<Emote>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "()vpx(\"text:<VPA:HEX>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "()vpx(\"text:<VPB:HEX>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "()vpx(\"text:<VPC:HEX>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setMaxHP_desc", "()setMaxHP(number:<Hp>, number:<0/1>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "npcSay_desc", "()npcSay(\"text:<Message>\", \"text:<say/shout>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "ignoreOffensiveActions_desc", "()ignoreOffensiveActions(number:<0/1>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "maxHitRange_desc", "()maxHitRange(number:<Meter>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addHP_desc", "()addHP(number:<Hp>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setClientSheet_desc", "()setClientSheet(\"text:<Sheet>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setSheet_desc", "()setSheet(\"text:<Sheet>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setUrl_desc", "()setUrl(\"text:<MENU_NAME>\", \"text:<Url/*>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "facing_desc", "()facing(rad:<3.14/-3.14>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setCanAggro_desc", "()setCanAggro(number:<0/1>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setHealer_desc", "()setHealer(number:<0/1>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setHPScale_desc", "()setHPScale(number:<0.0/..0.5../1.0>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "followPlayer_desc", "()followPlayer(number:<PlayerEID>, number:<Meter>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setFactionAttackableBelow_desc", "()setFactionAttackableBelow(\"text:<TribeName>\", number:<0/1>, number:<6000 points per 1 fame>)"}) + --END eScript commands function SearchCommand:find(tbl, value) @@ -122,23 +186,29 @@ end function SearchCommand:check_prvis(command_privs) local player_priv = isPlayerPrivilege() - local command_allowed = 0 + local command_allowed = "false" + local prvis = getPlayerPrivs() if(command_privs == "player" or command_privs == "")then - return 0 + return "false" else if(player_priv)then local prvis = getPlayerPrivs() - for prvissubstring in prvis:gmatch("[^: ]+") do - for substring in command_privs:gmatch("[^: ]+") do - if(substring == prvissubstring)then - command_allowed = 1 + --debug("Priv: "..prvis) + if(prvis ~= nil)then + for prvissubstring in prvis:gmatch("[^: ]+") do + for substring in command_privs:gmatch("[^: ]+") do + if(substring == prvissubstring)then + command_allowed = "true" + end end end + else + command_allowed = "false" end return command_allowed else - return 0 + return "false" end end end @@ -183,7 +253,7 @@ function SearchCommand:help_show_all(parameter) if(self.commands_list[c][2] == "player")then command_are_allowed = 1 else - if(SearchCommand:check_prvis(self.commands_list[c][2]))then + if(SearchCommand:check_prvis(self.commands_list[c][2]) == "true")then command_are_allowed = 1 end end @@ -207,9 +277,10 @@ function SearchCommand:help_show_all(parameter) build_content=build_content.."<tr><td width='10px'>"..count..".</td><td colspan=3>"..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.." '"..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][3]))).."'</td></tr>" build_content=build_content.."<tr><td> </td><td>type: "..SearchCommand:htmlentities(self.commands_list[c][1]).."</td></tr>" + build_content=build_content.."<tr><td> </td><td>priv: "..SearchCommand:htmlentities(self.commands_list[c][2]).."</td></tr>" for ac = 1, max_arguments do - build_content=build_content.."<tr><td> </td><td> arg"..ac.." :</td></tr>" + build_content=build_content.."<tr><td> </td><td>arg"..ac.." :</td></tr>" for pc = 1, #self.commands_list[c][4+ac] do if(self.commands_list[c][4+ac][pc][2] == "")then build_content=build_content.."<tr><td> </td><td>         "..SearchCommand:htmlentities(self.commands_list[c][4+ac][pc][1]).."</td></tr>" @@ -220,7 +291,12 @@ function SearchCommand:help_show_all(parameter) end if(self.commands_list[c][4] ~= "a" and self.commands_list[c][4] ~= "b" and self.commands_list[c][4] ~= "c")then if(self.commands_list[c][1] == "shard")then - build_content=build_content.."<tr><td> </td><td colspan=3>example: /a "..SearchCommand:htmlentities(self.commands_list[c][4]).." , /c riasan "..SearchCommand:htmlentities(self.commands_list[c][4]).."</td></tr>" + if(SearchCommand:check_prvis(self.commands_list[c][2]) == "true")then + build_content=build_content.."<tr><td> </td><td colspan=3>example: /a "..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.." | /c riasan "..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.."</td></tr>" + else + build_content=build_content.."<tr><td> </td><td colspan=3>example: /a "..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.."</td></tr>" + end + end end end @@ -267,7 +343,7 @@ function SearchCommand:help(uiId,input) if(self.commands_list[c][2] == "player")then command_are_allowed = 1 else - if(SearchCommand:check_prvis(self.commands_list[c][2]))then + if(SearchCommand:check_prvis(self.commands_list[c][2]) == "true")then command_are_allowed = 1 end end @@ -287,6 +363,7 @@ function SearchCommand:help(uiId,input) end build_content=build_content.."<tr><td>desc: "..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][3]))).."</td></tr>" build_content=build_content.."<tr><td>type: "..SearchCommand:htmlentities(self.commands_list[c][1]).."</td></tr>" + build_content=build_content.."<tr><td>priv: "..SearchCommand:htmlentities(self.commands_list[c][2]).."</td></tr>" build_content=build_content.."<tr><td> </td></tr>" build_content=build_content.."<tr><td>"..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.."</td></tr>" @@ -302,7 +379,7 @@ function SearchCommand:help(uiId,input) end if(self.commands_list[c][4] ~= "a" and self.commands_list[c][4] ~= "b" and self.commands_list[c][4] ~= "c")then if(self.commands_list[c][1] == "shard")then - build_content=build_content.."<tr><td>example: /a "..SearchCommand:htmlentities(self.commands_list[c][4]).." , /c riasan "..SearchCommand:htmlentities(self.commands_list[c][4]).."</td></tr>" + build_content=build_content.."<tr><td>example: /a "..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.." | /c riasan "..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.."</td></tr>" end end end @@ -531,15 +608,6 @@ function SearchCommand:build_valid_command_list(command_input,uiId) local found_command=0 for c = 1, #self.commands_list do - local command_are_allowed = 0 - if(self.commands_list[c][2] == "player")then - command_are_allowed = 1 - else - if(SearchCommand:check_prvis(self.commands_list[c][2]))then - command_are_allowed = 1 - end - end - --check if we want used a client or shared command if(self.command_self == "a" or self.command_self == "b" or self.command_self == "c")then --debug(self.commands_list[c][1]) @@ -566,6 +634,15 @@ function SearchCommand:build_valid_command_list(command_input,uiId) end end + local command_are_allowed = 0 + if(self.commands_list[c][2] == "player")then + command_are_allowed = 1 + else + if(SearchCommand:check_prvis(self.commands_list[c][2]) == "true")then + command_are_allowed = 1 + end + end + if(command_are_allowed == 1)then if(command_input ~= "")then if(string.lower(self.commands_list[c][4]) == string.lower(command_input))then @@ -855,14 +932,19 @@ function SearchCommand:build_command_helper(uiId) end function SearchCommand:write_command_help(uiId,text) - --debug("write_command_help: "..text) + local main_chat_input = getUI(uiId) + local read_prompt = main_chat_input.prompt + debug("write_command_help: "..text) local behind_help_text = getUI(uiId.."h") + + behind_help_text.prompt=read_prompt behind_help_text.input_string = text end function SearchCommand:write_command_help_clear(uiId) local behind_help_text = getUI(uiId.."h") behind_help_text.input_string = "" + behind_help_text.prompt = "" end function SearchCommand:close_modal(uiId) @@ -957,14 +1039,14 @@ function SearchCommand:show_more_options(uiId) --END setup menu window --fill menu window - menu:addLine(ucstring("Found: "..#self.valid_commands_list), "", "", "") + menu:addLine(ucstring("Found: "..#self.valid_commands_list), "lua", "SearchCommand:close_modal('"..uiId.."')", "") for c = 1, display_max_found do menu:addLine(ucstring(c..". "..self.valid_commands_list[c]), "lua", "SearchCommand:finish_commands('"..self.valid_commands_list[c].."','"..uiId.."')", "") end if(#self.valid_commands_list > 9)then - menu:addLine(ucstring("..."), "", "", "") + menu:addLine(ucstring("..."), "lua", "SearchCommand:close_modal('"..uiId.."')", "") end --END fill menu window @@ -978,7 +1060,7 @@ function SearchCommand:finish_commands(command_name,uiId) local input_search_string = getUI(uiId) local final_command = "" - debug("process_status: "..process_status) + --debug("process_status: "..process_status) for fc = 1, process_status do if(fc == process_status)then @@ -995,7 +1077,7 @@ function SearchCommand:finish_commands(command_name,uiId) end input_search_string.input_string = "/"..final_command - debug("/"..final_command) + --debug("/"..final_command) input_search_string:setFocusOnText() From 137b3b526c1f710b7718aef1b390f44bea67639a Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Wed, 10 Jan 2024 21:55:53 +0100 Subject: [PATCH 135/194] Changed: lot of improvments --- .../gamedev/interfaces_v3/search_command.lua | 328 +++++++++++------- 1 file changed, 193 insertions(+), 135 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index 8c705411e4..1c71df47c0 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -18,9 +18,9 @@ SearchCommand.commands_list = {} local player_priv = isPlayerPrivilege() if(player_priv)then - table.insert(SearchCommand.commands_list,{"client", "player", "help_desc", "?", {{"text:<Command>",""}, {"all","help_all_desc"}}, {{"shard",""},{"client",""},{"eScript",""}}}) + table.insert(SearchCommand.commands_list,{"client", "player", "help_desc", "?", {{"Text:<Command>",""}, {"all","help_all_desc"}}, {{"shard",""},{"client",""},{"eScript",""}}}) else - table.insert(SearchCommand.commands_list,{"client", "player", "help_desc", "?", {{"text:<Command>",""}, {"all","help_all_desc"}}}) + table.insert(SearchCommand.commands_list,{"client", "player", "help_desc", "?", {{"Text:<Command>",""}, {"all","help_all_desc"}}}) end --client commands @@ -28,150 +28,151 @@ table.insert(SearchCommand.commands_list,{"client", "player", "time_desc", "time table.insert(SearchCommand.commands_list,{"client", "player", "version_desc", "version"}) table.insert(SearchCommand.commands_list,{"client", "player", "where_desc", "where"}) table.insert(SearchCommand.commands_list,{"client", "player", "playedTime_desc", "playedTime"}) -table.insert(SearchCommand.commands_list,{"client", "player", "who_desc", "who", {{"gm","who_gm_desc"}}, {{"channel","who_channel_desc"}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "guildinvite_desc", "guildinvite",{{"text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "guildmotd_desc", "guildmotd",{{"text:<Message>","guildmotd_message_desc"},{"?","guildmotd_?_desc"}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "league_desc", "league",{{"text:<leaguename>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "leagueinvite_desc", "leagueinvite",{{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "who_desc", "who", {{"gm","who_gm_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guildinvite_desc", "guildinvite",{{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guildmotd_desc", "guildmotd",{{"Text:<Message>","guildmotd_message_desc"},{"?","guildmotd_?_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "league_desc", "league",{{"Text:<leaguename>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "leagueinvite_desc", "leagueinvite",{{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "leaguequit_desc", "leaguequit"}) -table.insert(SearchCommand.commands_list,{"client", "player", "leaguekick_desc", "leaguekick",{{"text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "afk_desc", "afk",{{"text:<autoresponse>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "leaguekick_desc", "leaguekick",{{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "afk_desc", "afk",{{"Text:<autoresponse>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "assist_desc", "assist"}) table.insert(SearchCommand.commands_list,{"client", "player", "assist_desc", "as"}) table.insert(SearchCommand.commands_list,{"client", "player", "self_desc", "self"}) table.insert(SearchCommand.commands_list,{"client", "player", "brutalQuit_desc", "brutalQuit"}) table.insert(SearchCommand.commands_list,{"client", "player", "chatLog_desc", "chatLog"}) table.insert(SearchCommand.commands_list,{"client", "player", "follow_desc", "follow"}) -table.insert(SearchCommand.commands_list,{"client", "player", "ignore_desc", "ignore",{{"text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "invite_desc", "invite",{{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "ignore_desc", "ignore",{{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "invite_desc", "invite",{{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "mount_desc", "mount"}) table.insert(SearchCommand.commands_list,{"client", "player", "unmount_desc", "unmount"}) -table.insert(SearchCommand.commands_list,{"client", "player", "random_desc", "random", {{"number:<lowest_number>",""}}, {{"number:<highest_number>",""}}, {{"hide ",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "random_desc", "random", {{"Number:<LowestNumber>",""}}, {{"Number:<HighestNumber>",""}}, {{"hide ",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "skiptutorial_desc", "skiptutorial"}) -table.insert(SearchCommand.commands_list,{"client", "player", "sleep_desc", "sleep", {{"number:<number>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "tar_desc", "tar", {{"text:<name>",""}}, {{"|quiet=true","tar_quiet_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "sleep_desc", "sleep", {{"Number:<number>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "tar_desc", "tar", {{"Text:<Name>",""}}, {{"|quiet=true","tar_quiet_desc"}}}) table.insert(SearchCommand.commands_list,{"client", "player", "target_quiet_desc", "target_quiet"}) table.insert(SearchCommand.commands_list,{"client", "player", "target_quiet_desc", "tarq"}) -table.insert(SearchCommand.commands_list,{"client", "player", "lmtar_desc", "lmtar", {{"text:<name>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "lmtar_desc", "lmtar", {{"Text:<Name>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "chat_desc", "chat"}) table.insert(SearchCommand.commands_list,{"client", "player", "go_desc", "go"}) -table.insert(SearchCommand.commands_list,{"client", "player", "appzone_desc", "appzone", {{"number:<AppId>","appzone_AppId_desc"},{"hide","appzone_hide_desc"}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "setuiscale_desc", "setuiscale", {{"number:<ScaleFactor>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "createGroup_desc", "createGroup", {{"text:<OutfitGroupName>","createGroup_OutfitGroupName_desc"},{"true","createGroup_true_desc"}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "moveGroup_desc", "moveGroup", {{"text:<OutfitGroupName>",""}},{{"text:<PetAnimal1>",""},{"text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "equipGroup_desc", "equipGroup", {{"text:<OutfitGroupName>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "deleteGroup_desc", "deleteGroup", {{"text:<OutfitGroupName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "appzone_desc", "appzone", {{"<AppId>","appzone_AppId_desc"},{"hide","appzone_hide_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "setuiscale_desc", "setuiscale", {{"Number:<ScaleFactor>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "createGroup_desc", "createGroup", {{"Text:<OutfitGroupName>","createGroup_OutfitGroupName_desc"},{"true","createGroup_true_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "moveGroup_desc", "moveGroup", {{"Text:<OutfitGroupName>",""}},{{"Text:<PetAnimal1>",""},{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "equipGroup_desc", "equipGroup", {{"Text:<OutfitGroupName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "deleteGroup_desc", "deleteGroup", {{"Text:<OutfitGroupName>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "naked_desc", "naked"}) table.insert(SearchCommand.commands_list,{"client", "player", "nude_desc", "nude"}) table.insert(SearchCommand.commands_list,{"client", "player", "listGroup_desc", "listGroup"}) -table.insert(SearchCommand.commands_list,{"client", "player", "say_desc", "say",{{">","s_param1_desc"}}, {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "say_desc", "s",{{">","s_param1_desc"}}, {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "shout", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "sh", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "y", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "yell", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "guild", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "g", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "gu", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "region", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "r", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "re", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "team", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "te", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "party", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "p", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "universe_desc", "universe", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "universe_desc", "u", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "0_desc", "0", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "1_desc", "1", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "2_desc", "2", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "3_desc", "3", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "4_desc", "4", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "channel_desc", "channel",{{"text:<channelname>",""}}, {{"text:<password>",""},{"*","channel_leave_desc"}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "tell",{{"text:<PlayerName>",""}}, {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "t",{{"text:<PlayerName>",""}}, {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "say_desc", "say",{{">","s_param1_desc"}}, {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "say_desc", "s",{{">","s_param1_desc"}}, {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "shout", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "sh", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "y", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "yell", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "guild", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "g", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "gu", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "region", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "r", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "re", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "team", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "te", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "party", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "p", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "universe_desc", "universe", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "universe_desc", "u", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "0_desc", "0", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "1_desc", "1", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "2_desc", "2", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "3_desc", "3", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "4_desc", "4", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "channel_desc", "channel",{{"Text:<Channelname>",""}}, {{"Text:<Password>",""},{"*","channel_leave_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "tell",{{"Text:<PlayerName>",""}}, {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "t",{{"Text:<PlayerName>",""}}, {{"Text:<Message>",""}}}) --END client commands --shard commands -table.insert(SearchCommand.commands_list,{"shard", "player", "a_desc", "a", {{"text:<Command>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "b_desc", "b", {{"text:<Command>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "c_desc", "c", {{"text:<TargetName>",""}}, {{"text:<Command>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "a_desc", "a", {{"Text:<Command>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "b_desc", "b", {{"Text:<Command>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "c_desc", "c", {{"Text:<TargetName>",""}}, {{"Text:<Command>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "showOnline_desc", "showOnline", {{"1","showOnline_1_desc"}, {"2","showOnline_2_desc"},{"0","showOnline_0_desc"}}}) -table.insert(SearchCommand.commands_list,{"shard", "player", "setLeague_desc", "setLeague", {{"text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", "player", "roomInvite_desc", "roomInvite", {{"text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", "player", "roomKick_desc", "roomKick", {{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "setLeague_desc", "setLeague", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "roomInvite_desc", "roomInvite", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "roomKick_desc", "roomKick", {{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "dodge_desc", "dodge"}) table.insert(SearchCommand.commands_list,{"shard", "player", "parry_desc", "parry"}) table.insert(SearchCommand.commands_list,{"shard", "player", "setPvPTag_desc", "setPvPTag", {{"0",""},{"1",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "clearGuildMessage_desc", "clearGuildMessage"}) -table.insert(SearchCommand.commands_list,{"shard", "player", "setGuildMessage_desc", "setGuildMessage", {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "setGuildMessage_desc", "setGuildMessage", {{"Text:<Message>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "setDontTranslateLangs_desc", "setDontTranslateLangs", {{"codelang|codelang","setDontTranslateLangs_codelang_desc"}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "connectLangChannel_desc", "connectLangChannel",{{"fr",""},{"en",""},{"de",""},{"es",""},{"ru",""}},{{"1","connectLangChannel_1_desc"}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "updateTarget_desc", "updateTarget"}) -table.insert(SearchCommand.commands_list,{"shard", "player", "teamInvite_desc", "teamInvite", {{"text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", "player", "summonPet_desc", "summonPet", {{"number:<PetNumber>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", "player", "setTeamLeader_desc", "setTeamLeader", {{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "teamInvite_desc", "teamInvite", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "summonPet_desc", "summonPet", {{"Number:<PetNumber>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "setTeamLeader_desc", "setTeamLeader", {{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "resetName_desc", "resetName"}) if(player_priv)then - table.insert(SearchCommand.commands_list,{"shard", "player", "connectUserChannel_desc", "connectUserChannel", {{"text:<channelname>",""}}, {{"text:<password>",""},{"*","channel_leave_desc"},{"***","channel_remove_admin_desc"}}}) + table.insert(SearchCommand.commands_list,{"shard", "player", "connectUserChannel_desc", "connectUserChannel", {{"Text:<Channelname>",""}}, {{"Text:<Password>",""},{"*","channel_leave_desc"},{"***","channel_remove_admin_desc"}}}) else - table.insert(SearchCommand.commands_list,{"shard", "player", "connectUserChannel_desc", "connectUserChannel", {{"text:<channelname>",""}}, {{"text:<password>",""},{"*","channel_leave_desc"}}}) + table.insert(SearchCommand.commands_list,{"shard", "player", "connectUserChannel_desc", "connectUserChannel", {{"Text:<Channelname>",""}}, {{"Text:<Password>",""},{"*","channel_leave_desc"}}}) end -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:", "Position_desc", "Position", {{"number:<posx>,<posy>[,<posz>]",""},{"text:<bot name>",""},{"text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eScript_desc", "eScript", {{"text:<ContinentName>@text:<EventNpcGroup>",""}}, {{"text:<ScriptCommand>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:", "Position_desc", "Position", {{"<PosX>,<PosY>[,<PosZ>]",""},{"Text:<BotName>",""},{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eScript_desc", "eScript", {{"Text:<ContinentName>@",""},{"Text:<EventNpcGroup>",""}}, {{"Text:<ScriptCommand>",""}}}) --END shard commands --eScript commands -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAggro_desc", "()setAggro(number:<25>,number:<10>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setPlayerAttackable_desc", "()setPlayerAttackable(number:<0/1>"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setBotAttackable_desc", "()setBotAttackable(number:<0/1)>"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAttackable_desc", "()setAttackable(number:<0/1)>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setActivity_desc", "()setActivity(\"text:<no_change/escorted/guard/guard_escorted/normal/faction/faction_no_assist/bandit>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setFactionProp_desc", "()setFactionProp(\"text:<faction/ennemyFaction/friendFaction/Player/Predator/outpost:<id>:<side>>\",\"text:<FameName>FameMin|FameName<FameMax>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAggro_desc", "()setAggro(number:<25>,number:<10>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"text:<event_group_killed>\",\"text:<Url>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"text:<event_bot_killed>\",text:<Url>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"text:<running>)\""}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"text:<faction>,text:<Factionname>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"text:<fame_for_guard_attack>\",number:<6000 points per 1 fame>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "removeProfileParameter_desc", "()removeProfileParameter(\"text:<Parameter>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "despawn_desc", "()despawn(<0/1>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "rename_desc", "()rename(\"Text:wk[<Name>]$#Text:wk[<Title>]$\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAggro_desc", "()setAggro(Number:<Range>,Number:<Ticks>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setPlayerAttackable_desc", "()setPlayerAttackable(<0/1>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setBotAttackable_desc", "()setBotAttackable(Number:<0/1>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAttackable_desc", "()setAttackable(Number:<0/1>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setActivity_desc", "()setActivity(\"<no_change/escorted/guard/guard_escorted/normal/faction/faction_no_assist/bandit>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setFactionProp_desc", "()setFactionProp(\"<faction/ennemyFaction/friendFaction/player/predator/outpost:<id>:<side>>\",\"Text:<FameName>FameMin|Text:<FameName>FameMax\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"event_group_killed\",\"Text:<Url>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"event_bot_killed\",Text:<Url>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"running\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"faction,Text:<Factionname>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"fame_for_guard_attack\",<6000 points per 1 fame>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "removeProfileParameter_desc", "()removeProfileParameter(\"Text:<Parameter>\")"}) table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "clearAggroList_desc", "()clearAggroList()"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "startMoving_desc", "()startMoving(number:<XPos>,number:<YPos>,number:<Radius>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "startMoving_desc", "()startMoving(Number:<PosX>,Number:<PosY>,Number:<Radius>)"}) table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "stopMoving_desc", "()stopMoving()"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "startWander_desc", "()startWander(number:<Meter>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAutoSpawn_desc", "()setAutoSpawn(number:<0/1>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setDespawnTime_desc", "()setDespawnTime(number:<Ticks>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setRespawnTime_desc", "()setDespawnTime(number:<Ticks>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "startWander_desc", "()startWander(Number:<Meter>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAutoSpawn_desc", "()setAutoSpawn(<0/1>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setDespawnTime_desc", "()setDespawnTime(Number:<Ticks>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setRespawnTime_desc", "()setDespawnTime(Number:<Ticks>)"}) table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "standUp_desc", "()standUp()"}) table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "sitDown_desc", "()sitDown()"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setZoneState_desc", "()setZoneState(\"text:<ZoneName>\",number:<0.0/1.0>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setMode_desc", "()setMode(\"text:<Normal/Sit/Eat/Rest/Alert/Hungry/Death>\""}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "aiActionSelf_desc", "()aiActionSelf(\"text:<name.aiaction>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "aiAction_desc", "()aiAction(\"text:<name.aiaction>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "emote_desc", "()emote(\"text:<Emote>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "()vpx(\"text:<VPA:HEX>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "()vpx(\"text:<VPB:HEX>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "()vpx(\"text:<VPC:HEX>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setMaxHP_desc", "()setMaxHP(number:<Hp>, number:<0/1>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "npcSay_desc", "()npcSay(\"text:<Message>\", \"text:<say/shout>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "ignoreOffensiveActions_desc", "()ignoreOffensiveActions(number:<0/1>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "maxHitRange_desc", "()maxHitRange(number:<Meter>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addHP_desc", "()addHP(number:<Hp>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setClientSheet_desc", "()setClientSheet(\"text:<Sheet>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setSheet_desc", "()setSheet(\"text:<Sheet>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setUrl_desc", "()setUrl(\"text:<MENU_NAME>\", \"text:<Url/*>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "facing_desc", "()facing(rad:<3.14/-3.14>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setCanAggro_desc", "()setCanAggro(number:<0/1>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setHealer_desc", "()setHealer(number:<0/1>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setHPScale_desc", "()setHPScale(number:<0.0/..0.5../1.0>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "followPlayer_desc", "()followPlayer(number:<PlayerEID>, number:<Meter>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setFactionAttackableBelow_desc", "()setFactionAttackableBelow(\"text:<TribeName>\", number:<0/1>, number:<6000 points per 1 fame>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setZoneState_desc", "()setZoneState(\"Text:<ZoneName>\",<0.0/1.0>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setMode_desc", "()setMode(\"<Normal/Sit/Eat/Rest/Alert/Hungry/Death>\""}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "aiActionSelf_desc", "()aiActionSelf(\"Text:<NameAiaction>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "aiAction_desc", "()aiAction(\"Text:<Aame.aiaction>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "emote_desc", "()emote(\"Text:<Emote>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "()vpx(\"VPA:Hex:<Value>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "()vpx(\"VPB:Hex:<Value>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "()vpx(\"VPC:Hex:<Value>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setMaxHP_desc", "()setMaxHP(Number:<Hp>, <0/1>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "npcSay_desc", "()npcSay(\"Text:<Message>\", \"<say/shout>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "ignoreOffensiveActions_desc", "()ignoreOffensiveActions(<0/1>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "maxHitRange_desc", "()maxHitRange(Number:<Meter>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addHP_desc", "()addHP(Number:<Hp>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setClientSheet_desc", "()setClientSheet(\"Text:<Sheet>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setSheet_desc", "()setSheet(\"Text:<Sheet>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setUrl_desc", "()setUrl(\"Text:<MENU_NAME>\", \"Text:<Url/*>\")"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "facing_desc", "()facing(<3.14/-3.14>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setCanAggro_desc", "()setCanAggro(<0/1>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setHealer_desc", "()setHealer(<0/1>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setHPScale_desc", "()setHPScale(<0.0/..0.5../1.0>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "followPlayer_desc", "()followPlayer(Number:<PlayerEID>, Number:<Meter>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setFactionAttackableBelow_desc", "()setFactionAttackableBelow(\"Text:<TribeName>\", <0/1>, <6000 points per 1 fame>)"}) --END eScript commands @@ -216,11 +217,34 @@ end function SearchCommand:htmlentities(text) local html_help_content="" - html_help_content = text:gsub("<", "<") + html_help_content = Text:gsub("<", "<") return html_help_content end +function SearchCommand:pars_command_parameter(command_parameter) + local finish_translation_text = "" + + if(string.find(string.lower(command_parameter), ":"))then + --split text to commands + for substring in string.gmatch(command_parameter, "([^:]+)") do + if(string.find(string.lower(substring), "<"))then + --debug(substring:match("<(.*)>")) + finish_translation_text=finish_translation_text.."<"..substring:gsub("<(.-)>", i18n.get("uiSearchCommand"..substring:match("<(.*)>")):toUtf8())..">" + else + finish_translation_text=finish_translation_text..""..i18n.get("uiSearchCommand"..substring):toUtf8()..":" + end + end + else + finish_translation_text = command_parameter + end + + --debug("trans: "..finish_translation_text) + + return finish_translation_text +end + + function SearchCommand:pars_help_on_window(content_of_window,height) local whm = getUI("ui:interface:web_transactions") local whm_html = getUI("ui:interface:web_transactions:content:html") @@ -228,24 +252,28 @@ function SearchCommand:pars_help_on_window(content_of_window,height) local html_help_content="" html_help_content=[[<table width="100%" border="0"><tr><td>]]..content_of_window..[[</td></tr></table>]] - whm.title = "command help" + whm.title = i18n.get("uiSearchCommandHelp"):toUtf8() whm.active = true whm.w = 750 whm.h = height whm_html:renderHtml(html_help_content) end - function SearchCommand:help_show_all(parameter) local count = 0 local build_content = "" + --debug("help parameter: "..parameter) build_content=build_content.."<table width='100%' border=0>" + if(parameter ~= "eScript" and parameter ~= "client" and parameter ~= "shard" and parameter ~= "all")then + parameter = "all" + end + if(parameter == "all")then - build_content=build_content.."<tr><td colspan=4>######################## command help all #######################</td></tr>" + build_content=build_content.."<tr><td colspan=4>######################## "..i18n.get("uiSearchCommandHelp"):toUtf8().." "..i18n.get("uiSearchCommandAll"):toUtf8().." #######################</td></tr>" else - build_content=build_content.."<tr><td colspan=4>######################## command help all / filter '"..SearchCommand:htmlentities(parameter).."' #######################</td></tr>" + build_content=build_content.."<tr><td colspan=4>######################## "..i18n.get("uiSearchCommandHelp"):toUtf8().." "..i18n.get("uiSearchCommandAll"):toUtf8().." / "..i18n.get("uiSearchCommandFilter"):toUtf8().." '"..SearchCommand:htmlentities(parameter).."' #######################</td></tr>" end for c = 1, #self.commands_list do @@ -275,17 +303,21 @@ function SearchCommand:help_show_all(parameter) count=count+1 - build_content=build_content.."<tr><td width='10px'>"..count..".</td><td colspan=3>"..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.." '"..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][3]))).."'</td></tr>" - build_content=build_content.."<tr><td> </td><td>type: "..SearchCommand:htmlentities(self.commands_list[c][1]).."</td></tr>" - build_content=build_content.."<tr><td> </td><td>priv: "..SearchCommand:htmlentities(self.commands_list[c][2]).."</td></tr>" + build_content=build_content.."<tr><td width='10px'>"..count..".</td><td colspan=3>"..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.."</td></tr>" + build_content=build_content.."<tr><td> </td><td>"..i18n.get("uiR2EDScenarioDescription"):toUtf8()..": '"..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][3]))).."'</td></tr>" + build_content=build_content.."<tr><td> </td><td>"..i18n.get("uiFrontSelectionType"):toUtf8()..": "..SearchCommand:htmlentities(self.commands_list[c][1]).."</td></tr>" + build_content=build_content.."<tr><td> </td><td>"..i18n.get("uiSearchCommandPriv"):toUtf8()..": "..SearchCommand:htmlentities(self.commands_list[c][2]).."</td></tr>" for ac = 1, max_arguments do build_content=build_content.."<tr><td> </td><td>arg"..ac.." :</td></tr>" for pc = 1, #self.commands_list[c][4+ac] do + + local translation_parm = SearchCommand:pars_command_parameter(self.commands_list[c][4+ac][pc][1]) + if(self.commands_list[c][4+ac][pc][2] == "")then - build_content=build_content.."<tr><td> </td><td>         "..SearchCommand:htmlentities(self.commands_list[c][4+ac][pc][1]).."</td></tr>" + build_content=build_content.."<tr><td> </td><td>         "..SearchCommand:htmlentities(translation_parm).."</td></tr>" else - build_content=build_content.."<tr><td> </td><td>         "..SearchCommand:htmlentities(self.commands_list[c][4+ac][pc][1]).." '"..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][4+ac][pc][2]))).."'</td></tr>" + build_content=build_content.."<tr><td> </td><td>         "..SearchCommand:htmlentities(translation_parm).." '"..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][4+ac][pc][2]))).."'</td></tr>" end end end @@ -305,7 +337,7 @@ function SearchCommand:help_show_all(parameter) end build_content=build_content.."<tr><td colspan=3> </td></tr>" - build_content=build_content.."<tr><td colspan=3>############################ end ##########################</td></tr>" + build_content=build_content.."<tr><td colspan=3>################################################################################</td></tr>" build_content=build_content.."</table>" SearchCommand:pars_help_on_window(build_content, 600) end @@ -338,7 +370,7 @@ function SearchCommand:help(uiId,input) local command_are_allowed = 0 if(self.commands_list[c][4] == command_split[1])then command_found = 1 - build_content=build_content.."<tr><td colspan=3>######################## command help '"..command_split[1].."' #######################</td></tr>" + build_content=build_content.."<tr><td colspan=3>######################## "..i18n.get("uiSearchCommandHelp"):toUtf8().." '"..command_split[1].."' #######################</td></tr>" if(self.commands_list[c][2] == "player")then command_are_allowed = 1 @@ -361,19 +393,23 @@ function SearchCommand:help(uiId,input) arg_display="[arg"..ad.."]" end end - build_content=build_content.."<tr><td>desc: "..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][3]))).."</td></tr>" - build_content=build_content.."<tr><td>type: "..SearchCommand:htmlentities(self.commands_list[c][1]).."</td></tr>" - build_content=build_content.."<tr><td>priv: "..SearchCommand:htmlentities(self.commands_list[c][2]).."</td></tr>" + + build_content=build_content.."<tr><td>"..i18n.get("uiR2EDScenarioDescription"):toUtf8()..": "..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][3]))).."</td></tr>" + build_content=build_content.."<tr><td>"..i18n.get("uiFrontSelectionType"):toUtf8()..": "..SearchCommand:htmlentities(self.commands_list[c][1]).."</td></tr>" + build_content=build_content.."<tr><td>"..i18n.get("uiSearchCommandPriv"):toUtf8()..": "..SearchCommand:htmlentities(self.commands_list[c][2]).."</td></tr>" build_content=build_content.."<tr><td> </td></tr>" build_content=build_content.."<tr><td>"..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.."</td></tr>" for ac = 1, max_arguments do build_content=build_content.."<tr><td> arg"..ac.." :</td></tr>" for pc = 1, #self.commands_list[c][4+ac] do + + local translation_parm = SearchCommand:pars_command_parameter(self.commands_list[c][4+ac][pc][1]) + if(self.commands_list[c][4+ac][pc][2] == "")then - build_content=build_content.."<tr><td>         "..SearchCommand:htmlentities(self.commands_list[c][4+ac][pc][1]).."</td></tr>" + build_content=build_content.."<tr><td>         "..SearchCommand:htmlentities(tostring(translation_parm)).."</td></tr>" else - build_content=build_content.."<tr><td>         "..SearchCommand:htmlentities(self.commands_list[c][4+ac][pc][1]).." '"..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][4+ac][pc][2]))).."'</td></tr>" + build_content=build_content.."<tr><td>         "..SearchCommand:htmlentities(tostring(translation_parm)).." '"..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][4+ac][pc][2]))).."'</td></tr>" end end end @@ -388,10 +424,10 @@ function SearchCommand:help(uiId,input) end build_content=build_content.."<tr><td colspan=3> </td></tr>" - build_content=build_content.."<tr><td colspan=3>############################ end ############################</td></tr>" + build_content=build_content.."<tr><td colspan=3>######################################################################</td></tr>" if(command_found == 0)then - displaySystemInfo(ucstring("Command not found"), "AROUND") + displaySystemInfo(ucstring(command_split[1].." : "..i18n.get("uiCommandNotExists"):toUtf8()), "SYS") else --debug("pars_help") SearchCommand:pars_help_on_window(build_content, 350) @@ -424,7 +460,7 @@ function SearchCommand:check_autocomplet_number(uiId) local get_last_char_from_input = tonumber(string.sub(input_text, (max_string_count), -1)) if(type(get_last_char_from_input) == "number")then - --debug("last_input_is_a_number: "..get_last_char_from_input) + --debug("last_input_is_a_Number: "..get_last_char_from_input) if(get_last_char_from_input <= #self.valid_commands_list)then if (menu.active) then @@ -564,13 +600,21 @@ function SearchCommand:search(uiId) if(max_string_count == 1)then self.command_self="" - SearchCommand:write_command_help(uiId,"/<command> or /? all") + SearchCommand:write_command_help(uiId,i18n.get("uiSearchCommandInitDialog"):toUtf8()) SearchCommand:close_modal(uiId) --update process_status SearchCommand:update_process_list(uiId,0) else SearchCommand:close_modal(uiId) + + --if we found 2 space cancel all action + if(string.find(string.lower(input_text), " "))then + --debug("found_two_spaces") + SearchCommand:write_command_help_clear(uiId) + return 0 + end + local command_first = string.sub(input_text, 2, (max_string_count)) --split text to commands for substring in command_first:gmatch("%S+") do @@ -608,33 +652,41 @@ function SearchCommand:build_valid_command_list(command_input,uiId) local found_command=0 for c = 1, #self.commands_list do + local command_are_allowed = 0 + local command_display = 0 + --check if we want used a client or shared command if(self.command_self == "a" or self.command_self == "b" or self.command_self == "c")then --debug(self.commands_list[c][1]) if(self.commands_list[c][1] == "shard" and self.command_parameter_list[2] ~= "eScript")then - command_are_allowed = 1 + command_display = 1 elseif(self.commands_list[c][1] == "eScript")then if(self.command_parameter_list[2] == "eScript")then - command_are_allowed = 1 + command_display = 1 else - command_are_allowed = 0 + command_display = 0 end else - command_are_allowed = 0 + command_display = 0 end else if(self.commands_list[c][1] == "shard")then if(self.command_self == "?")then - command_are_allowed = 1 + command_display = 1 else - command_are_allowed = 0 + command_display = 0 end elseif(self.commands_list[c][1] == "eScript")then - command_are_allowed = 0 + if(self.command_self == "?")then + command_display = 1 + else + command_display = 0 + end + else + command_display = 1 end end - local command_are_allowed = 0 if(self.commands_list[c][2] == "player")then command_are_allowed = 1 else @@ -643,7 +695,9 @@ function SearchCommand:build_valid_command_list(command_input,uiId) end end - if(command_are_allowed == 1)then + --debug("command_are_allowed: "..command_are_allowed.." command_display: "..command_display) + + if(command_are_allowed == 1 and command_display == 1)then if(command_input ~= "")then if(string.lower(self.commands_list[c][4]) == string.lower(command_input))then found_command=c @@ -800,10 +854,13 @@ function SearchCommand:search_build_argument_list(uiId,command_to_show_argument) if(max_args == ac or max_args == 1)then for pc = 1, #self.commands_list[command_index][4+ac] do + + local translation_parm = SearchCommand:pars_command_parameter(self.commands_list[command_index][4+ac][pc][1]) + if(pc > 1)then - argument_help=argument_help.."/"..self.commands_list[command_index][4+ac][pc][1] + argument_help=argument_help.."/"..translation_parm else - argument_help=argument_help.." "..self.commands_list[command_index][4+ac][pc][1] + argument_help=argument_help.." "..translation_parm end end else @@ -894,6 +951,7 @@ end function SearchCommand:build_command_helper(uiId) --read process_list + local player_priv = isPlayerPrivilege() local argu_name = "" local process_status=SearchCommand:read_process_status(uiId) @@ -934,7 +992,7 @@ end function SearchCommand:write_command_help(uiId,text) local main_chat_input = getUI(uiId) local read_prompt = main_chat_input.prompt - debug("write_command_help: "..text) + --debug("write_command_help: "..text) local behind_help_text = getUI(uiId.."h") behind_help_text.prompt=read_prompt @@ -1039,7 +1097,7 @@ function SearchCommand:show_more_options(uiId) --END setup menu window --fill menu window - menu:addLine(ucstring("Found: "..#self.valid_commands_list), "lua", "SearchCommand:close_modal('"..uiId.."')", "") + menu:addLine(ucstring(i18n.get("uiSearchCommandFound"):toUtf8()..": "..#self.valid_commands_list), "lua", "SearchCommand:close_modal('"..uiId.."')", "") for c = 1, display_max_found do menu:addLine(ucstring(c..". "..self.valid_commands_list[c]), "lua", "SearchCommand:finish_commands('"..self.valid_commands_list[c].."','"..uiId.."')", "") From 3858efd787d746f3e7378dc6a8e2cfbcedcc9ae0 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Wed, 10 Jan 2024 22:05:36 +0100 Subject: [PATCH 136/194] Fixed: bad commit --- ryzom/client/data/gamedev/interfaces_v3/search_command.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index 1c71df47c0..d1ab564e98 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -217,7 +217,7 @@ end function SearchCommand:htmlentities(text) local html_help_content="" - html_help_content = Text:gsub("<", "<") + html_help_content = text:gsub("<", "<") return html_help_content end From 5bb1ac1db49c65b0fb4fa38d2e508fbaab96ff1c Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Mon, 15 Jan 2024 00:49:21 +0100 Subject: [PATCH 137/194] Changed: fixing escript param list --- .../gamedev/interfaces_v3/search_command.lua | 206 +++++++++++------- 1 file changed, 123 insertions(+), 83 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index d1ab564e98..99ab2f24c6 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -8,7 +8,8 @@ if not SearchCommand then commands_list = {}, key_tab_down = 0, modal_open_list = {}, - process_list = {} + process_list = {}, + player_list = {} } end @@ -123,56 +124,52 @@ else end -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:", "Position_desc", "Position", {{"<PosX>,<PosY>[,<PosZ>]",""},{"Text:<BotName>",""},{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:", "Position_desc", "Position", {{"<PositionX>,<PositionY>[,<PositionZ>]",""},{"Text:<BotName>",""},{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eScript_desc", "eScript", {{"Text:<ContinentName>@",""},{"Text:<EventNpcGroup>",""}}, {{"Text:<ScriptCommand>",""}}}) --END shard commands --eScript commands -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "despawn_desc", "()despawn(<0/1>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "rename_desc", "()rename(\"Text:wk[<Name>]$#Text:wk[<Title>]$\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAggro_desc", "()setAggro(Number:<Range>,Number:<Ticks>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setPlayerAttackable_desc", "()setPlayerAttackable(<0/1>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setBotAttackable_desc", "()setBotAttackable(Number:<0/1>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAttackable_desc", "()setAttackable(Number:<0/1>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setActivity_desc", "()setActivity(\"<no_change/escorted/guard/guard_escorted/normal/faction/faction_no_assist/bandit>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setFactionProp_desc", "()setFactionProp(\"<faction/ennemyFaction/friendFaction/player/predator/outpost:<id>:<side>>\",\"Text:<FameName>FameMin|Text:<FameName>FameMax\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"event_group_killed\",\"Text:<Url>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"event_bot_killed\",Text:<Url>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"running\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"faction,Text:<Factionname>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "()addProfileParameter(\"fame_for_guard_attack\",<6000 points per 1 fame>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "removeProfileParameter_desc", "()removeProfileParameter(\"Text:<Parameter>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "clearAggroList_desc", "()clearAggroList()"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "startMoving_desc", "()startMoving(Number:<PosX>,Number:<PosY>,Number:<Radius>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "stopMoving_desc", "()stopMoving()"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "startWander_desc", "()startWander(Number:<Meter>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAutoSpawn_desc", "()setAutoSpawn(<0/1>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setDespawnTime_desc", "()setDespawnTime(Number:<Ticks>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setRespawnTime_desc", "()setDespawnTime(Number:<Ticks>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "standUp_desc", "()standUp()"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "sitDown_desc", "()sitDown()"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setZoneState_desc", "()setZoneState(\"Text:<ZoneName>\",<0.0/1.0>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setMode_desc", "()setMode(\"<Normal/Sit/Eat/Rest/Alert/Hungry/Death>\""}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "aiActionSelf_desc", "()aiActionSelf(\"Text:<NameAiaction>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "aiAction_desc", "()aiAction(\"Text:<Aame.aiaction>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "emote_desc", "()emote(\"Text:<Emote>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "()vpx(\"VPA:Hex:<Value>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "()vpx(\"VPB:Hex:<Value>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "()vpx(\"VPC:Hex:<Value>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setMaxHP_desc", "()setMaxHP(Number:<Hp>, <0/1>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "npcSay_desc", "()npcSay(\"Text:<Message>\", \"<say/shout>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "ignoreOffensiveActions_desc", "()ignoreOffensiveActions(<0/1>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "maxHitRange_desc", "()maxHitRange(Number:<Meter>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addHP_desc", "()addHP(Number:<Hp>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setClientSheet_desc", "()setClientSheet(\"Text:<Sheet>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setSheet_desc", "()setSheet(\"Text:<Sheet>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setUrl_desc", "()setUrl(\"Text:<MENU_NAME>\", \"Text:<Url/*>\")"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "facing_desc", "()facing(<3.14/-3.14>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setCanAggro_desc", "()setCanAggro(<0/1>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setHealer_desc", "()setHealer(<0/1>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setHPScale_desc", "()setHPScale(<0.0/..0.5../1.0>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "followPlayer_desc", "()followPlayer(Number:<PlayerEID>, Number:<Meter>)"}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setFactionAttackableBelow_desc", "()setFactionAttackableBelow(\"Text:<TribeName>\", <0/1>, <6000 points per 1 fame>)"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "despawn_desc", "despawn(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "rename_desc", "rename(\"arg1$#arg2$\")", {{"Text:wk[<Name>]",""}},{{"Text:wk[<Title>]",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAggro_desc", "setAggro(arg1)", {{"Number:<Range>",""}}, {{"Number:<Ticks>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setPlayerAttackable_desc", "setPlayerAttackable(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setBotAttackable_desc", "setBotAttackable(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAttackable_desc", "setAttackable(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setActivity_desc", "setActivity(\"arg1\")", {{"<no_change/escorted/guard/guard_escorted/normal/faction/faction_no_assist/bandit>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setFactionProp_desc", "setFactionProp(\"arg1\",\"arg2|arg3\")", {{"<faction/ennemyFaction/friendFaction/player/predator/outpost:<id>:<side>>",""}}, {{"Text:<FameName>FameMin",""}}, {{"Text:<FameName>FameMax",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "addProfileParameter(\"arg1\",\"arg2\")", {{"event_group_killed",""},{"event_bot_killed",""},{"running",""},{"faction",""}},{{"Text:<Url>",""},{"Text:<Factionname>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "removeProfileParameter_desc", "removeProfileParameter(\"arg1\")",{{"Text:<Parameter>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "clearAggroList_desc", "clearAggroList()"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "startMoving_desc", "startMoving(arg1,arg2,arg3)", {{"Number:<PositionX>",""}}, {{"Number:<PositionY>",""}}, {{"Number:<Radius>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "stopMoving_desc", "stopMoving()"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "startWander_desc", "startWander(arg1)", {{"Number:<Meter>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAutoSpawn_desc", "setAutoSpawn(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setDespawnTime_desc", "setDespawnTime(arg1)", {{"Number:<Ticks>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setRespawnTime_desc", "setDespawnTime(arg1)", {{"Number:<Ticks>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "standUp_desc", "standUp()"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "sitDown_desc", "sitDown()"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setZoneState_desc", "setZoneState(\"arg1\",arg2)", {{"Text:<ZoneName>",""}}, {{"<0.0/1.0>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setMode_desc", "setMode(\"arg1\")", {{"<Normal/Sit/Eat/Rest/Alert/Hungry/Death>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "aiActionSelf_desc", "aiActionSelf(\"arg1\")", {{"Text:<NameAiaction>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "aiAction_desc", "aiAction(\"arg1\")", {{"Text:<NameAiaction>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "emote_desc", "emote(\"arg1\")", {{"Text:<Emote>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "vpx(\"VPA:arg1\")", {{"Hex:<Value>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "vpx(\"VPB:arg1\")", {{"Hex:<Value>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "vpx(\"VPC:arg1\")", {{"Hex:<Value>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setMaxHP_desc", "setMaxHP(arg1,arg2)", {{"Number:<Hp>",""}}, {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "npcSay_desc", "npcSay(\"arg1\", \"arg2\")", {{"Text:<Message>",""}}, {{"<say/shout>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "ignoreOffensiveActions_desc", "ignoreOffensiveActions(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "maxHitRange_desc", "maxHitRange(arg1)", {{"Number:<Meter>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addHP_desc", "addHP(arg1)", {{"Number:<Hp>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setClientSheet_desc", "setClientSheet(\"arg1\")", {{"Text:<Sheet>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setSheet_desc", "setSheet(\"arg1\")", {{"Text:<Sheet>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setUrl_desc", "setUrl(\"arg1\", \"arg2\")", {{"Text:<MENU_NAME>",""}}, {{"Text:<Url>",""},{"*",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "facing_desc", "facing(arg1)", {{"<3.14/-3.14>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setCanAggro_desc", "setCanAggro(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setHealer_desc", "setHealer(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setHPScale_desc", "setHPScale(arg1)", {{"<0.0/..0.5../1.0>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "followPlayer_desc", "followPlayer(arg1,arg2)", {{"Number:<PlayerEID>",""}}, {{"Number:<Meter>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setFactionAttackableBelow_desc", "setFactionAttackableBelow(\"arg1\",arg2,arg3)", {{"Text:<TribeName>",""}}, {{"<0/1>",""}}, {{"<6000 points per 1 fame>",""}}}) --END eScript commands @@ -225,9 +222,12 @@ end function SearchCommand:pars_command_parameter(command_parameter) local finish_translation_text = "" - if(string.find(string.lower(command_parameter), ":"))then + --debug("param: "..command_parameter) + + if(string.find(string.lower(command_parameter), ":") ~= nil and string.find(string.lower(command_parameter), ":") < 20)then --split text to commands for substring in string.gmatch(command_parameter, "([^:]+)") do + --debug(substring) if(string.find(string.lower(substring), "<"))then --debug(substring:match("<(.*)>")) finish_translation_text=finish_translation_text.."<"..substring:gsub("<(.-)>", i18n.get("uiSearchCommand"..substring:match("<(.*)>")):toUtf8())..">" @@ -646,6 +646,18 @@ function SearchCommand:search(uiId) end end +function SearchCommand:get_command_type(command) + local command_type = "" + + for c = 1, #self.commands_list do + if(self.commands_list[c][4] == command) then + command_type = self.commands_list[c][1] + end + end + + return command_type +end + function SearchCommand:build_valid_command_list(command_input,uiId) self.valid_commands_list = {} local count_found=0 @@ -720,43 +732,26 @@ function SearchCommand:build_valid_command_list(command_input,uiId) end function SearchCommand:build_valid_player_list(playername_input,uiId) - player_list = {} - player_list[1] = "rias" - player_list[2] = "uluk" - player_list[3] = "riasan" - player_list[4] = "Limay" - player_list[5] = "Neira" - player_list[6] = "Beastie" - player_list[7] = "Audeva" - player_list[8] = "Decacaon" - player_list[9] = "Livege" - player_list[10] = "Purg" - player_list[11] = "Xxramusxx" - player_list[12] = "Kronoss" - player_list[13] = "Livan" - player_list[14] = "Mifisto" - player_list[15] = "Progulschik" - player_list[16] = "Darwyn" - player_list[17] = "Aprak" - player_list[18] = "Dorothee" - player_list[19] = "Zillah" - self.valid_commands_list = {} local count_found=0 local found_playername=0 - - for c = 1, #player_list do - if(playername_input ~= "")then - if(string.lower(player_list[c]) == string.lower(playername_input))then - found_playername=c - count_found=1 - else - if string.find(string.lower(player_list[c]), string.lower(playername_input))then - table.insert(self.valid_commands_list,player_list[c]) - count_found=count_found+1 + + if(self.player_list ~= nil)then + for c = 1, #self.player_list do + if(playername_input ~= "")then + if(string.lower(self.player_list[c]) == string.lower(playername_input))then + found_playername=c + count_found=1 + else + if string.find(string.lower(self.player_list[c]), string.lower(playername_input))then + table.insert(self.valid_commands_list,self.player_list[c]) + count_found=count_found+1 + end end end end + else + debug("Error") end if(count_found == 0)then @@ -882,8 +877,7 @@ function SearchCommand:search_build_argument_list(uiId,command_to_show_argument) argument_help=argument_help.." "..self.command_parameter_list[max_arguments+1+ma] end end - - argument_help=argument_help.." Warning to many Arguments" + argument_help=argument_help.." "..i18n.get("uiSearchCommandWarningParameter"):toUtf8() end if(self.command_self == "a" and #self.command_parameter_list >= 2)then @@ -976,7 +970,11 @@ function SearchCommand:build_command_helper(uiId) SearchCommand:search_build_command_list(uiId,self.command_parameter_list[process_status],false) elseif(string.find(string.lower(argu_name), string.lower("<PlayerName>")) or string.find(string.lower(argu_name), string.lower("<TargetName>")))then --debug("parm is a playername") + if(player_priv)then + --load_current_active_player_name + webig:openUrlInBg("https://app.ryzom.com/get_playername_online/index.php") + SearchCommand:search_build_player_list(uiId,self.command_parameter_list[process_status]) else SearchCommand:search_build_argument_list(uiId,self.command_self) @@ -1113,10 +1111,45 @@ function SearchCommand:show_more_options(uiId) --END launche menu window end +function SearchCommand:replace_escript_param(command_name) + local command_index = 0 + local temp_command = "" + + for c = 1, #self.commands_list do + if(self.commands_list[c][4] == command_name)then + command_index=c + end + end + + if(command_index ~= 0)then + temp_command = command_name + max_arguments = #self.commands_list[command_index] - 4 + + for ac = 1, max_arguments do + + local load_all_param = "" + for pc = 1, #self.commands_list[command_index][4+ac] do + debug(self.commands_list[command_index][4+ac][pc][1]) + local translation_parm = SearchCommand:pars_command_parameter(self.commands_list[command_index][4+ac][pc][1]) + if(pc > 1)then + load_all_param=load_all_param.."/"..translation_parm + else + load_all_param=translation_parm + end + end + temp_command = temp_command:gsub("arg"..ac,load_all_param) + end + end + + --debug("final_temp: "..temp_command) + return temp_command +end + function SearchCommand:finish_commands(command_name,uiId) local process_status = SearchCommand:read_process_status(uiId) local input_search_string = getUI(uiId) local final_command = "" + local new_command_par = "" --debug("process_status: "..process_status) @@ -1127,10 +1160,17 @@ function SearchCommand:finish_commands(command_name,uiId) end for pc = 1, #self.command_parameter_list do + local add_escript_prefix="" + if(SearchCommand:get_command_type(self.command_parameter_list[pc]) == "eScript")then + add_escript_prefix="()" + new_command_par = SearchCommand:replace_escript_param(self.command_parameter_list[pc]) + self.command_parameter_list[pc] = new_command_par + end + if(final_command == "")then - final_command = self.command_parameter_list[pc] + final_command = add_escript_prefix..""..self.command_parameter_list[pc] else - final_command = final_command.." "..self.command_parameter_list[pc] + final_command = final_command.." "..add_escript_prefix..""..self.command_parameter_list[pc] end end From 92d04de4a43da9e69cbc15eb0c9a12ea78596b35 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Mon, 15 Jan 2024 00:50:03 +0100 Subject: [PATCH 138/194] Changed: fixing escipt param list --- .../gamedev/interfaces_v3/search_command.lua | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index 99ab2f24c6..35590d5a0f 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -293,12 +293,17 @@ function SearchCommand:help_show_all(parameter) build_content=build_content.."<tr><td colspan=3> </td></tr>" max_arguments = #self.commands_list[c] - 4 - for ad = 1, max_arguments do - if(ad > 1)then - arg_display=arg_display.." [arg"..ad.."]" - else - arg_display="[arg"..ad.."]" + + if(self.commands_list[c][1] ~= "eScript")then + for ad = 1, max_arguments do + if(ad > 1)then + arg_display=arg_display.." [arg"..ad.."]" + else + arg_display="[arg"..ad.."]" + end end + else + arg_display = "" end count=count+1 @@ -386,12 +391,17 @@ function SearchCommand:help(uiId,input) build_content=build_content.."<tr><td><table width='100%' border=0>" max_arguments = #self.commands_list[c] - 4 - for ad = 1, max_arguments do - if(ad > 1)then - arg_display=arg_display.." [arg"..ad.."]" - else - arg_display="[arg"..ad.."]" + + if(self.commands_list[c][1] ~= "eScript")then + for ad = 1, max_arguments do + if(ad > 1)then + arg_display=arg_display.." [arg"..ad.."]" + else + arg_display="[arg"..ad.."]" + end end + else + arg_display = "" end build_content=build_content.."<tr><td>"..i18n.get("uiR2EDScenarioDescription"):toUtf8()..": "..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][3]))).."</td></tr>" From 6669ac1186bc477414217b980ddd7a8e68ed8738 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Mon, 15 Jan 2024 13:31:13 +0100 Subject: [PATCH 139/194] Changed: add missing shard commands --- .../gamedev/interfaces_v3/search_command.lua | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index 35590d5a0f..c4d5c38546 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -123,6 +123,130 @@ else table.insert(SearchCommand.commands_list,{"shard", "player", "connectUserChannel_desc", "connectUserChannel", {{"Text:<Channelname>",""}}, {{"Text:<Password>",""},{"*","channel_leave_desc"}}}) end +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addGuildMember_desc", "addGuildMember", {{"Text:<GuildName>",""}},{{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addGuildXp_desc", "addGuildXp", {{"Text:<GuildName>",""}},{{"<+-Xp>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addPetAnimal_desc", "addPetAnimal", {{"Text:<PetTicket>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addPosFlag_desc", "addPosFlag", {{"Text:<FlagName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addSkillPoints_desc", "addSkillPoints", {{"<Fight=0>",""},{"<Magic=1>",""},{"<Craft=2>",""},{"<Harvest=3>",""}}, {{"Number:<SkillPoints>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addXPToSkill_desc", "addXPToSkill", {{"<Xp>",""}}, {{"Text:<Skill>",""}}, {{"[Number:<Count>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:", "broadcast_desc", "broadcast", {{"<Xp>",""}}, {{"Text:<Skill>",""}}, {{"[Number:<Count>]",""}}, {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "changeHairCut_desc", "changeHairCut", {{"Text:<Sheet>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "changeMode_desc", "changeMode", {{"Text:<Mode>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "changeVar_desc", "changeVar", {{"Text:<Variable>",""},{"BaseConstitution",""},{"BaseIntelligence",""},{"BaseStrength",""},{"BaseDexterity",""},{"BaseMetabolism",""},{"BaseWisdom",""},{"BaseWellBalanced",""},{"BaseWill",""}}, {{"Number:<Value>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "checkTargetSP_desc", "checkTargetSP"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "clearEventFaction_desc", "clearEventFaction", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "clearFriendsList_desc", "clearFriendsList"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "clearIgnoreList_desc", "clearIgnoreList"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "clearIsFriendOfList_desc", "clearIsFriendOfList"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "createItemInBag_desc", "createItemInBag", {{"Text:<Sheet>",""}}, {{"Text:<Quantity>",""}}, {{"Text:<Quality>",""}}, {{"[force]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:", "createItemInInv_desc", "createItemInInv", {{"Number:<InventoryID>",""}}, {{"Text:<Sheet>",""}}, {{"Text:<Quantity>",""}}, {{"Text:<Quality>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "createItemInTmpInv_desc", "createItemInTmpInv", {{"Text:<Sheet>",""}}, {{"Text:<Quantity>",""}}, {{"Text:<Quality>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "createNamedItemInBag_desc", "createNamedItemInBag", {{"Text:<ItemName>",""}}, {{"Text:<Quantity>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "createFullArmorSet_desc", "createFullArmorSet", {{"fyros",""},{"matis",""},{"zorai",""},{"tryker",""}}, {{"light",""},{"medium",""},{"heavy",""}}, {{"Text:<Quality>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "delPosFlag_desc", "delPosFlag", {{"Text:<FlagName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:EG:", "dismiss_desc", "dismiss", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "displayForageRM_desc", "displayForageRM", {{"<exactPos=1>",""}}, {{"<extendedInfo=0>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "displayInfosOnTarget_desc", "displayInfosOnTarget"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "execPhrase_desc", "execPhrase", {{"<Cyclic 0/1>",""}}, {{"[<BrickIds>...]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "executeSabrinaPhrase_desc", "executeSabrinaPhrase", {{"<Cyclic 0/1>",""}}, {{"<PhraseId>...",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "failMission_desc", "failMission", {{"Number:<MissionIdex>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "forceTargetToDie_desc", "forceTargetToDie"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "getEventFaction_desc", "getEventFaction", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "giveRespawnPoint_desc", "giveRespawnPoint", {{"Text:<RespawnPointName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:EG:", "ignoreTells_desc", "ignoreTells", {{"<0/false/1/true>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:EG:", "infos_desc", "infos"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:EG:", "killMob_desc", "killMob"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "learnAllBricks_desc", "learnAllBricks"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "learnAllForagePhrases_desc", "learnAllForagePhrases", {{"Number:<Index>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "learnAllPhrases_desc", "learnAllPhrases"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "learnBrick_desc", "learnBrick", {{"Text:<BrickSheet>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "unlearnBrick_desc", "unlearnBrick", {{"Text:<BrickSheet>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "learnPhrase_desc", "learnPhrase", {{"Text:<PhraseSheet>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "listGuildMembers_desc", "listGuildMembers", {{"Text:<GuildName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:G:EM:EG:", "listPosFlags_desc", "listPosFlags", {{"Number:<Radius>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "loadFromXML_desc", "loadFromXML", {{"Text:<Filename>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "loadFromPDR_desc", "loadFromPDR", {{"Text:<Filename>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "logXpGain_desc", "logXpGain", {{"<on/off>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:G:EM:EG:", "listPosFlags_desc", "lPosFlags", {{"Number:<Radius>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "monitorMissions_desc", "monitorMissions", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:", "motd_desc", "motd", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:", "mute_desc", "mute", {{"Text:<PlayerName>",""}}, {{"Number:<Duration>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:", "muteUniverse_desc", "muteUniverse", {{"Text:<PlayerName>",""}}, {{"Number:<Duration>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "outpostBanGuild_desc", "outpostBanGuild", {{"Number:<OutpostId>",""}}, {{"Text:<GuildName>",""}}, {{"[<all|atk|def>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "outpostBanPlayer_desc", "outpostBanPlayer", {{"Number:<OutpostId>",""}}, {{"Number:<PlayerEID>",""}}, {{"[<all|atk|def>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "outpostUnbanGuild_desc", "outpostUnbanGuild", {{"Number:<OutpostId>",""}}, {{"Text:<GuildName>",""}}, {{"[<all|atk|def>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "outpostUnbanPlayer_desc", "outpostUnbanPlayer", {{"Number:<OutpostId>",""}}, {{"Number:<PlayerEID>",""}}, {{"[<all|atk|def>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "progressMission_desc", "progressMission", {{"Number:<MissionIdex>",""}}, {{"[repeat]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "renameGuild_desc", "renameGuild", {{"Text:<GuildName>",""}},{{"Text:<NewGuildName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "renamePlayer_desc", "renamePlayer", {{"Text:<PlayerName>",""}},{{"Text:<NewPlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:EG:", "renamePlayerForEvent_desc", "renamePlayerForEvent", {{"Text:<PlayerName>",""}},{{"Text:<NewPlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "resetPowerFlags_desc", "resetPowerFlags"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:", "root_desc", "root", {{"Text:<PlayerName>",""}}, {{"Number:<Duration>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "saveToPDR_desc", "saveToPDR", {{"Text:<Filename>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "saveToXML_desc", "saveToXML", {{"Text:<Filename>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setEventFaction_desc", "setEventFaction", {{"Text:<PlayerName>",""}}, {{"Text:<EventFaction>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "setGMGuild_desc", "setGMGuild"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setGuildChargePoint_desc", "setGuildChargePoint", {{"Text:<GuildName>",""}},{{"Number:<Points>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setGuildDescription_desc", "setGuildDescription", {{"Text:<GuildName>",""}},{{"Text:<Description>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setGuildMemberGrade_desc", "setGuildMemberGrade", {{"Text:<GuildName>",""}},{{"Text:<PlayerName>",""}},{{"Member",""},{"Officer",""},{"HighOfficer",""},{"Leader",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setItemSapLoad_desc", "setItemSapLoad", {{"<slot index in bag (starts at 0)>",""}}, {{"Float:<Value>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setPosFlag_desc", "setPosFlag", {{"Text:<FlagName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setFamePlayer_desc", "setFamePlayer", {{"Text:<Faction>",""}}, {{"Number:<Fame>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "resetPVPTimers_desc", "resetPVPTimers", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setSkillsToMaxValue_desc", "setSkillsToMaxValue"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:G:EM:EG:", "showCSR_desc", "showCSR"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "showFBT_desc", "showFBT"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "startEvent_desc", "startEvent", {{"Text:<EventName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "stopEvent_desc", "stopEvent"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "stopMonitorMissions_desc", "stopMonitorMissions"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "summon_desc", "summon", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:", "stopEvent_desc", "stopEvent"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:", "targetInfos_desc", "targetInfos"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:G:OBSERVER:EM:EG:", "teleport_desc", "teleport", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:G:EM:EG:", "tpPosFlag_desc", "tpPosFlag", {{"Text:<FlagName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:", "unmute_desc", "unmute", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:", "unmuteUniverse_desc", "unmuteUniverse", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:", "unroot_desc", "unroot", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "updateGuildMembersList_desc", "updateGuildMembersList", {{"Text:<GuildName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "allowSummonPet_desc", "allowSummonPet", {{"Number:<PetNumber>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "displayShopSelector_desc", "displayShopSelector"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:", "addFactionAttackableToTarget_desc", "addFactionAttackableToTarget"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:", "forceMissionProgress_desc", "forceMissionProgress"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "savePlayerActiveChar_desc", "savePlayerActiveChar", {{"[Text:<Filename>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "reloadPlayer_desc", "reloadPlayer", {{"[Number:<CharIndex>]",""}}, {{"[Text:<Filename>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:", "farTPPush_desc", "farTPPush", {{"Number:<DestSessionId>",""}}, {{"[<X> <Y> [<Z> [<Heading>]]]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:", "farTPReturn_desc", "farTPReturn"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "characterMissionDump_desc", "characterMissionDump"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "removeMission_desc", "removeMission", {{"Number:<MissionIdex>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "addMission_desc", "addMission", {{"Number:<MissionGiverAlias>",""}}, {{"Number:<MissionIdex>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "characterInventoryDump_desc", "characterInventoryDump", {{"Text:<Inventory>",""}}, {{"Number:<MinSlot>",""}}, {{"Number:<MaxSlot>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "deleteInventoryItem_desc", "deleteInventoryItem", {{"Text:<Inventory>",""}}, {{"Number:<Slot>",""}}, {{"Text:<SheetName>",""}}, {{"Text:<Quantity>",""}}, {{"Text:<Quality>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setPetAnimalSatiety_desc", "setPetAnimalSatiety", {{"<petIndex in 0..3>",""}}, {{"full|<Value>",""}}, {{"[Text:<NameForAnswer>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "getPetAnimalSatiety_desc", "getPetAnimalSatiety", {{"<petIndex in 0..3>",""}}, {{"[Text:<NameForAnswer>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:EG:", "setPetAnimalName_desc", "setPetAnimalName", {{"<petIndex in 0..3>",""}}, {{"Text:<Name>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setSimplePhrase_desc", "setSimplePhrase", {{"Number:<Id>",""}}, {{"Text:<Phrase>",""}}, {{"fr",""},{"en",""},{"de",""},{"es",""},{"ru",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:EG:", "Aggro_desc", "Aggro",{{"[<0/off/false/1/on/true>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "CreateCharacterStartSkillsValue_desc", "CreateCharacterStartSkillsValue"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:EM:", "FBT_desc", "FBT", {{"[<0/off/false/1/on/true>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "God_desc", "God", {{"[<0/off/false/1/on/true>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "Invulnerable_desc", "Invulnerable", {{"[<0/off/false/1/on/true>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:EG:", "Invisible_desc", "Invisible", {{"[<0/off/false//1/on/true>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:G:", "ShowFactionChannels_desc", "ShowFactionChannels"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "HP_desc", "HP", {{"[Number:<Hp>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "MaxHP_desc", "MaxHP", {{"[Number:<Hp>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "Money_desc", "Money", {{"[Number:+-<Value>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "Name_desc", "Name"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:", "Priv_desc", "Priv", {{"Text:<Privileges>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:EG:", "PriviledgePVP_desc", "PriviledgePVP", {{"[<0/off/false/1/on/pvp/true>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:EG:", "FullPVP_desc", "FullPVP", {{"[<0/off/false/1/on/pvp/true>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "RyzomDate_desc", "RyzomDate"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "RyzomTime_desc", "RyzomTime"}) + +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventCreateNpcGroup_desc", "eventCreateNpcGroup",{{"Number:<Bots>",""}},{{"Text:<Sheet>",""}},{{"Number:<DispersionRadius>",""}},{{"<0/1>",""}},{{"random|self|-360..360",""}},{{"Text:<Name>",""}},{{"Number:<PositionX>",""}},{{"Number:<PositionY>",""}},{{"[Number:<PositionZ>]",""},{"[*]",""}},{{"[Text:<Sheet>]",""}},{{"[inVIllage?inOutpost?inStable?inAtys?]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventSetBotName_desc", "eventSetBotName", {{"Text:<Name>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventSetBotScale_desc", "eventSetBotScale", {{"<0...255>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventSetBotFacing_desc", "eventSetBotFacing", {{"<0-360|random>",""}}, {{"[<0,1>]","eventSetBotFacing_group_desc"}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventNpcSay_desc", "eventNpcSay", {{"Text:<Message>",""}}, {{"[say,shout,...]",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:", "Position_desc", "Position", {{"<PositionX>,<PositionY>[,<PositionZ>]",""},{"Text:<BotName>",""},{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eScript_desc", "eScript", {{"Text:<ContinentName>@",""},{"Text:<EventNpcGroup>",""}}, {{"Text:<ScriptCommand>",""}}}) From ffd62ce3d2127d5b3b8913556cd29eead7cf4788 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Mon, 15 Jan 2024 20:07:15 +0100 Subject: [PATCH 140/194] Changed: small fixes --- .../gamedev/interfaces_v3/search_command.lua | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index c4d5c38546..032d5060fa 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -31,12 +31,12 @@ table.insert(SearchCommand.commands_list,{"client", "player", "where_desc", "whe table.insert(SearchCommand.commands_list,{"client", "player", "playedTime_desc", "playedTime"}) table.insert(SearchCommand.commands_list,{"client", "player", "who_desc", "who", {{"gm","who_gm_desc"}}}) table.insert(SearchCommand.commands_list,{"client", "player", "guildinvite_desc", "guildinvite",{{"Text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "guildmotd_desc", "guildmotd",{{"Text:<Message>","guildmotd_message_desc"},{"?","guildmotd_?_desc"}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "league_desc", "league",{{"Text:<leaguename>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guildmotd_desc", "guildmotd",{{"Text:<Message>",""},{"?","guildmotd_arg1_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "league_desc", "league",{{"Text:<LeagueName>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "leagueinvite_desc", "leagueinvite",{{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "leaguequit_desc", "leaguequit"}) table.insert(SearchCommand.commands_list,{"client", "player", "leaguekick_desc", "leaguekick",{{"Text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "afk_desc", "afk",{{"Text:<autoresponse>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "afk_desc", "afk",{{"Text:<Autoresponse>","afk_autoresponse_desc"}}}) table.insert(SearchCommand.commands_list,{"client", "player", "assist_desc", "assist"}) table.insert(SearchCommand.commands_list,{"client", "player", "assist_desc", "as"}) table.insert(SearchCommand.commands_list,{"client", "player", "self_desc", "self"}) @@ -47,18 +47,18 @@ table.insert(SearchCommand.commands_list,{"client", "player", "ignore_desc", "ig table.insert(SearchCommand.commands_list,{"client", "player", "invite_desc", "invite",{{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "mount_desc", "mount"}) table.insert(SearchCommand.commands_list,{"client", "player", "unmount_desc", "unmount"}) -table.insert(SearchCommand.commands_list,{"client", "player", "random_desc", "random", {{"Number:<LowestNumber>",""}}, {{"Number:<HighestNumber>",""}}, {{"hide ",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "random_desc", "random", {{"Number:<LowestNumber>",""}}, {{"Number:<HighestNumber>",""}}, {{"hide ","random_hide_desc"}}}) table.insert(SearchCommand.commands_list,{"client", "player", "skiptutorial_desc", "skiptutorial"}) -table.insert(SearchCommand.commands_list,{"client", "player", "sleep_desc", "sleep", {{"Number:<number>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "sleep_desc", "sleep", {{"Number:<Secound>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "tar_desc", "tar", {{"Text:<Name>",""}}, {{"|quiet=true","tar_quiet_desc"}}}) table.insert(SearchCommand.commands_list,{"client", "player", "target_quiet_desc", "target_quiet"}) table.insert(SearchCommand.commands_list,{"client", "player", "target_quiet_desc", "tarq"}) table.insert(SearchCommand.commands_list,{"client", "player", "lmtar_desc", "lmtar", {{"Text:<Name>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "chat_desc", "chat"}) table.insert(SearchCommand.commands_list,{"client", "player", "go_desc", "go"}) -table.insert(SearchCommand.commands_list,{"client", "player", "appzone_desc", "appzone", {{"<AppId>","appzone_AppId_desc"},{"hide","appzone_hide_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "appzone_desc", "appzone", {{"<AppId>",""},{"hide","appzone_hide_desc"}}}) table.insert(SearchCommand.commands_list,{"client", "player", "setuiscale_desc", "setuiscale", {{"Number:<ScaleFactor>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "createGroup_desc", "createGroup", {{"Text:<OutfitGroupName>","createGroup_OutfitGroupName_desc"},{"true","createGroup_true_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "createGroup_desc", "createGroup", {{"Text:<OutfitGroupName>",""}},{{"[true]",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "moveGroup_desc", "moveGroup", {{"Text:<OutfitGroupName>",""}},{{"Text:<PetAnimal1>",""},{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "equipGroup_desc", "equipGroup", {{"Text:<OutfitGroupName>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "deleteGroup_desc", "deleteGroup", {{"Text:<OutfitGroupName>",""}}}) @@ -88,7 +88,7 @@ table.insert(SearchCommand.commands_list,{"client", "player", "1_desc", "1", {{" table.insert(SearchCommand.commands_list,{"client", "player", "2_desc", "2", {{"Text:<Message>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "3_desc", "3", {{"Text:<Message>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "4_desc", "4", {{"Text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "channel_desc", "channel",{{"Text:<Channelname>",""}}, {{"Text:<Password>",""},{"*","channel_leave_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "channel_desc", "channel",{{"Text:<Channelname>",""}}, {{"Text:<Password>","channel_password_desc"},{"*","channel_leave_desc"}}}) table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "tell",{{"Text:<PlayerName>",""}}, {{"Text:<Message>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "t",{{"Text:<PlayerName>",""}}, {{"Text:<Message>",""}}}) --END client commands @@ -109,12 +109,14 @@ table.insert(SearchCommand.commands_list,{"shard", "player", "setPvPTag_desc", " table.insert(SearchCommand.commands_list,{"shard", "player", "clearGuildMessage_desc", "clearGuildMessage"}) table.insert(SearchCommand.commands_list,{"shard", "player", "setGuildMessage_desc", "setGuildMessage", {{"Text:<Message>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "setDontTranslateLangs_desc", "setDontTranslateLangs", {{"codelang|codelang","setDontTranslateLangs_codelang_desc"}}}) -table.insert(SearchCommand.commands_list,{"shard", "player", "connectLangChannel_desc", "connectLangChannel",{{"fr",""},{"en",""},{"de",""},{"es",""},{"ru",""}},{{"1","connectLangChannel_1_desc"}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "connectLangChannel_desc", "connectLangChannel",{{"fr",""},{"en",""},{"de",""},{"es",""},{"ru",""}},{{"[<0|1>]","connectLangChannel_1_desc"}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "updateTarget_desc", "updateTarget"}) table.insert(SearchCommand.commands_list,{"shard", "player", "teamInvite_desc", "teamInvite", {{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "summonPet_desc", "summonPet", {{"Number:<PetNumber>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "setTeamLeader_desc", "setTeamLeader", {{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "resetName_desc", "resetName"}) +table.insert(SearchCommand.commands_list,{"shard", "player", "lockItem_desc", "lockItem", {{"Text:<Inventory>",""}}, {{"Number:<Slot>",""}}, {{"lock=0,1",""}}}) + if(player_priv)then @@ -128,8 +130,8 @@ table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addGuildX table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addPetAnimal_desc", "addPetAnimal", {{"Text:<PetTicket>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addPosFlag_desc", "addPosFlag", {{"Text:<FlagName>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addSkillPoints_desc", "addSkillPoints", {{"<Fight=0>",""},{"<Magic=1>",""},{"<Craft=2>",""},{"<Harvest=3>",""}}, {{"Number:<SkillPoints>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addXPToSkill_desc", "addXPToSkill", {{"<Xp>",""}}, {{"Text:<Skill>",""}}, {{"[Number:<Count>]",""}}}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:", "broadcast_desc", "broadcast", {{"<Xp>",""}}, {{"Text:<Skill>",""}}, {{"[Number:<Count>]",""}}, {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addXPToSkill_desc", "addXPToSkill", {{"<Xp>",""}}, {{"Text:<Skill>",""}}, {{"Number:<Count>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:", "broadcast_desc", "broadcast", {{"<Xp>",""}}, {{"Text:<Skill>",""}}, {{"Number:<Count>",""}}, {{"Text:<Message>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "changeHairCut_desc", "changeHairCut", {{"Text:<Sheet>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "changeMode_desc", "changeMode", {{"Text:<Mode>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "changeVar_desc", "changeVar", {{"Text:<Variable>",""},{"BaseConstitution",""},{"BaseIntelligence",""},{"BaseStrength",""},{"BaseDexterity",""},{"BaseMetabolism",""},{"BaseWisdom",""},{"BaseWellBalanced",""},{"BaseWill",""}}, {{"Number:<Value>",""}}}) @@ -188,6 +190,7 @@ table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setEventF table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "setGMGuild_desc", "setGMGuild"}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setGuildChargePoint_desc", "setGuildChargePoint", {{"Text:<GuildName>",""}},{{"Number:<Points>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setGuildDescription_desc", "setGuildDescription", {{"Text:<GuildName>",""}},{{"Text:<Description>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setGuildLeader_desc", "setGuildLeader", {{"Text:<GuildName>",""}},{{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setGuildMemberGrade_desc", "setGuildMemberGrade", {{"Text:<GuildName>",""}},{{"Text:<PlayerName>",""}},{{"Member",""},{"Officer",""},{"HighOfficer",""},{"Leader",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setItemSapLoad_desc", "setItemSapLoad", {{"<slot index in bag (starts at 0)>",""}}, {{"Float:<Value>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setPosFlag_desc", "setPosFlag", {{"Text:<FlagName>",""}}}) @@ -200,7 +203,6 @@ table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "startEven table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "stopEvent_desc", "stopEvent"}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "stopMonitorMissions_desc", "stopMonitorMissions"}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "summon_desc", "summon", {{"Text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:", "stopEvent_desc", "stopEvent"}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:", "targetInfos_desc", "targetInfos"}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:G:OBSERVER:EM:EG:", "teleport_desc", "teleport", {{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:G:EM:EG:", "tpPosFlag_desc", "tpPosFlag", {{"Text:<FlagName>",""}}}) @@ -212,17 +214,17 @@ table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "allowSummonP table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "displayShopSelector_desc", "displayShopSelector"}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:", "addFactionAttackableToTarget_desc", "addFactionAttackableToTarget"}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:", "forceMissionProgress_desc", "forceMissionProgress"}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "savePlayerActiveChar_desc", "savePlayerActiveChar", {{"[Text:<Filename>]",""}}}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "reloadPlayer_desc", "reloadPlayer", {{"[Number:<CharIndex>]",""}}, {{"[Text:<Filename>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "savePlayerActiveChar_desc", "savePlayerActiveChar", {{"Text:<Filename>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "reloadPlayer_desc", "reloadPlayer", {{"Number:<CharIndex>",""}}, {{"Text:<Filename>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:", "farTPPush_desc", "farTPPush", {{"Number:<DestSessionId>",""}}, {{"[<X> <Y> [<Z> [<Heading>]]]",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:", "farTPReturn_desc", "farTPReturn"}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "characterMissionDump_desc", "characterMissionDump"}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "removeMission_desc", "removeMission", {{"Number:<MissionIdex>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "addMission_desc", "addMission", {{"Number:<MissionGiverAlias>",""}}, {{"Number:<MissionIdex>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "characterInventoryDump_desc", "characterInventoryDump", {{"Text:<Inventory>",""}}, {{"Number:<MinSlot>",""}}, {{"Number:<MaxSlot>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "deleteInventoryItem_desc", "deleteInventoryItem", {{"Text:<Inventory>",""}}, {{"Number:<Slot>",""}}, {{"Text:<SheetName>",""}}, {{"Text:<Quantity>",""}}, {{"Text:<Quality>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setPetAnimalSatiety_desc", "setPetAnimalSatiety", {{"<petIndex in 0..3>",""}}, {{"full|<Value>",""}}, {{"[Text:<NameForAnswer>]",""}}}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "getPetAnimalSatiety_desc", "getPetAnimalSatiety", {{"<petIndex in 0..3>",""}}, {{"[Text:<NameForAnswer>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "deleteInventoryItem_desc", "deleteInventoryItem", {{"Text:<Inventory>",""}}, {{"Number:<Slot>",""}}, {{"Text:<Sheet>",""}}, {{"Text:<Quantity>",""}}, {{"Text:<Quality>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setPetAnimalSatiety_desc", "setPetAnimalSatiety", {{"<petIndex in 0..3>",""}}, {{"full|<Value>",""}}, {{"Text:<NameForAnswer>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "getPetAnimalSatiety_desc", "getPetAnimalSatiety", {{"<petIndex in 0..3>",""}}, {{"Text:<NameForAnswer>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:EG:", "setPetAnimalName_desc", "setPetAnimalName", {{"<petIndex in 0..3>",""}}, {{"Text:<Name>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setSimplePhrase_desc", "setSimplePhrase", {{"Number:<Id>",""}}, {{"Text:<Phrase>",""}}, {{"fr",""},{"en",""},{"de",""},{"es",""},{"ru",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:EG:", "Aggro_desc", "Aggro",{{"[<0/off/false/1/on/true>]",""}}}) @@ -232,17 +234,17 @@ table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "God_desc" table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "Invulnerable_desc", "Invulnerable", {{"[<0/off/false/1/on/true>]",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:EG:", "Invisible_desc", "Invisible", {{"[<0/off/false//1/on/true>]",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:G:", "ShowFactionChannels_desc", "ShowFactionChannels"}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "HP_desc", "HP", {{"[Number:<Hp>]",""}}}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "MaxHP_desc", "MaxHP", {{"[Number:<Hp>]",""}}}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "Money_desc", "Money", {{"[Number:+-<Value>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "HP_desc", "HP", {{"Number:<Hp>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "MaxHP_desc", "MaxHP", {{"Number:<Hp>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "Money_desc", "Money", {{"Number:+-<Value>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "Name_desc", "Name"}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:", "Priv_desc", "Priv", {{"Text:<Privileges>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:", "Priv_desc", "Priv", {{"Text:<Priv>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:EG:", "PriviledgePVP_desc", "PriviledgePVP", {{"[<0/off/false/1/on/pvp/true>]",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:EG:", "FullPVP_desc", "FullPVP", {{"[<0/off/false/1/on/pvp/true>]",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "RyzomDate_desc", "RyzomDate"}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "RyzomTime_desc", "RyzomTime"}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventCreateNpcGroup_desc", "eventCreateNpcGroup",{{"Number:<Bots>",""}},{{"Text:<Sheet>",""}},{{"Number:<DispersionRadius>",""}},{{"<0/1>",""}},{{"random|self|-360..360",""}},{{"Text:<Name>",""}},{{"Number:<PositionX>",""}},{{"Number:<PositionY>",""}},{{"[Number:<PositionZ>]",""},{"[*]",""}},{{"[Text:<Sheet>]",""}},{{"[inVIllage?inOutpost?inStable?inAtys?]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventCreateNpcGroup_desc", "eventCreateNpcGroup",{{"Number:<Bots>",""}},{{"Text:<Sheet>",""}},{{"Number:<DispersionRadius>",""}},{{"<0/1>",""}},{{"random|self|-360..360",""}},{{"Text:<Name>",""}},{{"Number:<PositionX>",""}},{{"Number:<PositionY>",""}},{{"Number:<PositionZ>",""},{"[*]",""}},{{"Text:<Sheet>",""}},{{"[inVIllage?inOutpost?inStable?inAtys?]",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventSetBotName_desc", "eventSetBotName", {{"Text:<Name>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventSetBotScale_desc", "eventSetBotScale", {{"<0...255>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventSetBotFacing_desc", "eventSetBotFacing", {{"<0-360|random>",""}}, {{"[<0,1>]","eventSetBotFacing_group_desc"}}}) @@ -277,9 +279,9 @@ table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setMode table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "aiActionSelf_desc", "aiActionSelf(\"arg1\")", {{"Text:<NameAiaction>",""}}}) table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "aiAction_desc", "aiAction(\"arg1\")", {{"Text:<NameAiaction>",""}}}) table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "emote_desc", "emote(\"arg1\")", {{"Text:<Emote>",""}}}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "vpx(\"VPA:arg1\")", {{"Hex:<Value>",""}}}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "vpx(\"VPB:arg1\")", {{"Hex:<Value>",""}}}) -table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "vpx(\"VPC:arg1\")", {{"Hex:<Value>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "vpx(\"VPA:arg1\")", {{"Hex:<Value>","vpx_a_desc"}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "vpx(\"VPB:arg1\")", {{"Hex:<Value>","vpx_b_desc"}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "vpx(\"VPC:arg1\")", {{"Hex:<Value>","vpx_c_desc"}}}) table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setMaxHP_desc", "setMaxHP(arg1,arg2)", {{"Number:<Hp>",""}}, {{"<0/1>",""}}}) table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "npcSay_desc", "npcSay(\"arg1\", \"arg2\")", {{"Text:<Message>",""}}, {{"<say/shout>",""}}}) table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "ignoreOffensiveActions_desc", "ignoreOffensiveActions(arg1)", {{"<0/1>",""}}}) From 391be955d0b16911db7a73480e5385be7dc7d7ab Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Wed, 17 Jan 2024 12:39:55 +0100 Subject: [PATCH 141/194] Temporary fix for doors crash --- ryzom/client/src/door_manager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ryzom/client/src/door_manager.cpp b/ryzom/client/src/door_manager.cpp index 1b094ad7b9..d4d5d0a7c0 100644 --- a/ryzom/client/src/door_manager.cpp +++ b/ryzom/client/src/door_manager.cpp @@ -218,7 +218,7 @@ void CDoorManager::SDoor::entityCollide(CEntityCL *pE) // *************************************************************************** void CDoorManager::SDoor::checkToClose() { - for (sint i = 0; i < (sint)Entities.size(); ++i) + /*for (sint i = 0; i < (sint)Entities.size(); ++i) { if (EntitiesMoved[i] == 0) // No trigger moved { @@ -238,7 +238,7 @@ void CDoorManager::SDoor::checkToClose() if (Entities.empty()) close(); - else + else*/ open(); } From deca03cfe0b932221510debdab0d0cba55f80fb7 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Wed, 17 Jan 2024 12:40:11 +0100 Subject: [PATCH 142/194] Add checks --- nel/src/3d/u_instance.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/nel/src/3d/u_instance.cpp b/nel/src/3d/u_instance.cpp index cb2a273edb..a8ba37e9f0 100644 --- a/nel/src/3d/u_instance.cpp +++ b/nel/src/3d/u_instance.cpp @@ -42,7 +42,8 @@ namespace NL3D void UInstance::getShapeAABBox(NLMISC::CAABBox &bbox) const { CTransformShape *object = getObjectPtr(); - object->getAABBox(bbox); + if (object) + object->getAABBox(bbox); } // *************************************************************************** @@ -108,7 +109,7 @@ void UInstance::selectTextureSet(uint id) void UInstance::enableAsyncTextureMode(bool enable) { CTransformShape *object = getObjectPtr(); - if(object->isMeshBaseInstance()) + if(object && object->isMeshBaseInstance()) { CMeshBaseInstance *mbi = static_cast<CMeshBaseInstance *>(object); mbi->enableAsyncTextureMode(enable) ; @@ -118,7 +119,7 @@ void UInstance::enableAsyncTextureMode(bool enable) bool UInstance::getAsyncTextureMode() const { CTransformShape *object = getObjectPtr(); - if(object->isMeshBaseInstance()) + if(object && object->isMeshBaseInstance()) { CMeshBaseInstance *mbi = static_cast<CMeshBaseInstance *>(object); return mbi->getAsyncTextureMode() ; @@ -130,7 +131,7 @@ bool UInstance::getAsyncTextureMode() const void UInstance::startAsyncTextureLoading() { CTransformShape *object = getObjectPtr(); - if(object->isMeshBaseInstance()) + if(object && object->isMeshBaseInstance()) { CMeshBaseInstance *mbi = static_cast<CMeshBaseInstance *>(object); mbi->startAsyncTextureLoading(getPos()); @@ -140,7 +141,7 @@ void UInstance::startAsyncTextureLoading() bool UInstance::isAsyncTextureReady() { CTransformShape *object = getObjectPtr(); - if(object->isMeshBaseInstance()) + if(object && object->isMeshBaseInstance()) { CMeshBaseInstance *mbi = static_cast<CMeshBaseInstance *>(object); return mbi->isAsyncTextureReady(); @@ -152,7 +153,7 @@ bool UInstance::isAsyncTextureReady() void UInstance::setAsyncTextureDistance(float dist) { CTransformShape *object = getObjectPtr(); - if(object->isMeshBaseInstance()) + if(object && object->isMeshBaseInstance()) { CMeshBaseInstance *mbi = static_cast<CMeshBaseInstance *>(object); mbi->setAsyncTextureDistance(dist); @@ -162,7 +163,7 @@ void UInstance::setAsyncTextureDistance(float dist) float UInstance::getAsyncTextureDistance() const { CTransformShape *object = getObjectPtr(); - if(object->isMeshBaseInstance()) + if(object && object->isMeshBaseInstance()) { CMeshBaseInstance *mbi = static_cast<CMeshBaseInstance *>(object); return mbi->getAsyncTextureDistance(); @@ -174,7 +175,7 @@ float UInstance::getAsyncTextureDistance() const void UInstance::setAsyncTextureDirty(bool flag) { CTransformShape *object = getObjectPtr(); - if(object->isMeshBaseInstance()) + if(object && object->isMeshBaseInstance()) { CMeshBaseInstance *mbi = static_cast<CMeshBaseInstance *>(object); mbi->setAsyncTextureDirty(flag); @@ -184,7 +185,7 @@ void UInstance::setAsyncTextureDirty(bool flag) bool UInstance::isAsyncTextureDirty() const { CTransformShape *object = getObjectPtr(); - if(object->isMeshBaseInstance()) + if(object && object->isMeshBaseInstance()) { CMeshBaseInstance *mbi = static_cast<CMeshBaseInstance *>(object); return mbi->isAsyncTextureDirty(); From d805c2971fc9444dbeb5ae7f005d631c1b83e7e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= <ulukyn@ryzom.com> Date: Thu, 18 Jan 2024 22:26:47 +0100 Subject: [PATCH 143/194] Fix old syntax --- ryzom/server/www/libs/nel_message.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ryzom/server/www/libs/nel_message.php b/ryzom/server/www/libs/nel_message.php index d8669f1e44..22196af946 100644 --- a/ryzom/server/www/libs/nel_message.php +++ b/ryzom/server/www/libs/nel_message.php @@ -35,7 +35,7 @@ function serialUInt8 (&$val) { if ($this->isReading()) { - $val = ord($this->Buffer{$this->Pos++}); + $val = ord($this->Buffer[$this->Pos++]); debug(sprintf ("read uint8 '%d'<br>\n", $val)); } else @@ -54,10 +54,10 @@ function serialUInt32 (&$val) { if ($this->isReading()) { - $val = ord($this->Buffer{$this->Pos++}); - $val += ord($this->Buffer{$this->Pos++})*256; - $val += ord($this->Buffer{$this->Pos++})*(double)256*256; - $val += ord($this->Buffer{$this->Pos++})*(double)256*256*256; + $val = ord($this->Buffer[$this->Pos++]); + $val += ord($this->Buffer[$this->Pos++])*256; + $val += ord($this->Buffer[$this->Pos++])*(double)256*256; + $val += ord($this->Buffer[$this->Pos++])*(double)256*256*256; debug(sprintf ("read uint32 '%d'<br>\n", $val)); // var_dump($val); } From b59a53b903574de631e12fadecd3181ff05b4835 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Tue, 23 Jan 2024 18:16:13 +0100 Subject: [PATCH 144/194] Changed: add local playernames --- .../gamedev/interfaces_v3/search_command.lua | 62 ++++++++++++++++++- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index 032d5060fa..cfcf148ecd 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -1078,6 +1078,57 @@ function SearchCommand:find_argument(command,uiId) return argument_name end +function SearchCommand:add_player_to_list(online_player_list) + for online = 1, #online_player_list do + --only insert a playername once + if(SearchCommand:find(self.player_list, online_player_list[online]) == nil)then + table.insert(self.player_list, online_player_list[online]) + end + end +end + +function SearchCommand:search_build_local_player_list() + local online_player_list = {} + + --debug("Friends online:") + for i=0,1500 do + local ui = getUI("ui:interface:friend_list_"..tostring(i)) + if ui then + local online = getUI("ui:interface:friend_list_"..tostring(i)..":header_closed:online") + if online.texture == "w_online.tga" then + if(SearchCommand:find(online_player_list, ui.title) == nil)then + table.insert(online_player_list, ui.title) + end + end + end + end + + --debug("Teammembers:") + for i=0,5 do + local ui = getUI("ui:interface:team_list_"..tostring(i)) + if ui then + if(SearchCommand:find(online_player_list, ui.title) == nil)then + table.insert(online_player_list, ui.title) + end + end + end + + --debug("Guildmember online:") + for i=0,1500 do + local ui = getUI("ui:interface:guild:content:tab_guild:list_member:guild_members:ui:interface:guild:content:tab_guild:list_member:guild_members:m"..tostring(i)) + if ui then + local online = getUI("ui:interface:guild:content:tab_guild:list_member:guild_members:ui:interface:guild:content:tab_guild:list_member:guild_members:m"..tostring(i)..":online") + if online.texture == "w_online.tga" then + if(SearchCommand:find(online_player_list, ui.name.hardtext) == nil)then + table.insert(online_player_list, ui.name.hardtext) + end + end + end + end + + --now check and update player_list + SearchCommand:add_player_to_list(online_player_list) +end function SearchCommand:build_command_helper(uiId) --read process_list @@ -1110,11 +1161,16 @@ function SearchCommand:build_command_helper(uiId) if(player_priv)then --load_current_active_player_name webig:openUrlInBg("https://app.ryzom.com/get_playername_online/index.php") - - SearchCommand:search_build_player_list(uiId,self.command_parameter_list[process_status]) else - SearchCommand:search_build_argument_list(uiId,self.command_self) + --read local playername + --friendslist + --guildlist + --teammember + SearchCommand:search_build_local_player_list() end + + SearchCommand:search_build_player_list(uiId,self.command_parameter_list[process_status]) + elseif(string.find(string.lower(argu_name), string.lower("<ScriptCommand>")))then SearchCommand:search_build_command_list(uiId,self.command_parameter_list[process_status],false) else From 8f1ffde46161052bc1fc4114f91475ed1194660d Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Tue, 23 Jan 2024 17:18:59 +0000 Subject: [PATCH 145/194] Chat command autocomplete --- nel/include/nel/gui/group_editbox.h | 1 + nel/src/gui/group_editbox.cpp | 12 +- .../gamedev/interfaces_v3/search_command.lua | 986 ++++++++++++++---- .../data/gamedev/interfaces_v3/widgets.xml | 4 +- .../src/interface_v3/action_handler_edit.cpp | 4 +- .../client/src/interface_v3/lua_ihm_ryzom.cpp | 9 +- 6 files changed, 810 insertions(+), 206 deletions(-) diff --git a/nel/include/nel/gui/group_editbox.h b/nel/include/nel/gui/group_editbox.h index 1f4f316fc9..0ebf704f25 100644 --- a/nel/include/nel/gui/group_editbox.h +++ b/nel/include/nel/gui/group_editbox.h @@ -194,6 +194,7 @@ namespace NLGUI REFLECT_LUA_METHOD("setFocusOnText", luaSetFocusOnText); REFLECT_LUA_METHOD("cancelFocusOnText", luaCancelFocusOnText); REFLECT_STRING("input_string", getInputString, setInputString); + REFLECT_STRING("prompt", getPrompt, setPrompt); #ifdef RYZOM_LUA_UCSTRING REFLECT_UCSTRING("uc_input_string", getInputStringAsUtf16, setInputStringAsUtf16); // Compatibility #endif diff --git a/nel/src/gui/group_editbox.cpp b/nel/src/gui/group_editbox.cpp index 1410e2cb1b..fb0a5a23f3 100644 --- a/nel/src/gui/group_editbox.cpp +++ b/nel/src/gui/group_editbox.cpp @@ -1305,13 +1305,13 @@ namespace NLGUI { makeTopWindow(); // for french, deutsch and russian, be aware of unicode - std::string command = CUtfStringView(_InputString.substr(1)).toUtf8(); - ICommand::expand(command); + //std::string command = CUtfStringView(_InputString.substr(1)).toUtf8(); + //ICommand::expand(command); // then back to u32string - _InputString = CUtfStringView('/' + command).toUtf32(); - _InputString = _InputString; - _CursorPos = (sint32)_InputString.length(); - _CursorAtPreviousLineEnd = false; + //_InputString = CUtfStringView('/' + command).toUtf32(); + //_InputString = _InputString; + //_CursorPos = (sint32)_InputString.length(); + //_CursorAtPreviousLineEnd = false; triggerOnChangeAH(); return true; } diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index 7b1be6fdee..cfcf148ecd 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -7,8 +7,9 @@ if not SearchCommand then valid_commands_list = {}, commands_list = {}, key_tab_down = 0, - modal_open=0, - process_list={} + modal_open_list = {}, + process_list = {}, + player_list = {} } end @@ -18,9 +19,9 @@ SearchCommand.commands_list = {} local player_priv = isPlayerPrivilege() if(player_priv)then - table.insert(SearchCommand.commands_list,{"client", "player", "help_desc", "?", {{"text:<Command>",""}, {"all","help_all_desc"}}, {{"client/shard",""}}}) + table.insert(SearchCommand.commands_list,{"client", "player", "help_desc", "?", {{"Text:<Command>",""}, {"all","help_all_desc"}}, {{"shard",""},{"client",""},{"eScript",""}}}) else - table.insert(SearchCommand.commands_list,{"client", "player", "help_desc", "?", {{"text:<Command>",""}, {"all","help_all_desc"}}}) + table.insert(SearchCommand.commands_list,{"client", "player", "help_desc", "?", {{"Text:<Command>",""}, {"all","help_all_desc"}}}) end --client commands @@ -28,83 +29,276 @@ table.insert(SearchCommand.commands_list,{"client", "player", "time_desc", "time table.insert(SearchCommand.commands_list,{"client", "player", "version_desc", "version"}) table.insert(SearchCommand.commands_list,{"client", "player", "where_desc", "where"}) table.insert(SearchCommand.commands_list,{"client", "player", "playedTime_desc", "playedTime"}) -table.insert(SearchCommand.commands_list,{"client", "player", "who_desc", "who", {{"gm","who_gm_desc"}}, {{"channel","who_channel_desc"}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "guildinvite_desc", "guildinvite",{{"text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "guildmotd_desc", "guildmotd",{{"text:<Message>","guildmotd_message_desc"},{"?","guildmotd_?_desc"}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "league_desc", "league",{{"text:<leaguename>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "leagueinvite_desc", "leagueinvite",{{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "who_desc", "who", {{"gm","who_gm_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guildinvite_desc", "guildinvite",{{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guildmotd_desc", "guildmotd",{{"Text:<Message>",""},{"?","guildmotd_arg1_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "league_desc", "league",{{"Text:<LeagueName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "leagueinvite_desc", "leagueinvite",{{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "leaguequit_desc", "leaguequit"}) -table.insert(SearchCommand.commands_list,{"client", "player", "leaguekick_desc", "leaguekick",{{"text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "afk_desc", "afk",{{"text:<autoresponse>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "leaguekick_desc", "leaguekick",{{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "afk_desc", "afk",{{"Text:<Autoresponse>","afk_autoresponse_desc"}}}) table.insert(SearchCommand.commands_list,{"client", "player", "assist_desc", "assist"}) table.insert(SearchCommand.commands_list,{"client", "player", "assist_desc", "as"}) table.insert(SearchCommand.commands_list,{"client", "player", "self_desc", "self"}) table.insert(SearchCommand.commands_list,{"client", "player", "brutalQuit_desc", "brutalQuit"}) table.insert(SearchCommand.commands_list,{"client", "player", "chatLog_desc", "chatLog"}) table.insert(SearchCommand.commands_list,{"client", "player", "follow_desc", "follow"}) -table.insert(SearchCommand.commands_list,{"client", "player", "ignore_desc", "ignore",{{"text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "invite_desc", "invite",{{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "ignore_desc", "ignore",{{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "invite_desc", "invite",{{"Text:<PlayerName>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "mount_desc", "mount"}) table.insert(SearchCommand.commands_list,{"client", "player", "unmount_desc", "unmount"}) -table.insert(SearchCommand.commands_list,{"client", "player", "random_desc", "random", {{"number:<lowest_number>",""}}, {{"number:<highest_number>",""}}, {{"hide ",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "random_desc", "random", {{"Number:<LowestNumber>",""}}, {{"Number:<HighestNumber>",""}}, {{"hide ","random_hide_desc"}}}) table.insert(SearchCommand.commands_list,{"client", "player", "skiptutorial_desc", "skiptutorial"}) -table.insert(SearchCommand.commands_list,{"client", "player", "sleep_desc", "sleep", {{"number:<number>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "tar_desc", "tar", {{"text:<name>",""}}, {{"|quiet=true","tar_quiet_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "sleep_desc", "sleep", {{"Number:<Secound>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "tar_desc", "tar", {{"Text:<Name>",""}}, {{"|quiet=true","tar_quiet_desc"}}}) table.insert(SearchCommand.commands_list,{"client", "player", "target_quiet_desc", "target_quiet"}) table.insert(SearchCommand.commands_list,{"client", "player", "target_quiet_desc", "tarq"}) -table.insert(SearchCommand.commands_list,{"client", "player", "lmtar_desc", "lmtar", {{"text:<name>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "lmtar_desc", "lmtar", {{"Text:<Name>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "chat_desc", "chat"}) table.insert(SearchCommand.commands_list,{"client", "player", "go_desc", "go"}) -table.insert(SearchCommand.commands_list,{"client", "player", "appzone_desc", "appzone", {{"number:<AppId>","appzone_AppId_desc"},{"hide","appzone_hide_desc"}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "setuiscale_desc", "setuiscale", {{"number:<ScaleFactor>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "createGroup_desc", "createGroup", {{"text:<OutfitGroupName>","createGroup_OutfitGroupName_desc"},{"true","createGroup_true_desc"}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "moveGroup_desc", "moveGroup", {{"text:<OutfitGroupName>",""}},{{"text:<PetAnimal1>",""},{"text:<PlayerName>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "equipGroup_desc", "equipGroup", {{"text:<OutfitGroupName>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "deleteGroup_desc", "deleteGroup", {{"text:<OutfitGroupName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "appzone_desc", "appzone", {{"<AppId>",""},{"hide","appzone_hide_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "setuiscale_desc", "setuiscale", {{"Number:<ScaleFactor>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "createGroup_desc", "createGroup", {{"Text:<OutfitGroupName>",""}},{{"[true]",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "moveGroup_desc", "moveGroup", {{"Text:<OutfitGroupName>",""}},{{"Text:<PetAnimal1>",""},{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "equipGroup_desc", "equipGroup", {{"Text:<OutfitGroupName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "deleteGroup_desc", "deleteGroup", {{"Text:<OutfitGroupName>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "naked_desc", "naked"}) table.insert(SearchCommand.commands_list,{"client", "player", "nude_desc", "nude"}) table.insert(SearchCommand.commands_list,{"client", "player", "listGroup_desc", "listGroup"}) -table.insert(SearchCommand.commands_list,{"client", "player", "say_desc", "say",{{">","s_param1_desc"}}, {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "say_desc", "s",{{">","s_param1_desc"}}, {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "shout", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "sh", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "y", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "yell", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "guild", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "g", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "gu", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "region", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "r", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "re", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "team", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "te", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "party", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "p", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "universe_desc", "universe", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "universe_desc", "u", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "0_desc", "0", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "1_desc", "1", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "2_desc", "2", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "3_desc", "3", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "4_desc", "4", {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "channel_desc", "channel",{{"text:<channelname>",""}}, {{"text:<password>",""},{"*","channel_leave_desc"}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "tell",{{"text:<PlayerName>",""}}, {{"text:<Message>",""}}}) -table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "t",{{"text:<PlayerName>",""}}, {{"text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "say_desc", "say",{{">","s_param1_desc"}}, {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "say_desc", "s",{{">","s_param1_desc"}}, {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "shout", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "sh", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "y", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "shout_desc", "yell", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "guild", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "g", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "guild_desc", "gu", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "region", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "r", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "region_desc", "re", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "team", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "te", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "party", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "team_desc", "p", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "universe_desc", "universe", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "universe_desc", "u", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "0_desc", "0", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "1_desc", "1", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "2_desc", "2", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "3_desc", "3", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "4_desc", "4", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "channel_desc", "channel",{{"Text:<Channelname>",""}}, {{"Text:<Password>","channel_password_desc"},{"*","channel_leave_desc"}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "tell",{{"Text:<PlayerName>",""}}, {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "t",{{"Text:<PlayerName>",""}}, {{"Text:<Message>",""}}}) --END client commands --shard commands -table.insert(SearchCommand.commands_list,{"shard", "player", "a_desc", "a", {{"text:<Command>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", "privs", "b_desc", "b", {{"text:<Command>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", "privs", "c_desc", "c", {{"text:<TargetName>",""}}, {{"text:<Command>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "a_desc", "a", {{"Text:<Command>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "b_desc", "b", {{"Text:<Command>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "c_desc", "c", {{"Text:<TargetName>",""}}, {{"Text:<Command>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "showOnline_desc", "showOnline", {{"1","showOnline_1_desc"}, {"2","showOnline_2_desc"},{"0","showOnline_0_desc"}}}) -table.insert(SearchCommand.commands_list,{"shard", "player", "roomInvite_desc", "roomInvite", {{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "setLeague_desc", "setLeague", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "roomInvite_desc", "roomInvite", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "roomKick_desc", "roomKick", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "dodge_desc", "dodge"}) +table.insert(SearchCommand.commands_list,{"shard", "player", "parry_desc", "parry"}) +table.insert(SearchCommand.commands_list,{"shard", "player", "setPvPTag_desc", "setPvPTag", {{"0",""},{"1",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "clearGuildMessage_desc", "clearGuildMessage"}) +table.insert(SearchCommand.commands_list,{"shard", "player", "setGuildMessage_desc", "setGuildMessage", {{"Text:<Message>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "setDontTranslateLangs_desc", "setDontTranslateLangs", {{"codelang|codelang","setDontTranslateLangs_codelang_desc"}}}) -table.insert(SearchCommand.commands_list,{"shard", "player", "connectLangChannel_desc", "connectLangChannel",{{"fr",""},{"en",""},{"de",""},{"es",""},{"ru",""}}}) -table.insert(SearchCommand.commands_list,{"shard", "privs", "Position_desc", "Position", {{"number:<posx>,<posy>[,<posz>]",""},{"text:<bot name>",""},{"text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "connectLangChannel_desc", "connectLangChannel",{{"fr",""},{"en",""},{"de",""},{"es",""},{"ru",""}},{{"[<0|1>]","connectLangChannel_1_desc"}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "updateTarget_desc", "updateTarget"}) +table.insert(SearchCommand.commands_list,{"shard", "player", "teamInvite_desc", "teamInvite", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "summonPet_desc", "summonPet", {{"Number:<PetNumber>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "setTeamLeader_desc", "setTeamLeader", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", "player", "resetName_desc", "resetName"}) +table.insert(SearchCommand.commands_list,{"shard", "player", "lockItem_desc", "lockItem", {{"Text:<Inventory>",""}}, {{"Number:<Slot>",""}}, {{"lock=0,1",""}}}) + + + +if(player_priv)then + table.insert(SearchCommand.commands_list,{"shard", "player", "connectUserChannel_desc", "connectUserChannel", {{"Text:<Channelname>",""}}, {{"Text:<Password>",""},{"*","channel_leave_desc"},{"***","channel_remove_admin_desc"}}}) +else + table.insert(SearchCommand.commands_list,{"shard", "player", "connectUserChannel_desc", "connectUserChannel", {{"Text:<Channelname>",""}}, {{"Text:<Password>",""},{"*","channel_leave_desc"}}}) +end + +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addGuildMember_desc", "addGuildMember", {{"Text:<GuildName>",""}},{{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addGuildXp_desc", "addGuildXp", {{"Text:<GuildName>",""}},{{"<+-Xp>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addPetAnimal_desc", "addPetAnimal", {{"Text:<PetTicket>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addPosFlag_desc", "addPosFlag", {{"Text:<FlagName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addSkillPoints_desc", "addSkillPoints", {{"<Fight=0>",""},{"<Magic=1>",""},{"<Craft=2>",""},{"<Harvest=3>",""}}, {{"Number:<SkillPoints>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "addXPToSkill_desc", "addXPToSkill", {{"<Xp>",""}}, {{"Text:<Skill>",""}}, {{"Number:<Count>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:", "broadcast_desc", "broadcast", {{"<Xp>",""}}, {{"Text:<Skill>",""}}, {{"Number:<Count>",""}}, {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "changeHairCut_desc", "changeHairCut", {{"Text:<Sheet>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "changeMode_desc", "changeMode", {{"Text:<Mode>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "changeVar_desc", "changeVar", {{"Text:<Variable>",""},{"BaseConstitution",""},{"BaseIntelligence",""},{"BaseStrength",""},{"BaseDexterity",""},{"BaseMetabolism",""},{"BaseWisdom",""},{"BaseWellBalanced",""},{"BaseWill",""}}, {{"Number:<Value>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "checkTargetSP_desc", "checkTargetSP"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "clearEventFaction_desc", "clearEventFaction", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "clearFriendsList_desc", "clearFriendsList"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "clearIgnoreList_desc", "clearIgnoreList"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "clearIsFriendOfList_desc", "clearIsFriendOfList"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "createItemInBag_desc", "createItemInBag", {{"Text:<Sheet>",""}}, {{"Text:<Quantity>",""}}, {{"Text:<Quality>",""}}, {{"[force]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:", "createItemInInv_desc", "createItemInInv", {{"Number:<InventoryID>",""}}, {{"Text:<Sheet>",""}}, {{"Text:<Quantity>",""}}, {{"Text:<Quality>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "createItemInTmpInv_desc", "createItemInTmpInv", {{"Text:<Sheet>",""}}, {{"Text:<Quantity>",""}}, {{"Text:<Quality>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "createNamedItemInBag_desc", "createNamedItemInBag", {{"Text:<ItemName>",""}}, {{"Text:<Quantity>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "createFullArmorSet_desc", "createFullArmorSet", {{"fyros",""},{"matis",""},{"zorai",""},{"tryker",""}}, {{"light",""},{"medium",""},{"heavy",""}}, {{"Text:<Quality>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "delPosFlag_desc", "delPosFlag", {{"Text:<FlagName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:EG:", "dismiss_desc", "dismiss", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "displayForageRM_desc", "displayForageRM", {{"<exactPos=1>",""}}, {{"<extendedInfo=0>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "displayInfosOnTarget_desc", "displayInfosOnTarget"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "execPhrase_desc", "execPhrase", {{"<Cyclic 0/1>",""}}, {{"[<BrickIds>...]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "executeSabrinaPhrase_desc", "executeSabrinaPhrase", {{"<Cyclic 0/1>",""}}, {{"<PhraseId>...",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "failMission_desc", "failMission", {{"Number:<MissionIdex>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "forceTargetToDie_desc", "forceTargetToDie"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "getEventFaction_desc", "getEventFaction", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "giveRespawnPoint_desc", "giveRespawnPoint", {{"Text:<RespawnPointName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:EG:", "ignoreTells_desc", "ignoreTells", {{"<0/false/1/true>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:EG:", "infos_desc", "infos"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:EG:", "killMob_desc", "killMob"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "learnAllBricks_desc", "learnAllBricks"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "learnAllForagePhrases_desc", "learnAllForagePhrases", {{"Number:<Index>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "learnAllPhrases_desc", "learnAllPhrases"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "learnBrick_desc", "learnBrick", {{"Text:<BrickSheet>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "unlearnBrick_desc", "unlearnBrick", {{"Text:<BrickSheet>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "learnPhrase_desc", "learnPhrase", {{"Text:<PhraseSheet>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "listGuildMembers_desc", "listGuildMembers", {{"Text:<GuildName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:G:EM:EG:", "listPosFlags_desc", "listPosFlags", {{"Number:<Radius>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "loadFromXML_desc", "loadFromXML", {{"Text:<Filename>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "loadFromPDR_desc", "loadFromPDR", {{"Text:<Filename>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "logXpGain_desc", "logXpGain", {{"<on/off>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:G:EM:EG:", "listPosFlags_desc", "lPosFlags", {{"Number:<Radius>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "monitorMissions_desc", "monitorMissions", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:", "motd_desc", "motd", {{"Text:<Message>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:", "mute_desc", "mute", {{"Text:<PlayerName>",""}}, {{"Number:<Duration>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:", "muteUniverse_desc", "muteUniverse", {{"Text:<PlayerName>",""}}, {{"Number:<Duration>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "outpostBanGuild_desc", "outpostBanGuild", {{"Number:<OutpostId>",""}}, {{"Text:<GuildName>",""}}, {{"[<all|atk|def>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "outpostBanPlayer_desc", "outpostBanPlayer", {{"Number:<OutpostId>",""}}, {{"Number:<PlayerEID>",""}}, {{"[<all|atk|def>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "outpostUnbanGuild_desc", "outpostUnbanGuild", {{"Number:<OutpostId>",""}}, {{"Text:<GuildName>",""}}, {{"[<all|atk|def>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "outpostUnbanPlayer_desc", "outpostUnbanPlayer", {{"Number:<OutpostId>",""}}, {{"Number:<PlayerEID>",""}}, {{"[<all|atk|def>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "progressMission_desc", "progressMission", {{"Number:<MissionIdex>",""}}, {{"[repeat]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "renameGuild_desc", "renameGuild", {{"Text:<GuildName>",""}},{{"Text:<NewGuildName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "renamePlayer_desc", "renamePlayer", {{"Text:<PlayerName>",""}},{{"Text:<NewPlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:EG:", "renamePlayerForEvent_desc", "renamePlayerForEvent", {{"Text:<PlayerName>",""}},{{"Text:<NewPlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "resetPowerFlags_desc", "resetPowerFlags"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:", "root_desc", "root", {{"Text:<PlayerName>",""}}, {{"Number:<Duration>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "saveToPDR_desc", "saveToPDR", {{"Text:<Filename>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "saveToXML_desc", "saveToXML", {{"Text:<Filename>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setEventFaction_desc", "setEventFaction", {{"Text:<PlayerName>",""}}, {{"Text:<EventFaction>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "setGMGuild_desc", "setGMGuild"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setGuildChargePoint_desc", "setGuildChargePoint", {{"Text:<GuildName>",""}},{{"Number:<Points>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setGuildDescription_desc", "setGuildDescription", {{"Text:<GuildName>",""}},{{"Text:<Description>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setGuildLeader_desc", "setGuildLeader", {{"Text:<GuildName>",""}},{{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setGuildMemberGrade_desc", "setGuildMemberGrade", {{"Text:<GuildName>",""}},{{"Text:<PlayerName>",""}},{{"Member",""},{"Officer",""},{"HighOfficer",""},{"Leader",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setItemSapLoad_desc", "setItemSapLoad", {{"<slot index in bag (starts at 0)>",""}}, {{"Float:<Value>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setPosFlag_desc", "setPosFlag", {{"Text:<FlagName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setFamePlayer_desc", "setFamePlayer", {{"Text:<Faction>",""}}, {{"Number:<Fame>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "resetPVPTimers_desc", "resetPVPTimers", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setSkillsToMaxValue_desc", "setSkillsToMaxValue"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:G:EM:EG:", "showCSR_desc", "showCSR"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "showFBT_desc", "showFBT"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "startEvent_desc", "startEvent", {{"Text:<EventName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "stopEvent_desc", "stopEvent"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "stopMonitorMissions_desc", "stopMonitorMissions"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "summon_desc", "summon", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:", "targetInfos_desc", "targetInfos"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:G:OBSERVER:EM:EG:", "teleport_desc", "teleport", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:G:EM:EG:", "tpPosFlag_desc", "tpPosFlag", {{"Text:<FlagName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:", "unmute_desc", "unmute", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:", "unmuteUniverse_desc", "unmuteUniverse", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:", "unroot_desc", "unroot", {{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "updateGuildMembersList_desc", "updateGuildMembersList", {{"Text:<GuildName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "allowSummonPet_desc", "allowSummonPet", {{"Number:<PetNumber>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "displayShopSelector_desc", "displayShopSelector"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:", "addFactionAttackableToTarget_desc", "addFactionAttackableToTarget"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:", "forceMissionProgress_desc", "forceMissionProgress"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "savePlayerActiveChar_desc", "savePlayerActiveChar", {{"Text:<Filename>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:", "reloadPlayer_desc", "reloadPlayer", {{"Number:<CharIndex>",""}}, {{"Text:<Filename>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:", "farTPPush_desc", "farTPPush", {{"Number:<DestSessionId>",""}}, {{"[<X> <Y> [<Z> [<Heading>]]]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:", "farTPReturn_desc", "farTPReturn"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "characterMissionDump_desc", "characterMissionDump"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "removeMission_desc", "removeMission", {{"Number:<MissionIdex>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:", "addMission_desc", "addMission", {{"Number:<MissionGiverAlias>",""}}, {{"Number:<MissionIdex>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "characterInventoryDump_desc", "characterInventoryDump", {{"Text:<Inventory>",""}}, {{"Number:<MinSlot>",""}}, {{"Number:<MaxSlot>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "deleteInventoryItem_desc", "deleteInventoryItem", {{"Text:<Inventory>",""}}, {{"Number:<Slot>",""}}, {{"Text:<Sheet>",""}}, {{"Text:<Quantity>",""}}, {{"Text:<Quality>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setPetAnimalSatiety_desc", "setPetAnimalSatiety", {{"<petIndex in 0..3>",""}}, {{"full|<Value>",""}}, {{"Text:<NameForAnswer>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "getPetAnimalSatiety_desc", "getPetAnimalSatiety", {{"<petIndex in 0..3>",""}}, {{"Text:<NameForAnswer>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:EG:", "setPetAnimalName_desc", "setPetAnimalName", {{"<petIndex in 0..3>",""}}, {{"Text:<Name>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "setSimplePhrase_desc", "setSimplePhrase", {{"Number:<Id>",""}}, {{"Text:<Phrase>",""}}, {{"fr",""},{"en",""},{"de",""},{"es",""},{"ru",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:EG:", "Aggro_desc", "Aggro",{{"[<0/off/false/1/on/true>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "CreateCharacterStartSkillsValue_desc", "CreateCharacterStartSkillsValue"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:EM:", "FBT_desc", "FBT", {{"[<0/off/false/1/on/true>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "God_desc", "God", {{"[<0/off/false/1/on/true>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "Invulnerable_desc", "Invulnerable", {{"[<0/off/false/1/on/true>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:SG:EM:EG:", "Invisible_desc", "Invisible", {{"[<0/off/false//1/on/true>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:VG:SG:G:", "ShowFactionChannels_desc", "ShowFactionChannels"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "HP_desc", "HP", {{"Number:<Hp>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "MaxHP_desc", "MaxHP", {{"Number:<Hp>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "Money_desc", "Money", {{"Number:+-<Value>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "Name_desc", "Name"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:", "Priv_desc", "Priv", {{"Text:<Priv>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:EG:", "PriviledgePVP_desc", "PriviledgePVP", {{"[<0/off/false/1/on/pvp/true>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:EG:", "FullPVP_desc", "FullPVP", {{"[<0/off/false/1/on/pvp/true>]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "RyzomDate_desc", "RyzomDate"}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "RyzomTime_desc", "RyzomTime"}) + +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventCreateNpcGroup_desc", "eventCreateNpcGroup",{{"Number:<Bots>",""}},{{"Text:<Sheet>",""}},{{"Number:<DispersionRadius>",""}},{{"<0/1>",""}},{{"random|self|-360..360",""}},{{"Text:<Name>",""}},{{"Number:<PositionX>",""}},{{"Number:<PositionY>",""}},{{"Number:<PositionZ>",""},{"[*]",""}},{{"Text:<Sheet>",""}},{{"[inVIllage?inOutpost?inStable?inAtys?]",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventSetBotName_desc", "eventSetBotName", {{"Text:<Name>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventSetBotScale_desc", "eventSetBotScale", {{"<0...255>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventSetBotFacing_desc", "eventSetBotFacing", {{"<0-360|random>",""}}, {{"[<0,1>]","eventSetBotFacing_group_desc"}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eventNpcSay_desc", "eventNpcSay", {{"Text:<Message>",""}}, {{"[say,shout,...]",""}}}) + +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:", "Position_desc", "Position", {{"<PositionX>,<PositionY>[,<PositionZ>]",""},{"Text:<BotName>",""},{"Text:<PlayerName>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:EM:", "eScript_desc", "eScript", {{"Text:<ContinentName>@",""},{"Text:<EventNpcGroup>",""}}, {{"Text:<ScriptCommand>",""}}}) --END shard commands +--eScript commands +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "despawn_desc", "despawn(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "rename_desc", "rename(\"arg1$#arg2$\")", {{"Text:wk[<Name>]",""}},{{"Text:wk[<Title>]",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAggro_desc", "setAggro(arg1)", {{"Number:<Range>",""}}, {{"Number:<Ticks>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setPlayerAttackable_desc", "setPlayerAttackable(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setBotAttackable_desc", "setBotAttackable(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAttackable_desc", "setAttackable(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setActivity_desc", "setActivity(\"arg1\")", {{"<no_change/escorted/guard/guard_escorted/normal/faction/faction_no_assist/bandit>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setFactionProp_desc", "setFactionProp(\"arg1\",\"arg2|arg3\")", {{"<faction/ennemyFaction/friendFaction/player/predator/outpost:<id>:<side>>",""}}, {{"Text:<FameName>FameMin",""}}, {{"Text:<FameName>FameMax",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addProfileParameter_desc", "addProfileParameter(\"arg1\",\"arg2\")", {{"event_group_killed",""},{"event_bot_killed",""},{"running",""},{"faction",""}},{{"Text:<Url>",""},{"Text:<Factionname>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "removeProfileParameter_desc", "removeProfileParameter(\"arg1\")",{{"Text:<Parameter>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "clearAggroList_desc", "clearAggroList()"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "startMoving_desc", "startMoving(arg1,arg2,arg3)", {{"Number:<PositionX>",""}}, {{"Number:<PositionY>",""}}, {{"Number:<Radius>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "stopMoving_desc", "stopMoving()"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "startWander_desc", "startWander(arg1)", {{"Number:<Meter>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setAutoSpawn_desc", "setAutoSpawn(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setDespawnTime_desc", "setDespawnTime(arg1)", {{"Number:<Ticks>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setRespawnTime_desc", "setDespawnTime(arg1)", {{"Number:<Ticks>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "standUp_desc", "standUp()"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "sitDown_desc", "sitDown()"}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setZoneState_desc", "setZoneState(\"arg1\",arg2)", {{"Text:<ZoneName>",""}}, {{"<0.0/1.0>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setMode_desc", "setMode(\"arg1\")", {{"<Normal/Sit/Eat/Rest/Alert/Hungry/Death>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "aiActionSelf_desc", "aiActionSelf(\"arg1\")", {{"Text:<NameAiaction>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "aiAction_desc", "aiAction(\"arg1\")", {{"Text:<NameAiaction>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "emote_desc", "emote(\"arg1\")", {{"Text:<Emote>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "vpx(\"VPA:arg1\")", {{"Hex:<Value>","vpx_a_desc"}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "vpx(\"VPB:arg1\")", {{"Hex:<Value>","vpx_b_desc"}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "vpx_desc", "vpx(\"VPC:arg1\")", {{"Hex:<Value>","vpx_c_desc"}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setMaxHP_desc", "setMaxHP(arg1,arg2)", {{"Number:<Hp>",""}}, {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "npcSay_desc", "npcSay(\"arg1\", \"arg2\")", {{"Text:<Message>",""}}, {{"<say/shout>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "ignoreOffensiveActions_desc", "ignoreOffensiveActions(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "maxHitRange_desc", "maxHitRange(arg1)", {{"Number:<Meter>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "addHP_desc", "addHP(arg1)", {{"Number:<Hp>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setClientSheet_desc", "setClientSheet(\"arg1\")", {{"Text:<Sheet>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setSheet_desc", "setSheet(\"arg1\")", {{"Text:<Sheet>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setUrl_desc", "setUrl(\"arg1\", \"arg2\")", {{"Text:<MENU_NAME>",""}}, {{"Text:<Url>",""},{"*",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "facing_desc", "facing(arg1)", {{"<3.14/-3.14>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setCanAggro_desc", "setCanAggro(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setHealer_desc", "setHealer(arg1)", {{"<0/1>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setHPScale_desc", "setHPScale(arg1)", {{"<0.0/..0.5../1.0>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "followPlayer_desc", "followPlayer(arg1,arg2)", {{"Number:<PlayerEID>",""}}, {{"Number:<Meter>",""}}}) +table.insert(SearchCommand.commands_list,{"eScript", ":DEV:SGM:GM:EM:", "setFactionAttackableBelow_desc", "setFactionAttackableBelow(\"arg1\",arg2,arg3)", {{"Text:<TribeName>",""}}, {{"<0/1>",""}}, {{"<6000 points per 1 fame>",""}}}) + +--END eScript commands + function SearchCommand:find(tbl, value) for k, v in pairs(tbl) do if v == value then @@ -114,15 +308,98 @@ function SearchCommand:find(tbl, value) return nil end -function SearchCommand:help_show_all(parameter) +function SearchCommand:check_prvis(command_privs) local player_priv = isPlayerPrivilege() + local command_allowed = "false" + local prvis = getPlayerPrivs() + + if(command_privs == "player" or command_privs == "")then + return "false" + else + if(player_priv)then + local prvis = getPlayerPrivs() + --debug("Priv: "..prvis) + if(prvis ~= nil)then + for prvissubstring in prvis:gmatch("[^: ]+") do + for substring in command_privs:gmatch("[^: ]+") do + if(substring == prvissubstring)then + command_allowed = "true" + end + end + end + else + command_allowed = "false" + end + return command_allowed + else + return "false" + end + end +end + +function SearchCommand:htmlentities(text) + local html_help_content="" + + html_help_content = text:gsub("<", "<") + + return html_help_content +end + +function SearchCommand:pars_command_parameter(command_parameter) + local finish_translation_text = "" + + --debug("param: "..command_parameter) + + if(string.find(string.lower(command_parameter), ":") ~= nil and string.find(string.lower(command_parameter), ":") < 20)then + --split text to commands + for substring in string.gmatch(command_parameter, "([^:]+)") do + --debug(substring) + if(string.find(string.lower(substring), "<"))then + --debug(substring:match("<(.*)>")) + finish_translation_text=finish_translation_text.."<"..substring:gsub("<(.-)>", i18n.get("uiSearchCommand"..substring:match("<(.*)>")):toUtf8())..">" + else + finish_translation_text=finish_translation_text..""..i18n.get("uiSearchCommand"..substring):toUtf8()..":" + end + end + else + finish_translation_text = command_parameter + end + + --debug("trans: "..finish_translation_text) + + return finish_translation_text +end + + +function SearchCommand:pars_help_on_window(content_of_window,height) + local whm = getUI("ui:interface:web_transactions") + local whm_html = getUI("ui:interface:web_transactions:content:html") + + local html_help_content="" + html_help_content=[[<table width="100%" border="0"><tr><td>]]..content_of_window..[[</td></tr></table>]] + + whm.title = i18n.get("uiSearchCommandHelp"):toUtf8() + whm.active = true + whm.w = 750 + whm.h = height + whm_html:renderHtml(html_help_content) +end + +function SearchCommand:help_show_all(parameter) + local count = 0 + local build_content = "" - debug("help parameter: "..parameter) + --debug("help parameter: "..parameter) + build_content=build_content.."<table width='100%' border=0>" + + if(parameter ~= "eScript" and parameter ~= "client" and parameter ~= "shard" and parameter ~= "all")then + parameter = "all" + end if(parameter == "all")then - displaySystemInfo(ucstring("######################## command help all #######################"), "AROUND") + build_content=build_content.."<tr><td colspan=4>######################## "..i18n.get("uiSearchCommandHelp"):toUtf8().." "..i18n.get("uiSearchCommandAll"):toUtf8().." #######################</td></tr>" else - displaySystemInfo(ucstring("######################## command help all / filter '"..parameter.."' #######################"), "AROUND") + build_content=build_content.."<tr><td colspan=4>######################## "..i18n.get("uiSearchCommandHelp"):toUtf8().." "..i18n.get("uiSearchCommandAll"):toUtf8().." / "..i18n.get("uiSearchCommandFilter"):toUtf8().." '"..SearchCommand:htmlentities(parameter).."' #######################</td></tr>" end for c = 1, #self.commands_list do @@ -130,7 +407,7 @@ function SearchCommand:help_show_all(parameter) if(self.commands_list[c][2] == "player")then command_are_allowed = 1 else - if(player_priv)then + if(SearchCommand:check_prvis(self.commands_list[c][2]) == "true")then command_are_allowed = 1 end end @@ -138,46 +415,67 @@ function SearchCommand:help_show_all(parameter) if(command_are_allowed == 1)then if(self.commands_list[c][1] == parameter or parameter == "all")then local arg_display="" - displaySystemInfo(ucstring(""), "AROUND") + build_content=build_content.."<tr><td><table width='100%' border=0>" + build_content=build_content.."<tr><td colspan=3> </td></tr>" max_arguments = #self.commands_list[c] - 4 - for ad = 1, max_arguments do - if(ad > 1)then - arg_display=arg_display.." [arg"..ad.."]" - else - arg_display="[arg"..ad.."]" + + if(self.commands_list[c][1] ~= "eScript")then + for ad = 1, max_arguments do + if(ad > 1)then + arg_display=arg_display.." [arg"..ad.."]" + else + arg_display="[arg"..ad.."]" + end end + else + arg_display = "" end - displaySystemInfo(ucstring(c..". "..self.commands_list[c][4].." "..arg_display.." '"..self.commands_list[c][3].."'"), "AROUND") - displaySystemInfo(ucstring(" type: "..self.commands_list[c][1]), "AROUND") + count=count+1 + + build_content=build_content.."<tr><td width='10px'>"..count..".</td><td colspan=3>"..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.."</td></tr>" + build_content=build_content.."<tr><td> </td><td>"..i18n.get("uiR2EDScenarioDescription"):toUtf8()..": '"..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][3]))).."'</td></tr>" + build_content=build_content.."<tr><td> </td><td>"..i18n.get("uiFrontSelectionType"):toUtf8()..": "..SearchCommand:htmlentities(self.commands_list[c][1]).."</td></tr>" + build_content=build_content.."<tr><td> </td><td>"..i18n.get("uiSearchCommandPriv"):toUtf8()..": "..SearchCommand:htmlentities(self.commands_list[c][2]).."</td></tr>" for ac = 1, max_arguments do - displaySystemInfo(ucstring(" arg"..ac.." :"), "AROUND") + build_content=build_content.."<tr><td> </td><td>arg"..ac.." :</td></tr>" for pc = 1, #self.commands_list[c][4+ac] do + + local translation_parm = SearchCommand:pars_command_parameter(self.commands_list[c][4+ac][pc][1]) + if(self.commands_list[c][4+ac][pc][2] == "")then - displaySystemInfo(ucstring(" "..self.commands_list[c][4+ac][pc][1]), "AROUND") + build_content=build_content.."<tr><td> </td><td>         "..SearchCommand:htmlentities(translation_parm).."</td></tr>" else - displaySystemInfo(ucstring(" "..self.commands_list[c][4+ac][pc][1].." '"..self.commands_list[c][4+ac][pc][2].."'"), "AROUND") + build_content=build_content.."<tr><td> </td><td>         "..SearchCommand:htmlentities(translation_parm).." '"..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][4+ac][pc][2]))).."'</td></tr>" end end end if(self.commands_list[c][4] ~= "a" and self.commands_list[c][4] ~= "b" and self.commands_list[c][4] ~= "c")then if(self.commands_list[c][1] == "shard")then - displaySystemInfo(ucstring(" example: /a "..self.commands_list[c][4].." , /c riasan "..self.commands_list[c][4]), "AROUND") + if(SearchCommand:check_prvis(self.commands_list[c][2]) == "true")then + build_content=build_content.."<tr><td> </td><td colspan=3>example: /a "..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.." | /c riasan "..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.."</td></tr>" + else + build_content=build_content.."<tr><td> </td><td colspan=3>example: /a "..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.."</td></tr>" + end + end end end + build_content=build_content.."</table></td></tr>" end end - displaySystemInfo(ucstring(""), "AROUND") - displaySystemInfo(ucstring("############################ end ##########################"), "AROUND") + build_content=build_content.."<tr><td colspan=3> </td></tr>" + build_content=build_content.."<tr><td colspan=3>################################################################################</td></tr>" + build_content=build_content.."</table>" + SearchCommand:pars_help_on_window(build_content, 600) end function SearchCommand:help(uiId,input) --debug("search_input: "..input) - + local build_content = "" local command_split = {} if(input ~= "all")then @@ -196,72 +494,120 @@ function SearchCommand:help(uiId,input) SearchCommand:help_show_all(command_split[2]) end else + build_content=build_content.."<table width='100%' border=0>" --show help for command input local command_found = 0 for c = 1, #self.commands_list do local command_are_allowed = 0 if(self.commands_list[c][4] == command_split[1])then command_found = 1 - displaySystemInfo(ucstring("######################## command help "..command_split[1].." #######################"), "AROUND") + build_content=build_content.."<tr><td colspan=3>######################## "..i18n.get("uiSearchCommandHelp"):toUtf8().." '"..command_split[1].."' #######################</td></tr>" - local player_priv = isPlayerPrivilege() if(self.commands_list[c][2] == "player")then command_are_allowed = 1 else - if(player_priv)then + if(SearchCommand:check_prvis(self.commands_list[c][2]) == "true")then command_are_allowed = 1 end end if(command_are_allowed == 1)then local arg_display="" - displaySystemInfo(ucstring(""), "AROUND") + build_content=build_content.."<tr><td> </td></tr>" + build_content=build_content.."<tr><td><table width='100%' border=0>" max_arguments = #self.commands_list[c] - 4 - for ad = 1, max_arguments do - if(ad > 1)then - arg_display=arg_display.." [arg"..ad.."]" - else - arg_display="[arg"..ad.."]" + + if(self.commands_list[c][1] ~= "eScript")then + for ad = 1, max_arguments do + if(ad > 1)then + arg_display=arg_display.." [arg"..ad.."]" + else + arg_display="[arg"..ad.."]" + end end + else + arg_display = "" end - displaySystemInfo(ucstring("desc: "..self.commands_list[c][3]), "AROUND") - displaySystemInfo(ucstring("type: "..self.commands_list[c][1]), "AROUND") - displaySystemInfo(ucstring(""), "AROUND") - displaySystemInfo(ucstring(self.commands_list[c][4].." "..arg_display), "AROUND") + + build_content=build_content.."<tr><td>"..i18n.get("uiR2EDScenarioDescription"):toUtf8()..": "..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][3]))).."</td></tr>" + build_content=build_content.."<tr><td>"..i18n.get("uiFrontSelectionType"):toUtf8()..": "..SearchCommand:htmlentities(self.commands_list[c][1]).."</td></tr>" + build_content=build_content.."<tr><td>"..i18n.get("uiSearchCommandPriv"):toUtf8()..": "..SearchCommand:htmlentities(self.commands_list[c][2]).."</td></tr>" + build_content=build_content.."<tr><td> </td></tr>" + build_content=build_content.."<tr><td>"..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.."</td></tr>" for ac = 1, max_arguments do - displaySystemInfo(ucstring(" arg"..ac.." :"), "AROUND") + build_content=build_content.."<tr><td> arg"..ac.." :</td></tr>" for pc = 1, #self.commands_list[c][4+ac] do + + local translation_parm = SearchCommand:pars_command_parameter(self.commands_list[c][4+ac][pc][1]) + if(self.commands_list[c][4+ac][pc][2] == "")then - displaySystemInfo(ucstring(" "..self.commands_list[c][4+ac][pc][1]), "AROUND") + build_content=build_content.."<tr><td>         "..SearchCommand:htmlentities(tostring(translation_parm)).."</td></tr>" else - displaySystemInfo(ucstring(" "..self.commands_list[c][4+ac][pc][1].." '"..self.commands_list[c][4+ac][pc][2].."'"), "AROUND") + build_content=build_content.."<tr><td>         "..SearchCommand:htmlentities(tostring(translation_parm)).." '"..SearchCommand:htmlentities(tostring(i18n.get(self.commands_list[c][4+ac][pc][2]))).."'</td></tr>" end end end if(self.commands_list[c][4] ~= "a" and self.commands_list[c][4] ~= "b" and self.commands_list[c][4] ~= "c")then if(self.commands_list[c][1] == "shard")then - displaySystemInfo(ucstring(" example: /a "..self.commands_list[c][4].." , /c riasan "..self.commands_list[c][4]), "AROUND") + build_content=build_content.."<tr><td>example: /a "..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.." | /c riasan "..SearchCommand:htmlentities(self.commands_list[c][4]).." "..arg_display.."</td></tr>" end end - displaySystemInfo(ucstring(""), "AROUND") - displaySystemInfo(ucstring("############################ end ############################"), "AROUND") end + build_content=build_content.."</table></td></tr>" end end + + build_content=build_content.."<tr><td colspan=3> </td></tr>" + build_content=build_content.."<tr><td colspan=3>######################################################################</td></tr>" + if(command_found == 0)then - displaySystemInfo(ucstring("Command not found"), "AROUND") + displaySystemInfo(ucstring(command_split[1].." : "..i18n.get("uiCommandNotExists"):toUtf8()), "SYS") + else + --debug("pars_help") + SearchCommand:pars_help_on_window(build_content, 350) end end end function SearchCommand:check_autocomplet(uiId) - --debug("try_autocomplte") - if(self.modal_open==1)then - if next(self.valid_commands_list)then - --debug("check_autocomplet"..self.valid_commands_list[1]) - SearchCommand:finish_commands(self.valid_commands_list[1],uiId) + local modal_open_list = SearchCommand:read_modal_open_list(uiId) + local menu = getUI("ui:interface:search_command_add_menu") + + if (menu.active) then + --debug("try_autocomplte: "..uiId.." modal_open_list: "..modal_open_list) + if(modal_open_list == 1)then + if next(self.valid_commands_list)then + --debug("check_autocomplet"..self.valid_commands_list[1]) + SearchCommand:finish_commands(self.valid_commands_list[1],uiId) + end + end + end +end + +function SearchCommand:check_autocomplet_number(uiId) + local modal_open_list = SearchCommand:read_modal_open_list(uiId) + local menu = getUI("ui:interface:search_command_add_menu") + local text_from_input = getUI(uiId) + local input_text = text_from_input.input_string + + max_string_count = string.len(input_text) + + local get_last_char_from_input = tonumber(string.sub(input_text, (max_string_count), -1)) + if(type(get_last_char_from_input) == "number")then + --debug("last_input_is_a_Number: "..get_last_char_from_input) + + if(get_last_char_from_input <= #self.valid_commands_list)then + if (menu.active) then + --debug("try_autocomplte: "..uiId.." modal_open_list: "..modal_open_list) + if(modal_open_list == 1)then + if next(self.valid_commands_list)then + --debug("check_autocomplet"..self.valid_commands_list[get_last_char_from_input]) + SearchCommand:finish_commands(self.valid_commands_list[get_last_char_from_input],uiId) + end + end + end end end end @@ -276,21 +622,48 @@ function SearchCommand:key_trigger(uiId) removeOnDbChange(timer_function_on_ui_window,"@UI:VARIABLES:CURRENT_SERVER_TICK") end - is_tab_down = isTabDown() - if(key_tab_down == 1)then - key_tab_down = 0 - SearchCommand:check_autocomplet(uiId) - elseif(is_tab_down)then - key_tab_down = 0 - SearchCommand:check_autocomplet(uiId) - end - --check is input are empty if yes cancel all stuff local text_from_input = getUI(uiId) if(text_from_input.input_string == "")then SearchCommand:search(uiId) end +end + +function SearchCommand:update_modal_open_list(uiId,p_status) + local found_modal_open=0 + + --check if we already have a process status for this window + if next(self.modal_open_list)then + for pc = 1, #self.modal_open_list do + if(self.modal_open_list[pc][1] == uiId)then + found_modal_open=1 + end + end + end + if(found_modal_open == 0)then + table.insert(self.modal_open_list,{uiId, p_status}) + else + if next(self.modal_open_list)then + for mc = 1, #self.modal_open_list do + if(self.modal_open_list[mc][1] == uiId)then + self.modal_open_list[mc][2]=p_status + end + end + end + end +end + +function SearchCommand:read_modal_open_list(uiId) + local found_modal_open = 0 + if next(self.process_list)then + for mc = 1, #self.modal_open_list do + if(self.modal_open_list[mc][1] == uiId)then + found_modal_open=self.modal_open_list[mc][2] + end + end + end + return found_modal_open end function SearchCommand:update_process_list(uiId,p_status) @@ -331,15 +704,19 @@ function SearchCommand:read_process_status(uiId) end function SearchCommand:search(uiId) + --debug("now_onchange "..uiId) is_tab_down = isTabDown() if(is_tab_down)then - key_tab_down = 1 + --debug("key_tab_down") + SearchCommand:check_autocomplet(uiId) end --trigger command by onchange a singel input - self.command_parameter_list = {} + SearchCommand:check_autocomplet_number(uiId) + local text_from_input = getUI(uiId) - command_identifier = string.sub(text_from_input.input_string, 0, 1) + local input_text = text_from_input.input_string + command_identifier = string.sub(input_text, 0, 1) --check if first char are a "/" from text_from_input if(command_identifier == "/")then @@ -353,19 +730,28 @@ function SearchCommand:search(uiId) addOnDbChange(timer_function_on_ui_window, timer_str, "SearchCommand:key_trigger('"..uiId.."')") end - - - max_string_count = string.len(text_from_input.input_string) + --reset command_parameter_list for fresh input + self.command_parameter_list = {} + --END reset command_parameter_list for fresh input if(max_string_count == 1)then self.command_self="" - SearchCommand:write_command_help(uiId,"/<command> or /? all") - SearchCommand:close_modal() + SearchCommand:write_command_help(uiId,i18n.get("uiSearchCommandInitDialog"):toUtf8()) + SearchCommand:close_modal(uiId) --update process_status SearchCommand:update_process_list(uiId,0) else - local command_first = string.sub(text_from_input.input_string, 2, (max_string_count)) + SearchCommand:close_modal(uiId) + + --if we found 2 space cancel all action + if(string.find(string.lower(input_text), " "))then + --debug("found_two_spaces") + SearchCommand:write_command_help_clear(uiId) + return 0 + end + + local command_first = string.sub(input_text, 2, (max_string_count)) --split text to commands for substring in command_first:gmatch("%S+") do table.insert(self.command_parameter_list, substring) @@ -396,40 +782,70 @@ function SearchCommand:search(uiId) end end -function SearchCommand:build_valid_command_list(command_input) +function SearchCommand:get_command_type(command) + local command_type = "" + + for c = 1, #self.commands_list do + if(self.commands_list[c][4] == command) then + command_type = self.commands_list[c][1] + end + end + + return command_type +end + +function SearchCommand:build_valid_command_list(command_input,uiId) self.valid_commands_list = {} - local player_priv = isPlayerPrivilege() local count_found=0 local found_command=0 for c = 1, #self.commands_list do local command_are_allowed = 0 - if(self.commands_list[c][2] == "player")then - command_are_allowed = 1 - else - if(player_priv)then - command_are_allowed = 1 - end - end + local command_display = 0 --check if we want used a client or shared command if(self.command_self == "a" or self.command_self == "b" or self.command_self == "c")then - if(self.commands_list[c][1] == "shard")then - command_are_allowed = 1 + --debug(self.commands_list[c][1]) + if(self.commands_list[c][1] == "shard" and self.command_parameter_list[2] ~= "eScript")then + command_display = 1 + elseif(self.commands_list[c][1] == "eScript")then + if(self.command_parameter_list[2] == "eScript")then + command_display = 1 + else + command_display = 0 + end else - command_are_allowed = 0 + command_display = 0 end else if(self.commands_list[c][1] == "shard")then if(self.command_self == "?")then - command_are_allowed = 1 + command_display = 1 else - command_are_allowed = 0 + command_display = 0 end + elseif(self.commands_list[c][1] == "eScript")then + if(self.command_self == "?")then + command_display = 1 + else + command_display = 0 + end + else + command_display = 1 end end - if(command_are_allowed == 1)then + if(self.commands_list[c][2] == "player")then + command_are_allowed = 1 + else + if(SearchCommand:check_prvis(self.commands_list[c][2]) == "true")then + command_are_allowed = 1 + end + end + + --debug("command_are_allowed: "..command_are_allowed.." command_display: "..command_display) + + if(command_are_allowed == 1 and command_display == 1)then if(command_input ~= "")then if(string.lower(self.commands_list[c][4]) == string.lower(command_input))then found_command=c @@ -446,53 +862,36 @@ function SearchCommand:build_valid_command_list(command_input) if(count_found == 0)then --debug("no_command_found_close_modal") - SearchCommand:close_modal() + SearchCommand:close_modal(uiId) end return found_command end -function SearchCommand:build_valid_player_list(playername_input) - player_list = {} - player_list[1] = "rias" - player_list[2] = "uluk" - player_list[3] = "riasan" - player_list[4] = "Limay" - player_list[5] = "Neira" - player_list[6] = "Beastie" - player_list[7] = "Audeva" - player_list[8] = "Decacaon" - player_list[9] = "Livege" - player_list[10] = "Purg" - player_list[11] = "Xxramusxx" - player_list[12] = "Kronoss" - player_list[13] = "Livan" - player_list[14] = "Mifisto" - player_list[15] = "Progulschik" - player_list[16] = "Darwyn" - player_list[17] = "Aprak" - player_list[18] = "Dorothee" - player_list[19] = "Zillah" - +function SearchCommand:build_valid_player_list(playername_input,uiId) self.valid_commands_list = {} local count_found=0 local found_playername=0 - - for c = 1, #player_list do - if(playername_input ~= "")then - if(string.lower(player_list[c]) == string.lower(playername_input))then - found_playername=c - count_found=1 - else - if string.find(string.lower(player_list[c]), string.lower(playername_input))then - table.insert(self.valid_commands_list,player_list[c]) - count_found=count_found+1 + + if(self.player_list ~= nil)then + for c = 1, #self.player_list do + if(playername_input ~= "")then + if(string.lower(self.player_list[c]) == string.lower(playername_input))then + found_playername=c + count_found=1 + else + if string.find(string.lower(self.player_list[c]), string.lower(playername_input))then + table.insert(self.valid_commands_list,self.player_list[c]) + count_found=count_found+1 + end end end end + else + debug("Error") end if(count_found == 0)then - SearchCommand:close_modal() + SearchCommand:close_modal(uiId) end return found_playername end @@ -500,12 +899,12 @@ end function SearchCommand:search_build_player_list(uiId,playername) local found_player=0 local found_command=0 - found_player=SearchCommand:build_valid_player_list(playername) + found_player=SearchCommand:build_valid_player_list(playername,uiId) SearchCommand:search_build_argument_list(uiId,self.command_self) if(found_player ~= 0)then - SearchCommand:close_modal() + SearchCommand:close_modal(uiId) else if next(self.valid_commands_list) ~= nil then SearchCommand:show_more_options(uiId) @@ -517,12 +916,12 @@ function SearchCommand:search_build_command_list(uiId,command,show_argument_help local found_command=0 --debug("search_build_command_list") - found_command=SearchCommand:build_valid_command_list(command) + found_command=SearchCommand:build_valid_command_list(command,uiId) if(found_command ~= 0)then - SearchCommand:close_modal() + SearchCommand:close_modal(uiId) else - if next(self.valid_commands_list) ~= nil then + if next(self.valid_commands_list) then SearchCommand:show_more_options(uiId) end end @@ -586,10 +985,13 @@ function SearchCommand:search_build_argument_list(uiId,command_to_show_argument) if(max_args == ac or max_args == 1)then for pc = 1, #self.commands_list[command_index][4+ac] do + + local translation_parm = SearchCommand:pars_command_parameter(self.commands_list[command_index][4+ac][pc][1]) + if(pc > 1)then - argument_help=argument_help.."/"..self.commands_list[command_index][4+ac][pc][1] + argument_help=argument_help.."/"..translation_parm else - argument_help=argument_help.." "..self.commands_list[command_index][4+ac][pc][1] + argument_help=argument_help.." "..translation_parm end end else @@ -611,8 +1013,7 @@ function SearchCommand:search_build_argument_list(uiId,command_to_show_argument) argument_help=argument_help.." "..self.command_parameter_list[max_arguments+1+ma] end end - - argument_help=argument_help.." Warning to many Arguments" + argument_help=argument_help.." "..i18n.get("uiSearchCommandWarningParameter"):toUtf8() end if(self.command_self == "a" and #self.command_parameter_list >= 2)then @@ -677,9 +1078,61 @@ function SearchCommand:find_argument(command,uiId) return argument_name end +function SearchCommand:add_player_to_list(online_player_list) + for online = 1, #online_player_list do + --only insert a playername once + if(SearchCommand:find(self.player_list, online_player_list[online]) == nil)then + table.insert(self.player_list, online_player_list[online]) + end + end +end + +function SearchCommand:search_build_local_player_list() + local online_player_list = {} + + --debug("Friends online:") + for i=0,1500 do + local ui = getUI("ui:interface:friend_list_"..tostring(i)) + if ui then + local online = getUI("ui:interface:friend_list_"..tostring(i)..":header_closed:online") + if online.texture == "w_online.tga" then + if(SearchCommand:find(online_player_list, ui.title) == nil)then + table.insert(online_player_list, ui.title) + end + end + end + end + + --debug("Teammembers:") + for i=0,5 do + local ui = getUI("ui:interface:team_list_"..tostring(i)) + if ui then + if(SearchCommand:find(online_player_list, ui.title) == nil)then + table.insert(online_player_list, ui.title) + end + end + end + + --debug("Guildmember online:") + for i=0,1500 do + local ui = getUI("ui:interface:guild:content:tab_guild:list_member:guild_members:ui:interface:guild:content:tab_guild:list_member:guild_members:m"..tostring(i)) + if ui then + local online = getUI("ui:interface:guild:content:tab_guild:list_member:guild_members:ui:interface:guild:content:tab_guild:list_member:guild_members:m"..tostring(i)..":online") + if online.texture == "w_online.tga" then + if(SearchCommand:find(online_player_list, ui.name.hardtext) == nil)then + table.insert(online_player_list, ui.name.hardtext) + end + end + end + end + + --now check and update player_list + SearchCommand:add_player_to_list(online_player_list) +end function SearchCommand:build_command_helper(uiId) --read process_list + local player_priv = isPlayerPrivilege() local argu_name = "" local process_status=SearchCommand:read_process_status(uiId) @@ -699,16 +1152,27 @@ function SearchCommand:build_command_helper(uiId) --check if argument can be a command or a playername - if(string.find(string.lower(argu_name), string.lower("<command>")))then + if(string.find(string.lower(argu_name), string.lower("<Command>")))then --debug("parm is a command") SearchCommand:search_build_command_list(uiId,self.command_parameter_list[process_status],false) elseif(string.find(string.lower(argu_name), string.lower("<PlayerName>")) or string.find(string.lower(argu_name), string.lower("<TargetName>")))then --debug("parm is a playername") + if(player_priv)then - SearchCommand:search_build_player_list(uiId,self.command_parameter_list[process_status]) + --load_current_active_player_name + webig:openUrlInBg("https://app.ryzom.com/get_playername_online/index.php") else - SearchCommand:search_build_argument_list(uiId,self.command_self) + --read local playername + --friendslist + --guildlist + --teammember + SearchCommand:search_build_local_player_list() end + + SearchCommand:search_build_player_list(uiId,self.command_parameter_list[process_status]) + + elseif(string.find(string.lower(argu_name), string.lower("<ScriptCommand>")))then + SearchCommand:search_build_command_list(uiId,self.command_parameter_list[process_status],false) else SearchCommand:search_build_argument_list(uiId,self.command_self) end @@ -716,63 +1180,197 @@ function SearchCommand:build_command_helper(uiId) end function SearchCommand:write_command_help(uiId,text) + local main_chat_input = getUI(uiId) + local read_prompt = main_chat_input.prompt --debug("write_command_help: "..text) local behind_help_text = getUI(uiId.."h") + + behind_help_text.prompt=read_prompt behind_help_text.input_string = text end function SearchCommand:write_command_help_clear(uiId) local behind_help_text = getUI(uiId.."h") behind_help_text.input_string = "" + behind_help_text.prompt = "" end -function SearchCommand:close_modal() - self.modal_open=0 +function SearchCommand:close_modal(uiId) --debug("close_modal") + + SearchCommand:update_modal_open_list(uiId,0) runAH(nil, "leave_modal", "group=ui:interface:search_command_add_menu") end function SearchCommand:show_more_options(uiId) - self.modal_open=1 + SearchCommand:update_modal_open_list(uiId,1) --debug("build_menu") - launchContextMenuInGame("ui:interface:search_command_add_menu") - menu = getUI("ui:interface:search_command_add_menu") + local display_max_found = 0 + local calc_manu_hight = 0 + local up_ok = 0 + local down_ok = 0 + + table.sort(self.valid_commands_list) + + + base_main_chat_id = string.sub(uiId,0,string.len(uiId)-3) + local check_main_window = getUI(base_main_chat_id) + + base_window_id = string.sub(uiId,0,string.len(uiId)-15) + local check_window = getUI(base_window_id) + + local interface_window = getUI("ui:interface") + local interface_window_h = interface_window.h + local interface_window_w = interface_window.w + + local offset_h_down = 20 + local offset_h_up = 35 + local offest_x = 0 + + if(check_main_window.x == 0)then + offest_x = 18 + else + offest_x = check_main_window.x + 10 + end + + local new_modal_pos_x = check_window.x + offest_x + local new_modal_pos_y = check_window.y - check_window.h - menu:setMinW(85) + if(#self.valid_commands_list > 9)then + display_max_found = 9 + calc_manu_hight = (display_max_found * 16) + 39 + else + display_max_found = #self.valid_commands_list + calc_manu_hight = (display_max_found * 16) + 23 + end + + --check we need spawn menu up or down + local cal_needed_space_up = (check_window.y - check_window.h) + calc_manu_hight + offset_h_up + local cal_needed_space_down = (check_window.y - check_window.h) - calc_manu_hight - offset_h_down + + if(cal_needed_space_up > interface_window_h)then + up_ok = 0 + else + up_ok = 1 + end + + if(cal_needed_space_down < 0)then + down_ok = 0 + else + down_ok = 1 + end + + if(down_ok == 1 and up_ok == 1)then + if(cal_needed_space_up < cal_needed_space_down)then + up_ok = 1 + down_ok = 0 + else + up_ok = 0 + down_ok = 1 + end + end + if(up_ok == 1)then + new_modal_pos_y = (check_window.y - check_window.h) + offset_h_up + end + if(down_ok == 1)then + new_modal_pos_y = (check_window.y - check_window.h) - calc_manu_hight + end + + --setup menu window + menu = getUI("ui:interface:search_command_add_menu") + menu.active = true + menu.y = new_modal_pos_y + menu.x = new_modal_pos_x menu:updateCoords() menu = menu:getRootMenu() menu:reset() + --END setup menu window + + --fill menu window + menu:addLine(ucstring(i18n.get("uiSearchCommandFound"):toUtf8()..": "..#self.valid_commands_list), "lua", "SearchCommand:close_modal('"..uiId.."')", "") + + for c = 1, display_max_found do + menu:addLine(ucstring(c..". "..self.valid_commands_list[c]), "lua", "SearchCommand:finish_commands('"..self.valid_commands_list[c].."','"..uiId.."')", "") + end + + if(#self.valid_commands_list > 9)then + menu:addLine(ucstring("..."), "lua", "SearchCommand:close_modal('"..uiId.."')", "") + end + --END fill menu window - menu:addLine(ucstring("Options..."), "", "", "") + --launche menu window + launchContextMenuInGame("ui:interface:search_command_add_menu") + --END launche menu window +end + +function SearchCommand:replace_escript_param(command_name) + local command_index = 0 + local temp_command = "" + + for c = 1, #self.commands_list do + if(self.commands_list[c][4] == command_name)then + command_index=c + end + end - for c = 1, #self.valid_commands_list do - menu:addLine(ucstring(self.valid_commands_list[c]), "lua", "SearchCommand:finish_commands('"..self.valid_commands_list[c].."','"..uiId.."')", "") + if(command_index ~= 0)then + temp_command = command_name + max_arguments = #self.commands_list[command_index] - 4 + + for ac = 1, max_arguments do + + local load_all_param = "" + for pc = 1, #self.commands_list[command_index][4+ac] do + debug(self.commands_list[command_index][4+ac][pc][1]) + local translation_parm = SearchCommand:pars_command_parameter(self.commands_list[command_index][4+ac][pc][1]) + if(pc > 1)then + load_all_param=load_all_param.."/"..translation_parm + else + load_all_param=translation_parm + end + end + temp_command = temp_command:gsub("arg"..ac,load_all_param) + end end + + --debug("final_temp: "..temp_command) + return temp_command end function SearchCommand:finish_commands(command_name,uiId) - local process_status=SearchCommand:read_process_status(uiId) + local process_status = SearchCommand:read_process_status(uiId) local input_search_string = getUI(uiId) - local final_command="" + local final_command = "" + local new_command_par = "" + + --debug("process_status: "..process_status) for fc = 1, process_status do if(fc == process_status)then - self.command_parameter_list[fc]=command_name + self.command_parameter_list[fc] = command_name end end for pc = 1, #self.command_parameter_list do + local add_escript_prefix="" + if(SearchCommand:get_command_type(self.command_parameter_list[pc]) == "eScript")then + add_escript_prefix="()" + new_command_par = SearchCommand:replace_escript_param(self.command_parameter_list[pc]) + self.command_parameter_list[pc] = new_command_par + end + if(final_command == "")then - final_command = self.command_parameter_list[pc] + final_command = add_escript_prefix..""..self.command_parameter_list[pc] else - final_command = final_command.." "..self.command_parameter_list[pc] + final_command = final_command.." "..add_escript_prefix..""..self.command_parameter_list[pc] end end input_search_string.input_string = "/"..final_command + --debug("/"..final_command) input_search_string:setFocusOnText() - SearchCommand:close_modal() + SearchCommand:close_modal(uiId) SearchCommand:search(uiId) end \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml index 105283adc2..b7cf67ee7c 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml @@ -3,7 +3,7 @@ <!-- ****************************************** --> <interface_config> <root id="interface" x="0" y="0" w="800" h="600" active="true" /> - <lua file="search_command.lua" /> + <lua file="search_command.lua" /> <proc id="proc_nothing"></proc> <!-- a text with border --> <template name="bc_border_text" keep="true" posref="TM TM" posparent="parent" x="0" y="-20" w="-4"> @@ -708,7 +708,7 @@ <!-- ********************* --> <!-- * EDIT BOX WIDGET * --> <!-- ********************* --> - <group type="menu" id="search_command_add_menu" extends="base_menu" mouse_pos="true"></group> + <group type="menu" id="search_command_add_menu" extends="base_menu" mouse_pos="false"></group> <command name="?" action="lua" params="SearchCommand:help(getUICaller().id,'+')"/> <template name="edit_box_widget" active="true" posref="TL TL" text_x="0" text_y="0" text_ref="BL BL" child_resize_h="true" child_resize_hmargin="0" multi_line="false" x="0" y="0" w="0" h="0" sizeref="" id="eb" posparent="parent" onenter="chat_box_entry" params="" reset_focus_on_hide="true" enter_loose_focus="true" prompt=">" enter_recover_focus="true" max_num_chars="255" menu_r="" onchange="lua" onchange_params="SearchCommand:search(getUICaller().id)" entry_type="text" keep="true" max_historic="40" fontsize="10" shadow="true" shadow_x="1" shadow_y="1" shadow_color="0 0 0 255" shadow_outline="false" backup_father_container_pos="false" want_return="false" clear_on_escape="false" color="255 255 255 255" continuous_text_update="false" bg_texture="W_box_blank.tga" on_focus_lost="" on_focus_lost_params="" max_float_prec="5" tooltip="" tooltip_parent="" negative_filter="" render_layer="0"> <group id="#id" active="#active" posref="#posref" x="#x" y="#y" posparent="#posparent" child_resize_h="#child_resize_h" child_resize_hmargin="#child_resize_hmargin" sizeref="#sizeref" w="#w" h="#h" render_layer="#render_layer" > diff --git a/ryzom/client/src/interface_v3/action_handler_edit.cpp b/ryzom/client/src/interface_v3/action_handler_edit.cpp index d3fd022ad6..ebd7919067 100644 --- a/ryzom/client/src/interface_v3/action_handler_edit.cpp +++ b/ryzom/client/src/interface_v3/action_handler_edit.cpp @@ -639,8 +639,8 @@ class CAHEditExpandOrCycleTell : public CAHEdit } void actionPart () { - // If the line starts with '/tell ', do not try to expand - if (!NLMISC::startsWith(_GroupEdit->getInputString(), "/tell ")) + // If the line starts with '/', try to expand + if (NLMISC::startsWith(_GroupEdit->getInputString(), "/")) { if (_GroupEdit->expand()) return; } diff --git a/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp b/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp index cf87a3bf0a..19b016b897 100644 --- a/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp +++ b/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp @@ -1571,8 +1571,13 @@ int CLuaIHMRyzom::getPlayerPrivs(CLuaState &ls) if (hasPrivilegeOBSERVER()) privsString+=":OBSERVER"; if (hasPrivilegeOBSERVER()) privsString+=":TESTER"; - ls.push(privsString+=":"); - return 1; + if(privsString == ""){ + return 0; + } + else{ + ls.push(privsString+=":"); + return 1; + } } // *************************************************************************** From 0b8e513939300bef6b2ca47702c930e88b7c4424 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Sun, 28 Jan 2024 13:04:59 +0100 Subject: [PATCH 146/194] Changed: added tp command to commandlist --- ryzom/client/data/gamedev/interfaces_v3/search_command.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index cfcf148ecd..48294a5875 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -91,6 +91,8 @@ table.insert(SearchCommand.commands_list,{"client", "player", "4_desc", "4", {{" table.insert(SearchCommand.commands_list,{"client", "player", "channel_desc", "channel",{{"Text:<Channelname>",""}}, {{"Text:<Password>","channel_password_desc"},{"*","channel_leave_desc"}}}) table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "tell",{{"Text:<PlayerName>",""}}, {{"Text:<Message>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "t",{{"Text:<PlayerName>",""}}, {{"Text:<Message>",""}}}) + +table.insert(SearchCommand.commands_list,{"client", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "tp_desc", "tp", {{"<PositionX>,<PositionY>[,<PositionZ>]","tp_1_desc"},{"Text:<PlayerName>",""},{"Text:<BotName>",""}}}) --END client commands @@ -117,8 +119,6 @@ table.insert(SearchCommand.commands_list,{"shard", "player", "setTeamLeader_desc table.insert(SearchCommand.commands_list,{"shard", "player", "resetName_desc", "resetName"}) table.insert(SearchCommand.commands_list,{"shard", "player", "lockItem_desc", "lockItem", {{"Text:<Inventory>",""}}, {{"Number:<Slot>",""}}, {{"lock=0,1",""}}}) - - if(player_priv)then table.insert(SearchCommand.commands_list,{"shard", "player", "connectUserChannel_desc", "connectUserChannel", {{"Text:<Channelname>",""}}, {{"Text:<Password>",""},{"*","channel_leave_desc"},{"***","channel_remove_admin_desc"}}}) else From e45da29ab067cf2574e57248ebd8cb481d73b029 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Sun, 28 Jan 2024 14:02:05 +0100 Subject: [PATCH 147/194] Fix exploit --- .../src/entities_game_service/player_manager/character.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index 494a030f92..b00d013724 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -17024,14 +17024,14 @@ bool CCharacter::pickUpRawMaterial(uint32 indexInTempInv, bool* lastMaterial) if (useGenericMats) { // Not Named or Boss mats - if (genericMp->ItemId != mp->ItemId && rand() % 500 < modifier) + if (mp->Quantity > 0 && genericMp->ItemId != mp->ItemId && rand() % 500 < modifier) { SM_STATIC_PARAMS_1(params, STRING_MANAGER::sbrick); params[0].SheetId = usedSheet; sendDynamicSystemMessage(_EntityRowId, "ALLEGORY_EFFECT_TRIGGERED", params); bonus = 2; } - item = createItem(quality, bonus*genericMp->Quantity, genericMp->ItemId); + item = createItem(quality, bonus*mp->Quantity, genericMp->ItemId); } else item = createItem(quality, mp->Quantity, mp->ItemId); From 6cd0afb3d2fce225638248480746033d17aab84b Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Sun, 11 Feb 2024 20:03:45 +0100 Subject: [PATCH 148/194] Added: client command shape --- ryzom/client/data/gamedev/interfaces_v3/search_command.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index 48294a5875..4fbf267e88 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -93,6 +93,7 @@ table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "tell table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "t",{{"Text:<PlayerName>",""}}, {{"Text:<Message>",""}}}) table.insert(SearchCommand.commands_list,{"client", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "tp_desc", "tp", {{"<PositionX>,<PositionY>[,<PositionZ>]","tp_1_desc"},{"Text:<PlayerName>",""},{"Text:<BotName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:", "shape_desc", "shape", {{"Text:<ShapeFile>",""}}}) --END client commands From 4dd55e6f9beef61688059e9a3183dfb7ba682ba4 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Sun, 11 Feb 2024 22:08:36 +0100 Subject: [PATCH 149/194] Added: add space after Autocomplete but only if another paramter is possible --- .../gamedev/interfaces_v3/search_command.lua | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index 4fbf267e88..d938dbe87e 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -795,6 +795,18 @@ function SearchCommand:get_command_type(command) return command_type end +function SearchCommand:get_command_argument_count(command) + local max_arguments = 0 + + for c = 1, #self.commands_list do + if(self.commands_list[c][4] == command) then + max_arguments = #self.commands_list[c] - 4 + end + end + + return max_arguments +end + function SearchCommand:build_valid_command_list(command_input,uiId) self.valid_commands_list = {} local count_found=0 @@ -1343,6 +1355,8 @@ function SearchCommand:finish_commands(command_name,uiId) local input_search_string = getUI(uiId) local final_command = "" local new_command_par = "" + local argument_count = 0 + local max_aruments = 0 --debug("process_status: "..process_status) @@ -1367,9 +1381,32 @@ function SearchCommand:finish_commands(command_name,uiId) end end - input_search_string.input_string = "/"..final_command --debug("/"..final_command) + if(self.command_parameter_list[1] == "a" and process_status > 1)then + max_aruments = SearchCommand:get_command_argument_count(self.command_parameter_list[2]) + argument_count = #self.command_parameter_list - 2 + elseif(self.command_parameter_list[1] == "b" and process_status > 1)then + max_aruments = SearchCommand:get_command_argument_count(self.command_parameter_list[2]) + argument_count = #self.command_parameter_list - 2 + elseif(self.command_parameter_list[1] == "c" and process_status > 1)then + max_aruments = SearchCommand:get_command_argument_count(self.command_parameter_list[2]) + argument_count = #self.command_parameter_list - 2 + else + max_aruments = SearchCommand:get_command_argument_count(self.command_parameter_list[1]) + argument_count = #self.command_parameter_list - 1 + end + + --debug("process_status"..process_status) + --debug("argument_count: "..argument_count) + --debug("name:"..self.command_parameter_list[1].." max:"..max_aruments) + + if(argument_count < max_aruments)then + input_search_string.input_string = "/"..final_command.." " + else + input_search_string.input_string = "/"..final_command + end + input_search_string:setFocusOnText() SearchCommand:close_modal(uiId) From b8ecc165a4d8310b5de53b745d65043541cab79b Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Mon, 26 Feb 2024 14:12:08 +0100 Subject: [PATCH 150/194] Changed: impove search for commands --- .../gamedev/interfaces_v3/search_command.lua | 240 ++++++++++++++---- 1 file changed, 188 insertions(+), 52 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index d938dbe87e..6333de4961 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -357,9 +357,9 @@ function SearchCommand:pars_command_parameter(command_parameter) --debug(substring) if(string.find(string.lower(substring), "<"))then --debug(substring:match("<(.*)>")) - finish_translation_text=finish_translation_text.."<"..substring:gsub("<(.-)>", i18n.get("uiSearchCommand"..substring:match("<(.*)>")):toUtf8())..">" + finish_translation_text=finish_translation_text..""..substring:gsub("<(.-)>", i18n.get("uiSearchCommand"..substring:match("<(.*)>")):toUtf8())..">" else - finish_translation_text=finish_translation_text..""..i18n.get("uiSearchCommand"..substring):toUtf8()..":" + finish_translation_text="<"..finish_translation_text..""..i18n.get("uiSearchCommand"..substring):toUtf8()..":" end end else @@ -766,6 +766,12 @@ function SearchCommand:search(uiId) --go and search we found a mathing command SearchCommand:write_command_help_clear(uiId) SearchCommand:build_command_helper(uiId) + + --check last string is a space + local last_string = string.sub(input_text, -1, -1) + if(last_string == " ")then + SearchCommand:close_modal(uiId) + end end else --check if we found the identifier @@ -811,40 +817,69 @@ function SearchCommand:build_valid_command_list(command_input,uiId) self.valid_commands_list = {} local count_found=0 local found_command=0 + local input_lengh=0 + local first_char_commandname="" + local found_command_name="" for c = 1, #self.commands_list do local command_are_allowed = 0 local command_display = 0 - --check if we want used a client or shared command - if(self.command_self == "a" or self.command_self == "b" or self.command_self == "c")then - --debug(self.commands_list[c][1]) - if(self.commands_list[c][1] == "shard" and self.command_parameter_list[2] ~= "eScript")then - command_display = 1 - elseif(self.commands_list[c][1] == "eScript")then - if(self.command_parameter_list[2] == "eScript")then + if(#self.command_parameter_list <= 1)then + if(command_input == "a" or command_input == "b" or command_input == "c")then + if(self.commands_list[c][1] == "client" or self.commands_list[c][4] == "a" or self.commands_list[c][4] == "b" or self.commands_list[c][4] == "c")then command_display = 1 else command_display = 0 end else - command_display = 0 + if(self.commands_list[c][1] == "shard")then + if(self.command_self == "?")then + command_display = 1 + else + command_display = 0 + end + elseif(self.commands_list[c][1] == "eScript")then + if(self.command_self == "?")then + command_display = 1 + else + command_display = 0 + end + else + command_display = 1 + end end else - if(self.commands_list[c][1] == "shard")then - if(self.command_self == "?")then + --check if we want used a client or shared command + if(self.command_self == "a" or self.command_self == "b" or self.command_self == "c")then + --debug(self.commands_list[c][1]) + if(self.commands_list[c][1] == "shard" and self.command_parameter_list[2] ~= "eScript")then command_display = 1 + elseif(self.commands_list[c][1] == "eScript")then + if(self.command_parameter_list[2] == "eScript")then + command_display = 1 + else + command_display = 0 + end else command_display = 0 end - elseif(self.commands_list[c][1] == "eScript")then - if(self.command_self == "?")then - command_display = 1 + else + if(self.commands_list[c][1] == "shard")then + if(self.command_self == "?")then + command_display = 1 + else + command_display = 0 + end + elseif(self.commands_list[c][1] == "eScript")then + if(self.command_self == "?")then + command_display = 1 + else + command_display = 0 + end else - command_display = 0 + command_display = 1 end - else - command_display = 1 end end @@ -856,17 +891,44 @@ function SearchCommand:build_valid_command_list(command_input,uiId) end end + --debug("self.commands_list[c][4]: "..self.commands_list[c][4].." self.command_self: '"..self.command_self.."' command_input: '"..command_input.."' #self.command_parameter_list: "..#self.command_parameter_list) + + if(#self.command_parameter_list >= 2)then + if(self.command_self == "a" or self.command_self == "b" or self.command_self == "c")then + if(string.lower(command_input) == "a" or string.lower(command_input) == "b" or string.lower(command_input) == "c")then + if(self.commands_list[c][4] == "a" or self.commands_list[c][4] == "b" or self.commands_list[c][4] == "c")then + command_display = 0 + end + end + end + end + --debug("command_are_allowed: "..command_are_allowed.." command_display: "..command_display) if(command_are_allowed == 1 and command_display == 1)then if(command_input ~= "")then if(string.lower(self.commands_list[c][4]) == string.lower(command_input))then found_command=c - count_found=1 + found_command_name=self.commands_list[c][4] + count_found=count_found+1 else - if string.find(string.lower(self.commands_list[c][4]), string.lower(command_input))then - table.insert(self.valid_commands_list,self.commands_list[c][4]) - count_found=count_found+1 + command_input_lengh = string.len(command_input) + + if(command_input_lengh == 1)then + --its the first char only search all command whats beginn with this char + first_char_commandname = string.sub(self.commands_list[c][4],1,1) + + if (string.lower(first_char_commandname) == string.lower(command_input))then + --debug("found_command: "..self.commands_list[c][4]) + table.insert(self.valid_commands_list,self.commands_list[c][4]) + count_found=count_found+1 + end + else + --input is longer as 1 char, go to full search mode, add every result where the input string are anywhere in the command name + if string.find(string.lower(self.commands_list[c][4]), string.lower(command_input))then + table.insert(self.valid_commands_list,self.commands_list[c][4]) + count_found=count_found+1 + end end end end @@ -877,7 +939,31 @@ function SearchCommand:build_valid_command_list(command_input,uiId) --debug("no_command_found_close_modal") SearchCommand:close_modal(uiId) end - return found_command + + --sort the command table + SearchCommand:sort_valid_command_list(found_command_name) + --end + + return found_command,count_found +end + +function SearchCommand:sort_valid_command_list(found_command_name) + local temp_sort_list={} + --sort valid command list + table.sort(self.valid_commands_list) + + --debug("found_command_name: "..found_command_name) + + if(found_command_name ~= "")then + table.insert(temp_sort_list,found_command_name) + end + + for c = 1, #self.valid_commands_list do + table.insert(temp_sort_list,self.valid_commands_list[c]) + end + + self.valid_commands_list={} + self.valid_commands_list = temp_sort_list end function SearchCommand:build_valid_player_list(playername_input,uiId) @@ -906,6 +992,10 @@ function SearchCommand:build_valid_player_list(playername_input,uiId) if(count_found == 0)then SearchCommand:close_modal(uiId) end + + --sort found player list + table.sort(self.valid_commands_list) + return found_playername end @@ -915,7 +1005,7 @@ function SearchCommand:search_build_player_list(uiId,playername) found_player=SearchCommand:build_valid_player_list(playername,uiId) SearchCommand:search_build_argument_list(uiId,self.command_self) - + if(found_player ~= 0)then SearchCommand:close_modal(uiId) else @@ -926,13 +1016,20 @@ function SearchCommand:search_build_player_list(uiId,playername) end function SearchCommand:search_build_command_list(uiId,command,show_argument_help) - local found_command=0 + local found_command_id=0 + local found_more_possible=0 --debug("search_build_command_list") - found_command=SearchCommand:build_valid_command_list(command,uiId) - - if(found_command ~= 0)then - SearchCommand:close_modal(uiId) + found_command_id,found_more_possible=SearchCommand:build_valid_command_list(command,uiId) + + if(found_command_id ~= 0)then + if(found_more_possible > 1)then + if next(self.valid_commands_list) then + SearchCommand:show_more_options(uiId) + end + else + SearchCommand:close_modal(uiId) + end else if next(self.valid_commands_list) then SearchCommand:show_more_options(uiId) @@ -940,7 +1037,7 @@ function SearchCommand:search_build_command_list(uiId,command,show_argument_help end if(show_argument_help)then - if(found_command ~= 0)then + if(found_command_id ~= 0)then SearchCommand:search_build_argument_list(uiId,command) end else @@ -949,56 +1046,98 @@ function SearchCommand:search_build_command_list(uiId,command,show_argument_help end function SearchCommand:search_build_argument_list(uiId,command_to_show_argument) + --debug("search_build_argument_list") local argument_help="" local command_index=0 local max_arguments=0 local current_args=0 local special_offset=0 + local command_to_show_argument_new="" + + command_to_show_argument_new = command_to_show_argument if(command_to_show_argument == "a")then if(#self.command_parameter_list >= 2)then - command_to_show_argument=self.command_parameter_list[2] + command_to_show_argument_new=self.command_parameter_list[2] special_offset=1 end end if(command_to_show_argument == "b")then if(#self.command_parameter_list >= 2)then - command_to_show_argument=self.command_parameter_list[2] + command_to_show_argument_new=self.command_parameter_list[2] special_offset=1 end end if(command_to_show_argument == "c")then if(#self.command_parameter_list >= 3)then - command_to_show_argument=self.command_parameter_list[3] + command_to_show_argument_new=self.command_parameter_list[3] special_offset=2 end end + --debug("default: "..command_to_show_argument.." new: "..command_to_show_argument_new) + for c = 1, #self.commands_list do - if(self.commands_list[c][4] == command_to_show_argument)then - command_index=c + if(self.commands_list[c][4] == command_to_show_argument_new)then + --check now if we want display the argument for this command + + if(command_to_show_argument == "a" or command_to_show_argument == "b" or command_to_show_argument == "c")then + if(command_to_show_argument == command_to_show_argument_new)then + if(#self.command_parameter_list >= 2)then + --debug("here: "..#self.command_parameter_list.." "..command_to_show_argument_new) + if(command_to_show_argument_new ~= "a" and #self.command_parameter_list == 2)then + command_index=c + elseif(command_to_show_argument_new ~= "b" and #self.command_parameter_list == 2)then + command_index=c + elseif(command_to_show_argument_new ~= "c" and #self.command_parameter_list == 3)then + command_index=c + end + else + command_index=c + end + else + if(self.commands_list[c][1] == "shard")then + if(command_to_show_argument_new ~= "a" and command_to_show_argument_new ~= "b" and command_to_show_argument_new ~= "c")then + command_index=c + end + end + end + else + if(self.commands_list[c][1] == "shard")then + if(self.command_self == "?")then + command_index=c + end + elseif(self.commands_list[c][1] == "eScript")then + if(self.command_self == "?")then + command_index=c + end + else + command_index=c + end + end + + --end end end + --debug("command_index: "..command_index) + if(command_index ~= 0)then - max_arguments = #self.commands_list[command_index] - 4 - for ac = 1, max_arguments do - max_args=#self.command_parameter_list + max_args=#self.command_parameter_list + current_args=max_args - 1 + + if(special_offset ~= 0)then + max_args=max_args - special_offset current_args=max_args - 1 - --debug("p: "..#self.command_parameter_list.." l: "..ac) - - if(special_offset ~= 0)then - max_args=max_args - special_offset - current_args=max_args - 1 - end - - if(max_args == ac or max_args == 1)then + end + + for ac = 1, max_arguments do + if(ac > current_args)then for pc = 1, #self.commands_list[command_index][4+ac] do - local translation_parm = SearchCommand:pars_command_parameter(self.commands_list[command_index][4+ac][pc][1]) if(pc > 1)then @@ -1010,8 +1149,9 @@ function SearchCommand:search_build_argument_list(uiId,command_to_show_argument) else argument_help=argument_help.." "..self.command_parameter_list[ac+1+special_offset] end - end + end + if(current_args > max_arguments)then diff=current_args-max_arguments @@ -1223,9 +1363,6 @@ function SearchCommand:show_more_options(uiId) local up_ok = 0 local down_ok = 0 - table.sort(self.valid_commands_list) - - base_main_chat_id = string.sub(uiId,0,string.len(uiId)-3) local check_main_window = getUI(base_main_chat_id) @@ -1334,7 +1471,6 @@ function SearchCommand:replace_escript_param(command_name) local load_all_param = "" for pc = 1, #self.commands_list[command_index][4+ac] do - debug(self.commands_list[command_index][4+ac][pc][1]) local translation_parm = SearchCommand:pars_command_parameter(self.commands_list[command_index][4+ac][pc][1]) if(pc > 1)then load_all_param=load_all_param.."/"..translation_parm From 1a5fdef7f2cfd0461d180c1b1fb3689d29dd5fe9 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Mon, 26 Feb 2024 13:21:40 +0000 Subject: [PATCH 151/194] Chat command autocomplete --- .../gamedev/interfaces_v3/search_command.lua | 280 +++++++++++++++--- 1 file changed, 231 insertions(+), 49 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index cfcf148ecd..61c9a1fcef 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -91,6 +91,9 @@ table.insert(SearchCommand.commands_list,{"client", "player", "4_desc", "4", {{" table.insert(SearchCommand.commands_list,{"client", "player", "channel_desc", "channel",{{"Text:<Channelname>",""}}, {{"Text:<Password>","channel_password_desc"},{"*","channel_leave_desc"}}}) table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "tell",{{"Text:<PlayerName>",""}}, {{"Text:<Message>",""}}}) table.insert(SearchCommand.commands_list,{"client", "player", "tell_desc", "t",{{"Text:<PlayerName>",""}}, {{"Text:<Message>",""}}}) + +table.insert(SearchCommand.commands_list,{"client", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "tp_desc", "tp", {{"<PositionX>,<PositionY>[,<PositionZ>]","tp_1_desc"},{"Text:<PlayerName>",""},{"Text:<BotName>",""}}}) +table.insert(SearchCommand.commands_list,{"client", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:", "shape_desc", "shape", {{"Text:<ShapeFile>",""}}}) --END client commands @@ -117,8 +120,6 @@ table.insert(SearchCommand.commands_list,{"shard", "player", "setTeamLeader_desc table.insert(SearchCommand.commands_list,{"shard", "player", "resetName_desc", "resetName"}) table.insert(SearchCommand.commands_list,{"shard", "player", "lockItem_desc", "lockItem", {{"Text:<Inventory>",""}}, {{"Number:<Slot>",""}}, {{"lock=0,1",""}}}) - - if(player_priv)then table.insert(SearchCommand.commands_list,{"shard", "player", "connectUserChannel_desc", "connectUserChannel", {{"Text:<Channelname>",""}}, {{"Text:<Password>",""},{"*","channel_leave_desc"},{"***","channel_remove_admin_desc"}}}) else @@ -356,9 +357,9 @@ function SearchCommand:pars_command_parameter(command_parameter) --debug(substring) if(string.find(string.lower(substring), "<"))then --debug(substring:match("<(.*)>")) - finish_translation_text=finish_translation_text.."<"..substring:gsub("<(.-)>", i18n.get("uiSearchCommand"..substring:match("<(.*)>")):toUtf8())..">" + finish_translation_text=finish_translation_text..""..substring:gsub("<(.-)>", i18n.get("uiSearchCommand"..substring:match("<(.*)>")):toUtf8())..">" else - finish_translation_text=finish_translation_text..""..i18n.get("uiSearchCommand"..substring):toUtf8()..":" + finish_translation_text="<"..finish_translation_text..""..i18n.get("uiSearchCommand"..substring):toUtf8()..":" end end else @@ -765,6 +766,12 @@ function SearchCommand:search(uiId) --go and search we found a mathing command SearchCommand:write_command_help_clear(uiId) SearchCommand:build_command_helper(uiId) + + --check last string is a space + local last_string = string.sub(input_text, -1, -1) + if(last_string == " ")then + SearchCommand:close_modal(uiId) + end end else --check if we found the identifier @@ -794,36 +801,85 @@ function SearchCommand:get_command_type(command) return command_type end +function SearchCommand:get_command_argument_count(command) + local max_arguments = 0 + + for c = 1, #self.commands_list do + if(self.commands_list[c][4] == command) then + max_arguments = #self.commands_list[c] - 4 + end + end + + return max_arguments +end + function SearchCommand:build_valid_command_list(command_input,uiId) self.valid_commands_list = {} local count_found=0 local found_command=0 + local input_lengh=0 + local first_char_commandname="" + local found_command_name="" for c = 1, #self.commands_list do local command_are_allowed = 0 local command_display = 0 - --check if we want used a client or shared command - if(self.command_self == "a" or self.command_self == "b" or self.command_self == "c")then - --debug(self.commands_list[c][1]) - if(self.commands_list[c][1] == "shard" and self.command_parameter_list[2] ~= "eScript")then - command_display = 1 - elseif(self.commands_list[c][1] == "eScript")then - if(self.command_parameter_list[2] == "eScript")then + if(#self.command_parameter_list <= 1)then + if(command_input == "a" or command_input == "b" or command_input == "c")then + if(self.commands_list[c][1] == "client" or self.commands_list[c][4] == "a" or self.commands_list[c][4] == "b" or self.commands_list[c][4] == "c")then command_display = 1 else command_display = 0 end else - command_display = 0 + if(self.commands_list[c][1] == "shard")then + if(self.command_self == "?")then + command_display = 1 + else + command_display = 0 + end + elseif(self.commands_list[c][1] == "eScript")then + if(self.command_self == "?")then + command_display = 1 + else + command_display = 0 + end + else + command_display = 1 + end end else - if(self.commands_list[c][1] == "shard")then - if(self.command_self == "?")then + --check if we want used a client or shared command + if(self.command_self == "a" or self.command_self == "b" or self.command_self == "c")then + --debug(self.commands_list[c][1]) + if(self.commands_list[c][1] == "shard" and self.command_parameter_list[2] ~= "eScript")then command_display = 1 + elseif(self.commands_list[c][1] == "eScript")then + if(self.command_parameter_list[2] == "eScript")then + command_display = 1 + else + command_display = 0 + end else command_display = 0 end + else + if(self.commands_list[c][1] == "shard")then + if(self.command_self == "?")then + command_display = 1 + else + command_display = 0 + end + elseif(self.commands_list[c][1] == "eScript")then + if(self.command_self == "?")then + command_display = 1 + else + command_display = 0 + end + else + command_display = 1 + end elseif(self.commands_list[c][1] == "eScript")then if(self.command_self == "?")then command_display = 1 @@ -843,17 +899,44 @@ function SearchCommand:build_valid_command_list(command_input,uiId) end end + --debug("self.commands_list[c][4]: "..self.commands_list[c][4].." self.command_self: '"..self.command_self.."' command_input: '"..command_input.."' #self.command_parameter_list: "..#self.command_parameter_list) + + if(#self.command_parameter_list >= 2)then + if(self.command_self == "a" or self.command_self == "b" or self.command_self == "c")then + if(string.lower(command_input) == "a" or string.lower(command_input) == "b" or string.lower(command_input) == "c")then + if(self.commands_list[c][4] == "a" or self.commands_list[c][4] == "b" or self.commands_list[c][4] == "c")then + command_display = 0 + end + end + end + end + --debug("command_are_allowed: "..command_are_allowed.." command_display: "..command_display) if(command_are_allowed == 1 and command_display == 1)then if(command_input ~= "")then if(string.lower(self.commands_list[c][4]) == string.lower(command_input))then found_command=c - count_found=1 + found_command_name=self.commands_list[c][4] + count_found=count_found+1 else - if string.find(string.lower(self.commands_list[c][4]), string.lower(command_input))then - table.insert(self.valid_commands_list,self.commands_list[c][4]) - count_found=count_found+1 + command_input_lengh = string.len(command_input) + + if(command_input_lengh == 1)then + --its the first char only search all command whats beginn with this char + first_char_commandname = string.sub(self.commands_list[c][4],1,1) + + if (string.lower(first_char_commandname) == string.lower(command_input))then + --debug("found_command: "..self.commands_list[c][4]) + table.insert(self.valid_commands_list,self.commands_list[c][4]) + count_found=count_found+1 + end + else + --input is longer as 1 char, go to full search mode, add every result where the input string are anywhere in the command name + if string.find(string.lower(self.commands_list[c][4]), string.lower(command_input))then + table.insert(self.valid_commands_list,self.commands_list[c][4]) + count_found=count_found+1 + end end end end @@ -864,7 +947,31 @@ function SearchCommand:build_valid_command_list(command_input,uiId) --debug("no_command_found_close_modal") SearchCommand:close_modal(uiId) end - return found_command + + --sort the command table + SearchCommand:sort_valid_command_list(found_command_name) + --end + + return found_command,count_found +end + +function SearchCommand:sort_valid_command_list(found_command_name) + local temp_sort_list={} + --sort valid command list + table.sort(self.valid_commands_list) + + --debug("found_command_name: "..found_command_name) + + if(found_command_name ~= "")then + table.insert(temp_sort_list,found_command_name) + end + + for c = 1, #self.valid_commands_list do + table.insert(temp_sort_list,self.valid_commands_list[c]) + end + + self.valid_commands_list={} + self.valid_commands_list = temp_sort_list end function SearchCommand:build_valid_player_list(playername_input,uiId) @@ -893,6 +1000,10 @@ function SearchCommand:build_valid_player_list(playername_input,uiId) if(count_found == 0)then SearchCommand:close_modal(uiId) end + + --sort found player list + table.sort(self.valid_commands_list) + return found_playername end @@ -902,7 +1013,7 @@ function SearchCommand:search_build_player_list(uiId,playername) found_player=SearchCommand:build_valid_player_list(playername,uiId) SearchCommand:search_build_argument_list(uiId,self.command_self) - + if(found_player ~= 0)then SearchCommand:close_modal(uiId) else @@ -913,13 +1024,20 @@ function SearchCommand:search_build_player_list(uiId,playername) end function SearchCommand:search_build_command_list(uiId,command,show_argument_help) - local found_command=0 + local found_command_id=0 + local found_more_possible=0 --debug("search_build_command_list") - found_command=SearchCommand:build_valid_command_list(command,uiId) - - if(found_command ~= 0)then - SearchCommand:close_modal(uiId) + found_command_id,found_more_possible=SearchCommand:build_valid_command_list(command,uiId) + + if(found_command_id ~= 0)then + if(found_more_possible > 1)then + if next(self.valid_commands_list) then + SearchCommand:show_more_options(uiId) + end + else + SearchCommand:close_modal(uiId) + end else if next(self.valid_commands_list) then SearchCommand:show_more_options(uiId) @@ -927,7 +1045,7 @@ function SearchCommand:search_build_command_list(uiId,command,show_argument_help end if(show_argument_help)then - if(found_command ~= 0)then + if(found_command_id ~= 0)then SearchCommand:search_build_argument_list(uiId,command) end else @@ -936,56 +1054,98 @@ function SearchCommand:search_build_command_list(uiId,command,show_argument_help end function SearchCommand:search_build_argument_list(uiId,command_to_show_argument) + --debug("search_build_argument_list") local argument_help="" local command_index=0 local max_arguments=0 local current_args=0 local special_offset=0 + local command_to_show_argument_new="" + + command_to_show_argument_new = command_to_show_argument if(command_to_show_argument == "a")then if(#self.command_parameter_list >= 2)then - command_to_show_argument=self.command_parameter_list[2] + command_to_show_argument_new=self.command_parameter_list[2] special_offset=1 end end if(command_to_show_argument == "b")then if(#self.command_parameter_list >= 2)then - command_to_show_argument=self.command_parameter_list[2] + command_to_show_argument_new=self.command_parameter_list[2] special_offset=1 end end if(command_to_show_argument == "c")then if(#self.command_parameter_list >= 3)then - command_to_show_argument=self.command_parameter_list[3] + command_to_show_argument_new=self.command_parameter_list[3] special_offset=2 end end + --debug("default: "..command_to_show_argument.." new: "..command_to_show_argument_new) + for c = 1, #self.commands_list do - if(self.commands_list[c][4] == command_to_show_argument)then - command_index=c + if(self.commands_list[c][4] == command_to_show_argument_new)then + --check now if we want display the argument for this command + + if(command_to_show_argument == "a" or command_to_show_argument == "b" or command_to_show_argument == "c")then + if(command_to_show_argument == command_to_show_argument_new)then + if(#self.command_parameter_list >= 2)then + --debug("here: "..#self.command_parameter_list.." "..command_to_show_argument_new) + if(command_to_show_argument_new ~= "a" and #self.command_parameter_list == 2)then + command_index=c + elseif(command_to_show_argument_new ~= "b" and #self.command_parameter_list == 2)then + command_index=c + elseif(command_to_show_argument_new ~= "c" and #self.command_parameter_list == 3)then + command_index=c + end + else + command_index=c + end + else + if(self.commands_list[c][1] == "shard")then + if(command_to_show_argument_new ~= "a" and command_to_show_argument_new ~= "b" and command_to_show_argument_new ~= "c")then + command_index=c + end + end + end + else + if(self.commands_list[c][1] == "shard")then + if(self.command_self == "?")then + command_index=c + end + elseif(self.commands_list[c][1] == "eScript")then + if(self.command_self == "?")then + command_index=c + end + else + command_index=c + end + end + + --end end end + --debug("command_index: "..command_index) + if(command_index ~= 0)then - max_arguments = #self.commands_list[command_index] - 4 - for ac = 1, max_arguments do - max_args=#self.command_parameter_list + max_args=#self.command_parameter_list + current_args=max_args - 1 + + if(special_offset ~= 0)then + max_args=max_args - special_offset current_args=max_args - 1 - --debug("p: "..#self.command_parameter_list.." l: "..ac) - - if(special_offset ~= 0)then - max_args=max_args - special_offset - current_args=max_args - 1 - end - - if(max_args == ac or max_args == 1)then + end + + for ac = 1, max_arguments do + if(ac > current_args)then for pc = 1, #self.commands_list[command_index][4+ac] do - local translation_parm = SearchCommand:pars_command_parameter(self.commands_list[command_index][4+ac][pc][1]) if(pc > 1)then @@ -997,8 +1157,9 @@ function SearchCommand:search_build_argument_list(uiId,command_to_show_argument) else argument_help=argument_help.." "..self.command_parameter_list[ac+1+special_offset] end - end + end + if(current_args > max_arguments)then diff=current_args-max_arguments @@ -1210,9 +1371,6 @@ function SearchCommand:show_more_options(uiId) local up_ok = 0 local down_ok = 0 - table.sort(self.valid_commands_list) - - base_main_chat_id = string.sub(uiId,0,string.len(uiId)-3) local check_main_window = getUI(base_main_chat_id) @@ -1321,7 +1479,6 @@ function SearchCommand:replace_escript_param(command_name) local load_all_param = "" for pc = 1, #self.commands_list[command_index][4+ac] do - debug(self.commands_list[command_index][4+ac][pc][1]) local translation_parm = SearchCommand:pars_command_parameter(self.commands_list[command_index][4+ac][pc][1]) if(pc > 1)then load_all_param=load_all_param.."/"..translation_parm @@ -1342,6 +1499,8 @@ function SearchCommand:finish_commands(command_name,uiId) local input_search_string = getUI(uiId) local final_command = "" local new_command_par = "" + local argument_count = 0 + local max_aruments = 0 --debug("process_status: "..process_status) @@ -1366,9 +1525,32 @@ function SearchCommand:finish_commands(command_name,uiId) end end - input_search_string.input_string = "/"..final_command --debug("/"..final_command) + if(self.command_parameter_list[1] == "a" and process_status > 1)then + max_aruments = SearchCommand:get_command_argument_count(self.command_parameter_list[2]) + argument_count = #self.command_parameter_list - 2 + elseif(self.command_parameter_list[1] == "b" and process_status > 1)then + max_aruments = SearchCommand:get_command_argument_count(self.command_parameter_list[2]) + argument_count = #self.command_parameter_list - 2 + elseif(self.command_parameter_list[1] == "c" and process_status > 1)then + max_aruments = SearchCommand:get_command_argument_count(self.command_parameter_list[2]) + argument_count = #self.command_parameter_list - 2 + else + max_aruments = SearchCommand:get_command_argument_count(self.command_parameter_list[1]) + argument_count = #self.command_parameter_list - 1 + end + + --debug("process_status"..process_status) + --debug("argument_count: "..argument_count) + --debug("name:"..self.command_parameter_list[1].." max:"..max_aruments) + + if(argument_count < max_aruments)then + input_search_string.input_string = "/"..final_command.." " + else + input_search_string.input_string = "/"..final_command + end + input_search_string:setFocusOnText() SearchCommand:close_modal(uiId) From 3ee035b156f6c5f29598ecab721b5f1466466f21 Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Mon, 26 Feb 2024 14:34:38 +0100 Subject: [PATCH 152/194] fixed: bad merge --- .../client/data/gamedev/interfaces_v3/search_command.lua | 8 -------- 1 file changed, 8 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index 61c9a1fcef..6333de4961 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -880,14 +880,6 @@ function SearchCommand:build_valid_command_list(command_input,uiId) else command_display = 1 end - elseif(self.commands_list[c][1] == "eScript")then - if(self.command_self == "?")then - command_display = 1 - else - command_display = 0 - end - else - command_display = 1 end end From 934499316a67b4ae5889c21237825ce7f20aad6f Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Mon, 26 Feb 2024 15:23:19 +0100 Subject: [PATCH 153/194] Changed: add servname for c command --- .../gamedev/interfaces_v3/search_command.lua | 53 ++++++++++++++----- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index 61c9a1fcef..be681df530 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -100,7 +100,7 @@ table.insert(SearchCommand.commands_list,{"client", ":DEV:SGM:GM:VG:PR:OBSERVER: --shard commands table.insert(SearchCommand.commands_list,{"shard", "player", "a_desc", "a", {{"Text:<Command>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "b_desc", "b", {{"Text:<Command>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "c_desc", "c", {{"Text:<TargetName>",""}}, {{"Text:<Command>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "c_desc", "c", {{"Text:<TargetName>(Atys/Yubo/Gingo/Rendor)",""}}, {{"Text:<Command>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "showOnline_desc", "showOnline", {{"1","showOnline_1_desc"}, {"2","showOnline_2_desc"},{"0","showOnline_0_desc"}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "setLeague_desc", "setLeague", {{"Text:<PlayerName>",""}}}) @@ -880,14 +880,6 @@ function SearchCommand:build_valid_command_list(command_input,uiId) else command_display = 1 end - elseif(self.commands_list[c][1] == "eScript")then - if(self.command_self == "?")then - command_display = 1 - else - command_display = 0 - end - else - command_display = 1 end end @@ -974,7 +966,29 @@ function SearchCommand:sort_valid_command_list(found_command_name) self.valid_commands_list = temp_sort_list end -function SearchCommand:build_valid_player_list(playername_input,uiId) +function SearchCommand:get_server_name() + local server_name = "ERROR" + local application = getClientCfgVar("Application") + --debug(application["0"]) + + if(application["0"] == "ryzom_test")then + server_name="Gingo" + elseif(application["0"] == "ryzom_dev")then + server_name="Yubo" + elseif(application["0"] == "ryzom_live")then + server_name="Atys" + elseif(application["0"] == "ryzom_beta")then + server_name="Atys" + elseif(application["0"] == "ryzom_staging")then + server_name="Rendor" + else + server_name="Unknow" + end + + return server_name +end + +function SearchCommand:build_valid_player_list(playername_input,uiId,add_targetname_prefix) self.valid_commands_list = {} local count_found=0 local found_playername=0 @@ -987,7 +1001,12 @@ function SearchCommand:build_valid_player_list(playername_input,uiId) count_found=1 else if string.find(string.lower(self.player_list[c]), string.lower(playername_input))then - table.insert(self.valid_commands_list,self.player_list[c]) + if(add_targetname_prefix == 1)then + local server_name=SearchCommand:get_server_name() + table.insert(self.valid_commands_list,self.player_list[c].."("..server_name..")") + else + table.insert(self.valid_commands_list,self.player_list[c]) + end count_found=count_found+1 end end @@ -1007,10 +1026,10 @@ function SearchCommand:build_valid_player_list(playername_input,uiId) return found_playername end -function SearchCommand:search_build_player_list(uiId,playername) +function SearchCommand:search_build_player_list(uiId,playername,add_targetname_prefix) local found_player=0 local found_command=0 - found_player=SearchCommand:build_valid_player_list(playername,uiId) + found_player=SearchCommand:build_valid_player_list(playername,uiId,add_targetname_prefix) SearchCommand:search_build_argument_list(uiId,self.command_self) @@ -1297,6 +1316,7 @@ function SearchCommand:build_command_helper(uiId) local player_priv = isPlayerPrivilege() local argu_name = "" local process_status=SearchCommand:read_process_status(uiId) + local add_targetname_prefix=0 --debug("process_status: "..process_status) --process_status == 0 only / identifyer found @@ -1330,7 +1350,12 @@ function SearchCommand:build_command_helper(uiId) SearchCommand:search_build_local_player_list() end - SearchCommand:search_build_player_list(uiId,self.command_parameter_list[process_status]) + if(string.find(string.lower(argu_name), string.lower("<TargetName>")))then + --its TargetName so we need add the ServerName after the player name + add_targetname_prefix=1 + end + + SearchCommand:search_build_player_list(uiId,self.command_parameter_list[process_status],add_targetname_prefix) elseif(string.find(string.lower(argu_name), string.lower("<ScriptCommand>")))then SearchCommand:search_build_command_list(uiId,self.command_parameter_list[process_status],false) From 98451a0fa8cb7aff46a51ee7bfb42a8a1714741f Mon Sep 17 00:00:00 2001 From: Rias Gremory <riasan@ryzom.com> Date: Mon, 26 Feb 2024 14:27:33 +0000 Subject: [PATCH 154/194] Chat command autocomplete --- .../gamedev/interfaces_v3/search_command.lua | 45 ++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index 6333de4961..be681df530 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -100,7 +100,7 @@ table.insert(SearchCommand.commands_list,{"client", ":DEV:SGM:GM:VG:PR:OBSERVER: --shard commands table.insert(SearchCommand.commands_list,{"shard", "player", "a_desc", "a", {{"Text:<Command>",""}}}) table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "b_desc", "b", {{"Text:<Command>",""}}}) -table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "c_desc", "c", {{"Text:<TargetName>",""}}, {{"Text:<Command>",""}}}) +table.insert(SearchCommand.commands_list,{"shard", ":DEV:SGM:GM:VG:PR:OBSERVER:EM:EG:TESTER:", "c_desc", "c", {{"Text:<TargetName>(Atys/Yubo/Gingo/Rendor)",""}}, {{"Text:<Command>",""}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "showOnline_desc", "showOnline", {{"1","showOnline_1_desc"}, {"2","showOnline_2_desc"},{"0","showOnline_0_desc"}}}) table.insert(SearchCommand.commands_list,{"shard", "player", "setLeague_desc", "setLeague", {{"Text:<PlayerName>",""}}}) @@ -966,7 +966,29 @@ function SearchCommand:sort_valid_command_list(found_command_name) self.valid_commands_list = temp_sort_list end -function SearchCommand:build_valid_player_list(playername_input,uiId) +function SearchCommand:get_server_name() + local server_name = "ERROR" + local application = getClientCfgVar("Application") + --debug(application["0"]) + + if(application["0"] == "ryzom_test")then + server_name="Gingo" + elseif(application["0"] == "ryzom_dev")then + server_name="Yubo" + elseif(application["0"] == "ryzom_live")then + server_name="Atys" + elseif(application["0"] == "ryzom_beta")then + server_name="Atys" + elseif(application["0"] == "ryzom_staging")then + server_name="Rendor" + else + server_name="Unknow" + end + + return server_name +end + +function SearchCommand:build_valid_player_list(playername_input,uiId,add_targetname_prefix) self.valid_commands_list = {} local count_found=0 local found_playername=0 @@ -979,7 +1001,12 @@ function SearchCommand:build_valid_player_list(playername_input,uiId) count_found=1 else if string.find(string.lower(self.player_list[c]), string.lower(playername_input))then - table.insert(self.valid_commands_list,self.player_list[c]) + if(add_targetname_prefix == 1)then + local server_name=SearchCommand:get_server_name() + table.insert(self.valid_commands_list,self.player_list[c].."("..server_name..")") + else + table.insert(self.valid_commands_list,self.player_list[c]) + end count_found=count_found+1 end end @@ -999,10 +1026,10 @@ function SearchCommand:build_valid_player_list(playername_input,uiId) return found_playername end -function SearchCommand:search_build_player_list(uiId,playername) +function SearchCommand:search_build_player_list(uiId,playername,add_targetname_prefix) local found_player=0 local found_command=0 - found_player=SearchCommand:build_valid_player_list(playername,uiId) + found_player=SearchCommand:build_valid_player_list(playername,uiId,add_targetname_prefix) SearchCommand:search_build_argument_list(uiId,self.command_self) @@ -1289,6 +1316,7 @@ function SearchCommand:build_command_helper(uiId) local player_priv = isPlayerPrivilege() local argu_name = "" local process_status=SearchCommand:read_process_status(uiId) + local add_targetname_prefix=0 --debug("process_status: "..process_status) --process_status == 0 only / identifyer found @@ -1322,7 +1350,12 @@ function SearchCommand:build_command_helper(uiId) SearchCommand:search_build_local_player_list() end - SearchCommand:search_build_player_list(uiId,self.command_parameter_list[process_status]) + if(string.find(string.lower(argu_name), string.lower("<TargetName>")))then + --its TargetName so we need add the ServerName after the player name + add_targetname_prefix=1 + end + + SearchCommand:search_build_player_list(uiId,self.command_parameter_list[process_status],add_targetname_prefix) elseif(string.find(string.lower(argu_name), string.lower("<ScriptCommand>")))then SearchCommand:search_build_command_list(uiId,self.command_parameter_list[process_status],false) From 80be618cb032f3b105b5de9586b0a571afb42636 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Wed, 20 Mar 2024 12:30:12 +0100 Subject: [PATCH 155/194] Revert coillisions stairs patch --- nel/include/nel/pacs/move_container.h | 2 +- nel/include/nel/pacs/move_primitive.h | 27 ------------- nel/include/nel/pacs/u_move_primitive.h | 14 ------- nel/src/pacs/move_container.cpp | 29 +++----------- nel/src/pacs/move_primitive.cpp | 7 ---- ryzom/client/src/character_cl.cpp | 4 +- ryzom/client/src/entities.cpp | 22 +---------- ryzom/client/src/entity_cl.cpp | 51 ------------------------- ryzom/client/src/entity_cl.h | 8 +--- ryzom/client/src/main_loop.cpp | 51 +++---------------------- 10 files changed, 17 insertions(+), 198 deletions(-) diff --git a/nel/include/nel/pacs/move_container.h b/nel/include/nel/pacs/move_container.h index f368dd5e9a..5193e8386c 100644 --- a/nel/include/nel/pacs/move_container.h +++ b/nel/include/nel/pacs/move_container.h @@ -244,7 +244,7 @@ class CMoveContainer: public UMoveContainer CCollisionOTStaticInfo *staticColInfo); // Add a trigger in the trigger array - bool newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType); + void newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType); // Clear modified primitive list void clearModifiedList (uint8 worldImage); diff --git a/nel/include/nel/pacs/move_primitive.h b/nel/include/nel/pacs/move_primitive.h index 928ed10fcc..aa153c076f 100644 --- a/nel/include/nel/pacs/move_primitive.h +++ b/nel/include/nel/pacs/move_primitive.h @@ -251,28 +251,6 @@ class CMovePrimitive: public UMovePrimitive _Height=height; } - void setZFinalPosition(float pos) - { - _ZFinalPosition = pos; - } - - float getZFinalPosition() - { - return _ZFinalPosition; - } - - - bool haveZOffset() - { - return _HaveZOffset; - } - - void enableZOffset(bool enabled) - { - _HaveZOffset = enabled; - } - - /** * Set the cylinder size. Only for cylinder. * @@ -488,11 +466,6 @@ class CMovePrimitive: public UMovePrimitive // Iteration count sint32 _IterationCount; - - float _ZOffset; - float _ZFinalPosition; - bool _HaveZOffset; - }; } // NLPACS diff --git a/nel/include/nel/pacs/u_move_primitive.h b/nel/include/nel/pacs/u_move_primitive.h index cba266174e..5a021daa82 100644 --- a/nel/include/nel/pacs/u_move_primitive.h +++ b/nel/include/nel/pacs/u_move_primitive.h @@ -114,12 +114,6 @@ class UMovePrimitive * This is an overlap trigger. This trigger is actived each time the object overlap the trigger. */ OverlapTrigger=0x400, - - /** - * This is an stairs trigger. This trigger is actived each time the object overlap the trigger and change Z position. - */ - OverlapStairsTrigger=0x800, - }; /** @@ -280,14 +274,6 @@ class UMovePrimitive */ virtual float getHeight () const =0; - virtual void setZFinalPosition(float pos) =0; - - virtual float getZFinalPosition() =0; - - virtual bool haveZOffset() =0; - - virtual void enableZOffset(bool enabled) =0; - /** * Set the cylinder size. Only for cylinder. * diff --git a/nel/src/pacs/move_container.cpp b/nel/src/pacs/move_container.cpp index c313fefb91..35b7ddcd6d 100644 --- a/nel/src/pacs/move_container.cpp +++ b/nel/src/pacs/move_container.cpp @@ -918,10 +918,8 @@ bool CMoveContainer::evalPrimAgainstPrimCollision (double beginTime, CMovePrimit || (otherPrimitive->getTriggerType()&UMovePrimitive::EnterTrigger)); bool exit = (beginTime<=lastTime) && (lastTime<_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::ExitTrigger) || (otherPrimitive->getTriggerType()&UMovePrimitive::ExitTrigger)); - bool overlap = ((firstTime<=beginTime) && (lastTime>_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::OverlapTrigger) - || (otherPrimitive->getTriggerType()&UMovePrimitive::OverlapTrigger)) || - (firstTime<=beginTime) && (lastTime>_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::OverlapStairsTrigger) - || (otherPrimitive->getTriggerType()&UMovePrimitive::OverlapStairsTrigger))); + bool overlap = (firstTime<=beginTime) && (lastTime>_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::OverlapTrigger) + || (otherPrimitive->getTriggerType()&UMovePrimitive::OverlapTrigger)); bool contact = ( beginTime<((firstTime+lastTime)/2) ) && (firstTime<=_DeltaTime); bool collision = contact && (primitive->isObstacle() && otherPrimitive->isObstacle ()); @@ -1213,7 +1211,7 @@ void CMoveContainer::newCollision (CMovePrimitive* first, const CCollisionSurfac // *************************************************************************** -bool CMoveContainer::newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType) +void CMoveContainer::newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType) { // Element index uint index=(uint)_Triggers.size(); @@ -1226,14 +1224,6 @@ bool CMoveContainer::newTrigger (CMovePrimitive* first, CMovePrimitive* second, _Triggers[index].Object1=second->UserData; _Triggers[index].CollisionDesc=desc; _Triggers[index].CollisionType = uint8(triggerType); - - - if (second->_StaticFlags&UMovePrimitive::OverlapStairsTrigger) { - nlinfo("Col Stairs height %f", second->getHeight()); - return true; - } - - return false; } // *************************************************************************** @@ -1669,17 +1659,8 @@ void CMoveContainer::reaction (const CCollisionOTInfo& first) newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::In); if (dynInfo->isExit()) newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Out); - if (dynInfo->isInside()) { - if (newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Inside)) - { - dynInfo->getFirstPrimitive()->enableZOffset(true); - CVectorD first_pos = dynInfo->getFirstPrimitive()->getFinalPosition(dynInfo->getFirstWorldImage()); - CVectorD second_pos = dynInfo->getSecondPrimitive()->getFinalPosition(dynInfo->getSecondWorldImage()); - dynInfo->getFirstPrimitive()->setZFinalPosition(second_pos.z+dynInfo->getSecondPrimitive()->getHeight()-10.0f); - } - } - if (dynInfo->isExit()) - newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Out); + if (dynInfo->isInside()) + newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Inside); } } } diff --git a/nel/src/pacs/move_primitive.cpp b/nel/src/pacs/move_primitive.cpp index 261d7bbf89..039fa0c7b8 100644 --- a/nel/src/pacs/move_primitive.cpp +++ b/nel/src/pacs/move_primitive.cpp @@ -49,8 +49,6 @@ CMovePrimitive::CMovePrimitive (CMoveContainer* container, uint8 firstWorldImage _StaticFlags=0; _RootOTInfo=NULL; _LastTestTime=0xffffffff; - _ZOffset = 0; - _HaveZOffset = false; // Ptr table alloc _WorldImages=_Container->allocateWorldImagesPtrs (numWorldImage); @@ -151,11 +149,6 @@ bool CMovePrimitive::isTriggered (CMovePrimitive& second, bool enter, bool exit) { // Generate a trigger ? - - // Is one of them is a stairs trigger ? - if ( second._StaticFlags&OverlapStairsTrigger ) - return true; - // Is the two are not triggers ? if ( ( (_StaticFlags&TriggerMask) == NotATrigger ) && ( (second._StaticFlags&TriggerMask) == NotATrigger ) ) return false; diff --git a/ryzom/client/src/character_cl.cpp b/ryzom/client/src/character_cl.cpp index 67a4422ee0..43cf7c1a70 100644 --- a/ryzom/client/src/character_cl.cpp +++ b/ryzom/client/src/character_cl.cpp @@ -430,7 +430,7 @@ void CCharacterCL::computePrimitive() // Initialize the primitive. if (_Sheet) { - initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, (UMovePrimitive::TTrigger)(UMovePrimitive::OverlapTrigger | UMovePrimitive::EnterTrigger), MaskColNpc, MaskColDoor, _Sheet->ClipRadius, _Sheet->ClipHeight); + initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, UMovePrimitive::NotATrigger, MaskColNpc, MaskColNone, _Sheet->ClipRadius, _Sheet->ClipHeight); } else { @@ -980,7 +980,7 @@ bool CCharacterCL::build(const CEntitySheet *sheet) // virtual _CustomScalePos *= getScale(); // Create PACS Primitive. - initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, (UMovePrimitive::TTrigger)(UMovePrimitive::OverlapTrigger | UMovePrimitive::EnterTrigger), MaskColNpc, MaskColDoor, _Sheet->ClipRadius, _Sheet->ClipHeight); + initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, UMovePrimitive::NotATrigger, MaskColNpc, MaskColNone, _Sheet->ClipRadius, _Sheet->ClipHeight); // Compute the element to be able to snap the entity to the ground. computeCollisionEntity(); diff --git a/ryzom/client/src/entities.cpp b/ryzom/client/src/entities.cpp index 06d9fe6210..95c44377e3 100644 --- a/ryzom/client/src/entities.cpp +++ b/ryzom/client/src/entities.cpp @@ -954,8 +954,6 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const float height = primitive->getHeight(); CVector size = CVector(width, depth, height); - if (primitive->getTriggerType() == UMovePrimitive::OverlapStairsTrigger) - size.z -= 10.0f; float v; if (getRelativeFloatFromString(values[i], v)) { @@ -965,8 +963,6 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const { updateVector(param, size, v, false); } - if (primitive->getTriggerType() == UMovePrimitive::OverlapStairsTrigger) - size.z += 10.0f; primitive->setSize(size.x, size.y); primitive->setHeight(size.z); } @@ -1037,23 +1033,9 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const fromString(values[i], active); primitive->setObstacle(active); } - else if (param == "col stairs") + else if (param == "col obstacle") { - bool active; - fromString(values[i], active); - primitive->setObstacle(!active); - if (active) - { - primitive->setReactionType(UMovePrimitive::DoNothing); - primitive->setTriggerType(UMovePrimitive::OverlapStairsTrigger); - primitive->setGlobalPosition(instance.getPos(), dynamicWI); - } - else - { - primitive->setReactionType(UMovePrimitive::Slide); - primitive->setTriggerType(UMovePrimitive::NotATrigger); - primitive->setGlobalPosition(instance.getPos(), dynamicWI); - } + } } diff --git a/ryzom/client/src/entity_cl.cpp b/ryzom/client/src/entity_cl.cpp index ec0bfcf5e8..b82d5482f3 100644 --- a/ryzom/client/src/entity_cl.cpp +++ b/ryzom/client/src/entity_cl.cpp @@ -740,8 +740,6 @@ void CEntityCL::init() _EntityName = "Name"; } _NameId = 0; - _LastSnapToGroup = 0; - _CurrentZOffset = 0; _PermanentStatutIcon.clear(); @@ -1480,20 +1478,8 @@ void CEntityCL::pacsMove(const CVectorD &vect) if ((fabs (deltaPos.x) > 0.05) || (fabs (deltaPos.y) > 0.05)) { _HasMoved = true; - _Primitive->enableZOffset(false); _Primitive->move (deltaPos, dynamicWI); } - else - { - // This code force the player to move even when not moving, it's used to trigger special collissions - if (isUser()) - { - _HasMoved = true; - deltaPos.x = 0.0001; - _Primitive->move (deltaPos, dynamicWI); - } - - } } else { @@ -1727,43 +1713,6 @@ void CEntityCL::snapToGround() pos().z = vect.z; } - if (_Primitive->haveZOffset()) - { - - if (_LastSnapToGroup > 0) - { - if (pos().z + _CurrentZOffset < _Primitive->getZFinalPosition()) - { - _CurrentZOffset += (ryzomGetLocalTime() - _LastSnapToGroup)/100.0f; - - if (pos().z + _CurrentZOffset > _Primitive->getZFinalPosition()) - _CurrentZOffset = _Primitive->getZFinalPosition() - pos().z; - } - - if (pos().z + _CurrentZOffset > _Primitive->getZFinalPosition()) - { - _CurrentZOffset -= (ryzomGetLocalTime() - _LastSnapToGroup)/100.0f; - - if (pos().z + _CurrentZOffset < _Primitive->getZFinalPosition()) - _CurrentZOffset = _Primitive->getZFinalPosition() - pos().z; - } - - pos().z += _CurrentZOffset; - } - } - else - { - if (_CurrentZOffset > 0) - { - _CurrentZOffset -= (ryzomGetLocalTime() - _LastSnapToGroup)/100.0f; - - if (_CurrentZOffset < 0) - _CurrentZOffset = 0; - pos().z += _CurrentZOffset; - } - } - _LastSnapToGroup = ryzomGetLocalTime(); - // Set the box position. posBox(pos()); }// snapToGround // diff --git a/ryzom/client/src/entity_cl.h b/ryzom/client/src/entity_cl.h index 092a85dd3c..f2f99b347d 100644 --- a/ryzom/client/src/entity_cl.h +++ b/ryzom/client/src/entity_cl.h @@ -241,7 +241,7 @@ class CEntityCL : public NLMISC::IStreamable, public STRING_MANAGER::IStringWait /// Return the persistent NPC alias of entity (0 if N/A). uint32 npcAlias() const {return _NPCAlias; } - /// Set the persistent NPC alias of the entity. + /// Set the persistent NPC alias of the entity. void npcAlias(uint32 alias) {_NPCAlias = alias; } /// Method to call to initialize all members of the right class. @@ -702,7 +702,7 @@ class CEntityCL : public NLMISC::IStreamable, public STRING_MANAGER::IStringWait // todo handle NPC entities // Return true if this entity is a NPC (not a fauna) bool isNPC () const { return Type == NPC; } - + // Return true if this entity can have missions icons (humanoid NPCs (including Karavan), Kami or Bot Object) bool canHaveMissionIcon() const { return isNPC() || isKami() || isUnknownRace(); } @@ -949,10 +949,6 @@ class CEntityCL : public NLMISC::IStreamable, public STRING_MANAGER::IStringWait uint32 _NameId; // Primitive used for the collision in PACS NLPACS::UMovePrimitive *_Primitive; - - uint64 _LastSnapToGroup; - float _CurrentZOffset; - // 3D Logic info for light request. CEntityLogicInfo3D _LogicInfo3D; // Box around the entity. diff --git a/ryzom/client/src/main_loop.cpp b/ryzom/client/src/main_loop.cpp index 6c1a09544a..56452ba4ac 100644 --- a/ryzom/client/src/main_loop.cpp +++ b/ryzom/client/src/main_loop.cpp @@ -1418,7 +1418,7 @@ bool mainLoop() MainCam.setTransformMode(UTransformable::RotQuat); CVector cameraMoves = UserEntity->getCameraMoves(); - + currViewPos.z += cameraMoves.z; MainCam.setPos(currViewPos); MainCam.setRotQuat(View.currentViewQuat()); @@ -1432,7 +1432,7 @@ bool mainLoop() } UserEntity->setCameraMoves(CVector(0, 0, 0)); - + if (StereoHMD) { CMatrix camMatrix; @@ -2979,41 +2979,15 @@ CVector PacsBox[PacsBoxPointCount] = CVector( 0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 0), CVector( -0.5f, -0.5f, 0), - CVector( -0.5f, -0.5f, 0), CVector( -0.5f, -0.5f, 1), - CVector( 0.5f, -0.5f, 0), CVector( 0.5f, -0.5f, 1), - CVector( 0.5f, 0.5f, 0), CVector( 0.5f, 0.5f, 1), - CVector( -0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 1), - CVector( -0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 1), CVector( 0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 1), CVector( -0.5f, -0.5f, 1), -}; - -const uint PacsStairPointCount = 32; - -CVector PacsStair[PacsStairPointCount] = -{ - CVector( -0.5f, -0.5f, 0), CVector( 0.5f, -0.5f, 0), - CVector( 0.5f, -0.5f, 0), CVector( 0.5f, 0.5f, 0), - CVector( 0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 0), - CVector( -0.5f, 0.5f, 0), CVector( -0.5f, -0.5f, 0), CVector( -0.5f, -0.5f, 0), CVector( -0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 0), CVector( 0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 0), CVector( 0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 1), - - CVector( -0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 1), - CVector( 0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 1), - CVector( 0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 1), - CVector( -0.5f, 0.5f, 1), CVector( -0.5f, -0.5f, 1), - - CVector( -0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 1), - CVector( -0.5f, 0.5f, 1), CVector( 0.5f, -0.5f, 1), - CVector( -0.5f, 0, 1), CVector( 0.5f, 0, 1), - CVector( 0, - 0.5f, 1), CVector( 0, 0.5f, 1), - }; const uint PacsCylPointCount = 48; @@ -3067,7 +3041,6 @@ void displayPACSPrimitive() // Distance CVector position = prim->getFinalPosition(wI); - bool isStairs = false; if ((position-UserEntity->pos()).sqrnorm() < (200*200)) { // Choose a color @@ -3075,14 +3048,8 @@ void displayPACSPrimitive() if (prim->isCollisionable()) { // Static collision - if (prim->getTriggerType() == UMovePrimitive::OverlapStairsTrigger) + if (prim->getReactionType() == UMovePrimitive::DoNothing) { - line.Color0 = CRGBA::Green; - isStairs = true; - position.z -= 10.0f; - } - else if (prim->getReactionType() == UMovePrimitive::DoNothing) - { line.Color0 = CRGBA::Red; } else @@ -3112,16 +3079,8 @@ void displayPACSPrimitive() // Draw the primitive if (prim->getPrimitiveType() == UMovePrimitive::_2DOrientedBox) { - if (isStairs) - { - lines = PacsStair; - linecount = PacsStairPointCount/2; - } - else - { - lines = PacsBox; - linecount = PacsBoxPointCount/2; - } + lines = PacsBox; + linecount = PacsBoxPointCount/2; float width; float depth; prim->getSize (width, depth); From d2a382f0ed634dd7ccf39c5bb665a96d8c3bed18 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Wed, 20 Mar 2024 14:56:43 +0100 Subject: [PATCH 156/194] Revert fix --- ryzom/client/src/door_manager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ryzom/client/src/door_manager.cpp b/ryzom/client/src/door_manager.cpp index d4d5d0a7c0..1b094ad7b9 100644 --- a/ryzom/client/src/door_manager.cpp +++ b/ryzom/client/src/door_manager.cpp @@ -218,7 +218,7 @@ void CDoorManager::SDoor::entityCollide(CEntityCL *pE) // *************************************************************************** void CDoorManager::SDoor::checkToClose() { - /*for (sint i = 0; i < (sint)Entities.size(); ++i) + for (sint i = 0; i < (sint)Entities.size(); ++i) { if (EntitiesMoved[i] == 0) // No trigger moved { @@ -238,7 +238,7 @@ void CDoorManager::SDoor::checkToClose() if (Entities.empty()) close(); - else*/ + else open(); } From 4e7ee34118c88dee81749d5eae82ad3c3deab6ff Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Wed, 20 Mar 2024 14:56:43 +0100 Subject: [PATCH 157/194] Revert fix --- ryzom/client/src/door_manager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ryzom/client/src/door_manager.cpp b/ryzom/client/src/door_manager.cpp index d4d5d0a7c0..1b094ad7b9 100644 --- a/ryzom/client/src/door_manager.cpp +++ b/ryzom/client/src/door_manager.cpp @@ -218,7 +218,7 @@ void CDoorManager::SDoor::entityCollide(CEntityCL *pE) // *************************************************************************** void CDoorManager::SDoor::checkToClose() { - /*for (sint i = 0; i < (sint)Entities.size(); ++i) + for (sint i = 0; i < (sint)Entities.size(); ++i) { if (EntitiesMoved[i] == 0) // No trigger moved { @@ -238,7 +238,7 @@ void CDoorManager::SDoor::checkToClose() if (Entities.empty()) close(); - else*/ + else open(); } From acaedc0eb4940e68e4083d0019b754c4d367131f Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Thu, 21 Mar 2024 18:00:18 +0100 Subject: [PATCH 158/194] Revert "Revert coillisions stairs patch" This reverts commit 80be618cb032f3b105b5de9586b0a571afb42636. --- nel/include/nel/pacs/move_container.h | 2 +- nel/include/nel/pacs/move_primitive.h | 27 +++++++++++++ nel/include/nel/pacs/u_move_primitive.h | 14 +++++++ nel/src/pacs/move_container.cpp | 29 +++++++++++--- nel/src/pacs/move_primitive.cpp | 7 ++++ ryzom/client/src/character_cl.cpp | 4 +- ryzom/client/src/entities.cpp | 22 ++++++++++- ryzom/client/src/entity_cl.cpp | 51 +++++++++++++++++++++++++ ryzom/client/src/entity_cl.h | 8 +++- ryzom/client/src/main_loop.cpp | 51 ++++++++++++++++++++++--- 10 files changed, 198 insertions(+), 17 deletions(-) diff --git a/nel/include/nel/pacs/move_container.h b/nel/include/nel/pacs/move_container.h index 5193e8386c..f368dd5e9a 100644 --- a/nel/include/nel/pacs/move_container.h +++ b/nel/include/nel/pacs/move_container.h @@ -244,7 +244,7 @@ class CMoveContainer: public UMoveContainer CCollisionOTStaticInfo *staticColInfo); // Add a trigger in the trigger array - void newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType); + bool newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType); // Clear modified primitive list void clearModifiedList (uint8 worldImage); diff --git a/nel/include/nel/pacs/move_primitive.h b/nel/include/nel/pacs/move_primitive.h index aa153c076f..928ed10fcc 100644 --- a/nel/include/nel/pacs/move_primitive.h +++ b/nel/include/nel/pacs/move_primitive.h @@ -251,6 +251,28 @@ class CMovePrimitive: public UMovePrimitive _Height=height; } + void setZFinalPosition(float pos) + { + _ZFinalPosition = pos; + } + + float getZFinalPosition() + { + return _ZFinalPosition; + } + + + bool haveZOffset() + { + return _HaveZOffset; + } + + void enableZOffset(bool enabled) + { + _HaveZOffset = enabled; + } + + /** * Set the cylinder size. Only for cylinder. * @@ -466,6 +488,11 @@ class CMovePrimitive: public UMovePrimitive // Iteration count sint32 _IterationCount; + + float _ZOffset; + float _ZFinalPosition; + bool _HaveZOffset; + }; } // NLPACS diff --git a/nel/include/nel/pacs/u_move_primitive.h b/nel/include/nel/pacs/u_move_primitive.h index 5a021daa82..cba266174e 100644 --- a/nel/include/nel/pacs/u_move_primitive.h +++ b/nel/include/nel/pacs/u_move_primitive.h @@ -114,6 +114,12 @@ class UMovePrimitive * This is an overlap trigger. This trigger is actived each time the object overlap the trigger. */ OverlapTrigger=0x400, + + /** + * This is an stairs trigger. This trigger is actived each time the object overlap the trigger and change Z position. + */ + OverlapStairsTrigger=0x800, + }; /** @@ -274,6 +280,14 @@ class UMovePrimitive */ virtual float getHeight () const =0; + virtual void setZFinalPosition(float pos) =0; + + virtual float getZFinalPosition() =0; + + virtual bool haveZOffset() =0; + + virtual void enableZOffset(bool enabled) =0; + /** * Set the cylinder size. Only for cylinder. * diff --git a/nel/src/pacs/move_container.cpp b/nel/src/pacs/move_container.cpp index 35b7ddcd6d..c313fefb91 100644 --- a/nel/src/pacs/move_container.cpp +++ b/nel/src/pacs/move_container.cpp @@ -918,8 +918,10 @@ bool CMoveContainer::evalPrimAgainstPrimCollision (double beginTime, CMovePrimit || (otherPrimitive->getTriggerType()&UMovePrimitive::EnterTrigger)); bool exit = (beginTime<=lastTime) && (lastTime<_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::ExitTrigger) || (otherPrimitive->getTriggerType()&UMovePrimitive::ExitTrigger)); - bool overlap = (firstTime<=beginTime) && (lastTime>_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::OverlapTrigger) - || (otherPrimitive->getTriggerType()&UMovePrimitive::OverlapTrigger)); + bool overlap = ((firstTime<=beginTime) && (lastTime>_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::OverlapTrigger) + || (otherPrimitive->getTriggerType()&UMovePrimitive::OverlapTrigger)) || + (firstTime<=beginTime) && (lastTime>_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::OverlapStairsTrigger) + || (otherPrimitive->getTriggerType()&UMovePrimitive::OverlapStairsTrigger))); bool contact = ( beginTime<((firstTime+lastTime)/2) ) && (firstTime<=_DeltaTime); bool collision = contact && (primitive->isObstacle() && otherPrimitive->isObstacle ()); @@ -1211,7 +1213,7 @@ void CMoveContainer::newCollision (CMovePrimitive* first, const CCollisionSurfac // *************************************************************************** -void CMoveContainer::newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType) +bool CMoveContainer::newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType) { // Element index uint index=(uint)_Triggers.size(); @@ -1224,6 +1226,14 @@ void CMoveContainer::newTrigger (CMovePrimitive* first, CMovePrimitive* second, _Triggers[index].Object1=second->UserData; _Triggers[index].CollisionDesc=desc; _Triggers[index].CollisionType = uint8(triggerType); + + + if (second->_StaticFlags&UMovePrimitive::OverlapStairsTrigger) { + nlinfo("Col Stairs height %f", second->getHeight()); + return true; + } + + return false; } // *************************************************************************** @@ -1659,8 +1669,17 @@ void CMoveContainer::reaction (const CCollisionOTInfo& first) newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::In); if (dynInfo->isExit()) newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Out); - if (dynInfo->isInside()) - newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Inside); + if (dynInfo->isInside()) { + if (newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Inside)) + { + dynInfo->getFirstPrimitive()->enableZOffset(true); + CVectorD first_pos = dynInfo->getFirstPrimitive()->getFinalPosition(dynInfo->getFirstWorldImage()); + CVectorD second_pos = dynInfo->getSecondPrimitive()->getFinalPosition(dynInfo->getSecondWorldImage()); + dynInfo->getFirstPrimitive()->setZFinalPosition(second_pos.z+dynInfo->getSecondPrimitive()->getHeight()-10.0f); + } + } + if (dynInfo->isExit()) + newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Out); } } } diff --git a/nel/src/pacs/move_primitive.cpp b/nel/src/pacs/move_primitive.cpp index 039fa0c7b8..261d7bbf89 100644 --- a/nel/src/pacs/move_primitive.cpp +++ b/nel/src/pacs/move_primitive.cpp @@ -49,6 +49,8 @@ CMovePrimitive::CMovePrimitive (CMoveContainer* container, uint8 firstWorldImage _StaticFlags=0; _RootOTInfo=NULL; _LastTestTime=0xffffffff; + _ZOffset = 0; + _HaveZOffset = false; // Ptr table alloc _WorldImages=_Container->allocateWorldImagesPtrs (numWorldImage); @@ -149,6 +151,11 @@ bool CMovePrimitive::isTriggered (CMovePrimitive& second, bool enter, bool exit) { // Generate a trigger ? + + // Is one of them is a stairs trigger ? + if ( second._StaticFlags&OverlapStairsTrigger ) + return true; + // Is the two are not triggers ? if ( ( (_StaticFlags&TriggerMask) == NotATrigger ) && ( (second._StaticFlags&TriggerMask) == NotATrigger ) ) return false; diff --git a/ryzom/client/src/character_cl.cpp b/ryzom/client/src/character_cl.cpp index 43cf7c1a70..67a4422ee0 100644 --- a/ryzom/client/src/character_cl.cpp +++ b/ryzom/client/src/character_cl.cpp @@ -430,7 +430,7 @@ void CCharacterCL::computePrimitive() // Initialize the primitive. if (_Sheet) { - initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, UMovePrimitive::NotATrigger, MaskColNpc, MaskColNone, _Sheet->ClipRadius, _Sheet->ClipHeight); + initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, (UMovePrimitive::TTrigger)(UMovePrimitive::OverlapTrigger | UMovePrimitive::EnterTrigger), MaskColNpc, MaskColDoor, _Sheet->ClipRadius, _Sheet->ClipHeight); } else { @@ -980,7 +980,7 @@ bool CCharacterCL::build(const CEntitySheet *sheet) // virtual _CustomScalePos *= getScale(); // Create PACS Primitive. - initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, UMovePrimitive::NotATrigger, MaskColNpc, MaskColNone, _Sheet->ClipRadius, _Sheet->ClipHeight); + initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, (UMovePrimitive::TTrigger)(UMovePrimitive::OverlapTrigger | UMovePrimitive::EnterTrigger), MaskColNpc, MaskColDoor, _Sheet->ClipRadius, _Sheet->ClipHeight); // Compute the element to be able to snap the entity to the ground. computeCollisionEntity(); diff --git a/ryzom/client/src/entities.cpp b/ryzom/client/src/entities.cpp index 95c44377e3..06d9fe6210 100644 --- a/ryzom/client/src/entities.cpp +++ b/ryzom/client/src/entities.cpp @@ -954,6 +954,8 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const float height = primitive->getHeight(); CVector size = CVector(width, depth, height); + if (primitive->getTriggerType() == UMovePrimitive::OverlapStairsTrigger) + size.z -= 10.0f; float v; if (getRelativeFloatFromString(values[i], v)) { @@ -963,6 +965,8 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const { updateVector(param, size, v, false); } + if (primitive->getTriggerType() == UMovePrimitive::OverlapStairsTrigger) + size.z += 10.0f; primitive->setSize(size.x, size.y); primitive->setHeight(size.z); } @@ -1033,9 +1037,23 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const fromString(values[i], active); primitive->setObstacle(active); } - else if (param == "col obstacle") + else if (param == "col stairs") { - + bool active; + fromString(values[i], active); + primitive->setObstacle(!active); + if (active) + { + primitive->setReactionType(UMovePrimitive::DoNothing); + primitive->setTriggerType(UMovePrimitive::OverlapStairsTrigger); + primitive->setGlobalPosition(instance.getPos(), dynamicWI); + } + else + { + primitive->setReactionType(UMovePrimitive::Slide); + primitive->setTriggerType(UMovePrimitive::NotATrigger); + primitive->setGlobalPosition(instance.getPos(), dynamicWI); + } } } diff --git a/ryzom/client/src/entity_cl.cpp b/ryzom/client/src/entity_cl.cpp index b82d5482f3..ec0bfcf5e8 100644 --- a/ryzom/client/src/entity_cl.cpp +++ b/ryzom/client/src/entity_cl.cpp @@ -740,6 +740,8 @@ void CEntityCL::init() _EntityName = "Name"; } _NameId = 0; + _LastSnapToGroup = 0; + _CurrentZOffset = 0; _PermanentStatutIcon.clear(); @@ -1478,8 +1480,20 @@ void CEntityCL::pacsMove(const CVectorD &vect) if ((fabs (deltaPos.x) > 0.05) || (fabs (deltaPos.y) > 0.05)) { _HasMoved = true; + _Primitive->enableZOffset(false); _Primitive->move (deltaPos, dynamicWI); } + else + { + // This code force the player to move even when not moving, it's used to trigger special collissions + if (isUser()) + { + _HasMoved = true; + deltaPos.x = 0.0001; + _Primitive->move (deltaPos, dynamicWI); + } + + } } else { @@ -1713,6 +1727,43 @@ void CEntityCL::snapToGround() pos().z = vect.z; } + if (_Primitive->haveZOffset()) + { + + if (_LastSnapToGroup > 0) + { + if (pos().z + _CurrentZOffset < _Primitive->getZFinalPosition()) + { + _CurrentZOffset += (ryzomGetLocalTime() - _LastSnapToGroup)/100.0f; + + if (pos().z + _CurrentZOffset > _Primitive->getZFinalPosition()) + _CurrentZOffset = _Primitive->getZFinalPosition() - pos().z; + } + + if (pos().z + _CurrentZOffset > _Primitive->getZFinalPosition()) + { + _CurrentZOffset -= (ryzomGetLocalTime() - _LastSnapToGroup)/100.0f; + + if (pos().z + _CurrentZOffset < _Primitive->getZFinalPosition()) + _CurrentZOffset = _Primitive->getZFinalPosition() - pos().z; + } + + pos().z += _CurrentZOffset; + } + } + else + { + if (_CurrentZOffset > 0) + { + _CurrentZOffset -= (ryzomGetLocalTime() - _LastSnapToGroup)/100.0f; + + if (_CurrentZOffset < 0) + _CurrentZOffset = 0; + pos().z += _CurrentZOffset; + } + } + _LastSnapToGroup = ryzomGetLocalTime(); + // Set the box position. posBox(pos()); }// snapToGround // diff --git a/ryzom/client/src/entity_cl.h b/ryzom/client/src/entity_cl.h index f2f99b347d..092a85dd3c 100644 --- a/ryzom/client/src/entity_cl.h +++ b/ryzom/client/src/entity_cl.h @@ -241,7 +241,7 @@ class CEntityCL : public NLMISC::IStreamable, public STRING_MANAGER::IStringWait /// Return the persistent NPC alias of entity (0 if N/A). uint32 npcAlias() const {return _NPCAlias; } - /// Set the persistent NPC alias of the entity. + /// Set the persistent NPC alias of the entity. void npcAlias(uint32 alias) {_NPCAlias = alias; } /// Method to call to initialize all members of the right class. @@ -702,7 +702,7 @@ class CEntityCL : public NLMISC::IStreamable, public STRING_MANAGER::IStringWait // todo handle NPC entities // Return true if this entity is a NPC (not a fauna) bool isNPC () const { return Type == NPC; } - + // Return true if this entity can have missions icons (humanoid NPCs (including Karavan), Kami or Bot Object) bool canHaveMissionIcon() const { return isNPC() || isKami() || isUnknownRace(); } @@ -949,6 +949,10 @@ class CEntityCL : public NLMISC::IStreamable, public STRING_MANAGER::IStringWait uint32 _NameId; // Primitive used for the collision in PACS NLPACS::UMovePrimitive *_Primitive; + + uint64 _LastSnapToGroup; + float _CurrentZOffset; + // 3D Logic info for light request. CEntityLogicInfo3D _LogicInfo3D; // Box around the entity. diff --git a/ryzom/client/src/main_loop.cpp b/ryzom/client/src/main_loop.cpp index 56452ba4ac..6c1a09544a 100644 --- a/ryzom/client/src/main_loop.cpp +++ b/ryzom/client/src/main_loop.cpp @@ -1418,7 +1418,7 @@ bool mainLoop() MainCam.setTransformMode(UTransformable::RotQuat); CVector cameraMoves = UserEntity->getCameraMoves(); - + currViewPos.z += cameraMoves.z; MainCam.setPos(currViewPos); MainCam.setRotQuat(View.currentViewQuat()); @@ -1432,7 +1432,7 @@ bool mainLoop() } UserEntity->setCameraMoves(CVector(0, 0, 0)); - + if (StereoHMD) { CMatrix camMatrix; @@ -2979,15 +2979,41 @@ CVector PacsBox[PacsBoxPointCount] = CVector( 0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 0), CVector( -0.5f, -0.5f, 0), + CVector( -0.5f, -0.5f, 0), CVector( -0.5f, -0.5f, 1), + CVector( 0.5f, -0.5f, 0), CVector( 0.5f, -0.5f, 1), + CVector( 0.5f, 0.5f, 0), CVector( 0.5f, 0.5f, 1), + CVector( -0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 1), + CVector( -0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 1), CVector( 0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 1), CVector( -0.5f, -0.5f, 1), +}; + +const uint PacsStairPointCount = 32; + +CVector PacsStair[PacsStairPointCount] = +{ + CVector( -0.5f, -0.5f, 0), CVector( 0.5f, -0.5f, 0), + CVector( 0.5f, -0.5f, 0), CVector( 0.5f, 0.5f, 0), + CVector( 0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 0), + CVector( -0.5f, 0.5f, 0), CVector( -0.5f, -0.5f, 0), CVector( -0.5f, -0.5f, 0), CVector( -0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 0), CVector( 0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 0), CVector( 0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 1), + + CVector( -0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 1), + CVector( 0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 1), + CVector( 0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 1), + CVector( -0.5f, 0.5f, 1), CVector( -0.5f, -0.5f, 1), + + CVector( -0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 1), + CVector( -0.5f, 0.5f, 1), CVector( 0.5f, -0.5f, 1), + CVector( -0.5f, 0, 1), CVector( 0.5f, 0, 1), + CVector( 0, - 0.5f, 1), CVector( 0, 0.5f, 1), + }; const uint PacsCylPointCount = 48; @@ -3041,6 +3067,7 @@ void displayPACSPrimitive() // Distance CVector position = prim->getFinalPosition(wI); + bool isStairs = false; if ((position-UserEntity->pos()).sqrnorm() < (200*200)) { // Choose a color @@ -3048,8 +3075,14 @@ void displayPACSPrimitive() if (prim->isCollisionable()) { // Static collision - if (prim->getReactionType() == UMovePrimitive::DoNothing) + if (prim->getTriggerType() == UMovePrimitive::OverlapStairsTrigger) { + line.Color0 = CRGBA::Green; + isStairs = true; + position.z -= 10.0f; + } + else if (prim->getReactionType() == UMovePrimitive::DoNothing) + { line.Color0 = CRGBA::Red; } else @@ -3079,8 +3112,16 @@ void displayPACSPrimitive() // Draw the primitive if (prim->getPrimitiveType() == UMovePrimitive::_2DOrientedBox) { - lines = PacsBox; - linecount = PacsBoxPointCount/2; + if (isStairs) + { + lines = PacsStair; + linecount = PacsStairPointCount/2; + } + else + { + lines = PacsBox; + linecount = PacsBoxPointCount/2; + } float width; float depth; prim->getSize (width, depth); From 85e4bc4c258575c8670daabb2477c6b621f70801 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Thu, 21 Mar 2024 18:00:27 +0100 Subject: [PATCH 159/194] Revert "Revert fix" This reverts commit 4e7ee34118c88dee81749d5eae82ad3c3deab6ff. --- ryzom/client/src/door_manager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ryzom/client/src/door_manager.cpp b/ryzom/client/src/door_manager.cpp index 1b094ad7b9..d4d5d0a7c0 100644 --- a/ryzom/client/src/door_manager.cpp +++ b/ryzom/client/src/door_manager.cpp @@ -218,7 +218,7 @@ void CDoorManager::SDoor::entityCollide(CEntityCL *pE) // *************************************************************************** void CDoorManager::SDoor::checkToClose() { - for (sint i = 0; i < (sint)Entities.size(); ++i) + /*for (sint i = 0; i < (sint)Entities.size(); ++i) { if (EntitiesMoved[i] == 0) // No trigger moved { @@ -238,7 +238,7 @@ void CDoorManager::SDoor::checkToClose() if (Entities.empty()) close(); - else + else*/ open(); } From ec055a29d9b6c1bbee1055c463be6ef63f1f2194 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Fri, 22 Mar 2024 12:32:20 +0100 Subject: [PATCH 160/194] Revert "Revert "Revert fix"" This reverts commit 85e4bc4c258575c8670daabb2477c6b621f70801. --- ryzom/client/src/door_manager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ryzom/client/src/door_manager.cpp b/ryzom/client/src/door_manager.cpp index d4d5d0a7c0..1b094ad7b9 100644 --- a/ryzom/client/src/door_manager.cpp +++ b/ryzom/client/src/door_manager.cpp @@ -218,7 +218,7 @@ void CDoorManager::SDoor::entityCollide(CEntityCL *pE) // *************************************************************************** void CDoorManager::SDoor::checkToClose() { - /*for (sint i = 0; i < (sint)Entities.size(); ++i) + for (sint i = 0; i < (sint)Entities.size(); ++i) { if (EntitiesMoved[i] == 0) // No trigger moved { @@ -238,7 +238,7 @@ void CDoorManager::SDoor::checkToClose() if (Entities.empty()) close(); - else*/ + else open(); } From 7db8573c4ac6b4faf3d2a8eee9642622fe840a56 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Fri, 22 Mar 2024 12:32:27 +0100 Subject: [PATCH 161/194] Revert "Revert "Revert coillisions stairs patch"" This reverts commit acaedc0eb4940e68e4083d0019b754c4d367131f. --- nel/include/nel/pacs/move_container.h | 2 +- nel/include/nel/pacs/move_primitive.h | 27 ------------- nel/include/nel/pacs/u_move_primitive.h | 14 ------- nel/src/pacs/move_container.cpp | 29 +++----------- nel/src/pacs/move_primitive.cpp | 7 ---- ryzom/client/src/character_cl.cpp | 4 +- ryzom/client/src/entities.cpp | 22 +---------- ryzom/client/src/entity_cl.cpp | 51 ------------------------- ryzom/client/src/entity_cl.h | 8 +--- ryzom/client/src/main_loop.cpp | 51 +++---------------------- 10 files changed, 17 insertions(+), 198 deletions(-) diff --git a/nel/include/nel/pacs/move_container.h b/nel/include/nel/pacs/move_container.h index f368dd5e9a..5193e8386c 100644 --- a/nel/include/nel/pacs/move_container.h +++ b/nel/include/nel/pacs/move_container.h @@ -244,7 +244,7 @@ class CMoveContainer: public UMoveContainer CCollisionOTStaticInfo *staticColInfo); // Add a trigger in the trigger array - bool newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType); + void newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType); // Clear modified primitive list void clearModifiedList (uint8 worldImage); diff --git a/nel/include/nel/pacs/move_primitive.h b/nel/include/nel/pacs/move_primitive.h index 928ed10fcc..aa153c076f 100644 --- a/nel/include/nel/pacs/move_primitive.h +++ b/nel/include/nel/pacs/move_primitive.h @@ -251,28 +251,6 @@ class CMovePrimitive: public UMovePrimitive _Height=height; } - void setZFinalPosition(float pos) - { - _ZFinalPosition = pos; - } - - float getZFinalPosition() - { - return _ZFinalPosition; - } - - - bool haveZOffset() - { - return _HaveZOffset; - } - - void enableZOffset(bool enabled) - { - _HaveZOffset = enabled; - } - - /** * Set the cylinder size. Only for cylinder. * @@ -488,11 +466,6 @@ class CMovePrimitive: public UMovePrimitive // Iteration count sint32 _IterationCount; - - float _ZOffset; - float _ZFinalPosition; - bool _HaveZOffset; - }; } // NLPACS diff --git a/nel/include/nel/pacs/u_move_primitive.h b/nel/include/nel/pacs/u_move_primitive.h index cba266174e..5a021daa82 100644 --- a/nel/include/nel/pacs/u_move_primitive.h +++ b/nel/include/nel/pacs/u_move_primitive.h @@ -114,12 +114,6 @@ class UMovePrimitive * This is an overlap trigger. This trigger is actived each time the object overlap the trigger. */ OverlapTrigger=0x400, - - /** - * This is an stairs trigger. This trigger is actived each time the object overlap the trigger and change Z position. - */ - OverlapStairsTrigger=0x800, - }; /** @@ -280,14 +274,6 @@ class UMovePrimitive */ virtual float getHeight () const =0; - virtual void setZFinalPosition(float pos) =0; - - virtual float getZFinalPosition() =0; - - virtual bool haveZOffset() =0; - - virtual void enableZOffset(bool enabled) =0; - /** * Set the cylinder size. Only for cylinder. * diff --git a/nel/src/pacs/move_container.cpp b/nel/src/pacs/move_container.cpp index c313fefb91..35b7ddcd6d 100644 --- a/nel/src/pacs/move_container.cpp +++ b/nel/src/pacs/move_container.cpp @@ -918,10 +918,8 @@ bool CMoveContainer::evalPrimAgainstPrimCollision (double beginTime, CMovePrimit || (otherPrimitive->getTriggerType()&UMovePrimitive::EnterTrigger)); bool exit = (beginTime<=lastTime) && (lastTime<_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::ExitTrigger) || (otherPrimitive->getTriggerType()&UMovePrimitive::ExitTrigger)); - bool overlap = ((firstTime<=beginTime) && (lastTime>_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::OverlapTrigger) - || (otherPrimitive->getTriggerType()&UMovePrimitive::OverlapTrigger)) || - (firstTime<=beginTime) && (lastTime>_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::OverlapStairsTrigger) - || (otherPrimitive->getTriggerType()&UMovePrimitive::OverlapStairsTrigger))); + bool overlap = (firstTime<=beginTime) && (lastTime>_DeltaTime) && ((primitive->getTriggerType()&UMovePrimitive::OverlapTrigger) + || (otherPrimitive->getTriggerType()&UMovePrimitive::OverlapTrigger)); bool contact = ( beginTime<((firstTime+lastTime)/2) ) && (firstTime<=_DeltaTime); bool collision = contact && (primitive->isObstacle() && otherPrimitive->isObstacle ()); @@ -1213,7 +1211,7 @@ void CMoveContainer::newCollision (CMovePrimitive* first, const CCollisionSurfac // *************************************************************************** -bool CMoveContainer::newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType) +void CMoveContainer::newTrigger (CMovePrimitive* first, CMovePrimitive* second, const CCollisionDesc& desc, uint triggerType) { // Element index uint index=(uint)_Triggers.size(); @@ -1226,14 +1224,6 @@ bool CMoveContainer::newTrigger (CMovePrimitive* first, CMovePrimitive* second, _Triggers[index].Object1=second->UserData; _Triggers[index].CollisionDesc=desc; _Triggers[index].CollisionType = uint8(triggerType); - - - if (second->_StaticFlags&UMovePrimitive::OverlapStairsTrigger) { - nlinfo("Col Stairs height %f", second->getHeight()); - return true; - } - - return false; } // *************************************************************************** @@ -1669,17 +1659,8 @@ void CMoveContainer::reaction (const CCollisionOTInfo& first) newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::In); if (dynInfo->isExit()) newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Out); - if (dynInfo->isInside()) { - if (newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Inside)) - { - dynInfo->getFirstPrimitive()->enableZOffset(true); - CVectorD first_pos = dynInfo->getFirstPrimitive()->getFinalPosition(dynInfo->getFirstWorldImage()); - CVectorD second_pos = dynInfo->getSecondPrimitive()->getFinalPosition(dynInfo->getSecondWorldImage()); - dynInfo->getFirstPrimitive()->setZFinalPosition(second_pos.z+dynInfo->getSecondPrimitive()->getHeight()-10.0f); - } - } - if (dynInfo->isExit()) - newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Out); + if (dynInfo->isInside()) + newTrigger (dynInfo->getFirstPrimitive (), dynInfo->getSecondPrimitive (), dynInfo->getCollisionDesc (), UTriggerInfo::Inside); } } } diff --git a/nel/src/pacs/move_primitive.cpp b/nel/src/pacs/move_primitive.cpp index 261d7bbf89..039fa0c7b8 100644 --- a/nel/src/pacs/move_primitive.cpp +++ b/nel/src/pacs/move_primitive.cpp @@ -49,8 +49,6 @@ CMovePrimitive::CMovePrimitive (CMoveContainer* container, uint8 firstWorldImage _StaticFlags=0; _RootOTInfo=NULL; _LastTestTime=0xffffffff; - _ZOffset = 0; - _HaveZOffset = false; // Ptr table alloc _WorldImages=_Container->allocateWorldImagesPtrs (numWorldImage); @@ -151,11 +149,6 @@ bool CMovePrimitive::isTriggered (CMovePrimitive& second, bool enter, bool exit) { // Generate a trigger ? - - // Is one of them is a stairs trigger ? - if ( second._StaticFlags&OverlapStairsTrigger ) - return true; - // Is the two are not triggers ? if ( ( (_StaticFlags&TriggerMask) == NotATrigger ) && ( (second._StaticFlags&TriggerMask) == NotATrigger ) ) return false; diff --git a/ryzom/client/src/character_cl.cpp b/ryzom/client/src/character_cl.cpp index 67a4422ee0..43cf7c1a70 100644 --- a/ryzom/client/src/character_cl.cpp +++ b/ryzom/client/src/character_cl.cpp @@ -430,7 +430,7 @@ void CCharacterCL::computePrimitive() // Initialize the primitive. if (_Sheet) { - initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, (UMovePrimitive::TTrigger)(UMovePrimitive::OverlapTrigger | UMovePrimitive::EnterTrigger), MaskColNpc, MaskColDoor, _Sheet->ClipRadius, _Sheet->ClipHeight); + initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, UMovePrimitive::NotATrigger, MaskColNpc, MaskColNone, _Sheet->ClipRadius, _Sheet->ClipHeight); } else { @@ -980,7 +980,7 @@ bool CCharacterCL::build(const CEntitySheet *sheet) // virtual _CustomScalePos *= getScale(); // Create PACS Primitive. - initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, (UMovePrimitive::TTrigger)(UMovePrimitive::OverlapTrigger | UMovePrimitive::EnterTrigger), MaskColNpc, MaskColDoor, _Sheet->ClipRadius, _Sheet->ClipHeight); + initPrimitive(_Sheet->ColRadius*getScale(), _Sheet->ColHeight*getScale(), _Sheet->ColLength, _Sheet->ColWidth, UMovePrimitive::DoNothing, UMovePrimitive::NotATrigger, MaskColNpc, MaskColNone, _Sheet->ClipRadius, _Sheet->ClipHeight); // Compute the element to be able to snap the entity to the ground. computeCollisionEntity(); diff --git a/ryzom/client/src/entities.cpp b/ryzom/client/src/entities.cpp index 06d9fe6210..95c44377e3 100644 --- a/ryzom/client/src/entities.cpp +++ b/ryzom/client/src/entities.cpp @@ -954,8 +954,6 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const float height = primitive->getHeight(); CVector size = CVector(width, depth, height); - if (primitive->getTriggerType() == UMovePrimitive::OverlapStairsTrigger) - size.z -= 10.0f; float v; if (getRelativeFloatFromString(values[i], v)) { @@ -965,8 +963,6 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const { updateVector(param, size, v, false); } - if (primitive->getTriggerType() == UMovePrimitive::OverlapStairsTrigger) - size.z += 10.0f; primitive->setSize(size.x, size.y); primitive->setHeight(size.z); } @@ -1037,23 +1033,9 @@ bool CEntityManager::setupInstance(uint32 idx, const vector<string> &keys, const fromString(values[i], active); primitive->setObstacle(active); } - else if (param == "col stairs") + else if (param == "col obstacle") { - bool active; - fromString(values[i], active); - primitive->setObstacle(!active); - if (active) - { - primitive->setReactionType(UMovePrimitive::DoNothing); - primitive->setTriggerType(UMovePrimitive::OverlapStairsTrigger); - primitive->setGlobalPosition(instance.getPos(), dynamicWI); - } - else - { - primitive->setReactionType(UMovePrimitive::Slide); - primitive->setTriggerType(UMovePrimitive::NotATrigger); - primitive->setGlobalPosition(instance.getPos(), dynamicWI); - } + } } diff --git a/ryzom/client/src/entity_cl.cpp b/ryzom/client/src/entity_cl.cpp index ec0bfcf5e8..b82d5482f3 100644 --- a/ryzom/client/src/entity_cl.cpp +++ b/ryzom/client/src/entity_cl.cpp @@ -740,8 +740,6 @@ void CEntityCL::init() _EntityName = "Name"; } _NameId = 0; - _LastSnapToGroup = 0; - _CurrentZOffset = 0; _PermanentStatutIcon.clear(); @@ -1480,20 +1478,8 @@ void CEntityCL::pacsMove(const CVectorD &vect) if ((fabs (deltaPos.x) > 0.05) || (fabs (deltaPos.y) > 0.05)) { _HasMoved = true; - _Primitive->enableZOffset(false); _Primitive->move (deltaPos, dynamicWI); } - else - { - // This code force the player to move even when not moving, it's used to trigger special collissions - if (isUser()) - { - _HasMoved = true; - deltaPos.x = 0.0001; - _Primitive->move (deltaPos, dynamicWI); - } - - } } else { @@ -1727,43 +1713,6 @@ void CEntityCL::snapToGround() pos().z = vect.z; } - if (_Primitive->haveZOffset()) - { - - if (_LastSnapToGroup > 0) - { - if (pos().z + _CurrentZOffset < _Primitive->getZFinalPosition()) - { - _CurrentZOffset += (ryzomGetLocalTime() - _LastSnapToGroup)/100.0f; - - if (pos().z + _CurrentZOffset > _Primitive->getZFinalPosition()) - _CurrentZOffset = _Primitive->getZFinalPosition() - pos().z; - } - - if (pos().z + _CurrentZOffset > _Primitive->getZFinalPosition()) - { - _CurrentZOffset -= (ryzomGetLocalTime() - _LastSnapToGroup)/100.0f; - - if (pos().z + _CurrentZOffset < _Primitive->getZFinalPosition()) - _CurrentZOffset = _Primitive->getZFinalPosition() - pos().z; - } - - pos().z += _CurrentZOffset; - } - } - else - { - if (_CurrentZOffset > 0) - { - _CurrentZOffset -= (ryzomGetLocalTime() - _LastSnapToGroup)/100.0f; - - if (_CurrentZOffset < 0) - _CurrentZOffset = 0; - pos().z += _CurrentZOffset; - } - } - _LastSnapToGroup = ryzomGetLocalTime(); - // Set the box position. posBox(pos()); }// snapToGround // diff --git a/ryzom/client/src/entity_cl.h b/ryzom/client/src/entity_cl.h index 092a85dd3c..f2f99b347d 100644 --- a/ryzom/client/src/entity_cl.h +++ b/ryzom/client/src/entity_cl.h @@ -241,7 +241,7 @@ class CEntityCL : public NLMISC::IStreamable, public STRING_MANAGER::IStringWait /// Return the persistent NPC alias of entity (0 if N/A). uint32 npcAlias() const {return _NPCAlias; } - /// Set the persistent NPC alias of the entity. + /// Set the persistent NPC alias of the entity. void npcAlias(uint32 alias) {_NPCAlias = alias; } /// Method to call to initialize all members of the right class. @@ -702,7 +702,7 @@ class CEntityCL : public NLMISC::IStreamable, public STRING_MANAGER::IStringWait // todo handle NPC entities // Return true if this entity is a NPC (not a fauna) bool isNPC () const { return Type == NPC; } - + // Return true if this entity can have missions icons (humanoid NPCs (including Karavan), Kami or Bot Object) bool canHaveMissionIcon() const { return isNPC() || isKami() || isUnknownRace(); } @@ -949,10 +949,6 @@ class CEntityCL : public NLMISC::IStreamable, public STRING_MANAGER::IStringWait uint32 _NameId; // Primitive used for the collision in PACS NLPACS::UMovePrimitive *_Primitive; - - uint64 _LastSnapToGroup; - float _CurrentZOffset; - // 3D Logic info for light request. CEntityLogicInfo3D _LogicInfo3D; // Box around the entity. diff --git a/ryzom/client/src/main_loop.cpp b/ryzom/client/src/main_loop.cpp index 6c1a09544a..56452ba4ac 100644 --- a/ryzom/client/src/main_loop.cpp +++ b/ryzom/client/src/main_loop.cpp @@ -1418,7 +1418,7 @@ bool mainLoop() MainCam.setTransformMode(UTransformable::RotQuat); CVector cameraMoves = UserEntity->getCameraMoves(); - + currViewPos.z += cameraMoves.z; MainCam.setPos(currViewPos); MainCam.setRotQuat(View.currentViewQuat()); @@ -1432,7 +1432,7 @@ bool mainLoop() } UserEntity->setCameraMoves(CVector(0, 0, 0)); - + if (StereoHMD) { CMatrix camMatrix; @@ -2979,41 +2979,15 @@ CVector PacsBox[PacsBoxPointCount] = CVector( 0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 0), CVector( -0.5f, -0.5f, 0), - CVector( -0.5f, -0.5f, 0), CVector( -0.5f, -0.5f, 1), - CVector( 0.5f, -0.5f, 0), CVector( 0.5f, -0.5f, 1), - CVector( 0.5f, 0.5f, 0), CVector( 0.5f, 0.5f, 1), - CVector( -0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 1), - CVector( -0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 1), CVector( 0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 1), CVector( -0.5f, -0.5f, 1), -}; - -const uint PacsStairPointCount = 32; - -CVector PacsStair[PacsStairPointCount] = -{ - CVector( -0.5f, -0.5f, 0), CVector( 0.5f, -0.5f, 0), - CVector( 0.5f, -0.5f, 0), CVector( 0.5f, 0.5f, 0), - CVector( 0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 0), - CVector( -0.5f, 0.5f, 0), CVector( -0.5f, -0.5f, 0), CVector( -0.5f, -0.5f, 0), CVector( -0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 0), CVector( 0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 0), CVector( 0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 0), CVector( -0.5f, 0.5f, 1), - - CVector( -0.5f, -0.5f, 1), CVector( 0.5f, -0.5f, 1), - CVector( 0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 1), - CVector( 0.5f, 0.5f, 1), CVector( -0.5f, 0.5f, 1), - CVector( -0.5f, 0.5f, 1), CVector( -0.5f, -0.5f, 1), - - CVector( -0.5f, -0.5f, 1), CVector( 0.5f, 0.5f, 1), - CVector( -0.5f, 0.5f, 1), CVector( 0.5f, -0.5f, 1), - CVector( -0.5f, 0, 1), CVector( 0.5f, 0, 1), - CVector( 0, - 0.5f, 1), CVector( 0, 0.5f, 1), - }; const uint PacsCylPointCount = 48; @@ -3067,7 +3041,6 @@ void displayPACSPrimitive() // Distance CVector position = prim->getFinalPosition(wI); - bool isStairs = false; if ((position-UserEntity->pos()).sqrnorm() < (200*200)) { // Choose a color @@ -3075,14 +3048,8 @@ void displayPACSPrimitive() if (prim->isCollisionable()) { // Static collision - if (prim->getTriggerType() == UMovePrimitive::OverlapStairsTrigger) + if (prim->getReactionType() == UMovePrimitive::DoNothing) { - line.Color0 = CRGBA::Green; - isStairs = true; - position.z -= 10.0f; - } - else if (prim->getReactionType() == UMovePrimitive::DoNothing) - { line.Color0 = CRGBA::Red; } else @@ -3112,16 +3079,8 @@ void displayPACSPrimitive() // Draw the primitive if (prim->getPrimitiveType() == UMovePrimitive::_2DOrientedBox) { - if (isStairs) - { - lines = PacsStair; - linecount = PacsStairPointCount/2; - } - else - { - lines = PacsBox; - linecount = PacsBoxPointCount/2; - } + lines = PacsBox; + linecount = PacsBoxPointCount/2; float width; float depth; prim->getSize (width, depth); From 3887b9f4890ec6d8ca274f3a78e74bad46fbdd6e Mon Sep 17 00:00:00 2001 From: Pavor <pavor.ryzom@gmail.com> Date: Mon, 25 Mar 2024 17:07:40 +0100 Subject: [PATCH 162/194] 1st commit: Show number of friends on friends list 1st commit : Show number of friends on friends list --- nel/include/nel/gui/group_container.h | 2 ++ nel/src/gui/group_container.cpp | 28 +++++++++++++++---- ryzom/client/src/interface_v3/people_list.cpp | 10 +++++++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/nel/include/nel/gui/group_container.h b/nel/include/nel/gui/group_container.h index 5157c22b1c..bc16a38fa7 100644 --- a/nel/include/nel/gui/group_container.h +++ b/nel/include/nel/gui/group_container.h @@ -238,8 +238,10 @@ namespace NLGUI std::string getTitle () const; void setTitle (const std::string &title); std::string getTitleOpened () const; + CViewText* getTitleOpenedViewText(); void setTitleOpened (const std::string &title); std::string getTitleClosed () const; + CViewText* getTitleClosedViewText(); void setTitleClosed (const std::string &title); std::string getTitleColorAsString() const; void setTitleColorAsString(const std::string &col); diff --git a/nel/src/gui/group_container.cpp b/nel/src/gui/group_container.cpp index 916e95b13c..594ad04b06 100644 --- a/nel/src/gui/group_container.cpp +++ b/nel/src/gui/group_container.cpp @@ -3970,11 +3970,20 @@ namespace NLGUI setTitleClosed(title); } - // *************************************************************************** - std::string CGroupContainer::getTitleOpened () const - { - return _TitleTextOpened; - } + // *************************************************************************** + std::string CGroupContainer::getTitleOpened() const + { + return _TitleTextOpened; + } + + // *************************************************************************** + CViewText* CGroupContainer::getTitleOpenedViewText() + { + if (_TitleOpened != NULL) + { + return _TitleOpened; + } + } // *************************************************************************** void CGroupContainer::setTitleOpened (const std::string &title) @@ -3990,6 +3999,15 @@ namespace NLGUI return _TitleTextClosed; } + // *************************************************************************** + CViewText* CGroupContainer::getTitleClosedViewText() + { + if (_TitleClosed != NULL) + { + return _TitleClosed; + } + } + // *************************************************************************** void CGroupContainer::setTitleClosed (const std::string &title) { diff --git a/ryzom/client/src/interface_v3/people_list.cpp b/ryzom/client/src/interface_v3/people_list.cpp index 463013fa7b..629a6d9c37 100644 --- a/ryzom/client/src/interface_v3/people_list.cpp +++ b/ryzom/client/src/interface_v3/people_list.cpp @@ -129,6 +129,8 @@ bool CPeopleList::create(const CPeopleListDesc &desc, const CChatWindowDesc *cha _BaseContainer->setSavable(desc.Savable); _BaseContainer->setLocalize(desc.Localize); _BaseContainer->setTitle(desc.PeopleListTitle); + _BaseContainer->getTitleOpenedViewText()->setTextLocalized(_BaseContainer->getTitleOpenedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + _BaseContainer->getTitleClosedViewText()->setTextLocalized(_BaseContainer->getTitleClosedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); //_BaseContainer->setId("ui:interface:" + desc.Id); // create the chat window if there's one @@ -427,6 +429,10 @@ sint CPeopleList::addPeople(const string &name, uint teamMateIndex /*= 0*/) ++_CurrPeopleID; + _BaseContainer->setTitle(_BaseContainer->getTitle()); + _BaseContainer->getTitleOpenedViewText()->setTextLocalized(_BaseContainer->getTitleOpenedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + _BaseContainer->getTitleClosedViewText()->setTextLocalized(_BaseContainer->getTitleClosedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + return (sint) _Peoples.size() - 1; } @@ -454,6 +460,10 @@ void CPeopleList::removePeople(uint index) pRoot->delGroup (_Peoples[index].Container); _Peoples.erase(_Peoples.begin() + index); + + _BaseContainer->setTitle(_BaseContainer->getTitle()); + _BaseContainer->getTitleOpenedViewText()->setTextLocalized(_BaseContainer->getTitleOpenedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + _BaseContainer->getTitleClosedViewText()->setTextLocalized(_BaseContainer->getTitleClosedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); } //================================================================== From 5702f2892b375c8b94ad83d52b5a4477a7f1567e Mon Sep 17 00:00:00 2001 From: Pavor <pavor.ryzom@gmail.com> Date: Tue, 26 Mar 2024 17:09:03 +0100 Subject: [PATCH 163/194] Fix of 2 variables declarations. Get only in .h Fix of 2 variables declarations. Get only in .h --- nel/include/nel/gui/group_container.h | 4 ++-- nel/src/gui/group_container.cpp | 18 ------------------ 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/nel/include/nel/gui/group_container.h b/nel/include/nel/gui/group_container.h index bc16a38fa7..cac95121a1 100644 --- a/nel/include/nel/gui/group_container.h +++ b/nel/include/nel/gui/group_container.h @@ -238,10 +238,10 @@ namespace NLGUI std::string getTitle () const; void setTitle (const std::string &title); std::string getTitleOpened () const; - CViewText* getTitleOpenedViewText(); + CViewText* getTitleOpenedViewText() { return _TitleOpened; }; void setTitleOpened (const std::string &title); std::string getTitleClosed () const; - CViewText* getTitleClosedViewText(); + CViewText* getTitleClosedViewText() { return _TitleClosed; }; void setTitleClosed (const std::string &title); std::string getTitleColorAsString() const; void setTitleColorAsString(const std::string &col); diff --git a/nel/src/gui/group_container.cpp b/nel/src/gui/group_container.cpp index 594ad04b06..1bf11266f3 100644 --- a/nel/src/gui/group_container.cpp +++ b/nel/src/gui/group_container.cpp @@ -3976,15 +3976,6 @@ namespace NLGUI return _TitleTextOpened; } - // *************************************************************************** - CViewText* CGroupContainer::getTitleOpenedViewText() - { - if (_TitleOpened != NULL) - { - return _TitleOpened; - } - } - // *************************************************************************** void CGroupContainer::setTitleOpened (const std::string &title) { @@ -3999,15 +3990,6 @@ namespace NLGUI return _TitleTextClosed; } - // *************************************************************************** - CViewText* CGroupContainer::getTitleClosedViewText() - { - if (_TitleClosed != NULL) - { - return _TitleClosed; - } - } - // *************************************************************************** void CGroupContainer::setTitleClosed (const std::string &title) { From 5f46e293b6ba4f1b3b899e3577328b451dacf8fe Mon Sep 17 00:00:00 2001 From: Pavor <pavor.ryzom@gmail.com> Date: Tue, 26 Mar 2024 17:44:08 +0100 Subject: [PATCH 164/194] Check if ViewText is NULL Check if ViewText is NULL --- ryzom/client/src/interface_v3/people_list.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/ryzom/client/src/interface_v3/people_list.cpp b/ryzom/client/src/interface_v3/people_list.cpp index 629a6d9c37..6a1e9de528 100644 --- a/ryzom/client/src/interface_v3/people_list.cpp +++ b/ryzom/client/src/interface_v3/people_list.cpp @@ -129,8 +129,10 @@ bool CPeopleList::create(const CPeopleListDesc &desc, const CChatWindowDesc *cha _BaseContainer->setSavable(desc.Savable); _BaseContainer->setLocalize(desc.Localize); _BaseContainer->setTitle(desc.PeopleListTitle); - _BaseContainer->getTitleOpenedViewText()->setTextLocalized(_BaseContainer->getTitleOpenedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); - _BaseContainer->getTitleClosedViewText()->setTextLocalized(_BaseContainer->getTitleClosedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + if (_BaseContainer->getTitleOpenedViewText() != NULL) + _BaseContainer->getTitleOpenedViewText()->setTextLocalized(_BaseContainer->getTitleOpenedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + if (_BaseContainer->getTitleClosedViewText() != NULL) + _BaseContainer->getTitleClosedViewText()->setTextLocalized(_BaseContainer->getTitleClosedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); //_BaseContainer->setId("ui:interface:" + desc.Id); // create the chat window if there's one @@ -273,7 +275,6 @@ void CPeopleList::sortEx(TSortOrder order) case sort_name: std::sort(_Peoples.begin(), _Peoples.end(), CPeopleList::sortExByName); break; - case sort_online: std::sort(_Peoples.begin(), _Peoples.end(), CPeopleList::sortExByOnline); break; @@ -430,8 +431,10 @@ sint CPeopleList::addPeople(const string &name, uint teamMateIndex /*= 0*/) ++_CurrPeopleID; _BaseContainer->setTitle(_BaseContainer->getTitle()); - _BaseContainer->getTitleOpenedViewText()->setTextLocalized(_BaseContainer->getTitleOpenedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); - _BaseContainer->getTitleClosedViewText()->setTextLocalized(_BaseContainer->getTitleClosedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + if (_BaseContainer->getTitleOpenedViewText() != NULL) + _BaseContainer->getTitleOpenedViewText()->setTextLocalized(_BaseContainer->getTitleOpenedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + if (_BaseContainer->getTitleClosedViewText() != NULL) + _BaseContainer->getTitleClosedViewText()->setTextLocalized(_BaseContainer->getTitleClosedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); return (sint) _Peoples.size() - 1; } @@ -462,8 +465,10 @@ void CPeopleList::removePeople(uint index) _Peoples.erase(_Peoples.begin() + index); _BaseContainer->setTitle(_BaseContainer->getTitle()); - _BaseContainer->getTitleOpenedViewText()->setTextLocalized(_BaseContainer->getTitleOpenedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); - _BaseContainer->getTitleClosedViewText()->setTextLocalized(_BaseContainer->getTitleClosedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + if (_BaseContainer->getTitleOpenedViewText() != NULL) + _BaseContainer->getTitleOpenedViewText()->setTextLocalized(_BaseContainer->getTitleOpenedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + if (_BaseContainer->getTitleClosedViewText() != NULL) + _BaseContainer->getTitleClosedViewText()->setTextLocalized(_BaseContainer->getTitleClosedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); } //================================================================== From 8d76c8a7ec9bb2c8c7198758e21a954a6234df79 Mon Sep 17 00:00:00 2001 From: Pavor <pavor.ryzom@gmail.com> Date: Thu, 28 Mar 2024 10:22:55 +0100 Subject: [PATCH 165/194] Fix sorting of friends list with groups Fix sorting of friends list with groups --- ryzom/client/src/interface_v3/people_list.cpp | 115 ++++++++++-------- 1 file changed, 62 insertions(+), 53 deletions(-) diff --git a/ryzom/client/src/interface_v3/people_list.cpp b/ryzom/client/src/interface_v3/people_list.cpp index 463013fa7b..b601b0b651 100644 --- a/ryzom/client/src/interface_v3/people_list.cpp +++ b/ryzom/client/src/interface_v3/people_list.cpp @@ -190,57 +190,42 @@ sint CPeopleList::getIndexFromContainerID(const std::string &id) const //================================================================== bool CPeopleList::sortExByContactId(const CPeople& a, const CPeople& b) { - if (a.Group == b.Group) - return (a.ContactId < b.ContactId); - else - return (a.Group < b.Group); + return (a.ContactId < b.ContactId); } //================================================================== bool CPeopleList::sortExByName(const CPeople& a, const CPeople& b) { - if (a.Group == b.Group) { - return NLMISC::compareCaseInsensitive(a.getName(), b.getName()) < 0; // FIXME: Locale-dependent sort - } - else - { - return NLMISC::compareCaseInsensitive(a.Group, b.Group) < 0; // FIXME: Locale-dependent sort - } + return NLMISC::compareCaseInsensitive(a.getName(), b.getName()) < 0; // FIXME: Locale-dependent sort } //================================================================== bool CPeopleList::sortExByOnline(const CPeople& a, const CPeople& b) { - if (a.Group == b.Group) { - // We want order: online/alpha, offworld/alpha, offline/alpha - if (a.Online == b.Online) - { - return NLMISC::compareCaseInsensitive(a.getName(), b.getName()) < 0; // FIXME: Locale-dependent sort - } - else - { - // Compare online status - switch (a.Online) - { - case ccs_online: - // a is > if a is online - return true; - break; - case ccs_online_abroad: - // a is > if b is offline - return (b.Online == ccs_offline); - break; - case ccs_offline: - default: - // b is always > if a is offline - return false; - break; - } - } + // We want order: online/alpha, offworld/alpha, offline/alpha + if (a.Online == b.Online) + { + return NLMISC::compareCaseInsensitive(a.getName(), b.getName()) < 0; // FIXME: Locale-dependent sort } else { - return -NLMISC::compareCaseInsensitive(a.Group, b.Group); // FIXME: Locale-dependent sort + // Compare online status + switch (a.Online) + { + case ccs_online: + // a is > if a is online + return true; + break; + case ccs_online_abroad: + // a is > if b is offline + return (b.Online == ccs_offline); + break; + case ccs_offline: + default: + // b is always > if a is offline + return false; + break; + } } } @@ -256,6 +241,7 @@ void CPeopleList::sortEx(TSortOrder order) CGroupContainer *parentContainer = _Peoples[k].Container->getProprietaryContainer(); parentContainer->detachContainer(_Peoples[k].Container); } + // Destroy group containers for (k = 0; k < _GroupContainers.size(); ++k) { if (_GroupContainers[k].second->getProprietaryContainer() != NULL) @@ -271,32 +257,55 @@ void CPeopleList::sortEx(TSortOrder order) case sort_name: std::sort(_Peoples.begin(), _Peoples.end(), CPeopleList::sortExByName); break; - case sort_online: std::sort(_Peoples.begin(), _Peoples.end(), CPeopleList::sortExByOnline); break; } CGroupContainer *group = _BaseContainer; - uint groupIndex = 0; + uint cptContainers = 0; + // Create group containers : check each container, and add it if there's people in it. + bool severalGroups = false; for(k = 0; k < _Peoples.size(); ++k) { - bool newGroup = false; - if (k == 0) - { - newGroup = true; - } - while (groupIndex < _GroupContainers.size() && _GroupContainers[groupIndex].first != _Peoples[k].Group) + if (_Peoples[k].Group != "") + severalGroups = true; + } + + if (severalGroups) + { + for(cptContainers = 0; cptContainers < _GroupContainers.size(); ++cptContainers) { - newGroup = true; - ++groupIndex; + for(k = 0; k < _Peoples.size(); ++k) + { + if (_Peoples[k].Group == _GroupContainers[cptContainers].first) + { + group = _GroupContainers[cptContainers].second; + _BaseContainer->attachContainer(group); + break; + } + } } - if (newGroup && groupIndex < _GroupContainers.size() && _GroupContainers.size() > 1) + } + + // Add people in groups + group = _BaseContainer; + for(k = 0; k < _Peoples.size(); ++k) + { + if (severalGroups) { - group = _GroupContainers[groupIndex].second; - _BaseContainer->attachContainer(group); + //std::string groupName = (_Peoples[k].Group == "" ? "General" : _Peoples[k].Group); + for (cptContainers = 0; cptContainers < _GroupContainers.size(); ++cptContainers) + { + if (_GroupContainers[cptContainers].first == _Peoples[k].Group) + { + group = _GroupContainers[cptContainers].second; + break; + } + } } + group->attachContainer(_Peoples[k].Container); } } @@ -481,7 +490,7 @@ void CPeopleList::setContactId(uint index, uint32 contactId) //================================================================== void CPeopleList::changeGroup(uint index, const std::string &groupName) { - if (index >= _Peoples.size()) + if (index >= _Peoples.size()) { nlwarning("<CPeopleList::changeGroup> bad index."); return; @@ -610,7 +619,7 @@ void CPeopleList::readContactGroups() //================================================================== void CPeopleList::saveContactGroups() { - const std::string filename = CInterfaceManager::getInstance()->getSaveFileName("contactgroups", "xml"); + const std::string filename = CInterfaceManager::getInstance()->getSaveFileName("contactgroups", "xml"); try { COFile fd; From a293e32fe5f6c6339464174111f032372585ec90 Mon Sep 17 00:00:00 2001 From: Pavor <pavor.ryzom@gmail.com> Date: Thu, 28 Mar 2024 10:26:05 +0100 Subject: [PATCH 166/194] TODO Finish : Remove group when remove last friend TODO Finish : Remove group when remove last friend in it --- ryzom/client/src/interface_v3/people_list.cpp | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/ryzom/client/src/interface_v3/people_list.cpp b/ryzom/client/src/interface_v3/people_list.cpp index b601b0b651..3cc449e9ab 100644 --- a/ryzom/client/src/interface_v3/people_list.cpp +++ b/ryzom/client/src/interface_v3/people_list.cpp @@ -495,11 +495,36 @@ void CPeopleList::changeGroup(uint index, const std::string &groupName) nlwarning("<CPeopleList::changeGroup> bad index."); return; } + + std::string oldGroupName = _Peoples[index].Group; std::string group = groupName; if (group == "General") group.clear(); _Peoples[index].Group = group; + // If there is no more people in the old group, destroy it. + /*bool destroyOldGroup = true; + for (uint k = 0; k < _Peoples.size(); ++k) + { + if (_Peoples[k].Group == oldGroupName) + { + destroyOldGroup = false; + break; + } + } + if (destroyOldGroup) + { + for (uint k = 0; k < _GroupContainers.size(); ++k) + { + if (_GroupContainers[k].first == oldGroupName) + { + _GroupContainers[k].first.clear(); + _GroupContainers[k].second = NULL; + } + } + }*/ + + // If new group already exists, return. Else, create it. for (uint k = 0; k < _GroupContainers.size(); ++k) { if (_GroupContainers[k].first == group) From 2a54471f888a80bbc617b1aac291102ad8b512c7 Mon Sep 17 00:00:00 2001 From: Pavor <pavor.ryzom@gmail.com> Date: Thu, 28 Mar 2024 17:31:47 +0100 Subject: [PATCH 167/194] Fix friendlist groups XML reading & revert useless Fix friendlist groups XML reading & revert useless last modification --- ryzom/client/src/interface_v3/people_list.cpp | 73 ++++++------------- 1 file changed, 24 insertions(+), 49 deletions(-) diff --git a/ryzom/client/src/interface_v3/people_list.cpp b/ryzom/client/src/interface_v3/people_list.cpp index 3cc449e9ab..cbe58db52c 100644 --- a/ryzom/client/src/interface_v3/people_list.cpp +++ b/ryzom/client/src/interface_v3/people_list.cpp @@ -277,15 +277,8 @@ void CPeopleList::sortEx(TSortOrder order) { for(cptContainers = 0; cptContainers < _GroupContainers.size(); ++cptContainers) { - for(k = 0; k < _Peoples.size(); ++k) - { - if (_Peoples[k].Group == _GroupContainers[cptContainers].first) - { - group = _GroupContainers[cptContainers].second; - _BaseContainer->attachContainer(group); - break; - } - } + group = _GroupContainers[cptContainers].second; + _BaseContainer->attachContainer(group); } } @@ -295,7 +288,6 @@ void CPeopleList::sortEx(TSortOrder order) { if (severalGroups) { - //std::string groupName = (_Peoples[k].Group == "" ? "General" : _Peoples[k].Group); for (cptContainers = 0; cptContainers < _GroupContainers.size(); ++cptContainers) { if (_GroupContainers[cptContainers].first == _Peoples[k].Group) @@ -495,36 +487,11 @@ void CPeopleList::changeGroup(uint index, const std::string &groupName) nlwarning("<CPeopleList::changeGroup> bad index."); return; } - - std::string oldGroupName = _Peoples[index].Group; std::string group = groupName; if (group == "General") group.clear(); _Peoples[index].Group = group; - // If there is no more people in the old group, destroy it. - /*bool destroyOldGroup = true; - for (uint k = 0; k < _Peoples.size(); ++k) - { - if (_Peoples[k].Group == oldGroupName) - { - destroyOldGroup = false; - break; - } - } - if (destroyOldGroup) - { - for (uint k = 0; k < _GroupContainers.size(); ++k) - { - if (_GroupContainers[k].first == oldGroupName) - { - _GroupContainers[k].first.clear(); - _GroupContainers[k].second = NULL; - } - } - }*/ - - // If new group already exists, return. Else, create it. for (uint k = 0; k < _GroupContainers.size(); ++k) { if (_GroupContainers[k].first == group) @@ -594,37 +561,45 @@ void CPeopleList::readContactGroups() uint nb = 0; while (node) { - CXMLAutoPtr propName; - propName = (char*) xmlGetProp(node, (xmlChar*)"name"); - CXMLAutoPtr propGroup; - propGroup = (char*) xmlGetProp(node, (xmlChar*)"group"); - if (propName && propGroup) + std::string propName = (char*) xmlGetProp(node, (xmlChar*)"name"); + std::string propGroup = (char*) xmlGetProp(node, (xmlChar*)"group"); + if (true) { - sint index = getIndexFromName(propName.str()); - if (index < _Peoples.size()) + sint index = getIndexFromName(propName); + if (index >=0 && index < _Peoples.size()) { - _Peoples[index].Group = propGroup.str(); - if (_GroupContainers.empty() || _GroupContainers.back().first != propGroup.str()) { + _Peoples[index].Group = propGroup; + + bool groupAlreadyAdded = false; + uint k; + for (k = 0; k < _GroupContainers.size(); k++) + { + if (_GroupContainers[k].first == propGroup) + groupAlreadyAdded = true; + } + + if (!groupAlreadyAdded) { vector<pair<string, string> > properties; properties.push_back(make_pair(string("posparent"), string("parent"))); properties.push_back(make_pair(string("id"), _ContainerID + "_group_" + toString(_GroupContainers.size()))); - if (propGroup.str() == "") + if (propGroup == "") properties.push_back(make_pair(string("title"), "General")); else - properties.push_back(make_pair(string("title"), propGroup.str())); + properties.push_back(make_pair(string("title"), propGroup)); + CInterfaceGroup *group = CWidgetManager::getInstance()->getParser()->createGroupInstance("people_list_group_header", "ui:interface", properties, false); CGroupContainer *gc = dynamic_cast<CGroupContainer *>(group); - if (propGroup.str() == "") + if (propGroup == "") gc->setUCTitle(ucstring("General")); else - gc->setUCTitle(propGroup.str()); + gc->setUCTitle(propGroup); gc->setSavable(false); CInterfaceGroup *pRoot = dynamic_cast<CInterfaceGroup*>(CWidgetManager::getInstance()->getElementFromId("ui:interface")); pRoot->addGroup (gc); _BaseContainer->attachContainer(gc); - _GroupContainers.push_back(make_pair(propGroup.str(), gc)); + _GroupContainers.push_back(make_pair(propGroup, gc)); } } } From 25c44786cfc805817d2e6511c6b83629ea9eeac1 Mon Sep 17 00:00:00 2001 From: Pavor <pavor.ryzom@gmail.com> Date: Fri, 29 Mar 2024 09:24:50 +0100 Subject: [PATCH 168/194] Just fix for a commentary Just fix for a commentary --- ryzom/client/src/interface_v3/people_list.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/client/src/interface_v3/people_list.cpp b/ryzom/client/src/interface_v3/people_list.cpp index cbe58db52c..8de29e6e11 100644 --- a/ryzom/client/src/interface_v3/people_list.cpp +++ b/ryzom/client/src/interface_v3/people_list.cpp @@ -265,7 +265,7 @@ void CPeopleList::sortEx(TSortOrder order) CGroupContainer *group = _BaseContainer; uint cptContainers = 0; - // Create group containers : check each container, and add it if there's people in it. + // Create group containers bool severalGroups = false; for(k = 0; k < _Peoples.size(); ++k) { From 48f5f73e38affe6787556541a69e17a730cee208 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Thu, 4 Apr 2024 14:08:09 +0200 Subject: [PATCH 169/194] Add driller production into outpost dump log --- .../outpost_manager/outpost_building.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ryzom/server/src/entities_game_service/outpost_manager/outpost_building.cpp b/ryzom/server/src/entities_game_service/outpost_manager/outpost_building.cpp index cb413de7ca..961e4338b1 100644 --- a/ryzom/server/src/entities_game_service/outpost_manager/outpost_building.cpp +++ b/ryzom/server/src/entities_game_service/outpost_manager/outpost_building.cpp @@ -258,6 +258,19 @@ std::string COutpostBuilding::toString() const if (_Constructing) desc += "constructing "; + if (_StaticData->Type == CStaticOutpostBuilding::TypeDriller) + { + desc += "\nProduction:\n"; + for (uint i = 0; i < _StaticData->Driller.MPQuantities.size(); ++i) + { + for (uint j = 0; j < DRILLER_NB_LEVEL; ++j) + { + if (_StaticData->Driller.QualityFactor[j]) + desc += _StaticData->Driller.MPs[i].toString()+NLMISC::toString(" Q%d", 50*(j+1))+"\n"; + } + } + } + return desc; } From 8c91e879aa7990253b72656a41db2dd3e4fda2a1 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 5 Apr 2024 00:11:45 +0200 Subject: [PATCH 170/194] Added product in op dump list --- .../outpost_manager/outpost.cpp | 14 +++++++++-- .../outpost_manager/outpost_building.cpp | 23 +++++++++++++++++++ .../outpost_manager/outpost_building.h | 15 ++++++------ 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/ryzom/server/src/entities_game_service/outpost_manager/outpost.cpp b/ryzom/server/src/entities_game_service/outpost_manager/outpost.cpp index e617411011..17acb006e9 100644 --- a/ryzom/server/src/entities_game_service/outpost_manager/outpost.cpp +++ b/ryzom/server/src/entities_game_service/outpost_manager/outpost.cpp @@ -3154,15 +3154,25 @@ std::string COutpost::toString() const ownerName = "tribe"; } + string product = ""; + + for (uint i = 0; i < _Buildings.size(); ++i) + { + string p = _Buildings[i].getProductString(); + if (p != "") + product += p; + } + string desc; - desc = NLMISC::toString("Alias: %s, Name: '%s', Sheet: '%s', State: '%s', Level: %d, Owner: %s, Type: %s", + desc = NLMISC::toString("Alias: %s, Name: '%s', Sheet: '%s', State: '%s', Level: %d, Owner: %s, Type: %s, Product: %s", CPrimitivesParser::aliasToString( _Alias ).c_str(), _Name.c_str(), _Sheet.toString().c_str(), OUTPOSTENUMS::toString( _State ).c_str(), _CurrentOutpostLevel, ownerName.c_str(), - OUTPOSTENUMS::toString( _PVPType ).c_str() + OUTPOSTENUMS::toString( _PVPType ).c_str(), + product.c_str() ); return desc; diff --git a/ryzom/server/src/entities_game_service/outpost_manager/outpost_building.cpp b/ryzom/server/src/entities_game_service/outpost_manager/outpost_building.cpp index 961e4338b1..ccb388558d 100644 --- a/ryzom/server/src/entities_game_service/outpost_manager/outpost_building.cpp +++ b/ryzom/server/src/entities_game_service/outpost_manager/outpost_building.cpp @@ -274,6 +274,29 @@ std::string COutpostBuilding::toString() const return desc; } +//---------------------------------------------------------------------------- +std::string COutpostBuilding::getProductString() const +{ + string desc = ""; + if (_StaticData == NULL) + return desc; + + if (_StaticData->Type == CStaticOutpostBuilding::TypeDriller) + { + for (uint i = 0; i < _StaticData->Driller.MPQuantities.size(); ++i) + { + for (uint j = 0; j < DRILLER_NB_LEVEL; ++j) + { + if (_StaticData->Driller.QualityFactor[j]) + desc += _StaticData->Driller.MPs[i].toString()+NLMISC::toString(" Q%d", 50*(j+1))+","; + } + } + } + + return desc; +} + + //---------------------------------------------------------------------------- void COutpostBuilding::setConstructionTime(uint32 nNbSeconds, uint32 nCurrentTime) { diff --git a/ryzom/server/src/entities_game_service/outpost_manager/outpost_building.h b/ryzom/server/src/entities_game_service/outpost_manager/outpost_building.h index b6e90e47d8..3d03aeba8c 100644 --- a/ryzom/server/src/entities_game_service/outpost_manager/outpost_building.h +++ b/ryzom/server/src/entities_game_service/outpost_manager/outpost_building.h @@ -66,6 +66,7 @@ class COutpostBuilding /// get a one line description string (for debug) std::string toString() const; + std::string getProductString() const; /// called only by the command : outpostAccelerateConstruction void setConstructionTime(uint32 nNbSeconds, uint32 nCurrentTime); @@ -83,9 +84,9 @@ class COutpostBuilding /// @name Primitive data (static) //@{ COutpost *_Parent; - + TAIAlias _Alias; - + // Position in the world NLMISC::CVector _Center; @@ -98,25 +99,25 @@ class COutpostBuilding // Static data of the building const CStaticOutpostBuilding *_StaticData; //@} - + /// @name Persistent data //@{ // Date of the last constructed or the beginning of construction uint32 _BuiltDate; - + // Is there a construction in progress ? bool _Constructing; - + // Currently spawned object NLMISC::CSheetId _CurrentSheet; - + /// Used for driller //@{ float _MPLeft; uint32 _MPLastTime; //@} //@} - + /// @name Dynamic data //@{ /// Used BotObject From 743cd8077c46e3fd9a9d1c291a92e69eb16d019a Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Wed, 17 Apr 2024 15:35:50 +0200 Subject: [PATCH 171/194] Updates and fixes --- CMakeLists.txt | 6 +- CMakeModules/GetRevision.cmake | 2 +- CMakeModules/HunterGate.cmake | 18 +- .../client/data/gamedev/interfaces_v3/ark.lua | 26 ++- .../data/gamedev/interfaces_v3/config.xml | 8 + .../data/gamedev/interfaces_v3/guild.xml | 65 +++++++ .../gamedev/interfaces_v3/info_player.lua | 6 + .../data/gamedev/interfaces_v3/inventory.lua | 66 ++++++- .../data/gamedev/interfaces_v3/inventory.xml | 49 +++++- .../client/data/gamedev/interfaces_v3/map.lua | 2 +- .../data/gamedev/interfaces_v3/widgets.xml | 30 ++++ .../src/interface_v3/action_handler_game.cpp | 36 +++- .../src/interface_v3/action_handler_item.cpp | 59 ++++++- .../interface_v3/dbgroup_list_sheet_text.cpp | 36 +++- .../interface_v3/dbgroup_list_sheet_text.h | 5 +- .../interface_expr_user_fct_items.cpp | 22 ++- .../src/interface_v3/inventory_manager.cpp | 10 +- .../client/src/interface_v3/lua_ihm_ryzom.cpp | 30 ++++ ryzom/client/src/interface_v3/lua_ihm_ryzom.h | 6 + ryzom/client/src/net_manager.cpp | 4 +- ryzom/common/data_common/database.xml | 15 ++ .../src/entities_game_service/admin.cpp | 27 ++- .../entity_manager/entity_callbacks.cpp | 9 +- .../game_item_manager/guild_inv.cpp | 72 ++++++-- .../game_item_manager/guild_inv.h | 32 +++- .../game_item_manager/player_inv_bag.cpp | 2 +- .../game_item_manager/player_inv_bag.h | 4 +- .../game_item_manager/player_inv_pet.cpp | 4 +- .../game_item_manager/player_inv_pet.h | 4 +- .../game_item_manager/player_inv_room.cpp | 2 +- .../game_item_manager/player_inv_room.h | 2 +- .../game_item_manager/player_inventory.cpp | 84 +++++++-- .../game_item_manager/player_inventory.h | 6 +- .../guild_manager/guild.cpp | 161 ++++++++++++++++-- .../guild_manager/guild.h | 68 +++++++- .../guild_manager/guild_commands.cpp | 2 +- .../mission_manager/missions_commands.cpp | 32 ++++ ryzom/tools/pd_parser/cpp_output.h | 2 +- ryzom/tools/pd_parser/parser.cpp | 21 ++- 39 files changed, 921 insertions(+), 114 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a86a2c71c..ae48f1ad10 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,8 +41,8 @@ OPTION(HUNTER_ENABLED "Enable Hunter package manager" OFF) IF(HUNTER_ENABLED) INCLUDE("CMakeModules/HunterGate.cmake") HunterGate( - URL "https://github.com/cpp-pm/hunter/archive/v0.23.321.tar.gz" - SHA1 "5e53cbb0429037ea8e2592bfd92704b8ff3ab492" + URL "https://github.com/cpp-pm/hunter/archive/v0.25.0.tar.gz" + SHA1 "a1296b351dbfaf036c92d85c1bdb461f615849fa" FILEPATH "${CMAKE_CURRENT_LIST_DIR}/CMakeModules/HunterConfig.cmake" ) @@ -77,7 +77,7 @@ ELSE() SET(CURRENT_YEAR "2019") ENDIF() -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +CMAKE_MINIMUM_REQUIRED(VERSION 3.6) PROJECT(RyzomCore CXX C) SET(NL_VERSION_MAJOR 1) SET(NL_VERSION_MINOR 1) diff --git a/CMakeModules/GetRevision.cmake b/CMakeModules/GetRevision.cmake index f18b662e17..4cff000db1 100644 --- a/CMakeModules/GetRevision.cmake +++ b/CMakeModules/GetRevision.cmake @@ -1,4 +1,4 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6.3) +CMAKE_MINIMUM_REQUIRED(VERSION 3.6) # 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) diff --git a/CMakeModules/HunterGate.cmake b/CMakeModules/HunterGate.cmake index 64ccde563b..17c6d38038 100644 --- a/CMakeModules/HunterGate.cmake +++ b/CMakeModules/HunterGate.cmake @@ -25,7 +25,7 @@ # This is a gate file to Hunter package manager. # Include this file using `include` command and add package you need, example: # -# cmake_minimum_required(VERSION 3.2) +# cmake_minimum_required(VERSION 3.5) # # include("cmake/HunterGate.cmake") # HunterGate( @@ -39,16 +39,16 @@ # hunter_add_package(Boo COMPONENTS Bar Baz) # # Projects: -# * https://github.com/hunter-packages/gate/ -# * https://github.com/ruslo/hunter +# * https://github.com/cpp-pm/gate/ +# * https://github.com/cpp-pm/hunter option(HUNTER_ENABLED "Enable Hunter package manager support" ON) if(HUNTER_ENABLED) - if(CMAKE_VERSION VERSION_LESS "3.2") + if(CMAKE_VERSION VERSION_LESS "3.5") message( FATAL_ERROR - "At least CMake version 3.2 required for Hunter dependency management." + "At least CMake version 3.5 required for Hunter dependency management." " Update CMake or set HUNTER_ENABLED to OFF." ) endif() @@ -253,7 +253,13 @@ function(hunter_gate_download dir) file( WRITE "${cmakelists}" - "cmake_minimum_required(VERSION 3.2)\n" + "cmake_minimum_required(VERSION 3.5)\n" + "if(POLICY CMP0114)\n" + " cmake_policy(SET CMP0114 NEW)\n" + "endif()\n" + "if(POLICY CMP0135)\n" + " cmake_policy(SET CMP0135 NEW)\n" + "endif()\n" "project(HunterDownload LANGUAGES NONE)\n" "include(ExternalProject)\n" "ExternalProject_Add(\n" diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark.lua b/ryzom/client/data/gamedev/interfaces_v3/ark.lua index 93149d59c5..ff58e92be4 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark.lua @@ -285,9 +285,13 @@ function ArkShowStageDiv(name, state) end function ArkSelectRyform(curwin, id, mod) - e = ArkGetStageEdit(__CURRENT_WINDOW__):find(id..":eb") + local curwin = getUICaller().id + debug(curwin) + debug(ArkGetStageEdit(curwin)) + local e = ArkGetStageEdit(curwin):find(id..":eb") + debug(ArkGetStageEdit(curwin):find(id)) e.input_string = mod - ArkGetStageEdit(__CURRENT_WINDOW__):find("send:b"):runLeftClickAction() + ArkGetStageEdit(curwin):find("send:b"):runLeftClickAction() end function ArkSendForm(name) @@ -310,14 +314,18 @@ function ArkFindUI(name) local i = 0 local ui = getUICaller() while true do - local found = ui:find(name) - if found ~= nil then - return found + if ui then + local found = ui:find(name) + if found ~= nil then + return found + else + ui = ui.parent + end + i = i +1 + if i >= 100 then + return nil + end else - ui = ui.parent - end - i = i +1 - if i >= 100 then return nil end end diff --git a/ryzom/client/data/gamedev/interfaces_v3/config.xml b/ryzom/client/data/gamedev/interfaces_v3/config.xml index fd57bf5983..45db32fdcf 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/config.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/config.xml @@ -2561,6 +2561,8 @@ This MUST follow the Enum MISSION_DESC::TIconId value="%set_base:TEMP" /> <define id="guild_inv_dbentry" value="SERVER:GUILD:INVENTORY" /> + <define id="guild_chests_dbentry" + value="SERVER:GUILD:CHEST" /> <define id="guild_inv_money" value="%guild_inv_dbentry:MONEY" /> <define id="guild_inv_bulk_max" @@ -2955,6 +2957,12 @@ This MUST follow the Enum MISSION_DESC::TIconId <variable entry="UI:SAVE:TUTORIAL_ACTIVE_INVENTORY" type="bool" value="false" /> + <variable entry="UI:SAVE:GUILD_INVENTORY_CHEST_A" + type="uint8" + value="255" /> + <variable entry="UI:SAVE:GUILD_INVENTORY_CHEST_B" + type="uint8" + value="255" /> <variable entry="UI:SAVE:TUTORIAL_ACTIVE_INFO_PLAYER_JOURNAL" type="bool" value="false" /> diff --git a/ryzom/client/data/gamedev/interfaces_v3/guild.xml b/ryzom/client/data/gamedev/interfaces_v3/guild.xml index df80a7f4cd..82de77dcf2 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/guild.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/guild.xml @@ -910,6 +910,71 @@ params_l="guild_put_money" /> </group> </group> + + <group style="inv_container_guild" + id="inv_guild2" + header_color="UI:SAVE:WIN:COLORS:TRADE" + title="uitabInvGuild2" + on_close_button="set" + on_close_button_params="dblink=UI:SAVE:INVENTORY_GUILD2_WANT_POPUP|value=0"> + + <group id="header_closed" + x="0" + y="0" + h="12" + posref="TL TL"></group> + <group id="header_opened" + x="0" + y="0" + h="16" + posref="TL TL" + group_onclick_r="active_menu" + group_params_r="menu=ui:interface:base_menu_with_color"> + <instance template="tguildinv_nbslots_bulk_weight" + id="ibw" + x="-16" + selected_chest="UI:SAVE:GUILD_INVENTORY_CHEST_B" + inv_branch="%guild_inv_dbentry" /> + </group> + <group id="content" + h="214" + posref="TR TR"> + <instance template="tinv_item_list" + id="iil" + y="-8" + sizeref="wh" + h="-8" + inv_branch="%guild_inv_dbentry" + inv_branch_nb="%max_guild_invslot" + start_item="0" + inv_type="INV_GUILD2" /> + <instance template="argent" + id="money" + posref="BL BL" + x="4" + y="1" + value="%guild_inv_money" /> + <ctrl style="new_element_header" + id="getmoney_but" + posref="MR ML" + posparent="money" + x="4" + wmargin="8" + hardtext="uittGetMoney" + onclick_l="proc" + params_l="guild_get_money" /> + <ctrl style="new_element_header" + id="putmoney_but" + posref="MR ML" + posparent="getmoney_but" + x="4" + wmargin="8" + hardtext="uittPutMoney" + onclick_l="proc" + params_l="guild_put_money" /> + </group> + </group> + <link expr="and(%is_guild_present, @UI:SAVE:INVENTORY_GUILD_WANT_POPUP, @UI:TEMP:INVENTORY_GUILD_OPENED)" target="inv_guild:active" /> <tree node="inv_guild" /> diff --git a/ryzom/client/data/gamedev/interfaces_v3/info_player.lua b/ryzom/client/data/gamedev/interfaces_v3/info_player.lua index c02b1143df..f1c9272935 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/info_player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/info_player.lua @@ -1787,6 +1787,12 @@ function game:onInGameDbInitialized() --getUI("ui:interface:db_loading").active=false game.InGameDbInitialized = true debug("IG DB initialized") + -- Add waiters to guild chests + for i=0, 19 do + addOnDbChange(getUI("ui:interface:inv_guild"), "@SERVER:GUILD:CHEST:"..tostring(i)..":NAME", "updateChestList()") + end + addOnDbChange(getUI("ui:interface:inv_guild"), "@SERVER:GUILD:CHEST:0:BULK_MAX", "updateChestList(true)") + -- if the journal is opened, force an update for the fixed entry text -- (says if we're in start island, paying account ...) need DB flags like -- IS_NEWBIE & IS_TRIAL to be received diff --git a/ryzom/client/data/gamedev/interfaces_v3/inventory.lua b/ryzom/client/data/gamedev/interfaces_v3/inventory.lua index 47ccd49f5f..f32009101b 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/inventory.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/inventory.lua @@ -6,7 +6,7 @@ if (game==nil) then end function game:initEquipPreview() - setChar3dDBfromServerDB('UI:TEMP:PREVIEWCHAR3D') + setChar3dDBfromServerDB("UI:TEMP:PREVIEWCHAR3D") local scene = getUI("ui:interface:inventory:content:equip:midsection:content:visu3d:char3d") local headz = scene:getElement("character#0").headz @@ -75,5 +75,69 @@ function game:updateEquipOnResize(base, force) end end end + +function updateChest() + local index = getUICaller().selection + local chest = "A" + local inv = "" + if string.sub(getUICaller().id, 1, 23) == "ui:interface:inv_guild2" or string.sub(getUICaller().id, 1, 37) == "ui:interface:inventory:content:guild2" then + chest = "B" + inv = "2" + end + runCommand("a", "setGuildInventoryChest", chest, index) + doUpdateChest(index, chest, inv) + if string.sub(getUICaller().id, 1, 22) == "ui:interface:inv_guild" then + ui = getUI("ui:interface:inventory:content:guild"..inv..":ibw:chest") + else + ui = getUI("ui:interface:inv_guild"..inv..":header_opened:ibw:chest") + end + ui.selection = index +end + +function doUpdateChest(index, chest, inv) + setDbProp("UI:SAVE:GUILD_INVENTORY_CHEST_"..chest, index) + local ui = "" + ui = getUI("ui:interface:inv_guild"..inv..":content:iil:bag_icons") + runAH(ui, "list_sheet_change_start_item", "index="..tostring(index*getDefine("max_guild_invslot"))) + ui = getUI("ui:interface:inv_guild"..inv..":content:iil:bag_list") + runAH(ui, "list_sheet_text_change_start_item", "index="..tostring(index*getDefine("max_guild_invslot"))) + ui = getUI("ui:interface:inventory:content:guild"..inv..":iil:bag_icons") + runAH(ui, "list_sheet_change_start_item", "index="..tostring(index*getDefine("max_guild_invslot"))) + ui = getUI("ui:interface:inventory:content:guild"..inv..":iil:bag_list") + runAH(ui, "list_sheet_text_change_start_item", "index="..tostring(index*getDefine("max_guild_invslot"))) +end + +function updateChestList(init) + removeOnDbChange(getUI("ui:interface:inv_guild"),"@UI:VARIABLES:CURRENT_SERVER_TICK") + local uis = {"ui:interface:inv_guild:header_opened:ibw", "ui:interface:inv_guild2:header_opened:ibw", "ui:interface:inventory:content:guild:ibw", "ui:interface:inventory:content:guild2:ibw" } + local ui = "" + for iid, id in pairs(uis) do + ui = getUI(id..":chest") + ui:resetTexts() + local all_str_available = true + for i=0, 19 do + local name_id = getDbProp("SERVER:GUILD:CHEST:"..tostring(i)..":NAME") + debug(name_id) + if name_id > 0 then + if not isSrvStringAvailable(name_id) then + all_str_available = false + else + ui:addText(ucstring(getSrvString(name_id):toUtf8().." ")) + end + end + end + if not all_str_available then + addOnDbChange(getUI("ui:interface:inv_guild"), "@UI:VARIABLES:CURRENT_SERVER_TICK", "updateChestList()") + elseif init == true then + debug("RANGE ===== "..tostring(getUI(id..":bulk_weight:encombrement").range)) + ui.selection = (iid - 1) % 2; + local max_guild_invslot = tostring(getDefine("max_guild_invslot")) + getUI(id..":bulk_weight:encombrement").value = runExpr("getItemsBulk('"..getDefine("guild_inv_dbentry").."',mul("..max_guild_invslot..","..tostring(ui.selection).."),"..max_guild_invslot..")") + getUI(id..":bulk_weight:encombrement").range = runExpr("getChestMaxBulk('"..getDefine("guild_chests_dbentry").."',"..tostring(ui.selection)..")") + removeOnDbChange(getUI("ui:interface:inv_guild"), "@SERVER:GUILD:CHEST:0:BULK_MAX") + end + end +end + -- VERSION -- RYZOM_INVENTORY_VERSION = 324 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/inventory.xml b/ryzom/client/data/gamedev/interfaces_v3/inventory.xml index 9789045b86..211792c77a 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/inventory.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/inventory.xml @@ -1332,7 +1332,8 @@ sizeref="wh" w="0" h="0"> - <instance template="tinv_nbslots_bulk_weight" + + <instance template="tguildinv_nbslots_bulk_weight" id="ibw" x="0" inv_branch="%guild_inv_dbentry" @@ -1340,11 +1341,55 @@ <instance template="tinv_item_list" id="iil" inv_branch_nb="%max_guild_invslot" + start_item="0" + inv_type="INV_GUILD" /> + <instance template="argent" + id="money" + posref="BL BL" + x="4" + y="2" + value="%guild_inv_money" /> + <ctrl style="new_element_header" + id="getmoney_but" + posref="MR ML" + posparent="money" + x="4" + wmargin="8" + hardtext="uittGetMoney" + onclick_l="proc" + params_l="guild_get_money" /> + <ctrl style="new_element_header" + id="putmoney_but" + posref="MR ML" + posparent="getmoney_but" + x="4" + wmargin="8" + hardtext="uittPutMoney" + onclick_l="proc" + params_l="guild_put_money" /> + </group> + + <group id="guild2" + posref="TL TL" + x="0" + y="0" + sizeref="wh" + w="0" + h="0"> + <instance template="tguildinv_nbslots_bulk_weight" + id="ibw" + x="0" + selected_chest="UI:SAVE:GUILD_INVENTORY_CHEST_B" + inv_branch="%guild_inv_dbentry" /> + <instance template="tinv_item_list" + id="iil" y="-18" sizeref="wh" h="-16" inv_branch="%guild_inv_dbentry" - inv_type="INV_GUILD" /> + inv_branch_nb="%max_guild_invslot" + start_item="0" + inv_type="INV_GUILD2" /> <instance template="argent" id="money" posref="BL BL" diff --git a/ryzom/client/data/gamedev/interfaces_v3/map.lua b/ryzom/client/data/gamedev/interfaces_v3/map.lua index b9d321ae63..62b31fb267 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/map.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/map.lua @@ -241,7 +241,7 @@ function game:doSpawnShapesByZone(continent) deleteShape(shape[9]) end - if shape[10] ~= nil and shape[9] > 0then + if shape[10] ~= nil and shape[9] > 0 then deleteShape(shape[10]) end diff --git a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml index b7cf67ee7c..5ccd5cd06f 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml @@ -358,6 +358,12 @@ <proc id="move_to_guild"> <action handler="move_item" params="to=lists|nblist=1|listsheet0=ui:interface:inventory:content:guild:iil:bag_icons" /> </proc> + <proc id="move_to_guild2"> + <action handler="move_item" params="to=lists|nblist=1|listsheet0=ui:interface:inventory:content:guild2:iil:bag_icons" /> + </proc> + <proc id="move_to_guild_other"> + <action handler="move_item" params="to=guild_other|chest2A=ui:interface:inv_guild2|chest2B=ui:interface:inventory:content:guild2|listsheet1=ui:interface:inventory:content:guild:iil:bag_icons|listsheet2=ui:interface:inventory:content:guild2:iil:bag_icons" /> + </proc> <!-- item menu when we are in bags (do not modify hierarchy or ids if you do not modify the code) --> <group type="menu" id="item_menu_in_bag" extends="base_menu" on_deactive="item_menu_deactivate" on_active="item_menu_check"> <action id="cris_enchant" name="uimCristalEnchant" handler="item_cristal_enchant" icon="cristal_spell.tga"/> @@ -380,6 +386,8 @@ <action id="pa5" name="uiPABagTitleMount5" handler="proc" params="move_to_pa|5" icon="spe_beast.tga"/> <action id="pa6" name="uiPABagTitleMount6" handler="proc" params="move_to_pa|6" icon="spe_beast.tga"/> <action id="guild" name="uimMtGuild" handler="proc" params="move_to_guild" icon="spe_memory.tga"/> + <action id="guild2" name="uimMtGuild2" handler="proc" params="move_to_guild2" icon="spe_memory.tga"/> + <action id="guild_other" name="uimMtGuildOther" handler="proc" params="move_to_guild_other" icon="spe_memory.tga"/> <action id="room" name="uimMtRoom" handler="proc" params="move_to_room" icon="building_state2.tga"/> </action> <!--<action id="drop" name="uimDrop" handler="proc" params="drop_item_proc" />--> @@ -1444,6 +1452,28 @@ <!-- uses identity(x,@branch) to add an observer on branch --> </group> </template> + + <template name="tguildinv_nbslots_bulk_weight" id="" inv_branch_nb="100" inv_branch="" inv_bulk_max="" posparent="parent" posref="TL TL" x="0" y="0" selected_chest=""> + <group id="#id" sizeref="w" h="16" posref="#posref"> + <group id="bulk_weight" child_resize_w="true" child_resize_wmargin="4" h="16" posref="BR BR" posparent="#posparent"> + <view type="bitmap" id="weight" posref="MR MR" x="0" texture="W_weight.tga" global_color="false" /> + <view type="text" id="weight_txt" posparent="weight" posref="ML MR" y="-2" x="-2" color="255 255 255 255" global_color="false" shadow="true" fontsize="10" /> + <instance template="text_tt" tooltip="uittInventoryWeight" posparent="weight_txt" /> + <link expr="identity(getItemsWeight('#inv_branch',mul(%max_guild_invslot, @#selected_chest),#inv_branch_nb),@#inv_branch)" target="weight_txt:hardtext" /> + <view type="bar" id="encombrement" mini="true" posparent="weight_txt" posref="ML MR" x="-4" range="0" color="%bulk_color" /> + <ctrl type="tooltip" id="encombrement_tt" posparent="encombrement" sizeref="wh" w="0" h="0" on_tooltip="get_tt_bulk" on_tooltip_params="dbbranch=#inv_branch|dbStart=mul(%max_guild_invslot,@#selected_chest)|dbCount=#inv_branch_nb|dbmax=getChestMaxBulk('%guild_chests_dbentry',@#selected_chest)" /> + <link expr="identity(getItemsBulk('#inv_branch',mul(%max_guild_invslot, @#selected_chest),#inv_branch_nb),@#inv_branch)" target="encombrement:value" /> + <link expr="identity(getChestMaxBulk('%guild_chests_dbentry',@#selected_chest),@#selected_chest)" target="encombrement:range" /> + </group> + <view type="text" id="slots_nb" posparent="bulk_weight" posref="BL BR" color="255 255 255 255" global_color="false" shadow="true" fontsize="10" /> + <ctrl type="tooltip" id="slots_tt" posparent="slots_nb" sizeref="wh" tooltip="uittInvSlots" /> + <link expr="identity(getGuildInvSlotCounts('#inv_branch', mul(%max_guild_invslot, @#selected_chest), #inv_branch_nb),@#inv_branch)" target="slots_nb:hardtext" /> + <group type="combo_box" id="chest" active="true" child_resize_w="true" child_resize_wmargin="2" h="16" posparent="slots_nb" posref="ML MR" x="-5" linked_to_db="false" on_change="lua" on_change_params="updateChest()"> + <instance template="combo_box_def1" /> + </group> + <!-- uses identity(x,@branch) to add an observer on branch --> + </group> + </template> <!-- onClickR on a filter --> <proc id="pinv_item_filter"> <!-- Reset all filter first --> diff --git a/ryzom/client/src/interface_v3/action_handler_game.cpp b/ryzom/client/src/interface_v3/action_handler_game.cpp index 1d1f78e1dc..8816a05539 100644 --- a/ryzom/client/src/interface_v3/action_handler_game.cpp +++ b/ryzom/client/src/interface_v3/action_handler_game.cpp @@ -4189,22 +4189,40 @@ class CHandlerGetTTBulk : public IActionHandler { CInterfaceManager *pIM= CInterfaceManager::getInstance(); string dbBranch= getParam(sParams, "dbbranch"); + string dbStart= getParam(sParams, "dbstart"); + string dbCount= getParam(sParams, "dbcount"); string dbMax= getParam(sParams, "dbmax"); + uint32 start = 0; + uint32 count = 10000; + uint32 max = 0; + if (dbStart != "") + { + sint64 valstart; + CInterfaceExpr::evalAsInt(dbStart, valstart); + start = (uint32)valstart; + } + if (dbCount != "") + { + sint64 valcount; + CInterfaceExpr::evalAsInt(dbCount, valcount); + count = (uint32)valcount; + } + if (dbMax != "") + { + sint64 valmax; + CInterfaceExpr::evalAsInt(dbMax, valmax); + max = (uint32)valmax; + } // Get the sum of the bulk for this db branch const double epsilon = 0.001; - float val = CInventoryManager::getBranchBulk(dbBranch, 0, 10000) + epsilon; - - // Get the Max value - sint32 maxVal= 0; - CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(dbMax, false); - if(node) - maxVal= node->getValue32(); + nlinfo("Start = %s, %d, Count = %s, %d, Max = %s, %d", dbStart.c_str(), start, dbCount.c_str(), count, dbMax.c_str(), max); + float val = CInventoryManager::getBranchBulk(dbBranch, start, count) + epsilon; // Replace in the formated text string str= CI18N::get("uittBulkFormat"); - strFindReplace(str, "%v", toString("%.2f", val) ); - strFindReplace(str, "%m", toString(maxVal) ); + strFindReplace(str, "%v", toString("%.2f", val)); + strFindReplace(str, "%m", toString(max) ); CWidgetManager::getInstance()->setContextHelpText(str); } }; diff --git a/ryzom/client/src/interface_v3/action_handler_item.cpp b/ryzom/client/src/interface_v3/action_handler_item.cpp index 41c279b2c8..6806053f4e 100644 --- a/ryzom/client/src/interface_v3/action_handler_item.cpp +++ b/ryzom/client/src/interface_v3/action_handler_item.cpp @@ -482,7 +482,7 @@ static void sendSwapItemMsg(const CDBCtrlSheet *pCSSrc, const CDBCtrlSheet *pCSD // Special case for guilds that are not on the same counter as the other inventories // The guild counter is global on the server so it can changes without this client uint16 nGuildSessionCounter = 0; - if ((srcInvId == (uint16)INVENTORIES::guild) || (dstInvId == (uint16)INVENTORIES::guild)) + if (srcInvId == (uint16)INVENTORIES::guild || dstInvId == (uint16)INVENTORIES::guild) { CInterfaceManager *pIM = CInterfaceManager::getInstance(); nGuildSessionCounter = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:GUILD:INVENTORY:SESSION")->getValue16(); @@ -1556,6 +1556,45 @@ class CHandlerMoveItem : public IActionHandler } } } + else if (sDest == "guild_other") + { + string callerId = toString(pCaller->getId()); + + string sChest2A = getParam(sParams, "chest2A"); + string sChest2B = getParam(sParams, "chest2B"); + string sListId1 = getParam(sParams, "listsheet1"); + string sListId2 = getParam(sParams, "listsheet2"); + if (!sChest2A.empty() && !sChest2B.empty() && !sListId1.empty() && !sListId2.empty()) + { + IListSheetBase *pLS = dynamic_cast<IListSheetBase*>(CWidgetManager::getInstance()->getElementFromId(sListId2)); + if (callerId.substr(0, sChest2A.size()) == sChest2A) + { + nlinfo("guild_other, chest 2a"); + pLS = dynamic_cast<IListSheetBase*>(CWidgetManager::getInstance()->getElementFromId(sListId1)); + } + if (callerId.substr(0, sChest2B.size()) == sChest2B) + { + nlinfo("guild_other, chest 2b"); + pLS = dynamic_cast<IListSheetBase*>(CWidgetManager::getInstance()->getElementFromId(sListId1)); + } + + if (pLS == NULL) return; + sint32 nbelt = pLS->getNbSheet(); + nlinfo("nbelt = %d", nbelt); + for (sint32 i = 0; i < nbelt; ++i) + { + nlinfo("Item %d = %d", i, pLS->getSheet(i)->getIndexInDB()); + if (pLS->getSheet(i)->getSheetId() == 0) + { + // Send swap_item + nlinfo("Swap to %d", i); + CAHManager::getInstance()->runActionHandler("swap_item", pLS->getSheet(i), "src="+toString(pCaller->getId())); + return; + } + } + } + } + // Test With Group of Items. YOYO: TODO: test if works /*else if (sDest == "groups") { @@ -1803,6 +1842,8 @@ class CHandlerItemMenuCheck : public IActionHandler CViewTextMenu *pMoveSubMenu = dynamic_cast<CViewTextMenu*>(pMenu->getView("move")); CViewTextMenu *pMoveToBag = dynamic_cast<CViewTextMenu*>(pMenu->getView("bag")); CViewTextMenu *pMoveToGuild = dynamic_cast<CViewTextMenu*>(pMenu->getView("guild")); + CViewTextMenu *pMoveToGuild2 = dynamic_cast<CViewTextMenu*>(pMenu->getView("guild2")); + CViewTextMenu *pMoveToGuildOther = dynamic_cast<CViewTextMenu*>(pMenu->getView("guild_other")); CViewTextMenu *pMoveToRoom = dynamic_cast<CViewTextMenu*>(pMenu->getView("room")); CViewTextMenu *pMoveToPa[MAX_INVENTORY_ANIMAL]; @@ -1831,8 +1872,7 @@ class CHandlerItemMenuCheck : public IActionHandler if(pLockUnlock) pLockUnlock->setActive(true); const CItemSheet *pIS = pCS->asItemSheet(); - if (invId != INVENTORIES::guild) - if (pIS != NULL) + if (pIS != NULL && invId != INVENTORIES::guild) { if (pCrisEnchant && pIS->Family == ITEMFAMILY::CRYSTALLIZED_SPELL && !bIsLockedByOwner) pCrisEnchant->setActive(true); @@ -1976,7 +2016,7 @@ class CHandlerItemMenuCheck : public IActionHandler // Disable Text entries not supported by this menu (eg: if I am the Bag, i cannot drop to myself!) // Also Disable Text entries if the inventory is not present if(pMoveToBag) - pMoveToBag->setActive( invId!=INVENTORIES::bag && + pMoveToBag->setActive( invId != INVENTORIES::bag && invMngr.isInventoryPresent(INVENTORIES::bag) && (invId!=INVENTORIES::guild || invMngr.isInventoryPresent(INVENTORIES::guild)) ); @@ -1990,6 +2030,12 @@ class CHandlerItemMenuCheck : public IActionHandler if (pMoveToGuild) pMoveToGuild->setActive(invId!=INVENTORIES::guild && invMngr.isInventoryPresent(INVENTORIES::guild)); + if (pMoveToGuild2) + pMoveToGuild2->setActive(invId!=INVENTORIES::guild && invMngr.isInventoryPresent(INVENTORIES::guild)); + + if (pMoveToGuildOther) + pMoveToGuildOther->setActive(invId==INVENTORIES::guild); + if (pMoveToRoom) pMoveToRoom->setActive(invId!=INVENTORIES::player_room && invMngr.isInventoryPresent(INVENTORIES::player_room)); @@ -2188,6 +2234,11 @@ class CHandlerItemMenuCheck : public IActionHandler CViewTextMenu* tmp = pNewSubMenu->addLine(pMoveToGuild->getHardText(),"item_group_move", "destination=guild|" + ahParams, name + "_guild"); if(tmp) tmp->setGrayed(pMoveToRoom->getGrayed()); } + if(pMoveToGuild2 && pMoveToGuild2->getActive() && ClientCfg.ItemGroupAllowGuild) + { + CViewTextMenu* tmp = pNewSubMenu->addLine(pMoveToGuild2->getHardText(),"item_group_move", "destination=guild2|" + ahParams, name + "_guild2"); + if(tmp) tmp->setGrayed(pMoveToRoom->getGrayed()); + } } } diff --git a/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.cpp b/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.cpp index 5fef959984..276ca3285c 100644 --- a/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.cpp +++ b/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.cpp @@ -671,7 +671,7 @@ void CDBGroupListSheetText::draw () if (_EmptyListNotifier) { - _EmptyListNotifier->setActive(_DownloadComplete && (_NumValidSheets == 0)); + _EmptyListNotifier->setActive(_DownloadComplete && (_NumValidSheets == 0)); } } @@ -1125,6 +1125,23 @@ void CDBGroupListSheetText::notifyDownloadComplete(bool downloadComplete) } } +void CDBGroupListSheetText::setStartDbIndex(sint index) +{ + _StartDbIdx = index; + uint nbNodes = _DbBranch->getNbNodes(); + + // determine the inventory slot from the database branch id + int slotNum = CDBCtrlSheet::getInventorySlot( _DbBranchName ); + nlinfo("Id = %s, _DbBranchName = %s, _StartDbIdx = %d, slotNum = %d, nbNodes = %d, sheetChildrens = %d", _Id.c_str(), _DbBranchName.c_str(), _StartDbIdx, slotNum, nbNodes, _SheetChildren.size()); + for (uint i = 0; i < nbNodes; i++) + { + if (i < _SheetChildren.size() && _SheetChildren[i]->Ctrl) + _SheetChildren[i]->Ctrl->setSheetFast(_DbBranchName, _StartDbIdx+i, slotNum); + } + _NeedToSort = true; + invalidateCoords(); +} + // *************************************************************************** // *************************************************************************** @@ -1229,3 +1246,20 @@ class CHandlerListSheetTextResetSelection : public IActionHandler } }; REGISTER_ACTION_HANDLER( CHandlerListSheetTextResetSelection, "list_sheet_text_reset_selection" ); + +// *************************************************************************** +class CListSheetTextChangeStartItem : public IActionHandler +{ +public: + virtual void execute (CCtrlBase *pCaller, const std::string &sParams) + { + CDBGroupListSheetText *pLS = dynamic_cast<CDBGroupListSheetText*>(pCaller); + if (pLS== NULL) return; + uint index; + std::string idx = getParam(sParams, "index"); + if (!fromString(idx, index)) return; + nlinfo("setStartDbIndex %d", index); + pLS->setStartDbIndex(index); + } +}; +REGISTER_ACTION_HANDLER (CListSheetTextChangeStartItem, "list_sheet_text_change_start_item"); diff --git a/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h b/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h index 0c03c6da52..6ec2fef0ad 100644 --- a/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h +++ b/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h @@ -202,6 +202,9 @@ class CDBGroupListSheetText : public IListSheetBase CGroupContainer *getContainer(); + sint getStartDbIndex() const { return _StartDbIdx; } + void setStartDbIndex(sint index); + protected: friend struct CSheetChild; @@ -274,7 +277,7 @@ class CDBGroupListSheetText : public IListSheetBase bool _ClickWhenPushed; - uint _NumValidSheets; + uint _NumValidSheets; // List of sheet child to update when dynstring received std::set< CSheetChild* > _NameIdToUpdate; diff --git a/ryzom/client/src/interface_v3/interface_expr_user_fct_items.cpp b/ryzom/client/src/interface_v3/interface_expr_user_fct_items.cpp index 7744be7ebf..861f93d604 100644 --- a/ryzom/client/src/interface_v3/interface_expr_user_fct_items.cpp +++ b/ryzom/client/src/interface_v3/interface_expr_user_fct_items.cpp @@ -1013,6 +1013,24 @@ static DECLARE_INTERFACE_USER_FCT(getItemsBulkUserFct) } REGISTER_INTERFACE_USER_FCT("getItemsBulk", getItemsBulkUserFct) +// *************************************************************************** +static DECLARE_INTERFACE_USER_FCT(getChestMaxBulkUserFct) +{ + if (args.size() != 2 || !args[0].toString() || !args[1].toInteger()) + { + nlwarning("<getChestMaxBulk> 2 arguments expected : (dbPath, chest)"); + return false; + } + const std::string &basePath = args[0].getString(); + uint8 chest = (uint16) args[1].getInteger(); + CCDBNodeLeaf *prop = NLGUI::CDBManager::getInstance()->getDbProp(basePath+NLMISC::toString(":%u:BULK_MAX", chest)); + if (!prop) return false; + uint32 bulkMax = prop->getValue32(); + result.setInteger(bulkMax); + return true; +} +REGISTER_INTERFACE_USER_FCT("getChestMaxBulk", getChestMaxBulkUserFct) + // *************************************************************************** // return bulk/bulkmax static DECLARE_INTERFACE_USER_FCT(getBulkStrUserFct) @@ -1034,7 +1052,7 @@ static DECLARE_INTERFACE_USER_FCT(getBulkStrUserFct) sint32 maxVal= (sint32)args[1].getInteger(); // Replace in the formated text. - std::string str= toString("%d/%d", val, maxVal); + std::string str= toString("%d/%d", val, maxVal); result.setString(str); return true; @@ -1056,7 +1074,7 @@ static DECLARE_INTERFACE_USER_FCT(getInvSlotCounts) CInventoryManager::getBranchSlotCounts(dbBranch, nbUsedSlots, nbMaxSlots); // Replace in the formated text - std::string str = toString("%u/%u", nbUsedSlots, nbMaxSlots); + std::string str = toString("%u/%u", nbUsedSlots, nbMaxSlots); result.setString(str); return true; } diff --git a/ryzom/client/src/interface_v3/inventory_manager.cpp b/ryzom/client/src/interface_v3/inventory_manager.cpp index 6c6ab12e85..641c08f6d1 100644 --- a/ryzom/client/src/interface_v3/inventory_manager.cpp +++ b/ryzom/client/src/interface_v3/inventory_manager.cpp @@ -3349,11 +3349,11 @@ class CHandlerInvTempAll : public IActionHandler if (pInv->isInventoryAvailable(INVENTORIES::pet_animal4)) BagsBulk.push_back(pair <double, double>(pInv->getBagBulk(4), pInv->getMaxBagBulk(4))); if (pInv->isInventoryAvailable(INVENTORIES::pet_animal5)) - BagsBulk.push_back(pair <double, double>(pInv->getBagBulk(5), pInv->getMaxBagBulk(4))); + BagsBulk.push_back(pair <double, double>(pInv->getBagBulk(5), pInv->getMaxBagBulk(5))); if (pInv->isInventoryAvailable(INVENTORIES::pet_animal6)) - BagsBulk.push_back(pair <double, double>(pInv->getBagBulk(6), pInv->getMaxBagBulk(4))); + BagsBulk.push_back(pair <double, double>(pInv->getBagBulk(6), pInv->getMaxBagBulk(6))); if (pInv->isInventoryAvailable(INVENTORIES::pet_animal7)) - BagsBulk.push_back(pair <double, double>(pInv->getBagBulk(7), pInv->getMaxBagBulk(4))); + BagsBulk.push_back(pair <double, double>(pInv->getBagBulk(7), pInv->getMaxBagBulk(7))); bool bPlaceFound = true; @@ -3876,7 +3876,7 @@ void CInventoryManager::sortBag() } // *************************************************************************** -bool CInventoryManager::isInventoryPresent(INVENTORIES::TInventory invId) +bool CInventoryManager::isInventoryPresent(INVENTORIES::TInventory invId) { CInterfaceManager *pIM= CInterfaceManager::getInstance(); @@ -3904,7 +3904,7 @@ bool CInventoryManager::isInventoryPresent(INVENTORIES::TInventory invId) // *************************************************************************** -bool CInventoryManager::isInventoryAvailable(INVENTORIES::TInventory invId) +bool CInventoryManager::isInventoryAvailable(INVENTORIES::TInventory invId) { CInterfaceManager *pIM= CInterfaceManager::getInstance(); diff --git a/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp b/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp index 19b016b897..ae526a2a56 100644 --- a/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp +++ b/ryzom/client/src/interface_v3/lua_ihm_ryzom.cpp @@ -607,6 +607,8 @@ void CLuaIHMRyzom::RegisterRyzomFunctions(NLGUI::CLuaState &ls) LUABIND_FUNC(clearHtmlUndoRedo), LUABIND_FUNC(getDynString), LUABIND_FUNC(isDynStringAvailable), + LUABIND_FUNC(getSrvString), + LUABIND_FUNC(isSrvStringAvailable), LUABIND_FUNC(isFullyPatched), LUABIND_FUNC(getSheetType), LUABIND_FUNC(getSheetShape), @@ -3788,6 +3790,34 @@ bool CLuaIHMRyzom::isDynStringAvailable(sint32 dynStringId) return res; } +#ifdef RYZOM_LUA_UCSTRING +ucstring CLuaIHMRyzom::getSrvString(sint32 stringId) +{ + //H_AUTO(Lua_CLuaIHM_getDynString) + string result; + STRING_MANAGER::CStringManagerClient::instance()->getString(stringId, result); + return ucstring::makeFromUtf8(result); // Compatibility +} +#else +std::string CLuaIHMRyzom::getSrvString(sint32 stringId) +{ + //H_AUTO(Lua_CLuaIHM_getDynString) + string result; + STRING_MANAGER::CStringManagerClient::instance()->getString(stringId, result); + return result; +} +#endif + +// *************************************************************************** +bool CLuaIHMRyzom::isSrvStringAvailable(sint32 stringId) +{ + //H_AUTO(Lua_CLuaIHM_isDynStringAvailable) + string result; + bool res = STRING_MANAGER::CStringManagerClient::instance()->getString(stringId, result); + return res; +} + + // *************************************************************************** bool CLuaIHMRyzom::isFullyPatched() { diff --git a/ryzom/client/src/interface_v3/lua_ihm_ryzom.h b/ryzom/client/src/interface_v3/lua_ihm_ryzom.h index b30f1c1af2..4cf7bc4677 100644 --- a/ryzom/client/src/interface_v3/lua_ihm_ryzom.h +++ b/ryzom/client/src/interface_v3/lua_ihm_ryzom.h @@ -246,6 +246,12 @@ class CLuaIHMRyzom static std::string getDynString(sint32 dynStringId); #endif static bool isDynStringAvailable(sint32 dynStringId); +#ifdef RYZOM_LUA_UCSTRING + static ucstring getSrvString(sint32 stringId); +#else + static std::string getSrvString(sint32 stringId); +#endif + static bool isSrvStringAvailable(sint32 stringId); static bool isFullyPatched(); static std::string getSheetType(const std::string &sheet); static std::string getSheetShape(const std::string &sheet); diff --git a/ryzom/client/src/net_manager.cpp b/ryzom/client/src/net_manager.cpp index 5edefdf380..b36aebe0c8 100644 --- a/ryzom/client/src/net_manager.cpp +++ b/ryzom/client/src/net_manager.cpp @@ -2784,9 +2784,9 @@ void updateInventoryFromStream (NLMISC::CBitMemStream &impulse, const CInventory { uint32 slotIndex; impulse.serial( slotIndex, CInventoryCategoryTemplate::SlotBitSize ); - + nlinfo("Slot %d", slotIndex); // Access the database leaf - CCDBNodeBranch *slotNode = safe_cast<CCDBNodeBranch*>(inventoryNode->getNode( (uint16)slotIndex )); + CCDBNodeBranch *slotNode = safe_cast<CCDBNodeBranch*>(inventoryNode->getNode( (uint32)slotIndex )); CCDBNodeLeaf *leafNode = type_cast<CCDBNodeLeaf*>(slotNode->find( INVENTORIES::InfoVersionStr )); BOMB_IF( !leafNode, "Inventory slot property missing in database", continue ); diff --git a/ryzom/common/data_common/database.xml b/ryzom/common/data_common/database.xml index 1c83f5fab9..4447a81b73 100644 --- a/ryzom/common/data_common/database.xml +++ b/ryzom/common/data_common/database.xml @@ -1159,6 +1159,21 @@ <!-- tick when player entered the guild--> </branch> </branch> + <branch name="CHEST"> + <branch name="" + count="20"> + <leaf name="NAME" + type="TEXT" /> + <leaf name="VIEW_GRADE" + type="I3" /> + <leaf name="PUT_GRADE" + type="I3" /> + <leaf name="GET_GRADE" + type="I3" /> + <leaf name="BULK_MAX" + type="I32" /> + </branch> + </branch> <branch name="INVENTORY"> <leaf name="SESSION" type="I16" /> diff --git a/ryzom/server/src/entities_game_service/admin.cpp b/ryzom/server/src/entities_game_service/admin.cpp index c47fdb1f73..cd4e8c8483 100644 --- a/ryzom/server/src/entities_game_service/admin.cpp +++ b/ryzom/server/src/entities_game_service/admin.cpp @@ -4647,7 +4647,32 @@ NLMISC_COMMAND (setDontTranslateLangs, "Set langs that a player dont want to see -NLMISC_COMMAND (updateTarget, "Update current target", "<user id>") + if (args.size() != 3) + return false; + + GET_CHARACTER + + CGuild * guild = CGuildManager::getInstance()->getGuildFromId(c->getGuildId()); + if (guild) + { + uint8 chest; + NLMISC::fromString(args[2], chest); + + if (args[1] == "B") + guild->setChestB(c->getId(), chest); + else + guild->setChestA(c->getId(), chest); + } + return true; +} + +// /a setGuildInventoryChestParams (0x0000000020:00:00:82) 0 "Chest 1" Member Member Member + +//setGuildInventoryChestParams (0x0000000020:00:00:82) 1 "Coffre 2" Member Member Member +//setGuildInventoryChestParams (0x0000000020:00:00:82) 5 "Coffre 4" Member Member Member +///a setGuildInventoryChestParams 0 "Chest 1" Member Member Member +//---------------------------------------------------------------------------- +NLMISC_COMMAND(setGuildInventoryChestParams, "Set the chest of inventory", "<eid> <chest> <name> <rank view> <rank put> <rank get>" ) { GET_CHARACTER c->updateTarget(); diff --git a/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp b/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp index e2bc9a3fef..78fc8d2ef8 100644 --- a/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp +++ b/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp @@ -2614,6 +2614,13 @@ void cbItemSwap( NLNET::CMessage& msgin, const std::string &serviceName, NLNET:: inventoryDst = INVENTORIES::TInventory(temp); msgin.serial( slotDst ); msgin.serial( quantity ); + nlinfo("slotDst = %u", inventoryDst); + // Inventory guild2 are a fake + if (inventorySrc == INVENTORIES::guild2) + inventorySrc == INVENTORIES::guild; + + if (inventoryDst == INVENTORIES::guild2) + inventoryDst == INVENTORIES::guild; CCharacter *character = PlayerManager.getChar( charId ); if (character == NULL) @@ -2653,7 +2660,7 @@ void cbItemSwap( NLNET::CMessage& msgin, const std::string &serviceName, NLNET:: else if (inventoryDst == (uint16) INVENTORIES::guild) { // Bag -> Guild - pGuild->putItem(character, (INVENTORIES::TInventory) inventorySrc, slotSrc, quantity, nGuildSessionCounter); + pGuild->putItem(character, (INVENTORIES::TInventory) inventorySrc, slotSrc, slotDst, quantity, nGuildSessionCounter); } return; diff --git a/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.cpp b/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.cpp index 4db0fa4b30..fed45b2b05 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.cpp @@ -41,14 +41,16 @@ extern CGenericXmlMsgHeaderManager GenericMsgManager; CGuildInventory::CGuildInventory() { H_AUTO(CGuildInventory); - setSlotCount( getMaxSlot() ); setInventoryId( INVENTORIES::guild ); + setSlotCount( getMaxSlot() ); } //----------------------------------------------------------------------------- -uint32 CGuildInventory::getMaxBulk() const +uint32 CGuildInventory::getMaxBulk(uint8 index) const { - return BaseGuildBulk; /* keep this until players are able to increase guild max bulk */ + if (index < GUILD_NB_CHESTS) + return _ChestsMaxBulk[index]*1000; + return 0; } //----------------------------------------------------------------------------- @@ -71,11 +73,7 @@ void CGuildInventoryView::init( CGuildInventory *inventory, CCDBGroup *guildInvD H_AUTO(resizeGuildInventoryInit); _ItemsSessions.resize( getInventory()->getSlotCount(), 0 ); } - nlassert( INVENTORIES::NbGuildSlots == getInventory()->getSlotCount() ); _GuildInvDb = guildInvDb; -// _GuildInvDb->setProp( "GUILD:INVENTORY:BULK_MAX", getInventory()->getMaxBulk() / 1000 ); - CBankAccessor_GUILD::getGUILD().getINVENTORY().setBULK_MAX(*_GuildInvDb, getInventory()->getMaxBulk() / 1000 ); -// _GuildInvDb->setProp( "GUILD:INVENTORY:SESSION", _InventorySession ); CBankAccessor_GUILD::getGUILD().getINVENTORY().setSESSION(*_GuildInvDb, _InventorySession ); } @@ -149,8 +147,8 @@ void CGuildInventoryView::updateClientSlot(uint32 slot) itemSlot.setItemProp( INVENTORIES::Quality, item->quality() ); itemSlot.setItemProp( INVENTORIES::Quantity, item->getStackSize() ); itemSlot.setItemProp( INVENTORIES::UserColor, item->color() ); - itemSlot.setItemProp( INVENTORIES::CreateTime, itemId.getCreateTime() ); - itemSlot.setItemProp( INVENTORIES::Serial, itemId.getSerialNumber() ); + //itemSlot.setItemProp( INVENTORIES::CreateTime, itemId.getCreateTime() ); + //itemSlot.setItemProp( INVENTORIES::Serial, itemId.getSerialNumber() ); itemSlot.setItemProp( INVENTORIES::Locked, item->getLockCount()>0?1:0 ); itemSlot.setItemProp( INVENTORIES::Weight, item->weight() / 10 ); itemSlot.setItemProp( INVENTORIES::NameId, 0 ); // TODO: name of guild (item->sendNameId()) @@ -234,7 +232,6 @@ void CGuildInventoryView::updateInfoVersion(uint32 slot) CEntityId destCharacterId = proxy.getId(); msgout.serial( destCharacterId ); GenericMsgManager.pushNameToStream( "ITEM_INFO:REFRESH_VERSION", bms ); - nlctassert( CItemInfos::SlotIdIndexBitSize >= INVENTORIES::CInventoryCategoryForGuild::SlotBitSize ); uint16 slotId = ((uint16)slot) | ((uint16)(INVENTORIES::guild << CItemInfos::SlotIdIndexBitSize)); bms.serial( slotId ); bms.serial( currentVersion ); @@ -307,12 +304,59 @@ void CGuildInventoryView::provideContents( CBitMemStream& stream ) CGuildInventory *guildInv = static_cast<CGuildInventory*>(getInventory()); for ( uint i=0; i!=guildInv->getSlotCount(); ++i ) { - CGameItemPtr itemPtr = guildInv->getItem( i ); - if ( itemPtr != NULL ) + setChestA(recipient, 0); + setChestB(recipient, 1); + } + + uint8 chestA = getChestA(recipient); + uint8 chestB = getChestB(recipient); + + CCharacter * c = PlayerManager.getChar(recipient); + if (!c) + return; + + CGuild * guild = CGuildManager::getInstance()->getGuildFromId(c->getGuildId()); + if (!guild) + return; + + CGuildMember* member = guild->getMemberFromEId(c->getId()); + if (!member) + return; + + if (!c->isInitChest(chestA)) + { + if (guild->haveChestViewGrade(chestA, member->getGrade())) { - updateClientSlot( i ); - _GuildInvUpdater.pushItemInfoVersion( i ); // send the current info version (no change) + nlinfo("Access authorized"); + for ( uint i=chestA*GuildChestSlots; i < (chestA+1)*GuildChestSlots; ++i ) + { + CGameItemPtr itemPtr = guildInv->getItem( i ); + if ( itemPtr != NULL ) + { + updateClientSlot( i ); + _GuildInvUpdater.pushItemInfoVersion( i ); // send the current info version (no change) + } + } } } + + if (!c->isInitChest(chestB)) + { + if (guild->haveChestViewGrade(chestB, member->getGrade())) + { + nlinfo("Access authorized"); + for ( uint i=chestB*GuildChestSlots; i < (chestB+1)*GuildChestSlots; ++i ) + { + CGameItemPtr itemPtr = guildInv->getItem( i ); + if ( itemPtr != NULL ) + { + updateClientSlot( i ); + _GuildInvUpdater.pushItemInfoVersion( i ); // send the current info version (no change) + } + } + } + c->isInitChest(chestB, true); + } + provideUpdate( stream ); } diff --git a/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.h b/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.h index f905239ee6..9143dc4b3e 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.h +++ b/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.h @@ -22,6 +22,8 @@ #include "game_item_manager/player_inventory.h" #include "inventory_updater.h" +#define GUILD_NB_CHESTS 20 + class CGuild; class CCDBSynchronised; class CCDBGroup; @@ -68,10 +70,16 @@ class CGuildInventory : public CInventoryBase CGuildInventory(); /// Return the max bulk - virtual uint32 getMaxBulk() const; + virtual uint32 getMaxBulk(uint8 index = 0) const; /// Return the max number of slots virtual uint32 getMaxSlot() const; + + void setChestMaxBulk(uint8 chest, uint32 value) { if (chest < GUILD_NB_CHESTS) _ChestsMaxBulk[chest] = value; } + +private: + uint32 _ChestsMaxBulk[GUILD_NB_CHESTS]; + }; /** @@ -106,6 +114,24 @@ class CGuildInventoryView : public IInventoryView, public IDataProvider /// Return the "info version" of the specified item slot uint8 getItemInfoVersion( uint32 slot ) { return _GuildInvUpdater.getItemInfoVersion( slot ); } + /// Return the subdivisions chest A,B + uint8 getChestA(const NLMISC::CEntityId &recipient) { + TPlayerChest::const_iterator it = _ChestsA.find(recipient); + if (it != _ChestsA.end()) + return (*it).second; + return 0; + } + uint8 getChestB(const NLMISC::CEntityId &recipient) { + TPlayerChest::const_iterator it = _ChestsB.find(recipient); + if (it != _ChestsB.end()) + return (*it).second; + return 1; + } + + /// Select the subdivisions + uint8 setChestA(const NLMISC::CEntityId &recipient, uint8 chest) { _ChestsA[recipient] = chest; } + uint8 setChestB(const NLMISC::CEntityId &recipient, uint8 chest) { _ChestsB[recipient] = chest; } + /// An item has changed (can be a removing) virtual void onItemChanged(uint32 slot, INVENTORIES::TItemChangeFlags changeFlags); @@ -155,6 +181,10 @@ class CGuildInventoryView : public IInventoryView, public IDataProvider CGuild *_Guild; /// client updater for guild inventory CInventoryUpdaterForGuild _GuildInvUpdater; + /// Chests of player + typedef std::map<NLMISC::CEntityId, uint8> TPlayerChest; + TPlayerChest _ChestsA; + TPlayerChest _ChestsB; }; diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_bag.cpp b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_bag.cpp index faa0ea3acf..f3559a430b 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_bag.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_bag.cpp @@ -30,7 +30,7 @@ extern NLMISC::CVariable<uint32> MaxPlayerBulk; ///////////////////////////////////////////////////////////// // **************************************************************************** -uint32 CBagInventory::getMaxBulk() const +uint32 CBagInventory::getMaxBulk(uint8 index) const { return MaxPlayerBulk; } diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_bag.h b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_bag.h index 7fd0a2abc0..9a3fff3145 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_bag.h +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_bag.h @@ -25,11 +25,11 @@ class CBagInventory : public CInventoryBase { public: - + //@{ //@name Overloads from inventory base /// Return the max bulk according to player capacity - uint32 getMaxBulk() const; + uint32 getMaxBulk(uint8 index = 0) const; uint32 getMaxSlot() const; }; diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_pet.cpp b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_pet.cpp index 45596a45e1..b6a7158a37 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_pet.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_pet.cpp @@ -50,7 +50,7 @@ uint32 CPetInventory::getMaxWeight() const return _PetMaxWeight; } -uint32 CPetInventory::getMaxBulk() const +uint32 CPetInventory::getMaxBulk(uint8 index) const { return _PetMaxBulk; } @@ -88,7 +88,7 @@ void CPetInvView::onItemChanged(uint32 slot, INVENTORIES::TItemChangeFlags chang void CPetInvView::onInventoryChanged(INVENTORIES::TInventoryChangeFlags changeFlags) { - + } diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_pet.h b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_pet.h index aa4aba8451..f4b4484946 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_pet.h +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_pet.h @@ -34,9 +34,9 @@ class CPetInventory : public CInventoryBase //@name Overloads from inventory base /// Return the max bulk according to player capacity uint32 getMaxWeight() const; - uint32 getMaxBulk() const; + uint32 getMaxBulk(uint8 index = 0) const; uint32 getMaxSlot() const; - + /// Update database of item representation // virtual void onItemChanged(uint32 slot); /// Update database of inventory representation diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_room.cpp b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_room.cpp index 8a67b56e1c..e7a8eef860 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_room.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_room.cpp @@ -35,7 +35,7 @@ CPlayerRoomInventory::CPlayerRoomInventory(CCharacter * owner) } // **************************************************************************** -uint32 CPlayerRoomInventory::getMaxBulk() const +uint32 CPlayerRoomInventory::getMaxBulk(uint8 index) const { return BasePlayerRoomBulk; } diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_room.h b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_room.h index d2d8bae573..490d16f9e6 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_room.h +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_room.h @@ -30,7 +30,7 @@ class CPlayerRoomInventory : public CInventoryBase //@{ //@name Overloads from inventory base - virtual uint32 getMaxBulk() const; + virtual uint32 getMaxBulk(uint8 index = 0) const; virtual uint32 getMaxSlot() const; virtual TInventoryOpResult insertItem(CGameItemPtr &item, uint32 slot = INVENTORIES::INSERT_IN_FIRST_FREE_SLOT, bool autoStack = false); diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp b/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp index 8d38f83574..d5f3e9e75b 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp @@ -83,19 +83,37 @@ void CInventoryBase::setSlotCount(uint size) // recompute free slot, weight and bulk _FreeSlotCount = 0; _InventoryWeight = 0; - _InventoryBulk = 0; + _InventoryBulk[0] = 0; + if (_InventoryId == INVENTORIES::guild) + { + nlinfo("init %u _InventoryBulk with %u items", GUILD_NB_CHESTS, _Items.size()); + for (uint8 i = 1; i < GUILD_NB_CHESTS; i++) + _InventoryBulk[i] = 0; + } for (uint i=0; i<_Items.size(); ++i) { if (_Items[i] != NULL) { _InventoryWeight += _Items[i]->getStackWeight(); - _InventoryBulk += _Items[i]->getStackBulk(); + uint8 chest = 0; + if (_InventoryId == INVENTORIES::guild) + { + chest = floor((float)_Items[i]->getInventorySlot() / (float)GuildChestSlots); + } + _InventoryBulk[chest] += _Items[i]->getStackBulk(); } else { _FreeSlotCount++; } } + if (_InventoryId == INVENTORIES::guild) + { + nlinfo("_InventoryBulk:"); + for (uint8 i = 0; i < GUILD_NB_CHESTS; i++) + nlinfo("_InventoryBulk[%u] = %u", i, _InventoryBulk[i]); + } + } /// Return the inventory size in slot @@ -126,9 +144,9 @@ uint32 CInventoryBase::getInventoryWeight() const } // **************************************************************************** -uint32 CInventoryBase::getInventoryBulk() const +uint32 CInventoryBase::getInventoryBulk(uint8 index) const { - return _InventoryBulk; + return _InventoryBulk[index]; } // **************************************************************************** @@ -161,7 +179,7 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it nlassert(item->getInventory() == NULL); nlassert(slot < _Items.size() || slot == INVENTORIES::INSERT_IN_FIRST_FREE_SLOT); - if (!ignoreWeightAndBulk) + if (_InventoryId != INVENTORIES::guild && !ignoreWeightAndBulk) { if (item->getStackWeight() + getInventoryWeight() > getMaxWeight()) return ior_overweight; @@ -172,6 +190,21 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it if (autoStack) { H_AUTO(AutoStack); + + uint32 minSlotSearch = 0; + uint32 bulkMax = 0; + if (_InventoryId == INVENTORIES::guild) + { + uint8 chest = floor((float)slot / (float)GuildChestSlots); + nlinfo("item stack + InventoryBulk = %u + %u = %u > getMaxBulk(%u) = %u", item->getStackBulk(), getInventoryBulk(), item->getStackBulk() + getInventoryBulk(), chest, getMaxBulk(chest)); + if (item->getStackBulk() + getInventoryBulk() > getMaxBulk(chest)) + return ior_overbulk; + + minSlotSearch = GuildChestSlots*chest; + nlinfo("Slot = %d, minSlotSearch = %d", slot, minSlotSearch); + slot = INVENTORIES::INSERT_IN_FIRST_FREE_SLOT; + } + // If slot provided check we can stack if we can't find an empty slot if (slot != INVENTORIES::INSERT_IN_FIRST_FREE_SLOT) if (canStackItem(item, slot) != ior_ok) @@ -258,12 +291,14 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it // which update weight and bulk item->setStackSize(sizeModif); - // update weight and bulk "manually" - updateWeightAndBulk(item, sizeModif); - // put the item in the inventory _Items[slotModif] = item; item->setInventory(CInventoryPtr(this), slotModif); + + // update weight and bulk "manually" + nlinfo("updateWeightAndBulk"); + updateWeightAndBulk(item, sizeModif); + --_FreeSlotCount; onItemChanged(slotModif, INVENTORIES::itc_inserted); bInserted = true; @@ -304,6 +339,7 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it _Items[slot] = item; item->setInventory(CInventoryPtr(this), slot); + nlinfo("updateWeightAndBulk"); updateWeightAndBulk(item, item->getStackSize()); --_FreeSlotCount; @@ -394,11 +430,14 @@ CGameItemPtr CInventoryBase::removeItem(uint32 slot, uint32 quantity, TInventory { _Items[slot]->getRefInventory()->removeItem(_Items[slot]->getRefInventorySlot()); } + + nlinfo("updateWeightAndBulk"); + updateWeightAndBulk(ret, -sint32(ret->getStackSize())); + // unlink the item _Items[slot]->setInventory(CInventoryPtr(NULL), INVENTORIES::INVALID_INVENTORY_SLOT); _Items[slot] = NULL; ++_FreeSlotCount; - updateWeightAndBulk(ret, -sint32(ret->getStackSize())); } else // we want to remove a part of a stack { @@ -649,6 +688,7 @@ void CInventoryBase::onItemStackSizeChanged(uint32 slot, uint32 previousStackSiz CGameItemPtr item = getItem(slot); sint32 deltaSize = item->getStackSize() - previousStackSize; + nlinfo("updateWeightAndBulk"); updateWeightAndBulk(item, deltaSize); // callback all the views @@ -668,14 +708,25 @@ void CInventoryBase::updateWeightAndBulk(const CGameItemPtr &item, sint32 deltaQ if (form != NULL) { - _InventoryBulk = uint32(max(sint32(0), sint32(_InventoryBulk + form->Bulk*deltaQt))); + uint8 chest = 0; + if (_InventoryId == INVENTORIES::guild) + { + chest = floor((float)item->getInventorySlot() / (float)GuildChestSlots); + nlinfo("updateWeightAndBulk: %u / %u => %u", item->getInventorySlot(), (uint32)GuildChestSlots, chest); + } + + _InventoryBulk[chest] = uint32(max(sint32(0), sint32(_InventoryBulk[chest] + form->Bulk*deltaQt))); _InventoryWeight = uint32(max(sint32(0), sint32(_InventoryWeight + item->weight()*deltaQt))); + if (_InventoryId == INVENTORIES::guild) + { + nlinfo("_InventoryBulk: %u vs getMaxBulk: %u", _InventoryBulk[chest], getMaxBulk(chest)); + } if (_InventoryWeight > getMaxWeight()) { nlwarning("Inventory '%s' : weight is overload", INVENTORIES::toString(_InventoryId).c_str()); } - if (_InventoryBulk > getMaxBulk()) + if (deltaQt > 0 && _InventoryBulk[chest] > getMaxBulk(chest)) { nlwarning("Inventory '%s' : bulk is overload", INVENTORIES::toString(_InventoryId).c_str()); } @@ -813,7 +864,13 @@ void CInventoryBase::dumpInventory(NLMISC::CLog & log, bool dumpItems) const log.displayNL("Inventory: %s", INVENTORIES::toString(_InventoryId).c_str()); log.displayRawNL("Slots: max=%u, count=%u, free=%u", getMaxSlot(), _SlotCount, _FreeSlotCount); log.displayRawNL("Weight: %u", _InventoryWeight); - log.displayRawNL("Bulk: %u", _InventoryBulk); + if (_InventoryId == INVENTORIES::guild) + { + for (uint8 i = 0; i < GUILD_NB_CHESTS; i++) + log.displayRawNL("Bulk #%u: %u", i, _InventoryBulk[i]); + } + else + log.displayRawNL("Bulk: %u", _InventoryBulk[0]); log.displayRawNL("Nb views: %u", _InventoryViews.size()); log.displayNL("(DEBUG) _Items.size() = %u", _Items.size()); @@ -888,6 +945,7 @@ CInventoryBase::TInventoryOpResult CRefInventory::doInsertItem(CGameItemPtr &ite // insert and link the new item _Items[slot] = item; item->setRefInventory(CInventoryPtr(this), slot); + nlinfo("updateWeightAndBulk"); updateWeightAndBulk(item, item->getStackSize()); --_FreeSlotCount; @@ -926,7 +984,7 @@ CGameItemPtr CRefInventory::removeItem(uint32 slot, uint32 quantity, TInventoryO CGameItemPtr item = _Items[slot]; _Items[slot] = NULL; ++_FreeSlotCount; - + nlinfo("updateWeightAndBulk"); updateWeightAndBulk(ret, -sint32(ret->getStackSize())); // callbacks for derived class diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.h b/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.h index 5a28a35b80..2e3bd6897f 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.h +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.h @@ -121,7 +121,7 @@ class CInventoryBase : public NLMISC::CRefCount /// Return the total weight of the inventory uint32 getInventoryWeight() const; /// Return the total bulk of the inventory - uint32 getInventoryBulk() const; + uint32 getInventoryBulk(uint8 index = 0) const; //@{ //@name Item list manipulation @@ -191,7 +191,7 @@ class CInventoryBase : public NLMISC::CRefCount //@{ //@name Constraints inquiries in derived class /// Get the maximum bulk accepted, default is almost unlimited - virtual uint32 getMaxBulk() const { return UINT_MAX;}; + virtual uint32 getMaxBulk(uint8 index = 0) const { return UINT_MAX;}; /// Get the maximum weight accepted, default is almost unlimited virtual uint32 getMaxWeight() const { return UINT_MAX;}; /// Get the maximum slot accepted, default is almost unlimited @@ -274,7 +274,7 @@ class CInventoryBase : public NLMISC::CRefCount /// Total inventory weight uint32 _InventoryWeight; /// Total inventory bulk - uint32 _InventoryBulk; + uint32 _InventoryBulk[20]; /// The vector of item contained by this inventory std::vector<CGameItemPtr> _Items; diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp index 5214c9a0ea..c755313b57 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp @@ -185,6 +185,50 @@ void CGuild::setMoney(uint64 money) CBankAccessor_GUILD::getGUILD().getINVENTORY().setMONEY(_DbGroup, _Money); } +//---------------------------------------------------------------------------- +void CGuild::setChestA(const CEntityId &recipient, uint8 chest) +{ + if (chest >= _Chests.size()) + return; + _GuildInventoryView->setChestA(recipient, chest); + sendClientDBChest(recipient); +} + +//---------------------------------------------------------------------------- +void CGuild::setChestB(const CEntityId &recipient, uint8 chest) +{ + if (chest >= _Chests.size()) + return; + _GuildInventoryView->setChestB(recipient, chest); + sendClientDBChest(recipient); +} + +void CGuild::setChestParams(uint8 chest, std::string name, EGSPD::CGuildGrade::TGuildGrade gradeView, EGSPD::CGuildGrade::TGuildGrade gradePut, EGSPD::CGuildGrade::TGuildGrade gradeGet) +{ + if (chest >= _Chests.size()) + return; + + _Chests[chest].Name = name; + _Chests[chest].ViewGrade = gradeView; + _Chests[chest].PutGrade = gradePut; + _Chests[chest].GetGrade = gradeGet; + + NLMISC::TStringId strId = CStringMapper::map( name ); + CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setNAME(_DbGroup, name, true); + CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setVIEW_GRADE(_DbGroup, gradeView); + CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setPUT_GRADE(_DbGroup, gradePut); + CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setGET_GRADE(_DbGroup, gradeGet); +} + +void CGuild::setChestBulkMax(uint8 chest, uint32 bulk) +{ + if (chest >= _Chests.size()) return; + _Chests[chest].BulkMax = bulk; + _Inventory->setChestMaxBulk(chest, bulk); + CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setBULK_MAX(_DbGroup, _Chests[chest].BulkMax); +} + + //---------------------------------------------------------------------------- //void CGuild::clearChargePoints() //{ @@ -487,13 +531,24 @@ void CGuild::dumpGuildInfos( NLMISC::CLog & log ) // log.displayNL("\tVillage: %hu", getVillage() ); log.displayNL("\tCreation date: %u", getCreationDate() ); // log.displayNL("\tXP: %u", getXP() ); - log.displayNL("\tBulk: %d", _Inventory->getInventoryBulk() ); +// log.displayNL("\tBulk: %d", _Inventory->getInventoryBulk() ); log.displayNL("\tMax bulk: %d", _Inventory->getMaxBulk() ); // log.displayNL("\tCharge points: %u", getChargesPoints() ); log.displayNL("\tRace: %s", EGSPD::CPeople::toString(getRace()).c_str() ); log.displayNL("\tIcon: 0x%016" NL_I64 "x", getIcon() ); log.displayNL("\tCiv Allegiance: %s", PVP_CLAN::toString(_DeclaredCiv).c_str()); log.displayNL("\tCult Allegiance: %s", PVP_CLAN::toString(_DeclaredCult).c_str()); + log.displayNL("\tLast Failed PVE : %u", _LastFailedGVE); + for (uint8 i=0; i < GUILD_NB_CHESTS; i++) + { + log.displayNL("\tChest '%s' Grades (View/Put/Get): %s %s %s Bulk: %u", + getChestName(i).c_str(), + EGSPD::CGuildGrade::toString(getChestViewGrade(i)).c_str(), + EGSPD::CGuildGrade::toString(getChestPutGrade(i)).c_str(), + EGSPD::CGuildGrade::toString(getChestGetGrade(i)).c_str(), + getChestBulkMax(i) + ); + } string buildingName; TAIAlias buildingAlias = getBuilding(); @@ -951,7 +1006,7 @@ bool CGuild::putItem( CGameItemPtr item ) } //---------------------------------------------------------------------------- -void CGuild::putItem( CCharacter * user, INVENTORIES::TInventory srcInv, uint32 slot, uint32 quantity, uint16 session ) +void CGuild::putItem( CCharacter * user, INVENTORIES::TInventory srcInv, uint32 slot, uint32 dstSlot, uint32 quantity, uint16 session ) { // the session system works that way : // As player can share this inventory, we manage a per item session value @@ -1011,12 +1066,9 @@ void CGuild::putItem( CCharacter * user, INVENTORIES::TInventory srcInv, uint32 } // try to move the required quantity of the item - if ( CInventoryBase::moveItem( - user->getInventory(srcInv), slot, - _Inventory, INVENTORIES::INSERT_IN_FIRST_FREE_SLOT, - quantity ) != CInventoryBase::ior_ok ) + if ( CInventoryBase::moveItem(user->getInventory(srcInv), slot, _Inventory, dstSlot, quantity ) != CInventoryBase::ior_ok ) { - CCharacter::sendDynamicSystemMessage( user->getId(),"GUILD_ITEM_MAX_BULK" ); // "The guild warehouse is full" + CCharacter::sendDynamicSystemMessage( user->getId(),"GUILD_PLAYER_BAG_FULL" ); return; } } @@ -1087,6 +1139,73 @@ void CGuild::takeItem( CCharacter * user, INVENTORIES::TInventory srcInv, uint32 } } +//---------------------------------------------------------------------------- +void CGuild::moveItem( CCharacter * user, uint32 slot, uint32 dstSlot, uint32 quantity, uint16 session ) +{ + // the session system works that way : + // As player can share this inventory, we manage a per item session value + // the user sends its session when he tries to manipulate the inventory. If it is higher than the targeted item session, it is okj + // The item session is incremented and the highest session value is then sent to the clients + // sessions are reseted when nobody uses the inventory + + nlassert( user ); + + if( canAccessToGuildInventory( user ) == false ) + { + CCharacter::sendDynamicSystemMessage(user->getEntityRowId(), "CANT_ACCESS_GUILD_INVENTORY"); + return; + } + + // check if user is trial + CPlayer * p = PlayerManager.getPlayer(PlayerManager.getPlayerId( user->getId() )); + BOMB_IF(p == NULL, "Failed to find player record for character: " << user->getId().toString(), return); + if ( p->isTrialPlayer() ) + { + user->sendDynamicSystemMessage( user->getId(), "EGS_CANT_USE_GUILD_INV_IS_TRIAL_PLAYER" ); + return; + } + + + CGuildMemberModule * module; + if ( !user->getModuleParent().getModule(module) || !module->canTakeGuildItem() ) + { + CCharacter::sendDynamicSystemMessage( user->getId(),"GUILD_ITEM_DONT_HAVE_RIGHTS" ); + return; + } + + // get the source item + CInventoryPtr srcItems = (CGuildInventory *)_Inventory; + if ( slot >= srcItems->getSlotCount() ) + { + nlwarning( "<swapItem> user %s Invalid guild slot %u, count = %u",user->getId().toString().c_str(), slot, srcItems->getSlotCount() ); + return; + } + CGameItemPtr srcItem = srcItems->getItem(slot); + if ( srcItem == NULL ) + { + nlwarning( "<swapItem> user %s Invalid guild slot %u, count = %u -> NULL item",user->getId().toString().c_str(), slot, srcItems->getSlotCount() ); + return; + } + + // check session + if ( ! _GuildInventoryView->checkSession( slot, session ) ) + { + CCharacter::sendDynamicSystemMessage( user->getId(),"GUILD_ITEM_BAD_SESSION" ); + return; + } + + // try to move the required quantity of the item + if ( CInventoryBase::moveItem( + _Inventory, slot, + _Inventory, dstSlot, + quantity ) != CInventoryBase::ior_ok ) + { + CCharacter::sendDynamicSystemMessage( user->getId(),"GUILD_PLAYER_BAG_FULL" ); + return; + } +} + + //---------------------------------------------------------------------------- uint CGuild::selectItems(NLMISC::CSheetId itemSheetId, uint32 quality, std::vector<CItemSlotId> *itemList) { @@ -2396,7 +2515,19 @@ class COldGuildInventoryLoader //#pragma message( PERSISTENT_GENERATION_MESSAGE ) #include "game_share/persistent_data_template.h" +//----------------------------------------------------------------------------- + +#define PERSISTENT_CLASS CGuildInventoryChest +#define PERSISTENT_DATA\ + PROP(string,Name)\ + PROP2(ViewGrade,string,EGSPD::CGuildGrade::toString(ViewGrade),ViewGrade=EGSPD::CGuildGrade::fromString(val))\ + PROP2(PutGrade,string,EGSPD::CGuildGrade::toString(PutGrade),PutGrade=EGSPD::CGuildGrade::fromString(val))\ + PROP2(GetGrade,string,EGSPD::CGuildGrade::toString(GetGrade),GetGrade=EGSPD::CGuildGrade::fromString(val))\ + PROP(uint32,BulkMax)\ + +//#pragma message( PERSISTENT_GENERATION_MESSAGE ) +#include "game_share/persistent_data_template.h" //----------------------------------------------------------------------------- #define PERSISTENT_CLASS CGuild @@ -2411,7 +2542,18 @@ class COldGuildInventoryLoader #define PERSISTENT_POST_APPLY\ CGuildVersionAdapter::getInstance()->adaptGuildFromVersion(*this);\ - + _Chests.resize(GUILD_NB_CHESTS);\ + nlinfo("GUILD HAVE %u CHESTS", _Chests.size());\ + for (uint8 chest=0; chest < _Chests.size(); chest++)\ + {\ + nlinfo("Send DB for chest %u", chest);\ + _Inventory->setChestMaxBulk(chest, _Chests[chest].BulkMax);\ + CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setNAME(_DbGroup, _Chests[chest].Name, true);\ + CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setVIEW_GRADE(_DbGroup, _Chests[chest].ViewGrade, true);\ + CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setPUT_GRADE(_DbGroup, _Chests[chest].PutGrade, true);\ + CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setGET_GRADE(_DbGroup, _Chests[chest].GetGrade, true);\ + CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setBULK_MAX(_DbGroup, _Chests[chest].BulkMax, true);\ + }\ /* Token "_Inventory" was used to save old guild inventory, we still use it to load old guild saves (DO NOT suppress it). New token "GuildInventory" is now used for new inventory format. @@ -2422,11 +2564,10 @@ class COldGuildInventoryLoader PROP2(_MessageOfTheDay,string,_MessageOfTheDay.toUtf8(),ucstring s; s.fromUtf8(val); _MessageOfTheDay=s)\ LSTRUCT2(_Inventory, if (0), ;/* do not store in old format anymore */, COldGuildInventoryLoader((CGuildInventory *)_Inventory).apply(pdr))\ STRUCT2(GuildInventory, _Inventory->store(pdr), _Inventory->apply(pdr, NULL))\ -\ PROP2(DeclaredCult,string,PVP_CLAN::toString(_DeclaredCult),_DeclaredCult=PVP_CLAN::fromString(val))\ PROP2(DeclaredCiv,string,PVP_CLAN::toString(_DeclaredCiv),_DeclaredCiv=PVP_CLAN::fromString(val))\ PROP_GAME_CYCLE_COMP(_LastFailedGVE)\ - + STRUCT_VECT(_Chests)\ //#pragma message( PERSISTENT_GENERATION_MESSAGE ) #include "game_share/persistent_data_template.h" diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild.h b/ryzom/server/src/entities_game_service/guild_manager/guild.h index dfc5c199ea..cfbf835cc3 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild.h +++ b/ryzom/server/src/entities_game_service/guild_manager/guild.h @@ -36,13 +36,29 @@ class CGuildMember; */ struct TMissionHistory; - /** * A guild in ryzom * \author Nicolas Brigand * \author Nevrax France * \date 2004 */ + +struct CGuildInventoryChest +{ +public: + CGuildInventoryChest(): ViewGrade(EGSPD::CGuildGrade::Member), PutGrade(EGSPD::CGuildGrade::Officer), GetGrade(EGSPD::CGuildGrade::HighOfficer), BulkMax(0) {} + + DECLARE_PERSISTENCE_METHODS + + std::string Name; + EGSPD::CGuildGrade::TGuildGrade ViewGrade; + EGSPD::CGuildGrade::TGuildGrade PutGrade; + EGSPD::CGuildGrade::TGuildGrade GetGrade; + uint32 BulkMax; +}; + +typedef std::vector<CGuildInventoryChest> TChest; + class CGuild : public IGuild, public EGSPD::CGuildPD, @@ -107,6 +123,50 @@ class CGuild : void addMoney(uint64 money); /// set money void setMoney(uint64 money); + void setChestA(const NLMISC::CEntityId &recipient, uint8 chest); + void setChestB(const NLMISC::CEntityId &recipient, uint8 chest); + + std::string getChestName(uint8 chest) { if (chest >= _Chests.size()) return ""; return _Chests[chest].Name; } + EGSPD::CGuildGrade::TGuildGrade getChestViewGrade(uint8 chest) { if (chest >= _Chests.size()) return EGSPD::CGuildGrade::Leader; return _Chests[chest].ViewGrade; } + EGSPD::CGuildGrade::TGuildGrade getChestPutGrade(uint8 chest) { if (chest >= _Chests.size()) return EGSPD::CGuildGrade::Leader; return _Chests[chest].PutGrade; } + EGSPD::CGuildGrade::TGuildGrade getChestGetGrade(uint8 chest) { if (chest >= _Chests.size()) return EGSPD::CGuildGrade::Leader; return _Chests[chest].GetGrade; } + uint32 getChestBulkMax(uint8 chest) { if (chest >= _Chests.size()) return 0; return _Chests[chest].BulkMax; } + + void setChestParams(uint8 chest, std::string name, EGSPD::CGuildGrade::TGuildGrade gradeView, EGSPD::CGuildGrade::TGuildGrade gradePut, EGSPD::CGuildGrade::TGuildGrade gradeGet); + void setChestBulkMax(uint8 chest, uint32 bulk); + + bool haveChestViewGrade(uint8 chest, EGSPD::CGuildGrade::TGuildGrade grade) + { + if (chest >= _Chests.size()) + return false; + + nlinfo("Check have acces to chest %u : %u >= %u", chest, _Chests[chest].ViewGrade, grade); + return _Chests[chest].ViewGrade >= grade; + } + + bool haveChestPutGrade(uint8 chest, EGSPD::CGuildGrade::TGuildGrade grade) + { + if (chest >= _Chests.size()) + return false; + + nlinfo("Check have acces to chest %u : %u >= %u", chest, _Chests[chest].PutGrade, grade); + return _Chests[chest].PutGrade >= grade; + } + + bool haveChestGetGrade(uint8 chest, EGSPD::CGuildGrade::TGuildGrade grade) + { + if (chest >= _Chests.size()) + return false; + + nlinfo("Check have acces to chest %u : %u >= %u", chest, _Chests[chest].GetGrade, grade); + return _Chests[chest].GetGrade >= grade; + } + + + TChest getChests() { return _Chests; } + void setChests(TChest chests) { _Chests = chests; } + + /// clear the guild charge points // void clearChargePoints(); /// add an amount of charge point @@ -226,7 +286,9 @@ class CGuild : /// take an item from guild inventory (set quantity to UINT_MAX for 'all stack') void takeItem( CCharacter * user, INVENTORIES::TInventory srcInv, uint32 slot, uint32 quantity, uint16 session ); /// put an item in guild inventory (set quantity to UINT_MAX for 'all stack') - void putItem( CCharacter * user, INVENTORIES::TInventory srcInv, uint32 slot, uint32 quantity, uint16 session ); + void putItem( CCharacter * user, INVENTORIES::TInventory srcInv, uint32 slot, uint32 dstSlot, uint32 quantity, uint16 session ); + /// move an item in guild inventory (set quantity to UINT_MAX for 'all stack') + void moveItem( CCharacter * user, uint32 slot, uint32 dstSlot, uint32 quantity, uint16 session ); /// user wanna take money void takeMoney( CCharacter * user, uint64 money, uint16 session ); /// user wanna put money @@ -394,6 +456,8 @@ class CGuild : NLMISC::TGameCycle _LastFailedGVE; + TChest _Chests; + // The declared Cult and Civilization information for the guild for fame purposes. PVP_CLAN::TPVPClan _DeclaredCult; PVP_CLAN::TPVPClan _DeclaredCiv; diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild_commands.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild_commands.cpp index 0161321ec1..2090ecbd24 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild_commands.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild_commands.cpp @@ -357,7 +357,7 @@ NLMISC_COMMAND(guildFailedGVE, "get/set failed GVE of guild", "<guildName|<shard guild->setLastFailedGVE(time); } - log.displayNL("%d", time); + log.displayNL("%u", time); } else { log.displayNL("ERR: no guild"); } diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index 9d510ec882..b45123f306 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -1283,6 +1283,38 @@ NLMISC_COMMAND(getEnchantmentInEquipedItem, "getEnchantmentInEquipedItem", "<uid return true; } +//setGuildInventoryChestBulkMax 2 2 3000 + +//---------------------------------------------------------------------------- +NLMISC_COMMAND(setGuildInventoryChestBulkMax, "Set the bulk max of chest of inventory", "<uid> <chest> <value>" ) +{ + + if (args.size() < 2) + return false; + + GET_ACTIVE_CHARACTER + + CGuild * guild = CGuildManager::getInstance()->getGuildFromId(c->getGuildId()); + if (guild) + { + uint8 chest; + NLMISC::fromString(args[1], chest); + if (args.size() == 3) + { + uint32 bulkmax; + NLMISC::fromString(args[2], bulkmax); + guild->setChestBulkMax(chest, bulkmax); + log.displayNL("OK"); + } + else + { + uint32 bulkmax = guild->getChestBulkMax(chest); + log.displayNL("%u", bulkmax); + } + } + return true; +} + //updateSheetItem 2 LEGS ikaracp_ep2_1.sitem //---------------------------------------------------------------------------- diff --git a/ryzom/tools/pd_parser/cpp_output.h b/ryzom/tools/pd_parser/cpp_output.h index 96183b2652..b37eba1eff 100644 --- a/ryzom/tools/pd_parser/cpp_output.h +++ b/ryzom/tools/pd_parser/cpp_output.h @@ -386,7 +386,7 @@ class CCppOutput public: /// Constructor - CCppOutput(bool cppmode = true) : _CppMode(cppmode), + CCppOutput(bool cppmode = true) : _CppMode(cppmode), _XmlMode(false), _NewLine(true), _Indent(0), _DescriptionMode(false), _Clean(true), _XmlInNode(false), _XmlLastSlash(false), _XmlGetNodeName(false), _XmlCloseNode(false), _XmlRootNode(false) {} diff --git a/ryzom/tools/pd_parser/parser.cpp b/ryzom/tools/pd_parser/parser.cpp index 0d4629726c..a96bf18330 100644 --- a/ryzom/tools/pd_parser/parser.cpp +++ b/ryzom/tools/pd_parser/parser.cpp @@ -1329,7 +1329,7 @@ bool CEnumNode::generateContent() gen.addAttribute("std::vector<std::string>", "_StrTable", "init", true); gen.addAttribute("std::map<std::string, "+Name+">", "_ValueMap", "init", true, "", false, "std::map<std::string, "+getName()+">"); - cppOutput() << "static const struct { char* Name; " << getName() << " Value; } " << Name << "Convert[] =\n"; + cppOutput() << "static const struct { const char* Name; " << getName() << " Value; } " << Name << "Convert[] =\n"; cppOutput() << "{\n"; for (j=0; j<Values.size(); ++j) cppOutput() << "{ \"" << Values[j].first << "\", C"+enumTruncName+"::"+Values[j].first+" },\n"; @@ -2358,7 +2358,7 @@ bool CClassNode::generateContent() { oeid = ", "+getClassKey()->cppName(); } - + UnregisterId.add(pdslibFunc("deallocateRow")+"("+getId()+", __BaseRow"+oeid+");"); UnregisterId.add("_IndexAllocator.deallocate(__BaseRow);"); //UnregisterId.add(destroyFunction+"();"); @@ -2638,7 +2638,6 @@ bool CClassNode::generateContent() ApplyId.add( "else"); ApplyId.add( "{"); - ApplyId.add( "nlwarning(\"Skipping unrecognised token: %s\", __pdr.peekNextTokenName().c_str());"); ApplyId.add( "__pdr.skipData();"); ApplyId.add( "}"); ApplyId.add("}"); @@ -2766,7 +2765,7 @@ void CDeclarationNode::generateContent(CCallContext *context) { ClassNode->Gen.separator("methods"); } - + } @@ -3822,7 +3821,7 @@ void CDeclarationNode::generateArrayClassContent(CCallContext *context) ctx.getRootCaller()->ClearId.add("for (uint "+forIndex+"=0; "+forIndex+"<"+ind->getSizeName()+"; ++"+forIndex+")"); ctx.getRootCaller()->ClearId.add("{"); } - + sub->generateContentInCall(&ctx); if (ctx.getRootCaller()->HasRowAccess) @@ -4369,7 +4368,7 @@ void CDeclarationNode::generateSetContent(CCallContext *context) Gen.startMethod(setType+"::const_iterator", getFunc()+"End", "", "methods", true, inlineAccessors); Gen.add("return "+cppName()+".end();"); Gen.startMethod("const "+setType+" &", getFunc(), "", "methods", true, inlineAccessors); - Gen.add("return "+cppName()+";"); + Gen.add("return "+cppName()+";"); // // generate write accessor @@ -4515,11 +4514,11 @@ void CDeclarationNode::generateSetContent(CCallContext *context) if (useReference) { FetchId.add(Type+"*\t"+objectVariable+" = static_cast<"+Type+"*>("+pdslibFunc("create")+"(tableIndex));"); - FetchId.add(cppName()+".insert(std::make_pair("+keyVariable+", "+objectVariable+"));"); + FetchId.add(cppName()+".insert(std::pair<"+keyType->StorageType+","+Type+">("+keyVariable+", "+objectVariable+"));"); } else { - FetchId.add(cppName()+".insert(std::make_pair("+keyVariable+", "+Type+"()));"); + FetchId.add(cppName()+".insert(std::pair<"+keyType->StorageType+","+Type+">("+keyVariable+", "+Type+"()));"); FetchId.add(Type+"*\t"+objectVariable+" = &("+cppName()+"["+keyVariable+"]);"); } FetchId.add(pdslibFunc("setRowIndex")+"(rowIndex, "+objectVariable+");"); @@ -4639,7 +4638,7 @@ string CDeclarationNode::displayCppCode(string replVar) if (type->CppType == "CEntityId" || type->CppType == "CSheetId") return replVar+".toString().c_str()"; - else + else return replVar; } @@ -4658,7 +4657,7 @@ string CDeclarationNode::toUint64(string replVar) return replVar+".asUint64()"; else if (type->CppType == "CSheetId") return "(uint64)("+replVar+".asInt())"; - else + else return "(uint64)"+replVar; } @@ -4760,7 +4759,7 @@ void CLogMsgNode::generateContent() } } - // + // initDb.add("// Init "+Name+" log message and parameters"); for (j=0; j<Logs.size(); ++j) From 6dfe00425ab15834b884dc6947f6df53faeb9272 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Wed, 17 Apr 2024 15:53:26 +0200 Subject: [PATCH 172/194] Merge 77-guild-extensions into gh-extensions --- .../data/gamedev/interfaces_v3/config.xml | 32 ++++- .../data/gamedev/interfaces_v3/guild.xml | 7 +- .../data/gamedev/interfaces_v3/hierarchy.xml | 1 + .../data/gamedev/interfaces_v3/inventory.lua | 126 +++++++++--------- .../data/gamedev/interfaces_v3/inventory.xml | 34 +++-- .../data/gamedev/interfaces_v3/reset.xml | 9 ++ .../data/gamedev/interfaces_v3/widgets.xml | 6 +- .../src/interface_v3/action_handler_item.cpp | 11 ++ .../src/interface_v3/action_handler_ui.cpp | 2 +- .../src/interface_v3/dbgroup_list_sheet.cpp | 38 ++++++ .../src/interface_v3/dbgroup_list_sheet.h | 4 + .../interface_expr_user_fct_game.cpp | 1 + .../interface_expr_user_fct_items.cpp | 24 ++++ .../src/interface_v3/inventory_manager.cpp | 68 ++++++++-- .../src/interface_v3/inventory_manager.h | 13 +- ryzom/client/src/net_manager.cpp | 2 +- ryzom/common/data_common/database.xml | 17 ++- ryzom/common/data_common/msg.xml | 4 +- ryzom/common/src/game_share/inventories.cpp | 4 +- ryzom/common/src/game_share/inventories.h | 5 +- ryzom/common/src/game_share/item_infos.h | 8 +- ryzom/server/src/ai_service/ai_bot_npc.cpp | 2 +- .../src/entities_game_service/admin.cpp | 33 ++++- .../src/entities_game_service/cdb_group.cpp | 43 +++++- .../src/entities_game_service/cdb_group.h | 5 +- .../entities_game_service/client_messages.cpp | 2 +- .../entities_game_service/egs_variables.cpp | 3 +- .../entity_manager/entity_callbacks.cpp | 11 +- .../game_item_manager/guild_inv.cpp | 9 +- .../game_item_manager/guild_inv.h | 12 +- .../game_item_manager/player_inventory.cpp | 47 +++++-- .../game_item_manager/player_inventory.h | 2 +- .../guild_manager/guild.cpp | 17 ++- .../guild_manager/guild.h | 1 + .../guild_manager/guild_commands.cpp | 2 +- .../src/entities_game_service/guild_pd.cpp | 6 +- .../src/entities_game_service/guild_pd.h | 78 +++++------ .../entities_game_service/inventory_updater.h | 23 ++-- .../pd_scripts/guild.pds | 13 +- .../player_manager/character.cpp | 6 +- .../player_manager/character.h | 7 +- .../player_manager/character_inlines.h | 13 ++ .../character_inventory_manipulation.cpp | 2 +- 43 files changed, 544 insertions(+), 209 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/config.xml b/ryzom/client/data/gamedev/interfaces_v3/config.xml index 45db32fdcf..da2ae18847 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/config.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/config.xml @@ -2549,7 +2549,7 @@ This MUST follow the Enum MISSION_DESC::TIconId <define id="max_room_invslot" value_from_code="getMaxRoomInvSlot()" /> <define id="max_guild_invslot" - value_from_code="getMaxGuildInvSlot()" /> + value="getMaxGuildChestSlot()" /> <define id="max_temp_invslot" value_from_code="getMaxTempInvSlot()" /> <!--<define id="from_code_harvest" value_from_code="getInventorySlot('harvest')"/> @@ -3248,6 +3248,9 @@ This MUST follow the Enum MISSION_DESC::TIconId <variable entry="UI:SAVE:INVENTORY_GUILD_WANT_POPUP" type="sint32" value="1" /> + <variable entry="UI:SAVE:INVENTORY_GUILD2_WANT_POPUP" + type="sint32" + value="1" /> <variable entry="UI:SAVE:INV_BAG:SORT_TYPE" type="sint32" value="0" /> @@ -3489,7 +3492,32 @@ This MUST follow the Enum MISSION_DESC::TIconId <variable entry="UI:SAVE:INV_GUILD:FILTER_MISSMP" type="sint32" value="1" /> - <variable entry="UI:SAVE:INV_GUILD:FILTER_TP" + <variable entry="UI:SAVE:INV_GUILD2:SORT_TYPE" + type="sint32" + value="1" /> + <!-- 1 == SortType --> + <variable entry="UI:SAVE:INV_GUILD2:ICON_LIST" + type="sint32" + value="1" /> + <variable entry="UI:SAVE:INV_GUILD2:FILTER_ARMOR" + type="sint32" + value="1" /> + <variable entry="UI:SAVE:INV_GUILD2:FILTER_WEAPON" + type="sint32" + value="1" /> + <variable entry="UI:SAVE:INV_GUILD2:FILTER_TOOL" + type="sint32" + value="1" /> + <variable entry="UI:SAVE:INV_GUILD2:FILTER_PET" + type="sint32" + value="1" /> + <variable entry="UI:SAVE:INV_GUILD2:FILTER_MP" + type="sint32" + value="1" /> + <variable entry="UI:SAVE:INV_GUILD2:FILTER_MISSMP" + type="sint32" + value="1" /> + <variable entry="UI:SAVE:INV_GUILD2:FILTER_TP" type="sint32" value="1" /> <variable entry="UI:SAVE:INV_ROOM:SORT_TYPE" diff --git a/ryzom/client/data/gamedev/interfaces_v3/guild.xml b/ryzom/client/data/gamedev/interfaces_v3/guild.xml index 82de77dcf2..fa18c420ed 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/guild.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/guild.xml @@ -867,9 +867,10 @@ posref="TL TL" group_onclick_r="active_menu" group_params_r="menu=ui:interface:base_menu_with_color"> - <instance template="tinv_nbslots_bulk_weight" + <instance template="tguildinv_nbslots_bulk_weight" id="ibw" x="-16" + selected_chest="UI:SAVE:GUILD_INVENTORY_CHEST_A" inv_branch="%guild_inv_dbentry" inv_bulk_max="%guild_inv_bulk_max" /> </group> @@ -883,6 +884,7 @@ h="-8" inv_branch="%guild_inv_dbentry" inv_branch_nb="%max_guild_invslot" + start_item="0" inv_type="INV_GUILD" /> <instance template="argent" id="money" @@ -977,7 +979,10 @@ <link expr="and(%is_guild_present, @UI:SAVE:INVENTORY_GUILD_WANT_POPUP, @UI:TEMP:INVENTORY_GUILD_OPENED)" target="inv_guild:active" /> + <link expr="and(%is_guild_present, @UI:SAVE:INVENTORY_GUILD2_WANT_POPUP, @UI:TEMP:INVENTORY_GUILD_OPENED)" + target="inv_guild2:active" /> <tree node="inv_guild" /> + <tree node="inv_guild2" /> <!-- QUANTITY OF MONEY MODAL BOX --> <group type="modal" id="guild_inv_money" diff --git a/ryzom/client/data/gamedev/interfaces_v3/hierarchy.xml b/ryzom/client/data/gamedev/interfaces_v3/hierarchy.xml index 690fca7679..4ebacb2e86 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/hierarchy.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/hierarchy.xml @@ -25,6 +25,7 @@ <tree node="inv_hotbar" /> <tree node="inv_bag" /> <tree node="inv_guild" /> +<tree node="inv_guild2" /> <tree node="inv_room" /> <!-- ************************** --> diff --git a/ryzom/client/data/gamedev/interfaces_v3/inventory.lua b/ryzom/client/data/gamedev/interfaces_v3/inventory.lua index f32009101b..c7b05d8239 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/inventory.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/inventory.lua @@ -8,72 +8,72 @@ end function game:initEquipPreview() setChar3dDBfromServerDB("UI:TEMP:PREVIEWCHAR3D") - local scene = getUI("ui:interface:inventory:content:equip:midsection:content:visu3d:char3d") - local headz = scene:getElement("character#0").headz - local pz = scene:getElement("character#0").posz - local height = headz - pz - local camera = scene:getElement("camera#0") - camera.tgtz = pz + height*0.55 - camera.posz = camera.tgtz + 0.5 - camera.posy = 26 - 1.6*(height) - scene.distlimitmin = 25 - camera.posy - scene.distlimitmax = 27 - camera.posy + local scene = getUI("ui:interface:inventory:content:equip:midsection:content:visu3d:char3d") + local headz = scene:getElement("character#0").headz + local pz = scene:getElement("character#0").posz + local height = headz - pz + local camera = scene:getElement("camera#0") + camera.tgtz = pz + height*0.55 + camera.posz = camera.tgtz + 0.5 + camera.posy = 26 - 1.6*(height) + scene.distlimitmin = 25 - camera.posy + scene.distlimitmax = 27 - camera.posy - scene = getUI("ui:interface:inv_equip:content:equip:midsection:content:visu3d:char3d") - headz = scene:getElement("character#0").headz - pz = scene:getElement("character#0").posz - height = headz - pz - camera = scene:getElement("camera#0") - camera.tgtz = pz + height*0.55 - camera.posz = camera.tgtz + 0.5 - camera.posy = 26 - 1.6*(height) - scene.distlimitmin = 25 - camera.posy - scene.distlimitmax = 27 - camera.posy + scene = getUI("ui:interface:inv_equip:content:equip:midsection:content:visu3d:char3d") + headz = scene:getElement("character#0").headz + pz = scene:getElement("character#0").posz + height = headz - pz + camera = scene:getElement("camera#0") + camera.tgtz = pz + height*0.55 + camera.posz = camera.tgtz + 0.5 + camera.posy = 26 - 1.6*(height) + scene.distlimitmin = 25 - camera.posy + scene.distlimitmax = 27 - camera.posy end function game:updateEquipOnResize(base, force) - local path = "ui:interface:"..base - local win = getUI(path) - local equipPath = path..":content:equip" - local equip = getUI(equipPath) - if equip ~= nil and (equip.active ~= false or force) then - local w = win.w - local h = win.h - local hotbar = getUI(equipPath..":hotbar_c") - local hotbarTitle = getUI(equipPath..":hotbarTitle") - local midsection = getUI(equipPath..":midsection") - local jewelry = getUI(equipPath..":jewelry") - local armors = getUI(equipPath..":armors") - local handl = getUI(equipPath..":handl") - local handr = getUI(equipPath..":handr") - if h < 345 then - hotbar.active = false - hotbarTitle.active = false - else - hotbar.active = true - hotbarTitle.active = true - end - if w < 450 then - midsection.active = false - jewelry.x = -10 - armors.x = 10 - jewelry.y = 0 - armors.y = 0 - else - midsection.active = true - jewelry.x = -20 - armors.x = 20 - jewelry.y = -5 - armors.y = -5 - end - if w > 390 and h > 344 then - handr.active = true - handl.active = true - else - handr.active = false - handl.active = false - end - end + local path = "ui:interface:"..base + local win = getUI(path) + local equipPath = path..":content:equip" + local equip = getUI(equipPath) + if equip ~= nil and (equip.active ~= false or force) then + local w = win.w + local h = win.h + local hotbar = getUI(equipPath..":hotbar_c") + local hotbarTitle = getUI(equipPath..":hotbarTitle") + local midsection = getUI(equipPath..":midsection") + local jewelry = getUI(equipPath..":jewelry") + local armors = getUI(equipPath..":armors") + local handl = getUI(equipPath..":handl") + local handr = getUI(equipPath..":handr") + if h < 345 then + hotbar.active = false + hotbarTitle.active = false + else + hotbar.active = true + hotbarTitle.active = true + end + if w < 450 then + midsection.active = false + jewelry.x = -10 + armors.x = 10 + jewelry.y = 0 + armors.y = 0 + else + midsection.active = true + jewelry.x = -20 + armors.x = 20 + jewelry.y = -5 + armors.y = -5 + end + if w > 390 and h > 344 then + handr.active = true + handl.active = true + else + handr.active = false + handl.active = false + end + end end function updateChest() @@ -140,4 +140,4 @@ function updateChestList(init) end -- VERSION -- -RYZOM_INVENTORY_VERSION = 324 \ No newline at end of file +RYZOM_INVENTORY_VERSION = 324 diff --git a/ryzom/client/data/gamedev/interfaces_v3/inventory.xml b/ryzom/client/data/gamedev/interfaces_v3/inventory.xml index 211792c77a..2e94860314 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/inventory.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/inventory.xml @@ -185,7 +185,7 @@ line_maxw="70" over_extend_view_text="true" posref="TL TL" - shadow_x="0" + shadow_x="0" shadow_y="0" fontsize="10" /> <ctrl type="button" @@ -202,7 +202,7 @@ global_color_normal="false" global_color_over="false" global_color_pushed="false" - onclick_l="enter_modal" + onclick_l="enter_modal" params_l="group=ui:interface:remove_itemgroup_confirm" tooltip="uiRemove" /> <ctrl type="button" @@ -257,12 +257,12 @@ <action handler="set" cond="eq(@UI:TEMP:PREVIEWCHAR3D:PEOPLE,1)" params="target_property=ui:interface:inventory:content:equip:midsection:content:visu3d:char3d:env:name|value='outgame_matis.ig'" /> <action handler="set" cond="eq(@UI:TEMP:PREVIEWCHAR3D:PEOPLE,2)" params="target_property=ui:interface:inventory:content:equip:midsection:content:visu3d:char3d:env:name|value='outgame_tryker.ig'" /> <action handler="set" cond="eq(@UI:TEMP:PREVIEWCHAR3D:PEOPLE,3)" params="target_property=ui:interface:inventory:content:equip:midsection:content:visu3d:char3d:env:name|value='outgame_zorai.ig'" /> - + <action handler="set" cond="eq(@UI:TEMP:PREVIEWCHAR3D:PEOPLE,0)" params="target_property=ui:interface:inv_equip:content:equip:midsection:content:visu3d:char3d:env:name|value='outgame_fyros.ig'" /> <action handler="set" cond="eq(@UI:TEMP:PREVIEWCHAR3D:PEOPLE,1)" params="target_property=ui:interface:inv_equip:content:equip:midsection:content:visu3d:char3d:env:name|value='outgame_matis.ig'" /> <action handler="set" cond="eq(@UI:TEMP:PREVIEWCHAR3D:PEOPLE,2)" params="target_property=ui:interface:inv_equip:content:equip:midsection:content:visu3d:char3d:env:name|value='outgame_tryker.ig'" /> <action handler="set" cond="eq(@UI:TEMP:PREVIEWCHAR3D:PEOPLE,3)" params="target_property=ui:interface:inv_equip:content:equip:midsection:content:visu3d:char3d:env:name|value='outgame_zorai.ig'" /> - + <!-- make preview active --> <action handler="set" params="target_property=ui:interface:inventory:content:equip:midsection:content:visu3d:char3d:active|value=1" /> <action handler="set" params="target_property=ui:interface:inv_equip:content:equip:midsection:content:visu3d:char3d:active|value=1" /> @@ -290,7 +290,7 @@ </group> <view type="bitmap" id="septab" posparent="view_select" posref="BR BL" sizeparent="parent" sizeref="w" w="0" h="1" scale="true" texture="blank.tga" color="166 166 166 255" /> </group> - <group id="content" posref="BL TL" posparent="tab_group" w="140" h="173"> + <group id="content" posref="BL TL" posparent="tab_group" w="140" h="173"> <group id="black" posref="TL TL" sizeref="h" h="0" inherit_gc_alpha="true"/> <instance template="inner_thin_border" posparent="black" inherit_gc_alpha="true"/> <!-- 3d preview --> @@ -704,7 +704,7 @@ </group> </group> <tree node="inv_equip" /> - + <!-- hotbar --> <define id="hotbar_h" value="1" /> <define id="hotbar_v" value="2" /> @@ -761,7 +761,7 @@ <action handler="set" params="target_property=ui:interface:inv_hotbar:content:hotbar:hotbar5:x|value='2'"/> <action handler="set" params="target_property=ui:interface:inv_hotbar:content:hotbar:hotbar5:y|value='0'"/> </proc> - + <group type="menu" id="hotbar_menu" extends="base_menu_with_color"> <action id="horiz" name="uiHorizontal" handler="proc" params="hotbar_proc_set|%hotbar_h"/> <action id="vert" name="uiVertical" handler="proc" params="hotbar_proc_set|%hotbar_v"/> @@ -1108,8 +1108,18 @@ onclick_l="proc" params_l="inventory_focus" /> <ctrl style="tab_button_new" - id="tab10" + id="tab11" posparent="tab9" + group="content:guild2" + hardtext="uitabInvGuild2" + tooltip="uiTabInfo" + onclick_r="set" + params_r="dblink=UI:SAVE:INVENTORY_GUILD2_WANT_POPUP|value=1" + onclick_l="proc" + params_l="inventory_focus" /> + <ctrl style="tab_button_new" + id="tab10" + posparent="tab11" group="content:room" hardtext="uitabInvRoom" tooltip="uiTabInfo" @@ -1149,6 +1159,8 @@ target="tab9:active" /> <link expr="and(not(@UI:VARIABLES:ISACTIVE:INV_ROOM), @UI:TEMP:INVENTORY_ROOM_OPENED)" target="tab10:active" /> + <link expr="and(%is_guild_present, not(@UI:SAVE:INVENTORY_GUILD2_WANT_POPUP), @UI:TEMP:INVENTORY_GUILD_OPENED)" + target="tab11:active" /> </group> <view type="bitmap" id="sep" @@ -1336,10 +1348,15 @@ <instance template="tguildinv_nbslots_bulk_weight" id="ibw" x="0" + selected_chest="UI:SAVE:GUILD_INVENTORY_CHEST_A" inv_branch="%guild_inv_dbentry" inv_bulk_max="%guild_inv_bulk_max" /> <instance template="tinv_item_list" id="iil" + y="-18" + sizeref="wh" + h="-16" + inv_branch="%guild_inv_dbentry" inv_branch_nb="%max_guild_invslot" start_item="0" inv_type="INV_GUILD" /> @@ -1415,6 +1432,7 @@ onclick_l="proc" params_l="guild_put_money" /> </group> + <!-- room --> <group id="room" posref="TL TL" diff --git a/ryzom/client/data/gamedev/interfaces_v3/reset.xml b/ryzom/client/data/gamedev/interfaces_v3/reset.xml index fdb2c2e70c..5001df53cd 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/reset.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/reset.xml @@ -404,6 +404,15 @@ <action handler="set" params="dblink=UI:SAVE:INV_GUILD:FILTER_MP|value=1" /> <action handler="set" params="dblink=UI:SAVE:INV_GUILD:FILTER_MISSMP|value=1" /> <action handler="set" params="dblink=UI:SAVE:INV_GUILD:FILTER_TP|value=1" /> + <action handler="set" params="dblink=UI:SAVE:INV_GUILD2:SORT_TYPE|value=1" /> + <action handler="set" params="dblink=UI:SAVE:INV_GUILD2:ICON_LIST|value=0" /> + <action handler="set" params="dblink=UI:SAVE:INV_GUILD2:FILTER_ARMOR|value=1" /> + <action handler="set" params="dblink=UI:SAVE:INV_GUILD2:FILTER_WEAPON|value=1" /> + <action handler="set" params="dblink=UI:SAVE:INV_GUILD2:FILTER_TOOL|value=1" /> + <action handler="set" params="dblink=UI:SAVE:INV_GUILD2:FILTER_PET|value=1" /> + <action handler="set" params="dblink=UI:SAVE:INV_GUILD2:FILTER_MP|value=1" /> + <action handler="set" params="dblink=UI:SAVE:INV_GUILD2:FILTER_MISSMP|value=1" /> + <action handler="set" params="dblink=UI:SAVE:INV_GUILD2:FILTER_TP|value=1" /> <action handler="set" params="dblink=UI:SAVE:INV_ROOM:SORT_TYPE|value=1" /> <action handler="set" params="dblink=UI:SAVE:INV_ROOM:ICON_LIST|value=1" /> <action handler="set" params="dblink=UI:SAVE:INV_ROOM:FILTER_ARMOR|value=1" /> diff --git a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml index 5ccd5cd06f..02465bd0f6 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml @@ -1500,17 +1500,17 @@ <link expr="@#dblink" target="but_#id:pushed" /> </template> <!-- template for the list of items --> - <template name="tinv_item_list" id="" animal_status="" inv_branch_nb="256" inv_branch="" inv_type="" posparent="parent" posref="TL TL" x="0" y="0" sizeparent="parent" sizeref="wh" w="0" h="0"> + <template name="tinv_item_list" id="" animal_status="" inv_branch_nb="256" inv_branch="" inv_type="" start_item="0" posparent="parent" posref="TL TL" x="0" y="0" sizeparent="parent" sizeref="wh" w="0" h="0"> <group id="#id" posparent="#posparent" posref="#posref" x="#x" y="#y" sizeparent="#sizeparent" sizeref="#sizeref" w="#w" h="#h"> <!-- Bag Type --> <!-- Bags : icon list --> - <group type="list_icon_bag" id="bag_icons" array="false" sizeref="wh" w="0" h="-24" posref="TL TL" x="0" y="0" child_resize_h="false" value="#inv_branch" maxitem="#inv_branch_nb" inv_type="#inv_type" sort_type="UI:SAVE:#inv_type:SORT_TYPE" filter_armor="UI:SAVE:#inv_type:FILTER_ARMOR" filter_weapon="UI:SAVE:#inv_type:FILTER_WEAPON" filter_tool="UI:SAVE:#inv_type:FILTER_TOOL" filter_pet="UI:SAVE:#inv_type:FILTER_PET" filter_mp="UI:SAVE:#inv_type:FILTER_MP" filter_missmp="UI:SAVE:#inv_type:FILTER_MISSMP" filter_tp="UI:SAVE:#inv_type:FILTER_TP" wspace="2" hspace="2" startitem="0" selection_group="inventory_selection" auto_grayed="true" dragable="true" oncandrag="inv_can_drag" ondrag="inv_drag" params_drag="from_icon_list" oncandrop="inv_can_drop" ondrop="inv_drop" menu_r="ui:interface:item_menu_in_bag" instant_help="false" lmargin="10" rmargin="0" tmargin="1" bmargin="0" column_center="false" db_animal_status="#animal_status"> + <group type="list_icon_bag" id="bag_icons" array="false" sizeref="wh" w="0" h="-24" posref="TL TL" x="0" y="0" child_resize_h="false" value="#inv_branch" maxitem="#inv_branch_nb" inv_type="#inv_type" sort_type="UI:SAVE:#inv_type:SORT_TYPE" filter_armor="UI:SAVE:#inv_type:FILTER_ARMOR" filter_weapon="UI:SAVE:#inv_type:FILTER_WEAPON" filter_tool="UI:SAVE:#inv_type:FILTER_TOOL" filter_pet="UI:SAVE:#inv_type:FILTER_PET" filter_mp="UI:SAVE:#inv_type:FILTER_MP" filter_missmp="UI:SAVE:#inv_type:FILTER_MISSMP" filter_tp="UI:SAVE:#inv_type:FILTER_TP" wspace="2" hspace="2" startitem="#start_item" selection_group="inventory_selection" auto_grayed="true" dragable="true" oncandrag="inv_can_drag" ondrag="inv_drag" params_drag="from_icon_list" oncandrop="inv_can_drop" ondrop="inv_drop" menu_r="ui:interface:item_menu_in_bag" instant_help="false" lmargin="10" rmargin="0" tmargin="1" bmargin="0" column_center="false" db_animal_status="#animal_status"> <ctrl style="skin_scroll" id="scroll_row" posref="TL TL" target_stepy="44" /> </group> <view type="bitmap" id="sep1" x="0" y="0" posparent="bag_icons" posref="BL TL" scale="true" h="2" sizeref="w" texture="W_line_hor.tga" /> <link expr="eq(@UI:SAVE:#inv_type:ICON_LIST, 1)" target="bag_icons:active,sep1:active" /> <!-- Bags : detailed list --> - <group type="list_sheet_bag" id="bag_list" array="false" sizeref="wh" w="0" h="-34" posref="TL TL" x="0" y="-10" child_resize_h="false" value="#inv_branch" maxitem="#inv_branch_nb" inv_type="#inv_type" sort_type="UI:SAVE:#inv_type:SORT_TYPE" filter_armor="UI:SAVE:#inv_type:FILTER_ARMOR" filter_weapon="UI:SAVE:#inv_type:FILTER_WEAPON" filter_tool="UI:SAVE:#inv_type:FILTER_TOOL" filter_pet="UI:SAVE:#inv_type:FILTER_PET" filter_mp="UI:SAVE:#inv_type:FILTER_MP" filter_missmp="UI:SAVE:#inv_type:FILTER_MISSMP" filter_tp="UI:SAVE:#inv_type:FILTER_TP" hspace="2" xitem="2" yitem="-2" xtext="46" ytext="-2" selection_group="inventory_selection" selection="false" auto_grayed="true" dragable="true" oncandrag="inv_can_drag" ondrag="inv_drag" params_drag="from_text_list" oncandrop="inv_can_drop" ondrop="inv_drop" menu_r="ui:interface:item_menu_in_bag" instant_help="false" over_color="%bot_chat_sheet_selection_normal" over_col_pushed="%bot_chat_sheet_selection_pushed" over_col_over="%bot_chat_sheet_selection_over" color="255 255 255 255" fontsize="8" shadow="true" multi_line="true" multi_line_space="0" db_animal_status="#animal_status"> + <group type="list_sheet_bag" id="bag_list" array="false" sizeref="wh" w="0" h="-34" posref="TL TL" x="0" y="-10" child_resize_h="false" value="#inv_branch" maxitem="#inv_branch_nb" inv_type="#inv_type" sort_type="UI:SAVE:#inv_type:SORT_TYPE" filter_armor="UI:SAVE:#inv_type:FILTER_ARMOR" filter_weapon="UI:SAVE:#inv_type:FILTER_WEAPON" filter_tool="UI:SAVE:#inv_type:FILTER_TOOL" filter_pet="UI:SAVE:#inv_type:FILTER_PET" filter_mp="UI:SAVE:#inv_type:FILTER_MP" filter_missmp="UI:SAVE:#inv_type:FILTER_MISSMP" filter_tp="UI:SAVE:#inv_type:FILTER_TP" hspace="2" startitem="#start_item" xitem="2" yitem="-2" xtext="46" ytext="-2" selection_group="inventory_selection" selection="false" auto_grayed="true" dragable="true" oncandrag="inv_can_drag" ondrag="inv_drag" params_drag="from_text_list" oncandrop="inv_can_drop" ondrop="inv_drop" menu_r="ui:interface:item_menu_in_bag" instant_help="false" over_color="%bot_chat_sheet_selection_normal" over_col_pushed="%bot_chat_sheet_selection_pushed" over_col_over="%bot_chat_sheet_selection_over" color="255 255 255 255" fontsize="8" shadow="true" multi_line="true" multi_line_space="0" db_animal_status="#animal_status"> <!-- the scroll --> <ctrl style="skin_scroll" id="scroll_row" posref="TL TL" target_stepy="44" /> <!-- the group to scroll --> diff --git a/ryzom/client/src/interface_v3/action_handler_item.cpp b/ryzom/client/src/interface_v3/action_handler_item.cpp index 6806053f4e..b817ea0b47 100644 --- a/ryzom/client/src/interface_v3/action_handler_item.cpp +++ b/ryzom/client/src/interface_v3/action_handler_item.cpp @@ -479,6 +479,13 @@ static void sendSwapItemMsg(const CDBCtrlSheet *pCSSrc, const CDBCtrlSheet *pCSD out.serial(dstSlotId); out.serial(quantity); + nlinfo("Swap item"); + nlinfo("srcInvId = %d", srcInvId); + nlinfo("srcSlotId = %d", srcSlotId); + nlinfo("dstInvId = %d", dstInvId); + nlinfo("dstSlotId = %d", dstSlotId); + nlinfo("quantity = %d", quantity); + // Special case for guilds that are not on the same counter as the other inventories // The guild counter is global on the server so it can changes without this client uint16 nGuildSessionCounter = 0; @@ -1529,17 +1536,21 @@ class CHandlerMoveItem : public IActionHandler if (nNbList > 0) { string sListId = getParam(sParams, "listsheet"+toString(nListIt)); + nlinfo("To listsheet %s", sListId.c_str()); while (!sListId.empty()) { IListSheetBase *pLS = dynamic_cast<IListSheetBase*>(CWidgetManager::getInstance()->getElementFromId(sListId)); if (pLS == NULL) return; // search an empty slot where to put sint32 nbelt = pLS->getNbSheet(); + nlinfo("nbelt = %d", nbelt); for (sint32 i = 0; i < nbelt; ++i) { + nlinfo("Item %d = %d", i, pLS->getSheet(i)->getIndexInDB()); if (pLS->getSheet(i)->getSheetId() == 0) { // Send swap_item + nlinfo("Swap to %d", i); CAHManager::getInstance()->runActionHandler("swap_item", pLS->getSheet(i), "src="+toString(pCaller->getId())); return; } diff --git a/ryzom/client/src/interface_v3/action_handler_ui.cpp b/ryzom/client/src/interface_v3/action_handler_ui.cpp index 7495cfa7f5..7fd946ad24 100644 --- a/ryzom/client/src/interface_v3/action_handler_ui.cpp +++ b/ryzom/client/src/interface_v3/action_handler_ui.cpp @@ -65,7 +65,7 @@ static bool isContainerAuthorized(CGroupContainer *pGC) std::string shortId = pGC->getShortId(); // special case to prevent opening the guild inventory window if there's // no guild or not in guild hall. - if (shortId == "inv_guild") + if (shortId == "inv_guild" || shortId == "inv_guild2") { if (NLGUI::CDBManager::getInstance()->getDbProp("SERVER:GUILD:NAME") == 0 || !getInventory().isInventoryPresent(INVENTORIES::guild)) diff --git a/ryzom/client/src/interface_v3/dbgroup_list_sheet.cpp b/ryzom/client/src/interface_v3/dbgroup_list_sheet.cpp index 487b77c99e..f051ae29af 100644 --- a/ryzom/client/src/interface_v3/dbgroup_list_sheet.cpp +++ b/ryzom/client/src/interface_v3/dbgroup_list_sheet.cpp @@ -850,6 +850,8 @@ void CDBGroupListSheet::setup() // determine the inventory slot from the database branch id int slotNum = CDBCtrlSheet::getInventorySlot( _DbBranchName ); + nlinfo("_DbBranchName = %s, _StartDbIdx = %d, slotNum = %d, nbNodes = %d", _DbBranchName.c_str(), _StartDbIdx, slotNum, nbNodes); + for (i = 0; i < nbNodes; i++) { @@ -987,6 +989,23 @@ void CDBGroupListSheet::forceValidity(uint element, bool forceValid) } } +void CDBGroupListSheet::setStartDbIndex(sint index) +{ + _StartDbIdx = index; + uint nbNodes = _DbBranch->getNbNodes(); + + // determine the inventory slot from the database branch id + int slotNum = CDBCtrlSheet::getInventorySlot( _DbBranchName ); + nlinfo("Id = %s, _DbBranchName = %s, _StartDbIdx = %d, slotNum = %d, nbNodes = %d, sheetChildrens = %d", _Id.c_str(), _DbBranchName.c_str(), _StartDbIdx, slotNum, nbNodes, _SheetChildren.size()); + for (uint i = 0; i < nbNodes; i++) + { + if (i < _SheetChildren.size() && _SheetChildren[i]->Ctrl) + _SheetChildren[i]->Ctrl->setSheetFast(_DbBranchName, _StartDbIdx+i, slotNum); + } + _NeedToSort = true; + invalidateCoords(); +} + // *************************************************************************** // *************************************************************************** @@ -1021,3 +1040,22 @@ class CListSheetSubRow : public IActionHandler }; REGISTER_ACTION_HANDLER (CListSheetSubRow, "list_sheet_sub_row"); + +// *************************************************************************** +class CListSheetChangeStartItem : public IActionHandler +{ +public: + virtual void execute (CCtrlBase *pCaller, const std::string &sParams) + { + CDBGroupListSheet *pLS = dynamic_cast<CDBGroupListSheet*>(pCaller); + if (pLS== NULL) return; + uint index; + std::string idx = getParam(sParams, "index"); + if (!fromString(idx, index)) return; + nlinfo("setStartDbIndex %d", index); + pLS->setStartDbIndex(index); + } +}; +REGISTER_ACTION_HANDLER (CListSheetChangeStartItem, "list_sheet_change_start_item"); + + diff --git a/ryzom/client/src/interface_v3/dbgroup_list_sheet.h b/ryzom/client/src/interface_v3/dbgroup_list_sheet.h index 211d872dc4..b31fa5057a 100644 --- a/ryzom/client/src/interface_v3/dbgroup_list_sheet.h +++ b/ryzom/client/src/interface_v3/dbgroup_list_sheet.h @@ -85,6 +85,10 @@ class CDBGroupListSheet : public IListSheetBase */ void forceValidity(uint element, bool forceValid); + sint getStartDbIndex() const { return _StartDbIdx; } + void setStartDbIndex(sint index); + + public: // A child node diff --git a/ryzom/client/src/interface_v3/interface_expr_user_fct_game.cpp b/ryzom/client/src/interface_v3/interface_expr_user_fct_game.cpp index b6dde93799..01a0c7f765 100644 --- a/ryzom/client/src/interface_v3/interface_expr_user_fct_game.cpp +++ b/ryzom/client/src/interface_v3/interface_expr_user_fct_game.cpp @@ -79,6 +79,7 @@ DECLARE_INTERFACE_CONSTANT(getMaxBagInvSlot, MAX_BAGINV_ENTRIES); DECLARE_INTERFACE_CONSTANT(getMaxAnimalInvSlot, MAX_ANIMALINV_ENTRIES); DECLARE_INTERFACE_CONSTANT(getMaxRoomInvSlot, MAX_ROOMINV_ENTRIES); DECLARE_INTERFACE_CONSTANT(getMaxGuildInvSlot, MAX_GUILDINV_ENTRIES); +DECLARE_INTERFACE_CONSTANT(getMaxGuildChestSlot, MAX_GUILDCHEST_ENTRIES); DECLARE_INTERFACE_CONSTANT(getMaxTempInvSlot, MAX_TEMPINV_ENTRIES); DECLARE_INTERFACE_CONSTANT(getFaberTypeUnknown, RM_FABER_TYPE::Unknown); DECLARE_INTERFACE_CONSTANT(getItemTypeUnknown, ITEM_TYPE::UNDEFINED); diff --git a/ryzom/client/src/interface_v3/interface_expr_user_fct_items.cpp b/ryzom/client/src/interface_v3/interface_expr_user_fct_items.cpp index 861f93d604..cc097c44e4 100644 --- a/ryzom/client/src/interface_v3/interface_expr_user_fct_items.cpp +++ b/ryzom/client/src/interface_v3/interface_expr_user_fct_items.cpp @@ -1079,3 +1079,27 @@ static DECLARE_INTERFACE_USER_FCT(getInvSlotCounts) return true; } REGISTER_INTERFACE_USER_FCT("getInvSlotCounts", getInvSlotCounts) + +// *************************************************************************** +static DECLARE_INTERFACE_USER_FCT(getGuildInvSlotCounts) +{ + if (args.size() != 3 || !args[0].toString() || !args[1].toInteger() || !args[2].toInteger()) + { + nlwarning("<getInvSlotCounts> 3 argument expected : (dbPath, init, count)"); + return false; + } + + // Get the counts + std::string dbBranch= args[0].getString(); + uint16 startItemIndex = (uint16) args[1].getInteger(); + uint16 numItems = (uint16) args[2].getInteger(); + + uint nbUsedSlots = 0, nbMaxSlots = 0; + CInventoryManager::getBranchSlotCounts(dbBranch, startItemIndex, numItems, nbUsedSlots, nbMaxSlots); + + // Replace in the formated text + std::string str = toString("%u/%u", nbUsedSlots, numItems); + result.setString(str); + return true; +} +REGISTER_INTERFACE_USER_FCT("getGuildInvSlotCounts", getGuildInvSlotCounts) diff --git a/ryzom/client/src/interface_v3/inventory_manager.cpp b/ryzom/client/src/interface_v3/inventory_manager.cpp index 641c08f6d1..8c69a58a3e 100644 --- a/ryzom/client/src/interface_v3/inventory_manager.cpp +++ b/ryzom/client/src/interface_v3/inventory_manager.cpp @@ -718,7 +718,7 @@ std::string CInventoryManager::getDBIndexPath(CDBCtrlSheet *pCS) } } - + for (i = 0; i < MAX_HOTBARINV_ENTRIES; ++i) { if (UIHotbar[i] == pCS || UIHotbar2[i] == pCS || UIHotbar3[i] == pCS) @@ -1284,7 +1284,7 @@ void CInventoryManager::CDBEquipObs::update(ICDBNode* node) else { // in some case left sheet is same than right sheet so don't clear it now (ex: 2 hands item, right hand exclusive) - if (vCS[0] != getInventory().UIHands[1]) + if (vCS[0] != getInventory().UIHands[1]) { for(uint i = 0; i < vCS.size(); i++) vCS[i]->setSheet(""); @@ -1292,7 +1292,7 @@ void CInventoryManager::CDBEquipObs::update(ICDBNode* node) } // Hands management - if (vCS[0] == getInventory().UIHands[0]) // if right hand + if (vCS[0] == getInventory().UIHands[0]) // if right hand { std::vector<CDBCtrlSheet *> vCSLeftHand = {getInventory().UIHands[1], getInventory().UIHands2[1], getInventory().UIHands3[1]}; @@ -1312,7 +1312,7 @@ void CInventoryManager::CDBEquipObs::update(ICDBNode* node) // If something in left hand check if we have to remove CCDBNodeLeaf *pNL3 = NLGUI::CDBManager::getInstance()->getDbProp(LOCAL_INVENTORY ":HAND:1:INDEX_IN_BAG", false); - if (!pNL3) + if (!pNL3) return; uint32 leftSheet = getInventory().getBagItemSheet(pNL3->getValue32()-1); @@ -1325,7 +1325,7 @@ void CInventoryManager::CDBEquipObs::update(ICDBNode* node) for(uint i = 0; i < vCSLeftHand.size(); ++i) vCSLeftHand[i]->setSheet(""); } - + // update display of left hand according to new right hand item if (newVal >= 0) { @@ -1705,6 +1705,40 @@ void CInventoryManager::getBranchSlotCounts(const std::string &basePath, uint& n } } +void CInventoryManager::getBranchSlotCounts(const std::string &basePath, uint16 startItemIndex, uint16 numItems, uint& nbUsedSlots, uint& nbMaxSlots ) +{ + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + CCDBNodeBranch *branch = NLGUI::CDBManager::getInstance()->getDbBranch(basePath); + if (!branch) + { + nlwarning("<getBranchSlotCounts> Branch is NULL"); + return; + } + + nbMaxSlots = 0; // different from nbNodes, because there can be non-slots leaves (e.g. guild money...) + nbUsedSlots = 0; + for ( uint i=startItemIndex; i < startItemIndex+numItems; ++i ) + { + ICDBNode *node = branch->getNode(i); + if (node) + { + CCDBNodeLeaf *sheetNode = dynamic_cast<CCDBNodeLeaf *>(node->getNode(ICDBNode::CTextId("SHEET"))); + if (sheetNode) + { + // Get the Sheet + CSheetId sheetId = CSheetId(sheetNode->getValue32()); + if (sheetId != CSheetId::Unknown) + { + ++nbUsedSlots; + } + + ++nbMaxSlots; + } + } + } +} + + // *************************************************************************** double CInventoryManager::getBagBulk(uint32 inventoryIndex) @@ -2644,7 +2678,7 @@ bool CDBGroupListSheetFilterCLMSlot::CSheetChildFilter::isSheetValid(CDBGroupLis // *************************************************************************** bool CDBGroupListSheetFilterHotbarSlot::CSheetChildFilter::isSheetValid(CDBGroupListSheet *pFather) -{ +{ if (CSheetChild::isSheetValid(pFather)) { CInterfaceManager *pIM = CInterfaceManager::getInstance(); @@ -3134,7 +3168,6 @@ class CHandlerInvDropTo : public IActionHandler string sTmp; if (pListDstText != NULL) sTmp = toString("%d",pListDstText->getInvType()-CInventoryManager::InvPA0); if (pListDstIcon != NULL) sTmp = toString("%d",pListDstIcon->getInvType()-CInventoryManager::InvPA0); - nlinfo("ici :%s", sTmp.c_str()); CAHManager::getInstance()->runActionHandler("proc", pCSSrc, "move_to_pa|"+sTmp); } else if (((pListDstText != NULL) && (pListDstText->getInvType() == CInventoryManager::InvGuild)) || @@ -3142,6 +3175,11 @@ class CHandlerInvDropTo : public IActionHandler { CAHManager::getInstance()->runActionHandler("proc", pCSSrc, "move_to_guild"); } + else if (((pListDstText != NULL) && (pListDstText->getInvType() == CInventoryManager::InvGuild2)) || + ((pListDstIcon != NULL) && (pListDstIcon->getInvType() == CInventoryManager::InvGuild2))) + { + CAHManager::getInstance()->runActionHandler("proc", pCSSrc, "move_to_guild2"); + } else if (((pListDstText != NULL) && (pListDstText->getInvType() == CInventoryManager::InvRoom)) || ((pListDstIcon != NULL) && (pListDstIcon->getInvType() == CInventoryManager::InvRoom))) { @@ -3442,13 +3480,13 @@ void CClientItemInfo::readFromImpulse(const CItemInfos &itemInfo) } // *************************************************************************** -uint16 CInventoryManager::getItemSlotId(CDBCtrlSheet *ctrl) +uint32 CInventoryManager::getItemSlotId(CDBCtrlSheet *ctrl) { return getItemSlotId(ctrl->getSheet(), ctrl->getIndexInDB()); } // *************************************************************************** -uint16 CInventoryManager::getItemSlotId(const std::string &itemDb, uint slotIndex) +uint32 CInventoryManager::getItemSlotId(const std::string &itemDb, uint slotIndex) { // then compare to all possible inventories (ugly) uint inventoryIndex= 0; @@ -3472,7 +3510,7 @@ uint32 CInventoryManager::getBagItemSheet(sint32 bagId) const return 0; CCDBNodeLeaf *pNL = NLGUI::CDBManager::getInstance()->getDbProp(LOCAL_INVENTORY ":BAG:" + toString(bagId) + ":SHEET", false); - if (!pNL) + if (!pNL) return 0; return pNL->getValue32(); @@ -3699,7 +3737,7 @@ void CInventoryManager::onReceiveItemInfo(const CItemInfos &itemInfo) } // *************************************************************************** -void CInventoryManager::onRefreshItemInfoVersion(uint16 slotId, uint8 infoVersion) +void CInventoryManager::onRefreshItemInfoVersion(uint32 slotId, uint8 infoVersion) { _ItemInfoMap[slotId].refreshInfoVersion(infoVersion); } @@ -3765,7 +3803,7 @@ void CInventoryManager::updateItemInfoQueue() CBitMemStream out; if (GenericMsgHeaderMngr.pushNameToStream("ITEM_INFO:GET", out)) { - uint16 slotId= itemSlotId; + uint32 slotId= itemSlotId; out.serial( slotId ); NetMngr.push(out); //nlinfo("impulseCallBack : ITEM_INFO:GET %d sent", slotId); @@ -3839,6 +3877,11 @@ void CInventoryManager::sortBag() pList = dynamic_cast<CDBGroupListSheetBag*>(CWidgetManager::getInstance()->getElementFromId(LIST_GUILD_TEXT)); if (pList != NULL) pList->needToSort(); + pIconList = dynamic_cast<CDBGroupIconListBag*>(CWidgetManager::getInstance()->getElementFromId(LIST_GUILD2_ICONS)); + if (pIconList != NULL) pIconList->needToSort(); + pList = dynamic_cast<CDBGroupListSheetBag*>(CWidgetManager::getInstance()->getElementFromId(LIST_GUILD2_TEXT)); + if (pList != NULL) pList->needToSort(); + pIconList = dynamic_cast<CDBGroupIconListBag*>(CWidgetManager::getInstance()->getElementFromId(LIST_PA0_ICONS)); if (pIconList != NULL) pIconList->needToSort(); pList = dynamic_cast<CDBGroupListSheetBag*>(CWidgetManager::getInstance()->getElementFromId(LIST_PA0_TEXT)); @@ -4121,6 +4164,7 @@ CInventoryManager::TInvType CInventoryManager::invTypeFromString(const string &s if (sTmp == "inv_pa5") return InvPA5; if (sTmp == "inv_pa6") return InvPA6; if (sTmp == "inv_guild") return InvGuild; + if (sTmp == "inv_guild2") return InvGuild2; if (sTmp == "inv_room") return InvRoom; return InvUnknown; } diff --git a/ryzom/client/src/interface_v3/inventory_manager.h b/ryzom/client/src/interface_v3/inventory_manager.h index 10ef38a9c1..9e1f621b70 100644 --- a/ryzom/client/src/interface_v3/inventory_manager.h +++ b/ryzom/client/src/interface_v3/inventory_manager.h @@ -44,6 +44,7 @@ const uint MAX_EQUIPINV_ENTRIES = 19; const uint MAX_HOTBARINV_ENTRIES = INVENTORIES::NbHotbarSlots; const uint MAX_ANIMALINV_ENTRIES = INVENTORIES::NbPackerSlots; const uint MAX_GUILDINV_ENTRIES = INVENTORIES::NbGuildSlots; +const uint MAX_GUILDCHEST_ENTRIES = INVENTORIES::NbGuildChestSlots; const uint MAX_ROOMINV_ENTRIES = INVENTORIES::NbRoomSlots; // This is the personal player inventory max (bag and animal) const uint MAX_PLAYER_INV_ENTRIES = std::max(MAX_BAGINV_ENTRIES, MAX_ANIMALINV_ENTRIES); @@ -286,6 +287,7 @@ class CInventoryManager static double getBranchBulk(const std::string &basePath, uint16 startItemIndex, uint16 numItems); // Get the number of used and max slots static void getBranchSlotCounts(const std::string &basePath, uint& nbUsedSlots, uint& nbMaxSlots ); + static void getBranchSlotCounts(const std::string &basePath, uint16 startItemIndex, uint16 numItems, uint& nbUsedSlots, uint& nbMaxSlots ); // 0 bag, 1 - 6 pack animal 1 to 5, 7 temp inv double getBagBulk(uint32 inventoryIndex); double getMaxBagBulk(uint32 inventoryIndex); @@ -295,8 +297,8 @@ class CInventoryManager bool isSpaceInBagForItem(CDBCtrlSheet *item, uint32 quantity, uint32 bagId); // ItemExtraInfo management. From each slot is a unique uint16 - uint16 getItemSlotId(CDBCtrlSheet *ctrl); - uint16 getItemSlotId(const std::string &itemDb, uint slotIndex); + uint32 getItemSlotId(CDBCtrlSheet *ctrl); + uint32 getItemSlotId(const std::string &itemDb, uint slotIndex); const CClientItemInfo &getItemInfo(uint slotId) const; // get item info from cache const CClientItemInfo *getItemInfoCache(uint32 serial, uint32 createTime) const; @@ -313,7 +315,7 @@ class CInventoryManager void removeItemInfoWaiter(IItemInfoWaiter *waiter); // Called on impulse void onReceiveItemInfo(const CItemInfos &itemInfo); - void onRefreshItemInfoVersion(uint16 slotId, uint8 infoVersion); + void onRefreshItemInfoVersion(uint32 slotId, uint8 infoVersion); void onUpdateEquipHands(); // Log for debug void debugItemInfoWaiters(); @@ -330,7 +332,7 @@ class CInventoryManager bool isInventoryEmpty (INVENTORIES::TInventory invId); - enum TInvType { InvBag, InvPA0, InvPA1, InvPA2, InvPA3, InvPA4, InvPA5, InvPA6, InvGuild, InvRoom, InvUnknown }; + enum TInvType { InvBag, InvPA0, InvPA1, InvPA2, InvPA3, InvPA4, InvPA5, InvPA6, InvGuild, InvGuild2, InvRoom, InvUnknown }; static TInvType invTypeFromString(const std::string &str); static std::string invToDbPath(INVENTORIES::TInventory inventory); @@ -849,6 +851,9 @@ class CDBGroupListSheetFilterExchangeable : public CDBGroupListSheet #define LIST_GUILD_TEXT "ui:interface:inv_guild:content:iil:bag_list" #define LIST_GUILD_ICONS "ui:interface:inv_guild:content:iil:bag_icons" +#define LIST_GUILD2_TEXT "ui:interface:inv_guild2:content:iil:bag_list" +#define LIST_GUILD2_ICONS "ui:interface:inv_guild2:content:iil:bag_icons" + #define LIST_PA0_TEXT "ui:interface:inv_pa0:content:iil:bag_list" #define LIST_PA0_ICONS "ui:interface:inv_pa0:content:iil:bag_icons" diff --git a/ryzom/client/src/net_manager.cpp b/ryzom/client/src/net_manager.cpp index b36aebe0c8..b14c1ce26c 100644 --- a/ryzom/client/src/net_manager.cpp +++ b/ryzom/client/src/net_manager.cpp @@ -2910,7 +2910,7 @@ void impulseItemInfoSet (NLMISC::CBitMemStream &impulse) //----------------------------------------------- void impulseItemInfoRefreshVersion (NLMISC::CBitMemStream &impulse) { - uint16 slotId; + uint32 slotId; uint8 infoVersion; impulse.serial(slotId); impulse.serial(infoVersion); diff --git a/ryzom/common/data_common/database.xml b/ryzom/common/data_common/database.xml index 4447a81b73..cee23e5656 100644 --- a/ryzom/common/data_common/database.xml +++ b/ryzom/common/data_common/database.xml @@ -1181,8 +1181,23 @@ type="I32" /> <leaf name="MONEY" type="I64" /> + <branch name="CHEST"> + <branch name="" + count="20"> + <leaf name="NAME" + type="TEXT" /> + <leaf name="VIEW_GRADE" + type="I3" /> + <leaf name="PUT_GRADE" + type="I3" /> + <leaf name="GET_GRADE" + type="I3" /> + <leaf name="BULK_MAX" + type="I32" /> + </branch> + </branch> <branch name="" - count="1000" + count="10000" clientonly="1"> <!-- Common Item Data --> <leaf name="SHEET" diff --git a/ryzom/common/data_common/msg.xml b/ryzom/common/data_common/msg.xml index 3fb15e9a24..c319c6eefb 100644 --- a/ryzom/common/data_common/msg.xml +++ b/ryzom/common/data_common/msg.xml @@ -993,8 +993,8 @@ <branch name="ITEM_INFO"> <leaf name="GET" sendto="EGS" - format="u16" - description="the client ask for a special item info in a inventory slot: inventoryId(u8HIGH)/slotId(u8LOW)" /> + format="u32" + description="the client ask for a special item info in a inventory slot: inventoryId(u16HIGH)/slotId(u16LOW)" /> <leaf name="SET" description="Server answer to the previous message. A CItemInfos class is filled" /> <leaf name="REFRESH_VERSION" diff --git a/ryzom/common/src/game_share/inventories.cpp b/ryzom/common/src/game_share/inventories.cpp index 5697736ac6..eda6137200 100644 --- a/ryzom/common/src/game_share/inventories.cpp +++ b/ryzom/common/src/game_share/inventories.cpp @@ -132,7 +132,7 @@ namespace INVENTORIES const uint CInventoryCategoryForCharacter::InventoryNbSlots [CInventoryCategoryForCharacter::NbInventoryIds] = { NbBagSlots, NbPackerSlots, NbPackerSlots, NbPackerSlots, NbPackerSlots, NbPackerSlots, NbPackerSlots, NbPackerSlots, NbRoomSlots }; // Other values to change according to these InventoryNbSlots: - // - game_share.h/inventories.h: CInventoryCategoryForCharacter::SlotBitSize + // - game_share/inventories.h: CInventoryCategoryForCharacter::SlotBitSize // - data_common/database.xml: INVENTORY:BAG count // - data/gamedev/interfaces_v3/inventory.xml: inventory:content:bag param inv_branch_nb @@ -141,7 +141,7 @@ namespace INVENTORIES const uint CInventoryCategoryForGuild::InventoryNbSlots [CInventoryCategoryForGuild::NbInventoryIds] = { NbGuildSlots }; // Other values to change according to this InventoryNbSlots: - // - game_share.h/inventories.h: CInventoryCategoryForGuild::SlotBitSize + // - game_share/inventories.h: CInventoryCategoryForGuild::SlotBitSize // - data_common/database.xml: GUILD:INVENTORY count // - data/gamedev/interfaces_v3/inventory.xml: inventory:content:guild param inv_branch_nb diff --git a/ryzom/common/src/game_share/inventories.h b/ryzom/common/src/game_share/inventories.h index 1e3df09405..c605c95df1 100644 --- a/ryzom/common/src/game_share/inventories.h +++ b/ryzom/common/src/game_share/inventories.h @@ -252,7 +252,7 @@ namespace INVENTORIES static const uint InventoryNbSlots [NbInventoryIds]; enum TSlotBitSize { - SlotBitSize = 10 + SlotBitSize = 16 }; static std::string getDbStr( TInventoryId invId ); @@ -268,7 +268,8 @@ namespace INVENTORIES const uint NbBagSlots = 500; const uint NbPackerSlots = 500; const uint NbRoomSlots = 1000; - const uint NbGuildSlots = 1000; + const uint NbGuildSlots = 10000; + const uint NbGuildChestSlots = 500; const uint NbTempInvSlots = 16; const uint NbHotbarSlots = 5; diff --git a/ryzom/common/src/game_share/item_infos.h b/ryzom/common/src/game_share/item_infos.h index 4cdfe67ef1..59640eea4b 100644 --- a/ryzom/common/src/game_share/item_infos.h +++ b/ryzom/common/src/game_share/item_infos.h @@ -60,8 +60,8 @@ class CItemInfos enum { // The number of bits of the lower bits part (the index part) - // 10 because the trading list can have 1024 entries - SlotIdIndexBitSize= 11, + // 17 because the trading list can have >10000 entries + SlotIdIndexBitSize= 17, SlotIdIndexBitMask= (1<<SlotIdIndexBitSize)-1, }; @@ -78,8 +78,8 @@ class CItemInfos ///\serial void serial(NLMISC::IStream & s); - /// inventoryId(6 higher order bits )/slotId(10 lowers bits) - uint16 slotId; + /// inventoryId(6 higher order bits )/slotId(16 lowers bits) + uint32 slotId; /// version of the inventory slot uint16 versionInfo; ///\name item properties diff --git a/ryzom/server/src/ai_service/ai_bot_npc.cpp b/ryzom/server/src/ai_service/ai_bot_npc.cpp index 227987de22..61a694918d 100644 --- a/ryzom/server/src/ai_service/ai_bot_npc.cpp +++ b/ryzom/server/src/ai_service/ai_bot_npc.cpp @@ -1190,7 +1190,7 @@ void CBotNpc::getSpawnPos(CAIVector& triedPos, RYAI_MAP_CRUNCH::CWorldPosition& } while (!worldMap.setWorldPosition(AITYPES::vp_auto, wp, rpos) && maxTries>0); if (maxTries > 0 ) { - nlinfo("set pos %f,%f", rpos.x().asDouble(), rpos.x().asDouble()); + nlinfo("set pos %f,%f", rpos.x().asDouble(), rpos.y().asDouble()); _StartPos.setXY(rpos); } } diff --git a/ryzom/server/src/entities_game_service/admin.cpp b/ryzom/server/src/entities_game_service/admin.cpp index cd4e8c8483..802fdede96 100644 --- a/ryzom/server/src/entities_game_service/admin.cpp +++ b/ryzom/server/src/entities_game_service/admin.cpp @@ -325,6 +325,7 @@ AdminCommandsInit[] = "RyzomTime", false, "addGuildXp", false, "setGuildChargePoint", false, + "setGuildInventoryChest", true, "characterInventoryDump", true, "deleteInventoryItem", true, "setSimplePhrase", false, @@ -4513,7 +4514,7 @@ NLMISC_COMMAND (ShowFactionChannels, "Show faction channels", "<csr id> <channel //---------------------------------------------------------------------------- // If channel not exists create it -NLMISC_COMMAND (connectUserChannel, "Connect to user channels", "<user id> <channel_name> [<pass>]") +NLMISC_COMMAND (connectUserChannel, "Connect to user channels", "<eid> <channel_name> [<pass>]") { if ((args.size() < 2) || (args.size() > 3)) return false; @@ -4578,7 +4579,7 @@ NLMISC_COMMAND (connectUserChannel, "Connect to user channels", "<user id> <chan } -NLMISC_COMMAND (connectLangChannel, "Connect to lang channel", "<user id> <lang> <leave:0|1>") +NLMISC_COMMAND (connectLangChannel, "Connect to lang channel", "<eid> <lang> <leave:0|1>") { if ((args.size() < 2) || (args.size() > 3)) return false; @@ -4626,7 +4627,7 @@ NLMISC_COMMAND (connectLangChannel, "Connect to lang channel", "<user id> <lang> } -NLMISC_COMMAND (setDontTranslateLangs, "Set langs that a player dont want to see translated", "<user id> <langs>") +NLMISC_COMMAND (setDontTranslateLangs, "Set langs that a player dont want to see translated", "<eid> <langs>") { if (args.size() != 2) return false; @@ -4645,7 +4646,16 @@ NLMISC_COMMAND (setDontTranslateLangs, "Set langs that a player dont want to see return true; } +NLMISC_COMMAND (updateTarget, "Update current target", "<eid>") +{ + GET_CHARACTER + c->updateTarget(); + return true; +} +//---------------------------------------------------------------------------- +NLMISC_COMMAND(setGuildInventoryChest, "Set the chest of inventory", "<eid> <A|B> <chest>" ) +{ if (args.size() != 3) return false; @@ -4674,11 +4684,24 @@ NLMISC_COMMAND (setDontTranslateLangs, "Set langs that a player dont want to see //---------------------------------------------------------------------------- NLMISC_COMMAND(setGuildInventoryChestParams, "Set the chest of inventory", "<eid> <chest> <name> <rank view> <rank put> <rank get>" ) { + + if (args.size() != 6) + return false; + GET_CHARACTER - c->updateTarget(); + + CGuild * guild = CGuildManager::getInstance()->getGuildFromId(c->getGuildId()); + if (guild) + { + uint8 chest; + NLMISC::fromString(args[1], chest); + EGSPD::CGuildGrade::TGuildGrade gradeView = EGSPD::CGuildGrade::fromString(args[3]); + EGSPD::CGuildGrade::TGuildGrade gradePut = EGSPD::CGuildGrade::fromString(args[4]); + EGSPD::CGuildGrade::TGuildGrade gradeGet = EGSPD::CGuildGrade::fromString(args[5]); + guild->setChestParams(chest, args[2], gradeView, gradePut, gradeGet); + } return true; } - // !!! Deprecated !!! NLMISC_COMMAND (webAddCommandsIds, "Add ids of commands will be run from webig", "<user id> <bot_name> <web_app_url> <indexes>") { diff --git a/ryzom/server/src/entities_game_service/cdb_group.cpp b/ryzom/server/src/entities_game_service/cdb_group.cpp index c28ec16836..760abb1d5c 100644 --- a/ryzom/server/src/entities_game_service/cdb_group.cpp +++ b/ryzom/server/src/entities_game_service/cdb_group.cpp @@ -48,7 +48,7 @@ void CCDBGroup::addRecipient( const CCDBRecipient& recipient ) // done since the latest sendDeltas(), one of which is from the 'permanent // changes') _NewRecipients.push_back( recipient ); - + LOG( "CDB: %s added into group", recipient.toString().c_str() ); } @@ -102,7 +102,7 @@ void CCDBGroup::removeRecipient( const CCDBRecipient& recipient ) /* * */ -void CCDBGroup::sendDeltas( uint32 maxBitSize, IDataProvider& dataProvider, uint8 sendFlags ) +void CCDBGroup::sendDeltas( uint32 maxBitSize, IDataProvider& dataProvider, uint8 sendFlags ) { // Check if there are changes if ( (Database.getChangedPropertyCount() != 0) || @@ -130,6 +130,7 @@ void CCDBGroup::sendDeltas( uint32 maxBitSize, IDataProvider& dataProvider, uint DBOutput.serial( noChange, CDBChangedPropertyCountBitSize ); } // Write additional provided data (for guild inventory) + nlinfo("provide update"); dataProvider.provideUpdate( DBOutput ); // Send CMessage msgout( "CDB_MULTI_IMPULSION" ); @@ -142,7 +143,7 @@ void CCDBGroup::sendDeltas( uint32 maxBitSize, IDataProvider& dataProvider, uint { msgout.serialCont( _Recipients ); // Explicit multi-recipients } - + msgout.serialBufferWithSize( (uint8*)DBOutput.buffer(), DBOutput.length() ); CUnifiedNetwork::getInstance()->send( "FS", msgout, false ); // viaMirror not needed because sending entity ids instead of datasetrows LOG( "Sent CDB_MULTI_IMPULSION to all FS (%u bytes)", msgout.length() ); @@ -152,7 +153,7 @@ void CCDBGroup::sendDeltas( uint32 maxBitSize, IDataProvider& dataProvider, uint for ( std::vector<CCDBRecipient>::const_iterator inr=_NewRecipients.begin(); inr!=_NewRecipients.end(); ++inr ) { const CCDBRecipient& recipient = (*inr); - + // Sent history of what was modified before its arrival in the group // As this is a specific message, the client can react differently from an update DBOutput.resetBufPos(); @@ -172,16 +173,46 @@ void CCDBGroup::sendDeltas( uint32 maxBitSize, IDataProvider& dataProvider, uint DBOutput.serial( noInitialDelta, 16 ); } // Write additional provided data (for guild inventory) - dataProvider.provideContents( DBOutput ); // provideUpdate() must have been called before, otherwise would not be empty() + nlinfo("provide contents to %s", recipient.toString().c_str()); + dataProvider.provideContents( DBOutput, const_cast<CEntityId&>(recipient), true); // provideUpdate() must have been called before, otherwise would not be empty() // Send CMessage msgout( "CDB_IMPULSION" ); msgout.serial( const_cast<CEntityId&>(recipient) ); msgout.serialBufferWithSize( (uint8*)DBOutput.buffer(), DBOutput.length() ); CUnifiedNetwork::getInstance()->send( NLNET::TServiceId(recipient.getDynamicId()), msgout ); - + // Add to normal recipient list if ( ! _Recipients.insert( recipient ).second ) nlwarning( "Recipient %s added twice into CDBGroup", recipient.toString().c_str() ); } _NewRecipients.clear(); } + +void CCDBGroup::sendDeltasToClient(IDataProvider& dataProvider, const CEntityId &id ) +{ + nlinfo("sendDeltasToClient"); + DBOutput.resetBufPos(); + GenericMsgManager.pushNameToStream( "DB_GROUP:UPDATE_BANK", DBOutput ); + // Write the server tick, to ensure old DB update are not applied after newer + TGameCycle serverTick = CTickEventHandler::getGameCycle(); + DBOutput.serial( serverTick ); + // Encode the bank + uint32 bank = (uint32)Database.bank(); + uint nbits; + FILL_nbits_WITH_NB_BITS_FOR_CDBBANK + DBOutput.serial( bank, nbits ); + // Write the shared database delta (from the beginning) + if ( ! Database.writePermanentDelta( DBOutput ) ) + { + uint32 noInitialDelta = 1; + DBOutput.serial( noInitialDelta, 16 ); + } + // Write additional provided data (for guild inventory) + nlinfo("provide contents to %s", id.toString().c_str()); + dataProvider.provideContents( DBOutput, id ); + // Send + CMessage msgout( "CDB_IMPULSION" ); + msgout.serial( const_cast<CEntityId&>(id) ); + msgout.serialBufferWithSize( (uint8*)DBOutput.buffer(), DBOutput.length() ); + CUnifiedNetwork::getInstance()->send( NLNET::TServiceId(id.getDynamicId()), msgout ); +} diff --git a/ryzom/server/src/entities_game_service/cdb_group.h b/ryzom/server/src/entities_game_service/cdb_group.h index 69947c3bea..823b79ea5f 100644 --- a/ryzom/server/src/entities_game_service/cdb_group.h +++ b/ryzom/server/src/entities_game_service/cdb_group.h @@ -92,7 +92,7 @@ class CCDBGroup /// Init (the singleton of CCDBStructBanks must have been initialized before) void init( TCDBBank bank ) { Database.init( bank, true ); } - + /** * Add a recipient. * - recipient must be ready for writing (e.g. at state 1 of above tutorial), because it will @@ -112,6 +112,7 @@ class CCDBGroup /// Write and send the delta to all recipients, if there's something to write. Set maxBitSize to ~0 for no limit. /// @param[in] sendFlags A combination of Flags (see enum above) indicating how the deltas are to be sent void sendDeltas( uint32 maxBitSize, IDataProvider& dataProvider, uint8 sendFlags); + void sendDeltasToClient(IDataProvider& dataProvider, const NLMISC::CEntityId &id ); /// Simpler version /// @param[in] sendFlags A combination of Flags (see enum above) indicating how the deltas are to be sent @@ -120,7 +121,7 @@ class CCDBGroup CFakeDataProvider dp; sendDeltas( maxBitSize, dp, sendFlags ); } - + private: diff --git a/ryzom/server/src/entities_game_service/client_messages.cpp b/ryzom/server/src/entities_game_service/client_messages.cpp index 38c78f8b10..b361852c35 100644 --- a/ryzom/server/src/entities_game_service/client_messages.cpp +++ b/ryzom/server/src/entities_game_service/client_messages.cpp @@ -2907,7 +2907,7 @@ void cbClientSetCharacterTitle( NLNET::CMessage& msgin, const std::string & serv void cbClientItemInfos( NLNET::CMessage& msgin, const std::string & serviceName, NLNET::TServiceId serviceId ) { CEntityId userId; - uint16 slotId; + uint32 slotId; msgin.serial(userId,slotId); CCharacter * user = PlayerManager.getChar(userId); if ( user && user->getEnterFlag() && TheDataset.isAccessible( user->getEntityRowId() ) ) diff --git a/ryzom/server/src/entities_game_service/egs_variables.cpp b/ryzom/server/src/entities_game_service/egs_variables.cpp index 61c3017051..07070c1bfd 100644 --- a/ryzom/server/src/entities_game_service/egs_variables.cpp +++ b/ryzom/server/src/entities_game_service/egs_variables.cpp @@ -1,4 +1,4 @@ -// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> +W// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> // Copyright (C) 2010 Winch Gate Property Limited // // This source file has been modified by the following contributors: @@ -421,6 +421,7 @@ NLMISC::CVariable<float> KillAttribMinFactor("egs","KillAttribMinFactor", "min f CVariable<sint32> BaseGuildBulk("egs","BaseGuildBulk", "base bulk for a new guild building", 2000000, 0, true); +CVariable<sint32> GuildChestSlots("egs","GuildChestSlots", "number of slots in each guild chest", 500, 0, true); CVariable<sint16> MinFameToBuyGuildBuilding("egs","MinFameToBuyGuildBuilding", "Minimum Fame To Buy a Guild Building", 0, 0, true); CVariable<sint16> MinFameToBuyPlayerBuilding("egs","MinFameToBuyPlayerBuilding", "Minimum Fame To Buy a Player Building", 0, 0, true); CVariable<uint32> GuildCreationCost("egs","GuildCreationCost", "", 100, 0, true); diff --git a/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp b/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp index 78fc8d2ef8..0764887033 100644 --- a/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp +++ b/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp @@ -2652,7 +2652,11 @@ void cbItemSwap( NLNET::CMessage& msgin, const std::string &serviceName, NLNET:: return; } - if (inventorySrc == (uint16) INVENTORIES::guild) + if (inventorySrc == (uint16) INVENTORIES::guild && inventoryDst == (uint16) INVENTORIES::guild) + { + pGuild->moveItem(character, slotSrc, slotDst, quantity, nGuildSessionCounter); + } + else if (inventorySrc == (uint16) INVENTORIES::guild) { // Guild -> Bag pGuild->takeItem(character, (INVENTORIES::TInventory) inventoryDst, slotSrc, quantity, nGuildSessionCounter); @@ -2676,7 +2680,10 @@ void cbItemSwap( NLNET::CMessage& msgin, const std::string &serviceName, NLNET:: else { // autostack by default (ignore destination slot furnished by client) - character->moveItem(inventorySrc, slotSrc, inventoryDst, INVENTORIES::INSERT_IN_FIRST_FREE_SLOT, quantity); + if (inventoryDst == (uint16) INVENTORIES::guild) + character->moveItem(inventorySrc, slotSrc, inventoryDst, slotDst, quantity); + else + character->moveItem(inventorySrc, slotSrc, inventoryDst, INVENTORIES::INSERT_IN_FIRST_FREE_SLOT, quantity); } } diff --git a/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.cpp b/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.cpp index fed45b2b05..00cc7a3c1b 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.cpp @@ -22,8 +22,10 @@ #include "guild_inv.h" #include "player_manager/character.h" +#include "player_manager/player_manager.h" #include "egs_sheets/egs_sheets.h" #include "guild_manager/guild_member_module.h" +#include "guild_manager/guild_manager.h" #include "cdb_group.h" using namespace std; @@ -31,6 +33,7 @@ using namespace NLMISC; using namespace NLNET; extern NLMISC::CVariable<uint32> MaxPlayerBulk; +extern NLMISC::CVariable<uint32> GuildChestSlots; extern CGenericXmlMsgHeaderManager GenericMsgManager; ///////////////////////////////////////////////////////////// @@ -296,13 +299,14 @@ void CGuildInventoryView::provideUpdate( CBitMemStream& stream ) } //----------------------------------------------------------------------------- -void CGuildInventoryView::provideContents( CBitMemStream& stream ) +void CGuildInventoryView::provideContents( CBitMemStream& stream, const CEntityId &recipient, bool first) { // Ensure the updater is empty, otherwise our contents would be mixed with current update nlassert( _GuildInvUpdater.empty( INVENTORIES::CInventoryCategoryForGuild::GuildInvId ) ); CGuildInventory *guildInv = static_cast<CGuildInventory*>(getInventory()); - for ( uint i=0; i!=guildInv->getSlotCount(); ++i ) + + if (first) { setChestA(recipient, 0); setChestB(recipient, 1); @@ -338,6 +342,7 @@ void CGuildInventoryView::provideContents( CBitMemStream& stream ) } } } + c->isInitChest(chestA, true); } if (!c->isInitChest(chestB)) diff --git a/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.h b/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.h index 9143dc4b3e..fc84aabe38 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.h +++ b/ryzom/server/src/entities_game_service/game_item_manager/guild_inv.h @@ -45,7 +45,7 @@ class IDataProvider virtual void provideUpdate( NLMISC::CBitMemStream& stream ) = 0; /// Push all non-empty data, then provide them as update - virtual void provideContents( NLMISC::CBitMemStream& stream ) = 0; + virtual void provideContents( NLMISC::CBitMemStream& stream, const NLMISC::CEntityId &recipient = NLMISC::CEntityId::Unknown, bool first = false ) = 0; }; class CFakeDataProvider : public IDataProvider @@ -53,19 +53,19 @@ class CFakeDataProvider : public IDataProvider public: /// Return true if there is a pending update to provide virtual bool nonEmpty() const { return false; } - + /// Push data modified since the last update. May be called event if nonEmpty(). virtual void provideUpdate( NLMISC::CBitMemStream& stream ) {} - + /// Push all non-empty data, then provide them as update - virtual void provideContents( NLMISC::CBitMemStream& stream ) {} + virtual void provideContents( NLMISC::CBitMemStream& stream, const NLMISC::CEntityId &recipient = NLMISC::CEntityId::Unknown, bool first = false ) {} }; /** Guild inventory */ class CGuildInventory : public CInventoryBase { public: - + /// Constructor CGuildInventory(); @@ -151,7 +151,7 @@ class CGuildInventoryView : public IInventoryView, public IDataProvider virtual void provideUpdate( NLMISC::CBitMemStream& stream ); /// Push all non-empty data, for connecting members. Precondition: _GuildInvUpdater.empty() (provideUpdate() must have been called before) - virtual void provideContents( NLMISC::CBitMemStream& stream ); + virtual void provideContents( NLMISC::CBitMemStream& stream, const NLMISC::CEntityId &recipient = NLMISC::CEntityId::Unknown, bool first = false); protected: diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp b/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp index d5f3e9e75b..db38dfa09e 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp @@ -33,6 +33,7 @@ using namespace NLMISC; using namespace std; using namespace NLNET; +extern NLMISC::CVariable<uint32> GuildChestSlots; #define PERSISTENT_TOKEN_FAMILY RyzomTokenFamily @@ -177,7 +178,7 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it nlassert(item != NULL); nlassert(item->getInventory() == NULL); - nlassert(slot < _Items.size() || slot == INVENTORIES::INSERT_IN_FIRST_FREE_SLOT); + nlassert(slot < _Items.size() || slot == INVENTORIES::INSERT_IN_FIRST_FREE_SLOT || _InventoryId == INVENTORIES::guild); if (_InventoryId != INVENTORIES::guild && !ignoreWeightAndBulk) { @@ -217,7 +218,17 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it // get first compatible stack if (slot == INVENTORIES::INSERT_IN_FIRST_FREE_SLOT) slotBegin = 0; + slotSearch = slotBegin; + + if (_InventoryId == INVENTORIES::guild && minSlotSearch < _Items.size() && minSlotSearch + GuildChestSlots < _Items.size()) + { + slotSearch = minSlotSearch; + slotBegin = slotSearch + GuildChestSlots; + } + + nlinfo("Search stackable slot %d <-> %d", slotSearch, slotBegin); + // Modification to do : (slot to put item, stack size to put) vector< pair<uint32,uint32> > Modifs; @@ -250,6 +261,7 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it if (bFound) { + nlinfo("Found stackable %d", slotSearch); // We found a slot with an existing stack that is compatible // Try to put as much as we can into this stack if (itemStackSize > _Items[slotSearch]->getMaxStackSize() - _Items[slotSearch]->getStackSize()) @@ -267,12 +279,25 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it Modifs.push_back(make_pair(slotSearch, itemStackSize)); break; // finished } + } else { + nlinfo("Not found stackable", slotSearch); } - // Can't insert item in an already existing stack - if (getFreeSlotCount() == 0) - return ior_no_free_slot; // No more empty slot in this inventory !!! - slotSearch = getFirstFreeSlot(); + if (_InventoryId == INVENTORIES::guild) + { + nlinfo("Need found free slot"); + slotSearch = getFirstFreeSlot(minSlotSearch, minSlotSearch + GuildChestSlots); + nlinfo("Found %d", slotSearch); + if (slotSearch == INVENTORIES::INVALID_INVENTORY_SLOT) + return ior_no_free_slot; + } + else + { + // Can't insert item in an already existing stack + if (getFreeSlotCount() == 0) + return ior_no_free_slot; // No more empty slot in this inventory !!! + slotSearch = getFirstFreeSlot(); + } Modifs.push_back(make_pair(slotSearch, itemStackSize)); break; // finished } @@ -840,20 +865,20 @@ void CInventoryBase::forceViewUpdateOfInventory(bool skipEmptySlots) } // **************************************************************************** -uint32 CInventoryBase::getFirstFreeSlot() const +uint32 CInventoryBase::getFirstFreeSlot(uint32 start, uint32 end) const { nlassert(_FreeSlotCount > 0); - + nlinfo("getFirstFreeSlot %d <-> %d", start, end); // look for a valid slot - for (uint i=0; i<_Items.size(); ++i) + for (uint i = start; i < end; ++i) { + if (i >= _Items.size()) + break; + if (_Items[i] == NULL) - { return i; - } } - nlassertex(false, ("There are free slot, but I can't find them")); return INVENTORIES::INVALID_INVENTORY_SLOT; } diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.h b/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.h index 2e3bd6897f..84da25a680 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.h +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.h @@ -257,7 +257,7 @@ class CInventoryBase : public NLMISC::CRefCount protected: /// look for the first empty slot (assert if no free slot) - uint32 getFirstFreeSlot() const; + uint32 getFirstFreeSlot(uint32 start=0, uint32 end=INVENTORIES::INSERT_IN_FIRST_FREE_SLOT) const; /// Recompute weight and bulk according to item qt variation void updateWeightAndBulk(const CGameItemPtr &item, sint32 deltaQt); /// Copy the inventory content from this inventory to another diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp index c755313b57..221941e19d 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp @@ -185,6 +185,7 @@ void CGuild::setMoney(uint64 money) CBankAccessor_GUILD::getGUILD().getINVENTORY().setMONEY(_DbGroup, _Money); } + //---------------------------------------------------------------------------- void CGuild::setChestA(const CEntityId &recipient, uint8 chest) { @@ -423,6 +424,13 @@ void CGuild::sendClientDBDeltas() _DbGroup.sendDeltas( ~0, *_GuildInventoryView, CCDBGroup::SendDeltasToRecipients ); } +//---------------------------------------------------------------------------- +void CGuild::sendClientDBChest(const CEntityId& id) +{ + _DbGroup.sendDeltasToClient( *_GuildInventoryView, id ); +} + + //---------------------------------------------------------------------------- void CGuild::incMemberSession() @@ -482,6 +490,12 @@ void CGuild::initNonPDMembers() _Inventory = new CGuildInventory; _GuildInventoryView = new CGuildInventoryView( this ); // unfortunately this MUST be a smartptr because of smartptrs to views in CInventoryBase _GuildInventoryView->init( _Inventory, &_DbGroup ); + + for (uint8 i=0; i < 20; i++) + { + setChestParams(i, "", EGSPD::CGuildGrade::Member, EGSPD::CGuildGrade::Officer, EGSPD::CGuildGrade::HighOfficer); + } + } //---------------------------------------------------------------------------- @@ -1139,6 +1153,7 @@ void CGuild::takeItem( CCharacter * user, INVENTORIES::TInventory srcInv, uint32 } } + //---------------------------------------------------------------------------- void CGuild::moveItem( CCharacter * user, uint32 slot, uint32 dstSlot, uint32 quantity, uint16 session ) { @@ -1695,7 +1710,7 @@ void CGuild::updateMembersStringIds() { // Optimized property access (part 1) // static ICDBStructNode *membersArray = _DbGroup.Database.getICDBStructNodeFromName("GUILD:MEMBERS"); - CBankAccessor_GUILD::TGUILD::TMEMBERS &memberDb = CBankAccessor_GUILD::getGUILD().getMEMBERS(); +// CBankAccessor_GUILD::TGUILD::TMEMBERS &memberDb = CBankAccessor_GUILD::getGUILD().getMEMBERS(); // BOMB_IF(membersArray==NULL, "GUILD:MEMBERS not found in database.xml for guild "<< guildIdToString(getId())<<".", return); // static ICDBStructNode::CTextId nameTextId = ICDBStructNode::CTextId("NAME"); // static ICDBStructNode *nodeOfNameOfMember0 = membersArray->getNode( 0 )->getNode(nameTextId, false); diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild.h b/ryzom/server/src/entities_game_service/guild_manager/guild.h index cfbf835cc3..5d0bbfe997 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild.h +++ b/ryzom/server/src/entities_game_service/guild_manager/guild.h @@ -222,6 +222,7 @@ class CGuild : void decGradeCount( EGSPD::CGuildGrade::TGuildGrade grade ); /// send client datbase deltas void sendClientDBDeltas(); + void sendClientDBChest(const NLMISC::CEntityId& id); /// flag a user offline ( unregister it in other system, e.g. : chat group ) void setMemberOffline( CGuildMember * member ); /// flag a user online ( register it in other system, e.g. : chat group ) diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild_commands.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild_commands.cpp index 2090ecbd24..0e52b11eff 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild_commands.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild_commands.cpp @@ -468,7 +468,7 @@ NLMISC_COMMAND(guildRefuseJoinInvitation,"Refuse guild Join Invitation","<user>" } //---------------------------------------------------------------------------- -NLMISC_COMMAND( guildDB, "Display or set the value of a property in the guild database", "<guildName|<shardId>:<guildId> <db_entry> [<value>]" ) +NLMISC_COMMAND(guildDB, "Display or set the value of a property in the guild database", "<guildName|<shardId>:<guildId> <db_entry> [<value>]" ) { if ( args.size() != 2 && args.size() != 3 ) return false; diff --git a/ryzom/server/src/entities_game_service/guild_pd.cpp b/ryzom/server/src/entities_game_service/guild_pd.cpp index f045a8c217..340280236e 100644 --- a/ryzom/server/src/entities_game_service/guild_pd.cpp +++ b/ryzom/server/src/entities_game_service/guild_pd.cpp @@ -20,7 +20,7 @@ namespace EGSPD { - + /* ----------------------------------------- * Static Implementation of CGuildPD * ----------------------------------------- */ @@ -389,7 +389,7 @@ void CGuildPD::apply(CPersistentDataRecord &__pdr) } else { - nlwarning("Skipping unrecognised token: %s", __pdr.peekNextTokenName().c_str()); + //nlwarning("Skipping unrecognised token: %s", __pdr.peekNextTokenName().c_str()); __pdr.skipData(); } } @@ -645,5 +645,5 @@ void CGuildPD::pds_static__fetch(RY_PDS::IPDBaseData *object, RY_PDS::CPDa } // End of static implementation of CGuildPD - + } // End of EGSPD diff --git a/ryzom/server/src/entities_game_service/guild_pd.h b/ryzom/server/src/entities_game_service/guild_pd.h index 56e918162c..488b82c5a1 100644 --- a/ryzom/server/src/entities_game_service/guild_pd.h +++ b/ryzom/server/src/entities_game_service/guild_pd.h @@ -33,7 +33,7 @@ namespace EGSPD { - + // // Forward declarations // @@ -54,37 +54,37 @@ class CGuildPD : public RY_PDS::IPDBaseData /// \name Accessors and Mutators methods // @{ - + /** * Use these methods to change a value, add or delete elements. */ - + TGuildId getId() const; - + uint64 getMoney() const; void setMoney(uint64 __v, bool forceWrite=false); - + uint32 getCreationDate() const; void setCreationDate(uint32 __v, bool forceWrite=false); - + uint32 getXP() const; void setXP(uint32 __v, bool forceWrite=false); - + uint32 getChargesPoints() const; void setChargesPoints(uint32 __v, bool forceWrite=false); - + CPeople::TPeople getRace() const; void setRace(CPeople::TPeople __v, bool forceWrite=false); - + uint64 getIcon() const; void setIcon(uint64 __v, bool forceWrite=false); - + uint32 getBuilding() const; void setBuilding(uint32 __v, bool forceWrite=false); - + uint32 getVersion() const; void setVersion(uint32 __v, bool forceWrite=false); - + CGuildMemberPD* getMembers(const TCharacterId& __k); const CGuildMemberPD* getMembers(const TCharacterId& __k) const; std::map<TCharacterId, CGuildMemberPD*>::iterator getMembersBegin(); @@ -94,14 +94,14 @@ class CGuildPD : public RY_PDS::IPDBaseData const std::map<TCharacterId, CGuildMemberPD*> & getMembers() const; void setMembers(CGuildMemberPD* __v); void deleteFromMembers(const TCharacterId &__k); - + CGuildFameContainerPD* getFameContainer(); const CGuildFameContainerPD* getFameContainer() const; void setFameContainer(CGuildFameContainerPD* __v); - + CGuildContainerPD* getParent(); const CGuildContainerPD* getParent() const; - + // @} @@ -109,38 +109,38 @@ class CGuildPD : public RY_PDS::IPDBaseData /// \name Public Management methods // @{ - + /** * Use these methods to create, load, unload and get * an object from database. */ - - + + /** * Clear whole object content but key (delete subobjects if there are, key is left unmodified), default clear value is 0. */ void clear(); - + /** * Cast base object to CGuildPD */ static CGuildPD* cast(RY_PDS::IPDBaseData* obj); - + /** * Cast base object to const CGuildPD */ static const CGuildPD* cast(const RY_PDS::IPDBaseData* obj); - + /** * Set user factory for this class (as class is indicated as derived, a home made constructor must be provided) */ static void setFactory(RY_PDS::TPDFactory userFactory); - + /** * Create an object of the CGuildPD class, and declare it to the PDS. */ static CGuildPD* create(const TGuildId &Id); - + // @} @@ -148,14 +148,14 @@ class CGuildPD : public RY_PDS::IPDBaseData /// \name Public constructor // @{ - + /** * This constructor is public to allow direct instanciation of the class */ - + CGuildPD(); virtual ~CGuildPD(); - + // @} @@ -163,10 +163,10 @@ class CGuildPD : public RY_PDS::IPDBaseData /// \name Persistent methods declaration // @{ - + void apply(CPersistentDataRecord &__pdr); void store(CPersistentDataRecord &__pdr) const; - + // @} @@ -174,14 +174,14 @@ class CGuildPD : public RY_PDS::IPDBaseData /// \name User defined init and release methods // @{ - + /** * Overload those methods to implement init and release behaviours */ - + virtual void init(); virtual void release(); - + // @} @@ -189,11 +189,11 @@ class CGuildPD : public RY_PDS::IPDBaseData /// \name Attributes // @{ - + /** * Don't modify those value manually, use accessors and mutators above */ - + TGuildId _Id; uint64 _Money; uint32 _CreationDate; @@ -206,7 +206,7 @@ class CGuildPD : public RY_PDS::IPDBaseData std::map<TCharacterId, CGuildMemberPD*> _Members; CGuildFameContainerPD* _FameContainer; CGuildContainerPD* _Parent; - + // @} @@ -214,7 +214,7 @@ class CGuildPD : public RY_PDS::IPDBaseData /// \name Internal Management methods // @{ - + void pds__init(const TGuildId &Id); void pds__destroy(); void pds__fetch(RY_PDS::CPData &data); @@ -229,7 +229,7 @@ class CGuildPD : public RY_PDS::IPDBaseData void pds__unlinkMembers(TCharacterId __k); void pds__unlinkFameContainer(NLMISC::CEntityId dummy); static void pds_static__init(); - + // @} @@ -237,12 +237,12 @@ class CGuildPD : public RY_PDS::IPDBaseData /// \name Default Factory and Fetch methods // @{ - + static void pds_static__setFactory(RY_PDS::TPDFactory userFactory); static bool _FactoryInitialised; static RY_PDS::CIndexAllocator _IndexAllocator; static void pds_static__fetch(RY_PDS::IPDBaseData *object, RY_PDS::CPData &data); - + // @} @@ -255,7 +255,7 @@ class CGuildPD : public RY_PDS::IPDBaseData friend void EGSPD::init(uint32); }; - + } // End of EGSPD #endif diff --git a/ryzom/server/src/entities_game_service/inventory_updater.h b/ryzom/server/src/entities_game_service/inventory_updater.h index 5f1cd2a8c3..80f6e77f21 100644 --- a/ryzom/server/src/entities_game_service/inventory_updater.h +++ b/ryzom/server/src/entities_game_service/inventory_updater.h @@ -22,7 +22,7 @@ /** * Generic inventory updater. - * + * * Bufferizes and sends item updates to the client. * The number of recipients of the updates is not fixed. * @@ -99,7 +99,7 @@ class CInventoryUpdater /// Increment the stored "Info Version" number, but does not push it into the queue void incInfoVersion( TInventoryId invId, uint slotIndex ); - + /// Push the "Info Version" number into the queue. It will be included in the next sending. void pushInfoVersion( TInventoryId invId, uint slotIndex ); @@ -125,7 +125,7 @@ class CInventoryUpdater class CInventoryUpdaterForCharacter : public CInventoryUpdater<INVENTORIES::CInventoryCategoryForCharacter> { public: - + /// Constructor CInventoryUpdaterForCharacter( CCDBSynchronised *propertyDatabase ); @@ -134,7 +134,7 @@ class CInventoryUpdaterForCharacter : public CInventoryUpdater<INVENTORIES::CInv /// Increment the stored "Info Version" number only if it's useful. void incInfoVersion( TInventoryId invId, uint slotIndex ); - + /// Set the last sent info version, when the client requested to receive info sync. void syncInfoVersion( TInventoryId invId, uint slotIndex ); @@ -154,7 +154,7 @@ class CInventoryUpdaterForCharacter : public CInventoryUpdater<INVENTORIES::CInv incInfoVersion( invId, slotIndex ); return true; } - + /// Set the last sent info version, when the client requested to receive info sync bool syncInfoVersion( INVENTORIES::TInventory inventory, uint slotIndex ) { @@ -183,7 +183,7 @@ class CInventoryUpdaterForCharacter : public CInventoryUpdater<INVENTORIES::CInv { TInventoryId invId = InvIdFromEInventory[inventory]; if ( invId != CInvCat::InvalidInvId ) - CInventoryUpdater<CInvCat>::resetItem( invId, slotIndex ); + CInventoryUpdater<CInvCat>::resetItem( invId, slotIndex ); else resetItemIntoClassicDatabase( inventory, slotIndex ); } @@ -203,7 +203,7 @@ class CInventoryUpdaterForCharacter : public CInventoryUpdater<INVENTORIES::CInv /// Set an item slot, into classic database only (will not work for inventories for which isCompatibleWithInventory() is true) void setItemPropsToClassicDatabase( INVENTORIES::TInventory inventory, const INVENTORIES::CItemSlot& itemSlot ); - + /// Set only one property of an item slot (alternate version, uses the classic databasase if the specified inventory is NOT part of CInventoryUpdater) void setOneItemProp( INVENTORIES::TInventory inventory, uint slotIndex, INVENTORIES::TItemPropId propId, sint32 value ) { @@ -275,7 +275,7 @@ template <class CInventoryCategoryTemplate> void CInventoryUpdater<CInventoryCategoryTemplate>::resetItem( TInventoryId invId, uint slotIndex ) { H_AUTO(IU_resetItem); - + // Update item update if found in the pending list for ( typename CItemUpdates::iterator itu=_ItemUpdates[invId].begin(); itu!=_ItemUpdates[invId].end(); ++itu ) { @@ -292,7 +292,7 @@ void CInventoryUpdater<CInventoryCategoryTemplate>::resetItem( TInventoryId inv return; } } - + // Otherwise add to list CItemUpdate newItemUpdate; _ItemUpdates[invId].push_back( newItemUpdate ); @@ -316,7 +316,7 @@ template <class CInventoryCategoryTemplate> void CInventoryUpdater<CInventoryCategoryTemplate>::setItemProps( TInventoryId invId, const INVENTORIES::CItemSlot& itemSlot ) { H_AUTO(IU_setItemProps); - + // Update item update if found in the pending list for ( typename CItemUpdates::iterator itu=_ItemUpdates[invId].begin(); itu!=_ItemUpdates[invId].end(); ++itu ) { @@ -359,7 +359,7 @@ template <class CInventoryCategoryTemplate> void CInventoryUpdater<CInventoryCategoryTemplate>::setOneItemProp( TInventoryId invId, uint slotIndex, INVENTORIES::TItemPropId propId, sint32 value ) { H_AUTO(IU_setOneItemProp); - + // Update itemSlot if found in the pending list for ( typename CItemUpdates::iterator itu=_ItemUpdates[invId].begin(); itu!=_ItemUpdates[invId].end(); ++itu ) { @@ -489,6 +489,7 @@ bool CInventoryUpdater<CInventoryCategoryTemplate>::fillAllUpdates( NLMISC::CBi // Number field uint32 nbChanges = (uint32)_ItemUpdates[invId].size(); + nlinfo("nbChanges= %d", nbChanges); if ( nbChanges < INVENTORIES::LowNumberBound ) { destStream.serial( nbChanges, INVENTORIES::LowNumberBits ); diff --git a/ryzom/server/src/entities_game_service/pd_scripts/guild.pds b/ryzom/server/src/entities_game_service/pd_scripts/guild.pds index c36e17cff3..f38036e64d 100644 --- a/ryzom/server/src/entities_game_service/pd_scripts/guild.pds +++ b/ryzom/server/src/entities_game_service/pd_scripts/guild.pds @@ -10,7 +10,7 @@ file "entities_game_service/guild_member_pd" { onChange() @[ - // callback the manager + // callback the manager IGuildManager::getInstance().guildMemberChanged(this); ]@ } @@ -48,12 +48,13 @@ file "entities_game_service/guild_pd" uint32 Building; uint32 Version; - - CGuildMemberPD:Guild<> Members + + + CGuildMemberPD:Guild<> Members { onChange() @[ - // callback the manager + // callback the manager IGuildManager::getInstance().guildMemberListChanged(this); ]@ } @@ -67,10 +68,10 @@ file "entities_game_service/guild_pd" //CEntityId[TMaxChargeApplied] ChargesAppliedId; //CEntityId ChargeOwnedId; - + //CGuildMissionName:Guild<> SuccessfulMissions; //CGuildChargeName:Guild<> SuccessfulCharges; - + parent CGuildContainerPD:Guilds Parent; } } diff --git a/ryzom/server/src/entities_game_service/player_manager/character.cpp b/ryzom/server/src/entities_game_service/player_manager/character.cpp index b00d013724..a9eea4204d 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -443,6 +443,9 @@ CCharacter::CCharacter() for (uint i = 0; i < (PVP_CLAN::EndClans - PVP_CLAN::BeginClans + 1); ++i) _FactionPoint[i] = 0; + for (uint i = 0; i < 20; ++i) + _initializedChests[i] = false; + _PvpPoint = 0; _GuildPoints = 0; _TodayGuildPoints = 0; @@ -4742,8 +4745,7 @@ extern CBitMemStream DBOutput; // global to avoid reallocation void CCharacter::databaseUpdate() { // Write the inventory updates - _InventoryUpdater.sendAllUpdates( - _Id); // must be before the sending of _PropertyDatabase, because it tests _PropertyDatabase.notSentYet() + _InventoryUpdater.sendAllUpdates(_Id); // must be before the sending of _PropertyDatabase, because it tests _PropertyDatabase.notSentYet() // Write the character's database delta (for comment numbers, see tutorial in cdb_group.h) if (_PropertyDatabase.getChangedPropertyCount() != 0) // ensures writeDelta() will return true diff --git a/ryzom/server/src/entities_game_service/player_manager/character.h b/ryzom/server/src/entities_game_service/player_manager/character.h index 679bd03ac4..9111170526 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character.h +++ b/ryzom/server/src/entities_game_service/player_manager/character.h @@ -1385,6 +1385,9 @@ class CCharacter : public CCharacterPersistantData, public CEntityBase, public N ///\set the loot container void setLootContainer(CInventoryPtr lootSac); + bool isInitChest(uint8 chest); + void isInitChest(uint8 chest, bool value); + /// update scores infos in database void updateScoresInDatabase(); @@ -2967,7 +2970,7 @@ class CCharacter : public CCharacterPersistantData, public CEntityBase, public N void incSlotVersion(INVENTORIES::TInventory invId, uint32 slot); /// send item infos. For slotId (combination of inventory and slot), see explanation in CItemInfos - void sendItemInfos(uint16 slotId); + void sendItemInfos(uint32 slotId); /// return true if the player wears an item with the specified sheetId bool doesWear(const NLMISC::CSheetId &sheetId) const; @@ -3455,6 +3458,8 @@ class CCharacter : public CCharacterPersistantData, public CEntityBase, public N CInventoryPtr _LootContainer; NLMISC::CEntityId _EntityLoot; + bool _initializedChests[20]; + /// if this player has an invitation for another team, keep the team here NLMISC::CEntityId _TeamInvitor; diff --git a/ryzom/server/src/entities_game_service/player_manager/character_inlines.h b/ryzom/server/src/entities_game_service/player_manager/character_inlines.h index b7c3228033..abf4731aba 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character_inlines.h +++ b/ryzom/server/src/entities_game_service/player_manager/character_inlines.h @@ -295,6 +295,19 @@ inline CInventoryPtr CCharacter::getLootContainer() return _LootContainer; } + +inline bool CCharacter::isInitChest(uint8 chest) +{ + if (chest < 20) + return _initializedChests[chest]; +} + +inline void CCharacter::isInitChest(uint8 chest, bool value) +{ + if (chest < 20) + _initializedChests[chest] = value; +} + //------------------------------------------------------------------------------ inline bool CCharacter::staticActionInProgress() const diff --git a/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp b/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp index 285622f06e..de8fc5c1ea 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp @@ -2460,7 +2460,7 @@ void CCharacter::incSlotVersion(INVENTORIES::TInventory invId, uint32 slot) } // **************************************************************************** -void CCharacter::sendItemInfos(uint16 slotId) +void CCharacter::sendItemInfos(uint32 slotId) { TLogNoContext_Item noContext; From 8b73ed405d2f11778c662e5426b46bbd4d1ff135 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Wed, 17 Apr 2024 16:25:28 +0200 Subject: [PATCH 173/194] Fix --- ryzom/server/src/entities_game_service/egs_variables.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/egs_variables.cpp b/ryzom/server/src/entities_game_service/egs_variables.cpp index 07070c1bfd..5649be6c95 100644 --- a/ryzom/server/src/entities_game_service/egs_variables.cpp +++ b/ryzom/server/src/entities_game_service/egs_variables.cpp @@ -1,4 +1,4 @@ -W// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> +// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> // Copyright (C) 2010 Winch Gate Property Limited // // This source file has been modified by the following contributors: From 088e809abf9689508fadaabca460b4a9f00066db Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Wed, 17 Apr 2024 16:36:12 +0200 Subject: [PATCH 174/194] Fix --- .../entity_manager/entity_callbacks.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp b/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp index 0764887033..6dc591938d 100644 --- a/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp +++ b/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp @@ -2615,12 +2615,6 @@ void cbItemSwap( NLNET::CMessage& msgin, const std::string &serviceName, NLNET:: msgin.serial( slotDst ); msgin.serial( quantity ); nlinfo("slotDst = %u", inventoryDst); - // Inventory guild2 are a fake - if (inventorySrc == INVENTORIES::guild2) - inventorySrc == INVENTORIES::guild; - - if (inventoryDst == INVENTORIES::guild2) - inventoryDst == INVENTORIES::guild; CCharacter *character = PlayerManager.getChar( charId ); if (character == NULL) From e9b37f18ee89738d20bb7596dc5ac749e4aa0056 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Wed, 17 Apr 2024 19:37:46 +0200 Subject: [PATCH 175/194] Fixes --- .../data/gamedev/interfaces_v3/config.xml | 2 +- .../data/gamedev/interfaces_v3/widgets.xml | 2 +- ryzom/common/data_common/database.xml | 15 ------- .../src/entities_game_service/admin.cpp | 28 +----------- .../entity_manager/entity_callbacks.cpp | 2 +- .../game_item_manager/player_inventory.cpp | 8 ++-- .../guild_manager/guild.cpp | 2 +- .../mission_manager/missions_commands.cpp | 45 ++++++++++++++++++- .../character_inventory_manipulation.cpp | 5 ++- 9 files changed, 56 insertions(+), 53 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/config.xml b/ryzom/client/data/gamedev/interfaces_v3/config.xml index da2ae18847..82900eae9e 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/config.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/config.xml @@ -2549,7 +2549,7 @@ This MUST follow the Enum MISSION_DESC::TIconId <define id="max_room_invslot" value_from_code="getMaxRoomInvSlot()" /> <define id="max_guild_invslot" - value="getMaxGuildChestSlot()" /> + value_from_code="getMaxGuildChestSlot()" /> <define id="max_temp_invslot" value_from_code="getMaxTempInvSlot()" /> <!--<define id="from_code_harvest" value_from_code="getInventorySlot('harvest')"/> diff --git a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml index 02465bd0f6..230a4ac7dc 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml @@ -1453,7 +1453,7 @@ </group> </template> - <template name="tguildinv_nbslots_bulk_weight" id="" inv_branch_nb="100" inv_branch="" inv_bulk_max="" posparent="parent" posref="TL TL" x="0" y="0" selected_chest=""> + <template name="tguildinv_nbslots_bulk_weight" id="" inv_branch_nb="500" inv_branch="" inv_bulk_max="" posparent="parent" posref="TL TL" x="0" y="0" selected_chest=""> <group id="#id" sizeref="w" h="16" posref="#posref"> <group id="bulk_weight" child_resize_w="true" child_resize_wmargin="4" h="16" posref="BR BR" posparent="#posparent"> <view type="bitmap" id="weight" posref="MR MR" x="0" texture="W_weight.tga" global_color="false" /> diff --git a/ryzom/common/data_common/database.xml b/ryzom/common/data_common/database.xml index cee23e5656..f9ff55fd00 100644 --- a/ryzom/common/data_common/database.xml +++ b/ryzom/common/data_common/database.xml @@ -1181,21 +1181,6 @@ type="I32" /> <leaf name="MONEY" type="I64" /> - <branch name="CHEST"> - <branch name="" - count="20"> - <leaf name="NAME" - type="TEXT" /> - <leaf name="VIEW_GRADE" - type="I3" /> - <leaf name="PUT_GRADE" - type="I3" /> - <leaf name="GET_GRADE" - type="I3" /> - <leaf name="BULK_MAX" - type="I32" /> - </branch> - </branch> <branch name="" count="10000" clientonly="1"> diff --git a/ryzom/server/src/entities_game_service/admin.cpp b/ryzom/server/src/entities_game_service/admin.cpp index 802fdede96..54eb566df6 100644 --- a/ryzom/server/src/entities_game_service/admin.cpp +++ b/ryzom/server/src/entities_game_service/admin.cpp @@ -4654,7 +4654,7 @@ NLMISC_COMMAND (updateTarget, "Update current target", "<eid>") } //---------------------------------------------------------------------------- -NLMISC_COMMAND(setGuildInventoryChest, "Set the chest of inventory", "<eid> <A|B> <chest>" ) +NLMISC_COMMAND(setGuildInventoryChest, "Select the chest to display in GH A or B for the player", "<eid> <A|B> <chest>" ) { if (args.size() != 3) @@ -4676,32 +4676,6 @@ NLMISC_COMMAND(setGuildInventoryChest, "Set the chest of inventory", "<eid> <A|B return true; } -// /a setGuildInventoryChestParams (0x0000000020:00:00:82) 0 "Chest 1" Member Member Member - -//setGuildInventoryChestParams (0x0000000020:00:00:82) 1 "Coffre 2" Member Member Member -//setGuildInventoryChestParams (0x0000000020:00:00:82) 5 "Coffre 4" Member Member Member -///a setGuildInventoryChestParams 0 "Chest 1" Member Member Member -//---------------------------------------------------------------------------- -NLMISC_COMMAND(setGuildInventoryChestParams, "Set the chest of inventory", "<eid> <chest> <name> <rank view> <rank put> <rank get>" ) -{ - - if (args.size() != 6) - return false; - - GET_CHARACTER - - CGuild * guild = CGuildManager::getInstance()->getGuildFromId(c->getGuildId()); - if (guild) - { - uint8 chest; - NLMISC::fromString(args[1], chest); - EGSPD::CGuildGrade::TGuildGrade gradeView = EGSPD::CGuildGrade::fromString(args[3]); - EGSPD::CGuildGrade::TGuildGrade gradePut = EGSPD::CGuildGrade::fromString(args[4]); - EGSPD::CGuildGrade::TGuildGrade gradeGet = EGSPD::CGuildGrade::fromString(args[5]); - guild->setChestParams(chest, args[2], gradeView, gradePut, gradeGet); - } - return true; -} // !!! Deprecated !!! NLMISC_COMMAND (webAddCommandsIds, "Add ids of commands will be run from webig", "<user id> <bot_name> <web_app_url> <indexes>") { diff --git a/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp b/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp index 6dc591938d..294dcbbec1 100644 --- a/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp +++ b/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp @@ -2614,7 +2614,7 @@ void cbItemSwap( NLNET::CMessage& msgin, const std::string &serviceName, NLNET:: inventoryDst = INVENTORIES::TInventory(temp); msgin.serial( slotDst ); msgin.serial( quantity ); - nlinfo("slotDst = %u", inventoryDst); + nlinfo("slotDst = %u", slotDst); CCharacter *character = PlayerManager.getChar( charId ); if (character == NULL) diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp b/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp index db38dfa09e..ad56765d7a 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp @@ -147,7 +147,9 @@ uint32 CInventoryBase::getInventoryWeight() const // **************************************************************************** uint32 CInventoryBase::getInventoryBulk(uint8 index) const { - return _InventoryBulk[index]; + if (index < GUILD_NB_CHESTS) + return _InventoryBulk[index]; + return 0; } // **************************************************************************** @@ -197,8 +199,8 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it if (_InventoryId == INVENTORIES::guild) { uint8 chest = floor((float)slot / (float)GuildChestSlots); - nlinfo("item stack + InventoryBulk = %u + %u = %u > getMaxBulk(%u) = %u", item->getStackBulk(), getInventoryBulk(), item->getStackBulk() + getInventoryBulk(), chest, getMaxBulk(chest)); - if (item->getStackBulk() + getInventoryBulk() > getMaxBulk(chest)) + nlinfo("item stack + InventoryBulk(%u) = %u + %u = %u > getMaxBulk(%u) = %u", chest, item->getStackBulk(), getInventoryBulk(chest), item->getStackBulk() + getInventoryBulk(chest), chest, getMaxBulk(chest)); + if (item->getStackBulk() + getInventoryBulk(chest) > getMaxBulk(chest)) return ior_overbulk; minSlotSearch = GuildChestSlots*chest; diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp index 221941e19d..368690320f 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp @@ -1215,7 +1215,7 @@ void CGuild::moveItem( CCharacter * user, uint32 slot, uint32 dstSlot, uint32 qu _Inventory, dstSlot, quantity ) != CInventoryBase::ior_ok ) { - CCharacter::sendDynamicSystemMessage( user->getId(),"GUILD_PLAYER_BAG_FULL" ); + CCharacter::sendDynamicSystemMessage( user->getId(), "GUILD_ITEM_MAX_BULK"); return; } } diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index b45123f306..1c79702bd2 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -1283,8 +1283,6 @@ NLMISC_COMMAND(getEnchantmentInEquipedItem, "getEnchantmentInEquipedItem", "<uid return true; } -//setGuildInventoryChestBulkMax 2 2 3000 - //---------------------------------------------------------------------------- NLMISC_COMMAND(setGuildInventoryChestBulkMax, "Set the bulk max of chest of inventory", "<uid> <chest> <value>" ) { @@ -1315,6 +1313,49 @@ NLMISC_COMMAND(setGuildInventoryChestBulkMax, "Set the bulk max of chest of inve return true; } +//---------------------------------------------------------------------------- +NLMISC_COMMAND(setGuildInventoryChestParams, "Set the chest of inventory", "<uid> <chest> <name> <rank view> <rank put> <rank get>" ) +{ + + if (args.size() != 6) + return false; + + GET_ACTIVE_CHARACTER + + CGuild * guild = CGuildManager::getInstance()->getGuildFromId(c->getGuildId()); + if (guild) + { + uint8 chest; + NLMISC::fromString(args[1], chest); + EGSPD::CGuildGrade::TGuildGrade gradeView = EGSPD::CGuildGrade::fromString(args[3]); + EGSPD::CGuildGrade::TGuildGrade gradePut = EGSPD::CGuildGrade::fromString(args[4]); + EGSPD::CGuildGrade::TGuildGrade gradeGet = EGSPD::CGuildGrade::fromString(args[5]); + guild->setChestParams(chest, args[2], gradeView, gradePut, gradeGet); + } + return true; +} + +NLMISC_COMMAND(getGuildInventoryChestParams, "Get the params of a chest of inventory", "<uid> <chest>" ) +{ + if (args.size() != 2) + return false; + + GET_ACTIVE_CHARACTER + + CGuild * guild = CGuildManager::getInstance()->getGuildFromId(c->getGuildId()); + if (guild) + { + uint8 chest; + NLMISC::fromString(args[1], chest); + + log.displayNL("%s", guild->getChestName(chest).c_str()); + log.displayNL("%s", EGSPD::CGuildGrade::toString(guild->getChestViewGrade(chest)).c_str()); + log.displayNL("%s", EGSPD::CGuildGrade::toString(guild->getChestPutGrade(chest)).c_str()); + log.displayNL("%s", EGSPD::CGuildGrade::toString(guild->getChestGetGrade(chest)).c_str()); + } + return true; +} + //updateSheetItem 2 LEGS ikaracp_ep2_1.sitem //---------------------------------------------------------------------------- diff --git a/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp b/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp index de8fc5c1ea..d1fe8a6782 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp @@ -821,8 +821,7 @@ void CCharacter::destroyItem(INVENTORIES::TInventory invId, uint32 slot, uint32 } // **************************************************************************** -void CCharacter::moveItem( - INVENTORIES::TInventory srcInvId, uint32 srcSlot, INVENTORIES::TInventory dstInvId, uint32 dstSlot, uint32 quantity) +void CCharacter::moveItem(INVENTORIES::TInventory srcInvId, uint32 srcSlot, INVENTORIES::TInventory dstInvId, uint32 dstSlot, uint32 quantity) { // cannot move an item in the same inventory if (srcInvId == dstInvId) @@ -961,6 +960,8 @@ void CCharacter::moveItem( sendDynamicSystemMessage(_EntityRowId, "TOO_ENCUMBERED"); else if (dstInvId == INVENTORIES::player_room) sendDynamicSystemMessage(_EntityRowId, "ROOM_TOO_ENCUMBERED"); + else if (dstInvId == INVENTORIES::guild) + sendDynamicSystemMessage(_EntityRowId, "GUILD_ITEM_MAX_BULK"); else if (dstInvId >= INVENTORIES::pet_animal && dstInvId < INVENTORIES::max_pet_animal) sendDynamicSystemMessage(_EntityRowId, "ANIMAL_PACKER_TOO_ENCUMBERED"); From 7eb1ff197a0a0e02978d70a282b45d3d784969b7 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 26 Apr 2024 02:22:56 +0200 Subject: [PATCH 176/194] Added check rank access to Get and Put --- .../game_item_manager/player_inv_xchg.cpp | 24 ++++++++-- .../guild_manager/guild.cpp | 48 ++++++++++++++++--- 2 files changed, 61 insertions(+), 11 deletions(-) diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_xchg.cpp b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_xchg.cpp index 1ca656b206..60369a5540 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inv_xchg.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inv_xchg.cpp @@ -23,6 +23,7 @@ #include "game_share/slot_equipment.h" #include "player_manager/character.h" +#include "guild_manager/guild_manager.h" #include "guild_manager/guild_member_module.h" using namespace NLMISC; @@ -34,6 +35,7 @@ using namespace std; ///////////////////////////////////////////////////////////// const uint32 CExchangeView::NbExchangeSlots = 10; +extern NLMISC::CVariable<uint32> GuildChestSlots; // **************************************************************************** CExchangeView::CExchangeView() @@ -83,12 +85,24 @@ bool CExchangeView::putItemInExchange(uint32 invSrc, uint32 invSlot, uint32 exch if (form == NULL) return false; - // if item is from guild inventory, check permissions - CGuildMemberModule * module; - if (INVENTORIES::TInventory(invSrc) == INVENTORIES::guild && (!c->getModuleParent().getModule(module) || !module->canTakeGuildItem())) + + if (INVENTORIES::TInventory(invSrc) == INVENTORIES::guild) { - CCharacter::sendDynamicSystemMessage(c->getId(), "GUILD_ITEM_DONT_HAVE_RIGHTS"); - return false; + CGuild* guild = CGuildManager::getInstance()->getGuildFromId(c->getGuildId()); + if (!guild) + return false; + + CGuildMember* member = guild->getMemberFromEId(c->getId()); + if (!member) + return false; + + uint8 chest = floor((float)invSlot / (float)GuildChestSlots); + + if (!guild->haveChestViewGrade(chest, member->getGrade()) || !guild->haveChestGetGrade(chest, member->getGrade())) + { + CCharacter::sendDynamicSystemMessage( c->getId(),"GUILD_ITEM_DONT_HAVE_RIGHTS" ); + return false; + } } // if it is an exchange between 2 players diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp index 368690320f..48a2f99e02 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp @@ -59,6 +59,7 @@ CVariable<uint32> GuildMaxOutpostCount("egs", "GuildMaxOutpostCount", "max numbe extern std::string guildIdToString(uint32 guildId); // utility to parse a human readable string into a guild id extern uint32 parseGuildId(const std::string &str); +extern NLMISC::CVariable<uint32> GuildChestSlots; extern bool IOSIsUp; @@ -1049,6 +1050,20 @@ void CGuild::putItem( CCharacter * user, INVENTORIES::TInventory srcInv, uint32 return; } + CGuildMember* member = getMemberFromEId(user->getId()); + if (!member) + return; + + uint8 chest = floor((float)slot / (float)GuildChestSlots); + + + if (!haveChestViewGrade(chest, member->getGrade()) || !haveChestPutGrade(chest, member->getGrade())) + { + CCharacter::sendDynamicSystemMessage( user->getId(),"GUILD_ITEM_DONT_HAVE_RIGHTS" ); + return; + } + + // check if this type of item is legal in the guild inventory CGameItemPtr item = srcItem; if (!item->getMovable() && ( @@ -1113,9 +1128,14 @@ void CGuild::takeItem( CCharacter * user, INVENTORIES::TInventory srcInv, uint32 return; } + CGuildMember* member = getMemberFromEId(user->getId()); + if (!member) + return; - CGuildMemberModule * module; - if ( !user->getModuleParent().getModule(module) || !module->canTakeGuildItem() ) + uint8 chest = floor((float)slot / (float)GuildChestSlots); + + + if (!haveChestViewGrade(chest, member->getGrade()) || !haveChestGetGrade(chest, member->getGrade())) { CCharacter::sendDynamicSystemMessage( user->getId(),"GUILD_ITEM_DONT_HAVE_RIGHTS" ); return; @@ -1180,9 +1200,20 @@ void CGuild::moveItem( CCharacter * user, uint32 slot, uint32 dstSlot, uint32 qu return; } + CGuildMember* member = getMemberFromEId(user->getId()); + if (!member) + return; - CGuildMemberModule * module; - if ( !user->getModuleParent().getModule(module) || !module->canTakeGuildItem() ) + uint8 srcChest = floor((float)slot / (float)GuildChestSlots); + uint8 dstChest = floor((float)dstSlot / (float)GuildChestSlots); + + if (!haveChestViewGrade(srcChest, member->getGrade()) || !haveChestGetGrade(srcChest, member->getGrade())) + { + CCharacter::sendDynamicSystemMessage( user->getId(),"GUILD_ITEM_DONT_HAVE_RIGHTS" ); + return; + } + + if (!haveChestViewGrade(dstChest, member->getGrade()) || !haveChestPutGrade(dstChest, member->getGrade())) { CCharacter::sendDynamicSystemMessage( user->getId(),"GUILD_ITEM_DONT_HAVE_RIGHTS" ); return; @@ -1190,11 +1221,12 @@ void CGuild::moveItem( CCharacter * user, uint32 slot, uint32 dstSlot, uint32 qu // get the source item CInventoryPtr srcItems = (CGuildInventory *)_Inventory; - if ( slot >= srcItems->getSlotCount() ) + if ( slot >= srcItems->getSlotCount() || dstSlot >= srcItems->getSlotCount() ) { - nlwarning( "<swapItem> user %s Invalid guild slot %u, count = %u",user->getId().toString().c_str(), slot, srcItems->getSlotCount() ); + nlwarning( "<swapItem> user %s Invalid guild slot %u or %u, count = %u",user->getId().toString().c_str(), slot, dstSlot, srcItems->getSlotCount() ); return; } + CGameItemPtr srcItem = srcItems->getItem(slot); if ( srcItem == NULL ) { @@ -2561,6 +2593,10 @@ class COldGuildInventoryLoader nlinfo("GUILD HAVE %u CHESTS", _Chests.size());\ for (uint8 chest=0; chest < _Chests.size(); chest++)\ {\ + if (chest < 2 && _Chests[chest].BulkMax < 6000)\ + _Chests[chest].BulkMax = 6000;\ + if (chest < 2 && _Chests[chest].Name.empty())\ + _Chests[chest].Name = NLMISC::toString("Chest #%u", chest+1);\ nlinfo("Send DB for chest %u", chest);\ _Inventory->setChestMaxBulk(chest, _Chests[chest].BulkMax);\ CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setNAME(_DbGroup, _Chests[chest].Name, true);\ From 850b54412d406c5b6a62e8fbc141d0b47428c292 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 17 May 2024 13:47:33 +0200 Subject: [PATCH 177/194] Added Ark Shop Lua functions --- .../client/data/gamedev/interfaces_v3/ark.lua | 8 + .../data/gamedev/interfaces_v3/ark_shop.lua | 502 ++++++++++++++++++ .../gamedev/interfaces_v3/webig_widgets.xml | 1 + 3 files changed, 511 insertions(+) create mode 100644 ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark.lua b/ryzom/client/data/gamedev/interfaces_v3/ark.lua index 93149d59c5..a23f7f135a 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark.lua @@ -25,6 +25,14 @@ function print_r(arr, indentLevel) return str end +function tablelength(T) + if T == nil then + return 0 + end + local count = 0 + for _ in pairs(T) do count = count + 1 end + return count +end function openPageInWebIg(url) getUI("ui:interface:webig:content:html"):browse(url) diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua b/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua new file mode 100644 index 0000000000..d694f9da7f --- /dev/null +++ b/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua @@ -0,0 +1,502 @@ +if arkNpcShop == nil then + arkNpcShop = {} +end + +function arkNpcShop:selectSheetItem(item, i, sheet) + for name, value in pairs(arkNpcShop.lockedSlots[item]) do + if value == item.."_"..i then + arkNpcShop.lockedSlots[item][name] = nil + end + end + + local items = arkNpcShop.all_valid_items[item][i][sheet] + arkNpcShop.player_money_per_items[item][i] = items[3] + webig:addSheet("UI:TEMP:ARK:ITEM:"..tostring(item).."_"..tostring(i), items[1], items[2], getDbProp("UI:TEMP:ARK:ITEM:"..tostring(item).."_"..tostring(i)..":QUANTITY"), nil, items[4]) + setDbProp("UI:TEMP:ARK:ITEM:"..tostring(item).."_"..tostring(i)..":SERIAL", items[5]) + arkNpcShop.lockedSlots[item][items[5]] = item.."_"..i + updateSelectedItems() + runAH(nil, "leave_modal", "group=ui:interface:webig_html_modal") +end + + +function arkNpcShop:showBuy() + getUI("ui:interface:ark_shop_buy_item"):find("ok").active=true +end + +function arkNpcShop:openSection(url) + framewin = getUI(arkNpcShop.window):find("buy"):renderHtml(arkNpcShop.PleaseWait) + getUI("ui:interface:web_transactions"):find("html"):browse(url) +end + +function arkNpcShop:updateWindow(px, py) + local stop = false + if px ~= 0 and py ~= 0 then + local x, y, z = getPlayerPos() + if (px-x)*(px-x)+(py-y)*(py-y) > 25 then + stop = true + end + + if arkNpcShop.target ~= getTargetSlot() then + stop = true + end + end + + if stop then + local w = getUI(arkNpcShop.window) + w.active = false + setOnDraw(w, "") + getUI("ui:interface:ark_shop_buy_item").active = false + arkNpcShop.player_can_buy = false + broadcast(arkNpcShop.TooFar) + end + + local diff = math.floor((nltime.getLocalTime() - arkNpcShop.lastMultipleItemsUpdate ) / 10) + if diff >= 120 then + arkNpcShop.lastMultipleItemsUpdate = nltime.getLocalTime() + if arkNpcShop.player_money_per_items ~= nil then + for item, price in pairs(arkNpcShop.player_money_per_items) do + if arkNpcShop.lastMultipleItemsIndex[item] == nil then + arkNpcShop.lastMultipleItemsIndex[item] = {} + end + for i = 1,5 do + local w = getUI(arkNpcShop.window):find("ark_npc_shop_item_"..item.."_price"..tostring(i)) + if w ~= nil and arkNpcShop.all_items[item] ~= nil and arkNpcShop.all_items[item][i] ~= nil then + if price[i] < 1 then + if arkNpcShop.lastMultipleItemsIndex[item][i] == nil then + arkNpcShop.lastMultipleItemsIndex[item][i] = 0 + end + + arkNpcShop.lastMultipleItemsIndex[item][i] = arkNpcShop.lastMultipleItemsIndex[item][i] + 1 + if arkNpcShop.lastMultipleItemsIndex[item][i] > tablelength(arkNpcShop.all_items[item][i]) then + arkNpcShop.lastMultipleItemsIndex[item][i] = 1 + end + + local multiple = arkNpcShop.lastMultipleItemsIndex[item][i] + if multiple ~= nil then + local sheet = arkNpcShop.all_items[item][i][multiple] + if sheet ~= "" then + setDbProp("UI:TEMP:ARK:ITEM:"..item.."_"..tostring(i)..":SHEET", getSheetId(sheet..".sitem")) + end + end + end + end + end + end + end + end +end + +function arkNpcShop:checkitems(db, items, quality, quality_max, id, must_be_equiped, item_i) + if arkNpcShop.lockedSlots[id] == nil then + arkNpcShop.lockedSlots[id] = {} + end + total = 0 + if arkNpcShop.all_valid_items[id] == nil then + arkNpcShop.all_valid_items[id] = {} + end + + arkNpcShop.all_valid_items[id][item_i] = {} + + local selected_item = 9999 + local last_selected = nil + + for i = 0, 499, 1 do + local sheet = getDbProp("SERVER:INVENTORY:BAG:"..tostring(i)..":SHEET") + if sheet ~= 0 then + + local name = string.lower(getSheetName(sheet)) + for item_id, item in pairs(items) do + if item == name or item..".sitem" == name then + local qual = getDbProp("SERVER:INVENTORY:BAG:"..tostring(i)..":QUALITY") + local quant = getDbProp("SERVER:INVENTORY:BAG:"..tostring(i)..":QUANTITY") + local color = getDbProp("SERVER:INVENTORY:BAG:"..tostring(i)..":USER_COLOR") + local locked = getDbProp("SERVER:INVENTORY:BAG:"..tostring(i)..":RESALE_FLAG") == 3 + + if qual >= quality and qual <= quality_max and locked == false then + valid = true + + if must_be_equiped ~= 0 then + valid = false + for j = 0, 19, 1 do + local slot = getDbProp("SERVER:INVENTORY:EQUIP:"..tostring(j)..":INDEX_IN_BAG") + if slot == i then + valid = true + end + end + end + + if valid then + local use_quant = getDbProp("UI:TEMP:ARK:ITEM:"..tostring(id).."_"..tostring(item_i)..":QUANTITY") + + if quant >= use_quant then + table.insert(arkNpcShop.all_valid_items[id][item_i], {sheet, qual, quant, color, i}) + local valid_item_i = #arkNpcShop.all_valid_items[id][item_i] + local db_id = "UI:TEMP:ARK:POPUP_ITEM_"..tostring(id).."_"..tostring(item_i).."_"..tostring(valid_item_i) + webig:deleteItem(db_id) + webig:copyItems("SERVER:INVENTORY:BAG:"..tostring(i), db_id) + setDbProp(db_id..":QUANTITY", use_quant) + + if qual < selected_item then + total = quant + selected_item = qual + if last_selected ~= nil then + arkNpcShop.lockedSlots[id][last_selected] = nil + end + last_selected = i + arkNpcShop.lockedSlots[id][i] = tostring(id).."_"..tostring(item_i) + webig:copyItems("SERVER:INVENTORY:BAG:"..tostring(i), db) + setDbProp(db..":SERIAL", i) + setDbProp(db..":QUANTITY", use_quant) + end + end + end + end + end + end + end + end + + return total +end + +function arkNpcShop:checkslot(db, slotid) + total = 0 + local index = getDbProp("SERVER:INVENTORY:EQUIP:"..tostring(slotid)..":INDEX_IN_BAG")-1 + if index ~= -1 then + local sheet = getDbProp("SERVER:INVENTORY:BAG:"..tostring(index)..":SHEET") + local qual = getDbProp("SERVER:INVENTORY:BAG:"..tostring(index)..":QUALITY") + setDbProp(db..":SHEET", sheet) + setDbProp(db..":QUALITY", qual) + return 1 + end + return 0 +end + + +function arkNpcShop:OpenSheetInfosWindow(id) + local w = getUI(arkNpcShop.window) + local x = w:find("buy") + if x == nil then + x = w + end + x = x:find("ark_npc_shop_item_"..tostring(id)) + runAH(x:find("sheet"), "open_help_auto", "") + +end + +function arkNpcShop:HideHelpWindow(id) + -- Check what help window are active + local help_active={} + for i = 0,7 do + help_active[i] = getUI("ui:interface:sheet_help"..i).active + end + + arkNpcShop:OpenSheetInfosWindow(id) + + -- Apply previous stats of help window + for i = 0,7 do + getUI("ui:interface:sheet_help"..i).active = help_active[i] + end +end + +function arkNpcShop:CheckMoney() + local win = getUI("ui:interface:ark_shop_buy_item") + local value = tonumber(win:find("edit"):find("eb").input_string) + if value == nil or value == 0 then + value = 1 + end + + if arkNpcShop.price == -1 then + arkNpcShop.max_quantity = 1 + end + + if arkNpcShop.max_quantity ~= 0 and value > arkNpcShop.max_quantity then + win:find("edit"):find("eb").input_string = arkNpcShop.max_quantity + value = arkNpcShop.max_quantity + end + + + local total = 9999999999 + if arkNpcShop.price == -1 then + total = getDbProp("UI:TEMP:ARK_MONEY_TOTAL") + else + total = math.floor(arkNpcShop.price*value) + end + + if total > arkNpcShop.player_money then + win:find("ok").hardtext="uiNotEnoughMoney" + arkNpcShop.player_can_buy = false + else + win:find("ok").hardtext = arkNpcShop.ActionName + arkNpcShop.player_can_buy = true + end + setDbProp("UI:TEMP:ARK_MONEY_TOTAL", total) +end + +function arkNpcShop:Close() + if arkNpcShop.window == "ui:interface:ark_npc_shop" then + local framewin = getUI(arkNpcShop.window) + if framewin ~= nil then + framewin.active=false + end + else + local framewin = getUI(arkNpcShop.window) + framewin:renderHtml("please wait...") + end + + framewin = getUI("ui:interface:ark_shop_buy_item") + if framewin ~= nil then + framewin.active=false + end + +end + +function arkNpcShop:CloseShopBuyItem() + framewin = getUI("ui:interface:ark_shop_buy_item") + if framewin ~= nil then + framewin.active=false + end +end + +function arkNpcShop:timer(id, len) + local diff = math.floor((nltime.getLocalTime() - savedTime) / 50) + getUI("ui:interface:current_action").active=true + setDbProp("UI:PHRASE:ACT_BAR_LEN", math.floor(diff * (100/len))) + if diff >= len then + getUI("ui:interface:current_action").active=false + setOnDraw(getUI("ui:interface:current_action"), "") + local quantity = getUI("ui:interface:ark_shop_buy_item"):find("edit"):find("eb").input_string + getUI("ui:interface:web_transactions"):find("html"):browse(arkNpcShop.ValidateUrl..quantity.."&item_id="..id.."&item_selection="..arkNpcShop.selectedItems[id]) + end +end + + +function arkNpcShop:Buy(id) + local item = arkNpcShop.items[id] + local win = getUI("ui:interface:ark_shop_buy_item") + local quantity = win:find("edit"):find("eb").input_string + if arkNpcShop.player_can_buy then + local message = ucstring() + message:fromUtf8("@{F5FF}"..getUI("ui:interface:target").title..": @{FF0F}I\'m checking to see if you\'re trying to rip him off... ") + -- displaySystemInfo(message, "BC") + + if arkNpcShop.AtysPoint then + if item[8] == 0 then + local message = ucstring() + message:fromUtf8(arkNpcShop.AtysPointsBuyMessage) + displaySystemInfo(message, "BC") + savedTime = nltime.getLocalTime() + getUI("ui:interface:current_action").active=true + local len = item[1] + if len > 200 then + len = 200 + end + setOnDraw(getUI("ui:interface:current_action"), "arkNpcShop:timer("..id..", "..tostring(len)..")") + else + getUI("ui:interface:web_transactions"):find("html"):browse(arkNpcShop.ValidateUrl..quantity.."&item_id="..id.."&item_selection="..arkNpcShop.selectedItems[id]) + end + else + getUI("ui:interface:web_transactions"):find("html"):browse(arkNpcShop.ValidateUrl..quantity.."&item_id="..id.."&item_selection="..arkNpcShop.selectedItems[id]) + end + end + arkNpcShop:Close() + if arkNpcShop.window ~= "ui:interface:ark_npc_shop" then + getUI("ui:interface:encyclopedia").active=false + end +end + +function arkNpcShop:generateMp(mps) + local final = {} + local generateMps = {} + for _, mp in pairs(mps) do + if game.RawCreaturesMats ~= nil and string.sub(mp, 1, 1) == "!" then + local params = {} + for str in string.gmatch(string.sub(mp, 2), "([^!]+)") do + table.insert(params, str) + end + local sheets = params[1] + local qual = params[2] + local eco = params[3] + + if qual == "" or qual == nil then + qual = "cdef" + end + + if eco == "" or eco == nil then + eco = "dfljp" + end + + for sheet in string.gmatch(sheets, "([^|]+)") do + debug(sheet) + if string.sub(sheet, 1, 1) == "#" then + local all_sheets = game.RawCreaturesMats[string.sub(sheet, 2)] + if sheets ~= nil then + for i_sheet, f_sheet in pairs(all_sheets) do + if generateMps[i_sheet] == nil then + generateMps[i_sheet] = {} + end + table.insert(generateMps[i_sheet], f_sheet) + end + end + else + table.insert(final, sheet..c_eco..c_qual.."01") + end + end + + for i = 1, #qual do + local c_qual = string.sub(qual, i, i) + for j = 1, #eco do + local c_eco = string.sub(eco, j, j) + for _, sheets in pairs(generateMps) do + for _, f_sheet in pairs(sheets) do + table.insert(final, f_sheet..c_eco..c_qual.."01") + end + end + end + end + else + table.insert(final, mp) + end + end + + return final +end + + +function arkNpcShop:getHtmlIcon(id, item) + if string.sub(item[2], 1, 1) == "#" then + addDbProp("UI:TEMP:ARK:SELECTITEM:RESALE_FLAG", 0) + + if string.sub(item[3], 1, 1) == "!" then + webig:addSheet("UI:TEMP:ARK:SELECTITEM", getSheetId(item[7]), item[4], tonumber(string.sub(item[3], 2))) + else + webig:addSheet("UI:TEMP:ARK:SELECTITEM", getSheetId(item[7]), item[4], 1) + end + addDbProp("UI:TEMP:ARK:SELECTITEM:USER_COLOR", item[9]) + return [[<div class="ryzom-ui-grouptemplate" style="template:arkshop_inv_item;id:inv_special_bag_item;usesheet:true;isvirtual:false;sheetdb:UI:TEMP:ARK:SELECTITEM;w:40;params_r:arkNpcShop:OpenSheetInfosWindow(]]..id..[[);"></div>]] + else + return [[<div class="ryzom-ui-grouptemplate" style="template:arkshop_inv_item;id:inv_special_bag_item;usesheet:false;isvirtual:true;w:44;quantity: ;quality:]]..item[4]..[[;tooltip:]]..item[6]..[[;gc2:true;gc1:true;img1:]]..item[2]..[[;col_over:0 0 0 0"></div>]] + end +end + +function arkNpcShop:OpenItemWindow(id, buy) + local item = arkNpcShop.items[id] + if arkNpcShop.all_items[id] ~= nil and arkNpcShop.all_items[id].need_real_item ~= nil then + if string.sub(item[3], 1, 1) == "!" then + arkNpcShop.max_quantity = 1 + else + arkNpcShop.max_quantity = item[3] + for _, price in ipairs(arkNpcShop.player_money_per_items[id]) do + if price < arkNpcShop.max_quantity then + arkNpcShop.max_quantity = price + end + end + end + else + if string.sub(item[3], 1, 1) == "!" then + arkNpcShop.max_quantity = 1 + else + arkNpcShop.max_quantity = item[3] + end + end + + arkNpcShop:HideHelpWindow(id) + + local non_buy_window_w = 400 + + if string.sub(item[2], 1, 1) == "#" then + local item_type = getSheetFamily(item[7]) + local display_preview = item_type == "SHIELD" or item_type == "ARMOR" or item_type == "MELEE_WEAPON" or item_type == "RANGE_WEAPON" + if ui_item_preview then + ui_item_preview.active = display_preview + end + + if display_preview then + non_buy_window_w = 495 + else + -- Items who are not named items must display help window when no buy + if buy == nil and item[2] == "#sheet" then + arkNpcShop:OpenSheetInfosWindow(id) + return + end + end + end + + if buy == true then + arkNpcShop.price = item[1] + setDbProp("UI:TEMP:ARK_MONEY_PRICE", arkNpcShop.price) + setDbProp("UI:TEMP:ARK_MONEY_TOTAL", arkNpcShop.price) + if arkNpcShop.price > arkNpcShop.player_money then + arkNpcShop.player_can_buy = false + else + arkNpcShop.player_can_buy = true + end + end + + framewin = getUI("ui:interface:ark_shop_buy_item") + if framewin == nil then + createRootGroupInstance("webig_bot_chat_buy_item", "ark_shop_buy_item", {id="content", infosclick="arkNpcShop:OpenSheetInfosWindow("..id..")", onclick="arkNpcShop:Buy("..id..")"}) + framewin = getUI("ui:interface:ark_shop_buy_item") + framewin.x = math.ceil(((getUI("ui:interface").w - framewin.w))/2) + framewin.y = math.ceil(((getUI("ui:interface").h + framewin.h))/2) + end + + local ui_item_show_desc = getUI("ui:interface:ark_shop_buy_item:content:header_opened:desc") + if ui_item_show_desc then + ui_item_show_desc.active = item[2] == "#sheet" + end + + runAH(nil, "proc", "ark_shop_animate_preview_body") + + if buy == true then + local eb = framewin:find("edit"):find("eb") + eb.input_string = arkNpcShop.max_quantity + eb:setFocusOnText() + eb:setSelectionAll() + framewin:find("item_total_price"):find("icone").texture = arkNpcShop.MoneyIcon + framewin:find("item_price"):find("icone").texture = arkNpcShop.MoneyIcon + framewin:find("item_total_price"):find("tt").tooltip = arkNpcShop.Money + framewin:find("item_price"):find("tt").tooltip = arkNpcShop.Money + arkNpcShop.window_params = {-70, 305, 408} + else + arkNpcShop.window_params = {-20, 380, non_buy_window_w} + end + + framewin:find("top").active = buy == true -- active onlye if buy + framewin:find("scroll_text").y=arkNpcShop.window_params[1] + framewin:find("scroll_text").h=arkNpcShop.window_params[2] + framewin.w=arkNpcShop.window_params[3] + framewin.uc_title = getUCtf8(item[6]) + + if buy == true then + local html = "" + html = arkNpcShop:getHtmlIcon(id, item) + framewin:find("buy_sell_slot"):renderHtml(html) + if string.sub(item[5], 1 , 8) == "https://" then + framewin:find("ok").active=false + framewin:find("infos"):renderHtml(arkNpcShop.PleaseWait) + framewin:find("infos"):browse(item[5].."&rnd="..tostring(nltime.getLocalTime())) + else + framewin:find("ok").active=true + framewin:find("infos"):renderHtml("<table width=\'380px\'><tr><td>"..item[5].."</td></tr></table>") + end + arkNpcShop:CheckMoney() + -- framewin:setModalParentList(arkNpcShop.window) + else + html = arkNpcShop:getHtmlIcon(id, item) + framewin:find("infos"):renderHtml([[ + <table width="100%"> + <tr> + <td width="40px" valign="top">]]..html..[[</td> + <td >]]..item[5]..[[</td> + </tr> + </table> + ]]) + end + + framewin:find("desc").params_l = "arkNpcShop:OpenSheetInfosWindow("..id..")" + framewin:find("ok").params_l = "arkNpcShop:Buy("..id..")" + framewin.opened=true + framewin.active=true +end + diff --git a/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml index 40001707cd..a4eb8692c4 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml @@ -9,6 +9,7 @@ <lua file="sceneedit.lua" /> <lua file="ark.lua" /> <lua file="ark_lessons.lua" /> + <lua file="ark_shop.lua" /> <!-- //////////// STYLE : webigchat_desc /////////// --> <style style="webigchat_desc" type="text" fontsize="12" justification="dont_clip_word" color="0 0 0 255" global_color="false" multi_line="true" multi_line_space="0" line_maxw="320" multi_line_maxw_only="true" /> From afa75b97097a2562f742cfd9324188382e65c81f Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 17 May 2024 13:50:00 +0200 Subject: [PATCH 178/194] Added arkNpcShop:selectSheet --- .../data/gamedev/interfaces_v3/ark_shop.lua | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua b/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua index d694f9da7f..86f318a705 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua @@ -500,3 +500,24 @@ function arkNpcShop:OpenItemWindow(id, buy) framewin.active=true end +function arkNpcShop:selectSheet(item, id) + html = "" + items = arkNpcShop.all_valid_items[item][id] + for i=1,#items do + if arkNpcShop.lockedSlots[item][items[i][5]] == nil then + local params = "arkNpcShop:selectSheetItem("..tostring(item)..","..tostring(id)..","..tostring(i)..")" + html = html..[[<div class="ryzom-ui-grouptemplate" id="ark_npc_shop_select_item_]]..item..[[" style="template:arkshop_inv_item;display:inline;id:inv_special_bag_item;usesheet:true;sheetdb:UI:TEMP:ARK:POPUP_ITEM_]]..item.."_"..id.."_"..i..[[;isvirtual:false;w:40;overlay2_active:1;gc2:true;gc1:true;col_over:0 0 0 0;params_l:]]..params..[[;params_r:]]..params..[["></div> ]] + end + end + + runAH(nil, "enter_modal", "group=ui:interface:webig_html_modal") + local whm = getUI("ui:interface:webig_html_modal") + whm.child_resize_h = false + whm.w = 240 + if h == nil then + h = 120 + end + whm.h = h + whm_html = getUI("ui:interface:webig_html_modal:html") + whm_html:renderHtml(html) +end From 1160f92dcd7010d6a1bc15184e06c54d44cea92c Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 17 May 2024 13:55:04 +0200 Subject: [PATCH 179/194] Fixes --- .../gamedev/interfaces_v3/interaction.xml | 20 ++++++------- .../gamedev/interfaces_v3/webig_widgets.xml | 30 +++++++++---------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/interaction.xml b/ryzom/client/data/gamedev/interfaces_v3/interaction.xml index d3320228b9..4bff5378e6 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/interaction.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/interaction.xml @@ -3327,8 +3327,8 @@ <tree node="rpitems_actions" /> -<template name="arkshop_inv_item" sheetdb="UI:TEMP:ARK:ITEM:0" usesheet="false" isvirtual="true" lock="false" render_layer1="1" render_layer2="2" fontsize="8" render_layer3="3" render_layer4="4" w="45" over="grey_0.tga" keep="true" img1scale="false" img2scale="false" img1="token_basic.tga" img2="" img3="" tooltip="" quality="" quantity="" overlay="" text="" text2="" text3="" overlay_active="0" overlay2_active="0" qualquan_active="0" color="255 255 255 255" gc1="false" gc2="false" gc3="true" ctrlcolor="0 0 0 0" color2="255 255 255 255" color3="255 255 255 255" colover="255 255 255 30" bg="w_slot_item.tga" params_l="" params_r="" x="0" y="0"> - <group id="#id" posref="MM MM" w="#w" h="45" x="#x" y="#y" sizeref="" render_layer="#render_layer1"> +<template name="arkshop_inv_item" sheetdb="UI:TEMP:ARK:ITEM:0" usesheet="false" isvirtual="true" lock="false" render_layer1="1" render_layer2="2" fontsize="11" fontsize2="11" fontsize3="11" render_layer3="3" render_layer4="4" w="45" over="grey_0.tga" keep="true" img1scale="false" img2scale="false" img1="token_basic.tga" img2="" img3="" tooltip="" quality="" quantity="" overlay="" text="" text2="" text3="" overlay_active="0" overlay2_active="0" qualquan_active="0" color="255 255 255 255" gc1="false" gc2="false" gc3="false" ctrlcolor="0 0 0 0" color2="255 255 255 255" color3="255 255 255 255" colover="255 255 255 30" bg="w_slot_item.tga" params_l="" params_r="" x="0" y="0"> + <group id="#id" posref="MM MM" w="#w" h="42" x="#x" y="#y" sizeref="" render_layer="#render_layer1"> <ctrl type="sheet" tooltip="#text" onclick_r="open_help_auto" active="#usesheet" id="sheet" value="#sheetdb" posref="ML ML" y="0" x="#x" render_layer="#render_layer2" use_quality="true" use_quantity="true" /> <view type="bitmap" id="back" posref="ML ML" h="40" w="40" scale="true" x="#x" y="0" render_layer="#render_layer1" texture="#bg" global_color="false" /> <group id="virtual" active="#isvirtual" posref="MM MM" posparent="back"> @@ -3344,22 +3344,22 @@ <view type="text" id="quantity" posref="BL BL" posparent="ref" render_layer="#render_layer3" x="0" y="0" hardtext="#quantity" fontsize="8" color="255 255 255 255" shadow="true" global_color="false" /> <view type="text" id="quality" posref="BR BR" posparent="ref" render_layer="#render_layer3" x="0" y="0" hardtext="#quality" fontsize="8" color="255 255 255 255" shadow="true" global_color="true" /> </group> - <view type="bitmap" id="over" posref="ML ML" h="40" w="#w" scale="true" x="#x" y="0" render_layer="#render_layer4" texture="#over" global_color="false" /> + <view type="bitmap" id="over" posref="MR MR" h="40" w="#w" scale="true" x="#x" y="0" render_layer="#render_layer4" texture="#over" global_color="false" /> <view type="bitmap" id="lock" posref="TL TL" h="16" w="16" x="0" y="0" active="#lock" render_layer="#render_layer4" texture="pin_on.tga" global_color="false" /> - <view type="text" id="text1" posref="TR TL" posparent="back" x="5" y="1" multi_line="true" format_taged="true" fontsize="8" hardtext_format="#text" color="#color1" shadow="true" global_color="#gc1" /> - <view type="text" id="text2" posref="BL TL" posparent="text1" x="0" y="0" multi_line="true" format_taged="true" fontsize="#fontsize" hardtext_format="#text2" color="#color2" shadow="true" global_color="#gc2" /> - <view type="text" id="text3" posref="BL TL" posparent="text2" x="0" y="-2" multi_line="true" format_taged="true" fontsize="#fontsize" hardtext_format="#text3" color="#color3" shadow="true" global_color="#gc3" /> + <view type="text" id="text1" posref="TR TL" posparent="back" x="5" y="1" multi_line="true" line_maxw="#w" multi_line_maxw_only="true" multi_line_space="0" format_taged="true" fontsize="#fontsize" hardtext="#text" color="#color1" shadow="true" global_color="#gc1" /> + <view type="text" id="text2" posref="BL TL" posparent="text1" x="0" y="0" multi_line="true" line_maxw="#w" multi_line_maxw_only="true" multi_line_space="0" format_taged="true" fontsize="#fontsize2" hardtext="#text2" color="#color2" shadow="true" global_color="#gc2" /> <ctrl type="button" id="ctrl" button_type="push_button" global_color_normal="false" posref="ML ML" x="#x" y="0" tx_normal="blank.tga" tx_pushed="blank.tga" tx_over="blank.tga" scale="true" w="#w" h="40" color="#ctrlcolor" col_over="#colover" col_pushed="#colover" render_layer="#render_layer2" onclick_l="lua" params_l="#params_l" onclick_r="lua" params_r="#params_r" /> + <view type="text" id="text3" posref="BR BR" posparent="ctrl" x="-4" y="2" multi_line="true" line_maxw="#w" multi_line_maxw_only="true" format_taged="true" fontsize="#fontsize3" hardtext="#text3" color="#color3" shadow="true" global_color="#gc3" /> </group> </template> -<template name="arkshop_inv_mission" sheetdb="UI:TEMP:ARK:ITEM:0" usesheet="false" usesheet_reward="false" isvirtual="true" render_layer1="1" render_layer2="2" fontsize="8" render_layer3="3" w="45" keep="true" img1="token_basic.tga" img2="" img3="" tooltip="" quality="" quantity="" overlay="" text="" text2="" text3="" color="255 255 255 255" gc1="false" gc2="false" gc3="true" ctrlcolor="0 0 0 0" color2="255 255 255 255" color3="255 255 255 255" colover="255 255 255 30" bg="w_slot_item.tga" params_l="" params_r="" x="0" y="0"> +<template name="arkshop_inv_mission" sheetdb="UI:TEMP:ARK:ITEM:0" usesheet="false" usesheet_reward="false" isvirtual="true" render_layer1="1" render_layer2="2" fontsize="10" render_layer3="3" w="45" keep="true" img1="token_basic.tga" img2="" img3="" tooltip="" quality="" quantity="" overlay="" text="" text2="" text3="" color="255 255 255 255" gc1="false" gc2="false" gc3="false" ctrlcolor="0 0 0 0" color2="255 255 255 255" color3="255 255 255 255" colover="255 255 255 30" bg="w_slot_item.tga" params_l="" params_r="" x="0" y="0"> <group id="#id" posref="MM MM" w="#w" h="45" x="#x" y="#y" sizeref="" render_layer="#render_layer1"> <ctrl type="sheet" tooltip="#text" onclick_r="open_help_auto" active="#usesheet" id="sheet" value="#sheetdb" posref="MR MR" y="0" x="0" render_layer="#render_layer3" use_quality="true" use_quantity="true" /> <view type="bitmap" id="back" posref="ML ML" h="40" w="40" scale="true" x="0" y="0" render_layer="#render_layer1" texture="points_atys.tga" global_color="false" /> - <view type="bitmap" id="back2" posref="MM MM" posparent="back" h="40" w="40" scale="false" x="0" y="0" render_layer="#render_layer2" texture="mission_elyps.tga" global_color="false" /> - <view type="text" id="text1" posref="TR TL" posparent="back" x="5" y="1" format_taged="true" fontsize="8" hardtext="#text" color="#color1" shadow="true" global_color="#gc1" /> - <view type="text" id="text2" posref="BL TL" posparent="text1" x="0" y="2" format_taged="true" fontsize="#fontsize" hardtext="#text2" color="#color2" shadow="true" global_color="#gc2" /> + <view type="bitmap" id="back2" posref="MM MM" posparent="back" h="40" w="40" scale="false" x="0" y="0" render_layer="#render_layer2" texture="https://app.ryzom.com/app_arcc/data/app/Scripts//1/5/0/4/assets/mission_elyps.png" global_color="false" /> + <view type="text" id="text1" posref="TR TL" posparent="back" x="5" y="1" format_taged="true" fontsize="#fontsize" hardtext="#text" color="#color1" shadow="true" global_color="#gc1" /> + <view type="text" id="text2" posref="BL TL" posparent="text1" x="0" y="2" format_taged="true" multi_line="true" multi_line_maxw_only="true" multi_line_space="0" fontsize="#fontsize" hardtext="#text2" color="#color2" shadow="true" global_color="#gc2" /> <ctrl type="button" id="ctrl" button_type="push_button" global_color_normal="false" posref="ML ML" x="1" y="0" tx_normal="blank.tga" tx_pushed="blank.tga" tx_over="blank.tga" scale="true" w="#w" h="40" color="#ctrlcolor" col_over="#colover" col_pushed="#colover" render_layer="#render_layer2" onclick_l="lua" params_l="#params_l" onclick_r="lua" params_r="#params_r" /> </group> </template> diff --git a/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml index a4eb8692c4..088e97b8bf 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml @@ -134,19 +134,19 @@ <!-- //////////// TEMPLATE : webig_bot_chat_buy /////////// --> <template name="webig_bot_chat_buy" keep="true" title="uiBuy" tooltip="Dappers" icon_points="money_seve.tga" buyto_text="uiBuyFrom" buyto_name="?"> - <group id="#id" type="container" openable="false" opened="true" movable="true" resizer="false" savable="false" header_color="UI:SAVE:WIN:COLORS:BOT" global_color="false" escapable="true" posref="BL TL" min_w="450" max_w="450" w="450" x="352" y="200" pop_max_h="700" max_h="2000" active="true" title="#title"> - <group id="header_opened" child_resize_h="true" w="600" x="0" y="0" posref="TL TL"> - <instance template="bc_border_text" id="intro" /> + <group id="#id" type="container" openable="false" opened="true" movable="true" resizer="false" savable="false" header_color="UI:SAVE:WIN:COLORS:BOT" global_color="false" escapable="true" posref="BL TL" pop_min_w="550" pop_max_w="550" min_h="700" w="550" x="352" y="200" pop_min_h="700" pop_max_h="700" active="true" title="#title"> + <group id="header_opened" child_resize_h="true" x="0" y="0" posref="TL TL"> + <instance template="bc_border_text" id="intro" posref="TL TL"/> <group id="trade_content" sizeref="w" w="0" child_resize_h="true" child_resize_hmargin="30" posref="BL TL" posparent="intro" y="0"> - <view type="text" id="buy_title" multi_line="1" posparent="buy_back" posref="TL BL" x="0" y="35" color="255 255 255 255" fontsize="12" shadow="true" hardtext="#buyto_text" /> - <view type="text" id="vendor_name" multi_line="1" posparent="buy_back" posref="TL BL" x="10" y="18" color="255 255 255 255" global_color="false" fontsize="12" shadow="true" hardtext="#buyto_name" /> - <view type="text" id="buy_info" multi_line="1" posparent="buy_back" posref="TL BL" x="10" y="2" color="255 255 255 255" global_color="false" fontsize="12" shadow="true" hardtext="" /> - <instance template="box_widget" id="buy_back" posref="TR TR" w="430" h="420" x="0" y="-48" /> + <view type="text" id="buy_title" multi_line="1" posparent="buy_back" posref="TL BL" x="0" y="35" color="255 255 255 255" fontsize="10" shadow="true" hardtext="#buyto_text" /> + <view type="text" id="vendor_name" multi_line="1" posparent="buy_back" posref="TL BL" x="10" y="18" color="255 255 255 255" global_color="false" fontsize="10" shadow="true" hardtext="#buyto_name" /> + <view type="text" id="buy_info" multi_line="1" posparent="buy_back" posref="TL BL" x="10" y="2" color="255 255 255 255" global_color="false" fontsize="10" shadow="true" hardtext="" /> + <instance template="box_widget" id="buy_back" sizeref="w" posref="TL TL" w="0" h="520" x="0" y="-48" /> <!-- BUY --> <group id="buy" type="html" posparent="buy_back" posref="MM MM" sizeref="wh" w="0" h="0" url="" title_prefix="uiQuickhelpTitle" x="5" y="0" background_color="0 0 0 0" error_color="255 240 48 255" link_color="240 155 100 255" text_color="210 210 210 255" h1_color="255 255 255 255" h2_color="255 255 255 255" h3_color="255 255 255 255" h4_color="255 255 255 255" h5_color="255 255 255 255" h6_color="255 255 255 255" text_font_size="10" h1_font_size="16" h2_font_size="14" h3_font_size="13" h4_font_size="12" h5_font_size="11" h6_font_size="11" paragraph_begin_space="12" multi_line_space_factor="0.25" td_begin_space="0" li_begin_space="4" ul_begin_space="12" li_indent="-10" ul_indent="30" checkbox_bitmap_normal="patch_off.tga" checkbox_bitmap_pushed="patch_on.tga" checkbox_bitmap_over="" background_bitmap_view="" home="" browse_next_time="false" timeout="0" form_text_area_group="edit_box_widget_multiline"> <group id="black" posref="TL TL" sizeref="hw" inherit_gc_alpha="true" /> <view type="bitmap" id="black2" posparent="black" posref="MM MM" sizeref="wh" w="-2" h="-2" inherit_gc_alpha="true" scale="true" texture="blank.tga" global_color="false" /> - <group type="list" id="text_list" fontsize="9" posref="TL TL" posparent="black" x="10" y="-2" space="0" sizeref="hw" w="-4" h="-4" maxelements="2000" /> + <group type="list" id="text_list" fontsize="10" posref="TL TL" posparent="black" x="10" y="-2" space="0" sizeref="hw" w="-4" h="-4" maxelements="2000" /> <ctrl style="skin_scroll" id="scroll_bar" /> </group> <instance template="money_tmpl" id="points" posref="BR TR" x="0" y="-8" w="150" icon="#icon_points" posparent="buy_back" tooltip="#tooltip" value="UI:TEMP:ARK_SHOP_MONEY" /> @@ -156,14 +156,14 @@ </template> <!-- //////////// TEMPLATE : webig_bot_chat_buy_item /////////// --> - <template name="webig_bot_chat_buy_item" id="" money_tooltip="uiDappers" money_icon="money_seve.tga" onclick="" infosclick="" infos_text="uiTS_Items" ok_text="uiBuy" tooltip_ok="" keep="true" x="0" y="0"> + <template name="webig_bot_chat_buy_item" id="" money_tooltip="uiDappers" money_icon="money_seve.tga" onclick="" infosclick="" infos_text="uiTS_Items" ok_text="uiBuy" tooltip_ok="" keep="true" x="0" y="0"> <group id="#id" type="container" posref="TL TL" min_w="240" w="408" x="#x" y="#y" pop_min_h="320" pop_max_h="420" min_h="320" max_h="420" active="true" openable="false" opened="true" movable="true" resizer="false" savable="false" title="uiBotChatMissions" escapable="true" header_color="UI:SAVE:WIN:COLORS:BOT" global_color="false"> <group id="header_opened" h="400" w="600" x="0" y="0" posref="TL TL"> <group id="top" posref="TL TL" sizeref="wh" x="2" y="-2"> <group id="buy_sell_slot" type="html" posref="TL TL" w="48" h="48" url="" x="2" y="-20" background_color="0 0 0 0" error_color="255 240 48 255" link_color="240 155 100 255" text_color="210 210 210 255" h1_color="255 255 255 255" h2_color="255 255 255 255" h3_color="255 255 255 255" h4_color="255 255 255 255" h5_color="255 255 255 255" h6_color="255 255 255 255" text_font_size="10" h1_font_size="16" h2_font_size="14" h3_font_size="13" h4_font_size="12" h5_font_size="11" h6_font_size="11" paragraph_begin_space="12" multi_line_space_factor="0.25" td_begin_space="0" li_begin_space="4" ul_begin_space="12" li_indent="-10" ul_indent="30" checkbox_bitmap_normal="patch_off.tga" checkbox_bitmap_pushed="patch_on.tga" checkbox_bitmap_over="" background_bitmap_view="" home="" browse_next_time="false" timeout="0" form_text_area_group="edit_box_widget_multiline"> <group id="black" posref="TL TL" sizeref="hw" inherit_gc_alpha="true" /> <view type="bitmap" id="black2" posparent="black" posref="MM MM" sizeref="wh" w="-2" h="-2" inherit_gc_alpha="true" scale="true" texture="blank.tga" global_color="false" /> - <group type="list" id="text_list" fontsize="9" posref="TL TL" posparent="black" x="2" y="-2" space="0" sizeref="hw" w="-4" h="-4" maxelements="2000" /> + <group type="list" id="text_list" fontsize="11" posref="TL TL" posparent="black" x="2" y="-2" space="0" sizeref="hw" w="-4" h="-4" maxelements="2000" /> <ctrl style="skin_scroll" id="scroll_bar" /> </group> @@ -171,20 +171,20 @@ <instance template="money_tmpl" id="item_price" tooltip="#money_tooltip" icon="#money_icon" posref="ML ML" x="0" w="130" h="32" value="UI:TEMP:ARK_MONEY_PRICE" /> <instance template="edit_box_widget" id="edit" posref="MM MM" x="0" text_x="0" text_ref="BR BR" w="36" backup_father_container_pos="true" prompt="" value="1" enter_loose_focus="true" multi_line="false" max_num_chars="4" onenter="lua" params="arkNpcShop:CheckMoney()" onchange="lua" onchange_params="arkNpcShop:CheckMoney()" enter_recover_focus="true" reset_focus_on_hide="true" max_historic="0" entry_type="positive_integer" /> <instance template="money_tmpl" id="item_total_price" tooltip="#money_tooltip" icon="#money_icon" posref="MR MR" x="0" w="130" h="32" value="UI:TEMP:ARK_MONEY_TOTAL" /> - <view type="text" id="cross" posref="ML MR" posparent="edit" color="255 255 255 255" fontsize="10" x="-4" y="0" shadow="true" hardtext="X" /> + <view type="text" id="cross" posref="ML MR" posparent="edit" color="255 255 255 255" fontsize="11" x="-4" y="0" shadow="true" hardtext="X" /> <view type="text" id="equal" posref="MR ML" posparent="edit" color="255 255 255 255" x="2" y="0" fontsize="16" shadow="true" hardtext="=" /> - <view type="text" id="unit_price_header" posparent="item_price" posref="TR BR" color="255 255 255 255" fontsize="10" x="0" y="-5" shadow="true" hardtext="uiUnitValue" /> - <view type="text" id="quantity_header" posref="TM TM" color="255 255 255 255" fontsize="10" x="0" y="0" shadow="true" hardtext="uiQtty" /> + <view type="text" id="unit_price_header" posparent="item_price" posref="TR BR" color="255 255 255 255" fontsize="11" x="0" y="-5" shadow="true" hardtext="uiUnitValue" /> + <view type="text" id="quantity_header" posref="TM TM" color="255 255 255 255" fontsize="11" x="0" y="0" shadow="true" hardtext="uiQtty" /> <view type="text" id="total_price_header" posparent="item_total_price" posref="TR BR" color="255 255 255 255" fontsize="10" x="0" y="-5" shadow="true" hardtext="uiImmediatePrice" /> </group> </group> <group id="scroll_text" posref="TL TL" h="200" y="-20" sizeref="w" w="0"> <instance template="inner_thin_border_group" /> - <group id="infos" type="html" posref="MM MM" sizeref="hw" w="0" h="0" url="" title_prefix="uiQuickhelpTitle" x="0" y="0" background_color="0 0 0 0" error_color="255 240 48 255" link_color="240 155 100 255" text_color_global_color="true" h1_color="255 255 255 255" h2_color="255 255 255 255" h3_color="255 255 255 255" h4_color="255 255 255 255" h5_color="255 255 255 255" h6_color="255 255 255 255" text_font_size="12" h1_font_size="16" h2_font_size="14" h3_font_size="13" h4_font_size="12" h5_font_size="11" h6_font_size="11" paragraph_begin_space="12" multi_line_space_factor="0.25" td_begin_space="0" li_begin_space="4" ul_begin_space="12" li_indent="-10" ul_indent="30" checkbox_bitmap_normal="patch_off.tga" checkbox_bitmap_pushed="patch_on.tga" checkbox_bitmap_over="" background_bitmap_view="" home="" browse_next_time="false" timeout="0" form_text_area_group="edit_box_widget_multiline"> + <group id="infos" type="html" posref="MM MM" sizeref="hw" w="0" h="0" url="" title_prefix="uiQuickhelpTitle" x="0" y="0" background_color="0 0 0 0" error_color="255 240 48 255" link_color="240 155 100 255" text_color_global_color="true" h1_color="255 255 255 255" h2_color="255 255 255 255" h3_color="255 255 255 255" h4_color="255 255 255 255" h5_color="255 255 255 255" h6_color="255 255 255 255" text_font_size="10" h1_font_size="16" h2_font_size="14" h3_font_size="13" h4_font_size="12" h5_font_size="11" h6_font_size="11" paragraph_begin_space="12" multi_line_space_factor="0.25" td_begin_space="0" li_begin_space="4" ul_begin_space="12" li_indent="-10" ul_indent="30" checkbox_bitmap_normal="patch_off.tga" checkbox_bitmap_pushed="patch_on.tga" checkbox_bitmap_over="" background_bitmap_view="" home="" browse_next_time="false" timeout="0" form_text_area_group="edit_box_widget_multiline"> <group id="black" posref="TL TL" sizeref="hw" inherit_gc_alpha="true" /> <view type="bitmap" id="black2" posparent="black" posref="MM MM" sizeref="wh" w="-2" h="-2" inherit_gc_alpha="true" scale="true" texture="blank.tga" /> - <group type="list" id="text_list" fontsize="9" posref="TL TL" posparent="black" x="2" y="-2" space="0" sizeref="hw" w="-4" h="-4" maxelements="2000" /> + <group type="list" id="text_list" fontsize="10" posref="TL TL" posparent="black" x="2" y="-2" space="0" sizeref="hw" w="-4" h="-4" maxelements="2000" /> <ctrl style="skin_scroll" id="scroll_bar" /> </group> </group> From 66bcf780c293bb2f99253cbbd9695322a852e311 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Thu, 23 May 2024 01:16:48 +0200 Subject: [PATCH 180/194] Added initchests --- .../src/entities_game_service/guild_manager/guild.h | 11 +++++++++++ .../guild_manager/guild_commands.cpp | 1 + .../guild_manager/guild_manager.cpp | 2 ++ .../mission_manager/missions_commands.cpp | 2 ++ 4 files changed, 16 insertions(+) diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild.h b/ryzom/server/src/entities_game_service/guild_manager/guild.h index 5d0bbfe997..a36689fcf2 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild.h +++ b/ryzom/server/src/entities_game_service/guild_manager/guild.h @@ -126,6 +126,17 @@ class CGuild : void setChestA(const NLMISC::CEntityId &recipient, uint8 chest); void setChestB(const NLMISC::CEntityId &recipient, uint8 chest); + void initChests() { + _Chests.resize(GUILD_NB_CHESTS); + for (uint8 chest=0; chest < 2; chest++) + { + if (_Chests[chest].BulkMax < 6000) + _Chests[chest].BulkMax = 6000; + if (_Chests[chest].Name.empty()); + _Chests[chest].Name = NLMISC::toString("Chest #%u", chest+1); + } + } + std::string getChestName(uint8 chest) { if (chest >= _Chests.size()) return ""; return _Chests[chest].Name; } EGSPD::CGuildGrade::TGuildGrade getChestViewGrade(uint8 chest) { if (chest >= _Chests.size()) return EGSPD::CGuildGrade::Leader; return _Chests[chest].ViewGrade; } EGSPD::CGuildGrade::TGuildGrade getChestPutGrade(uint8 chest) { if (chest >= _Chests.size()) return EGSPD::CGuildGrade::Leader; return _Chests[chest].PutGrade; } diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild_commands.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild_commands.cpp index 0e52b11eff..a1f3989ebd 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild_commands.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild_commands.cpp @@ -160,6 +160,7 @@ NLMISC_COMMAND(dumpGuild, "dump a guild", "<guildName|<shardId>:<guildId>") GET_GUILD(false); + guild->initChests(); guild->dumpGuildInfos( log ); return true; diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild_manager.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild_manager.cpp index cf1e206386..654483c9f0 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild_manager.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild_manager.cpp @@ -835,6 +835,8 @@ void CGuildManager::createGuildStep2(uint32 guildId, const ucstring &guildName, guild->setName(guildName); guild->setDescription(pgc.Description); + guild->initChests(); + // _GuildsAwaitingString.insert( std::make_pair( guildName, guild->getId() ) ); // _GuildsAwaitingString.insert( std::make_pair( pgc.Description, guild->getId() ) ); // NLMISC::CEntityId stringEId = guild->getEId(); diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index 1c79702bd2..de60b2d9aa 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -1301,6 +1301,7 @@ NLMISC_COMMAND(setGuildInventoryChestBulkMax, "Set the bulk max of chest of inve { uint32 bulkmax; NLMISC::fromString(args[2], bulkmax); + guild->initChests(); guild->setChestBulkMax(chest, bulkmax); log.displayNL("OK"); } @@ -1325,6 +1326,7 @@ NLMISC_COMMAND(setGuildInventoryChestParams, "Set the chest of inventory", "<uid CGuild * guild = CGuildManager::getInstance()->getGuildFromId(c->getGuildId()); if (guild) { + guild->initChests(); uint8 chest; NLMISC::fromString(args[1], chest); EGSPD::CGuildGrade::TGuildGrade gradeView = EGSPD::CGuildGrade::fromString(args[3]); From d8f4a79b0850b705c6ee6a2bda1fc8a7b9dd6359 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Tue, 4 Jun 2024 15:33:23 +0200 Subject: [PATCH 181/194] Fix tutorial issues --- .../client/data/gamedev/interfaces_v3/ark.lua | 3 +- .../data/gamedev/interfaces_v3/help.lua | 35 +++++++++---------- .../gamedev/interfaces_v3/out_v2_appear.lua | 10 +++--- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark.lua b/ryzom/client/data/gamedev/interfaces_v3/ark.lua index a23f7f135a..a5a943e376 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark.lua @@ -50,7 +50,8 @@ function broadcast(text, t) end function fixUrl(url) - return url:gsub("{amp}", "&") + s, n = string.gsub(url, "{amp}", "&") + return s end function openArkScript(id, winid, extra) diff --git a/ryzom/client/data/gamedev/interfaces_v3/help.lua b/ryzom/client/data/gamedev/interfaces_v3/help.lua index 1a3e4dd1f8..ee802b8da9 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/help.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/help.lua @@ -41,16 +41,27 @@ function help:skipTutorial() WebQueue:push("https://app.ryzom.com/app_arcc/outgame_rpbg.php?action=skip") setDbProp("UI:SAVE:SKIP_WELCOME", 1) setDbProp("UI:SAVE:TUTORIAL_ACTIVE_SETS", 1) + getUI("ui:interface:gestionsets").active = true setDbProp("UI:SAVE:TUTORIAL_ACTIVE_INFO_PLAYER_JOURNAL", 1) + getUI("ui:interface:info_player_journal").active = true setDbProp("UI:SAVE:TUTORIAL_ACTIVE_PLAYER", 1) + getUI("ui:interface:player").active = true setDbProp("UI:SAVE:TUTORIAL_ACTIVE_COMPASS", 1) + getUI("ui:interface:compass").active = true setDbProp("UI:SAVE:TUTORIAL_ACTIVE_TARGET", 1) + getUI("ui:interface:target").active = true setDbProp("UI:SAVE:TUTORIAL_ACTIVE_MAIN_CHAT", 1) setDbProp("UI:SAVE:TUTORIAL_ACTIVE_INVENTORY", 1) setDbProp("UI:SAVE:TUTORIAL_ACTIVE_ENCYCLOPEDIA", 1) setDbProp("UI:SAVE:ISENABLED:AROUND_ME", 1) setDbProp("UI:SAVE:ISENABLED:REGION_CHAT", 1) setDbProp("UI:SAVE:ISENABLED:DYNAMIC_CHAT0", 1) + setDbProp("UI:SAVE:MK_MODE", 4) + game:activeMilkoKey(1, true) + game:activeMilkoKey(2, true) + game:activeMilkoKey(3, true) + game:activeMilkoKey(4, true) + if getDbProp("UI:SAVE:SKIP_TUTORIAL") == 1 then return end @@ -78,29 +89,29 @@ function help:displayWelcome() end if getDbProp("UI:SAVE:TUTORIAL_ACTIVE_SETS") == 0 then - getUI("ui:interface:gestionsets").active=false + getUI("ui:interface:gestionsets").active = false end if getDbProp("UI:SAVE:TUTORIAL_ACTIVE_INFO_PLAYER_JOURNAL") == 0 then - getUI("ui:interface:info_player_journal").active=false + getUI("ui:interface:info_player_journal").active = false end if getDbProp("UI:SAVE:TUTORIAL_ACTIVE_PLAYER") == 0 then - getUI("ui:interface:player").active=false + getUI("ui:interface:player").active = false end if getDbProp("UI:SAVE:TUTORIAL_ACTIVE_TARGET") == 0 then - getUI("ui:interface:target").active=false + getUI("ui:interface:target").active = false end - getUI("ui:interface:milko_pad:content:mode_button").active=false + getUI("ui:interface:milko_pad:content:mode_button").active = false setDbProp("UI:SAVE:MK_MODE", 5) game:activeMilkoKey(1, false) game:activeMilkoKey(2, false) game:activeMilkoKey(3, false) game:activeMilkoKey(4, getDbProp("UI:SAVE:TUTORIAL_ACTIVE_INVENTORY") == 1) -- bag - game:activeMilkoKey(5, getDbProp("UI:SAVE:TUTORIAL_ACTIVE_ENCYCLOPEDIA") == 1) -- ency + game:activeMilkoKey(5, true) -- ency game:activeMilkoKey(6, true) -- mission game:activeMilkoKey(7, true) -- help game:activeMilkoKey(8, true) -- system @@ -143,7 +154,6 @@ function help:checkSkipTutorial() local skip_tutorial = getDbProp("UI:SAVE:SKIP_TUTORIAL") if skip_tutorial == 0 then debug("Skip Tutorial") - setDbProp("UI:SAVE:SKIP_TUTORIAL", 1) help:skipTutorial() end end @@ -165,17 +175,6 @@ function help:checkSkipWelcomeTutorial() end end -function help:updateRpbg(slot) - local rpbg_key_file = io.open("save/rpbg_"..slot..".key", "rb") - if rpbg_key_file then - debug("Setup RP BG save/rpbg_"..slot..".key") - rpbg_key = rpbg_key_file:read() - rpbg_key_file:close() - os.remove("save/rpbg_"..slot..".key") - WebQueue:push("https://app.ryzom.com/app_arcc/outgame_rpbg.php?action=save&key="..rpbg_key) - end -end - function help:checkTutorialMilkoPad() getUI("ui:interface:cap_popup").active = false removeOnDbChange(getUI("ui:interface"), "@UI:SAVE:MK_MODE") diff --git a/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua b/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua index 62343406d4..65ef3ed480 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/out_v2_appear.lua @@ -276,17 +276,14 @@ function outgame:buildActionPack() local slot = getDbProp("UI:TEMP:CHARSELSLOT") local lang = getClientCfg("LanguageCode") + local login = getClientCfgVar("LastLogin") local sex = "m" if getDbProp("UI:TEMP:CHAR3D:VPA:SEX") == 1 then sex = "f" end - rpbg_key = tostring(nltime.getSecondsSince1970())..":"..tostring(math.random(100000, 429496729)) - local dst = io.open("save/rpbg_"..tostring(slot)..".key", "wb") - dst:write(rpbg_key) - dst:close() getUI("ui:outgame:appear:finish_but").frozen = 1 - getUI("ui:outgame:appear:job_options:rpbg:html"):browse("https://app.ryzom.com/app_arcc/outgame_rpbg.php?lang="..lang.."&slot="..tostring(slot).."&sex="..sex.."&key="..rpbg_key) + getUI("ui:outgame:appear:job_options:rpbg:html"):browse("https://app.ryzom.com/app_arcc/outgame_rpbg.php?lang="..lang.."&login="..login.."&slot="..tostring(slot).."&sex="..sex) local uiDesc = getUI("ui:outgame:appear:job_options:options:desc") @@ -431,11 +428,12 @@ end function outgame:loadRPBGPage() local slot = getDbProp("UI:TEMP:CHARSELSLOT") local lang = getClientCfg("LanguageCode") + local login = getClientCfgVar("LastLogin") local sex = "m" if getDbProp("UI:TEMP:CHAR3D:VPA:SEX") == 1 then sex = "f" end - getUI("ui:outgame:appear:job_options:rpbg:html"):browse("https://app.ryzom.com/app_arcc/outgame_rpbg.php?lang="..lang.."&slot="..tostring(slot).."&sex="..sex.."&key="..rpbg_key) + getUI("ui:outgame:appear:job_options:rpbg:html"):browse("https://app.ryzom.com/app_arcc/outgame_rpbg.php?lang="..lang.."&login="..login.."&slot="..tostring(slot).."&sex="..sex) end -- VERSION -- From 2f9e1f206f22115a25dbc337e98eea97cb772c22 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Tue, 4 Jun 2024 18:43:05 +0200 Subject: [PATCH 182/194] Fix hunter --- CMakeLists.txt | 6 +++--- CMakeModules/GetRevision.cmake | 2 +- CMakeModules/HunterGate.cmake | 18 ++++++------------ 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ae48f1ad10..7a86a2c71c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,8 +41,8 @@ OPTION(HUNTER_ENABLED "Enable Hunter package manager" OFF) IF(HUNTER_ENABLED) INCLUDE("CMakeModules/HunterGate.cmake") HunterGate( - URL "https://github.com/cpp-pm/hunter/archive/v0.25.0.tar.gz" - SHA1 "a1296b351dbfaf036c92d85c1bdb461f615849fa" + URL "https://github.com/cpp-pm/hunter/archive/v0.23.321.tar.gz" + SHA1 "5e53cbb0429037ea8e2592bfd92704b8ff3ab492" FILEPATH "${CMAKE_CURRENT_LIST_DIR}/CMakeModules/HunterConfig.cmake" ) @@ -77,7 +77,7 @@ ELSE() SET(CURRENT_YEAR "2019") ENDIF() -CMAKE_MINIMUM_REQUIRED(VERSION 3.6) +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) PROJECT(RyzomCore CXX C) SET(NL_VERSION_MAJOR 1) SET(NL_VERSION_MINOR 1) diff --git a/CMakeModules/GetRevision.cmake b/CMakeModules/GetRevision.cmake index 4cff000db1..f18b662e17 100644 --- a/CMakeModules/GetRevision.cmake +++ b/CMakeModules/GetRevision.cmake @@ -1,4 +1,4 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 3.6) +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) diff --git a/CMakeModules/HunterGate.cmake b/CMakeModules/HunterGate.cmake index 17c6d38038..64ccde563b 100644 --- a/CMakeModules/HunterGate.cmake +++ b/CMakeModules/HunterGate.cmake @@ -25,7 +25,7 @@ # This is a gate file to Hunter package manager. # Include this file using `include` command and add package you need, example: # -# cmake_minimum_required(VERSION 3.5) +# cmake_minimum_required(VERSION 3.2) # # include("cmake/HunterGate.cmake") # HunterGate( @@ -39,16 +39,16 @@ # hunter_add_package(Boo COMPONENTS Bar Baz) # # Projects: -# * https://github.com/cpp-pm/gate/ -# * https://github.com/cpp-pm/hunter +# * https://github.com/hunter-packages/gate/ +# * https://github.com/ruslo/hunter option(HUNTER_ENABLED "Enable Hunter package manager support" ON) if(HUNTER_ENABLED) - if(CMAKE_VERSION VERSION_LESS "3.5") + if(CMAKE_VERSION VERSION_LESS "3.2") message( FATAL_ERROR - "At least CMake version 3.5 required for Hunter dependency management." + "At least CMake version 3.2 required for Hunter dependency management." " Update CMake or set HUNTER_ENABLED to OFF." ) endif() @@ -253,13 +253,7 @@ function(hunter_gate_download dir) file( WRITE "${cmakelists}" - "cmake_minimum_required(VERSION 3.5)\n" - "if(POLICY CMP0114)\n" - " cmake_policy(SET CMP0114 NEW)\n" - "endif()\n" - "if(POLICY CMP0135)\n" - " cmake_policy(SET CMP0135 NEW)\n" - "endif()\n" + "cmake_minimum_required(VERSION 3.2)\n" "project(HunterDownload LANGUAGES NONE)\n" "include(ExternalProject)\n" "ExternalProject_Add(\n" From 1b1296c6f1ef81a76f71c516bf4e43be6864ca14 Mon Sep 17 00:00:00 2001 From: Pavor <pavor.ryzom@gmail.com> Date: Wed, 5 Jun 2024 23:31:36 +0200 Subject: [PATCH 183/194] Fix bug : Removed the number in team list Fix bug : Removed the number in team list --- ryzom/client/src/interface_v3/people_list.cpp | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/ryzom/client/src/interface_v3/people_list.cpp b/ryzom/client/src/interface_v3/people_list.cpp index 6a1e9de528..fd81da4def 100644 --- a/ryzom/client/src/interface_v3/people_list.cpp +++ b/ryzom/client/src/interface_v3/people_list.cpp @@ -431,10 +431,13 @@ sint CPeopleList::addPeople(const string &name, uint teamMateIndex /*= 0*/) ++_CurrPeopleID; _BaseContainer->setTitle(_BaseContainer->getTitle()); - if (_BaseContainer->getTitleOpenedViewText() != NULL) - _BaseContainer->getTitleOpenedViewText()->setTextLocalized(_BaseContainer->getTitleOpenedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); - if (_BaseContainer->getTitleClosedViewText() != NULL) - _BaseContainer->getTitleClosedViewText()->setTextLocalized(_BaseContainer->getTitleClosedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + if (_ContactType != CPeopleListDesc::Team) + { + if (_BaseContainer->getTitleOpenedViewText() != NULL) + _BaseContainer->getTitleOpenedViewText()->setTextLocalized(_BaseContainer->getTitleOpenedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + if (_BaseContainer->getTitleClosedViewText() != NULL) + _BaseContainer->getTitleClosedViewText()->setTextLocalized(_BaseContainer->getTitleClosedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + } return (sint) _Peoples.size() - 1; } @@ -465,10 +468,13 @@ void CPeopleList::removePeople(uint index) _Peoples.erase(_Peoples.begin() + index); _BaseContainer->setTitle(_BaseContainer->getTitle()); - if (_BaseContainer->getTitleOpenedViewText() != NULL) - _BaseContainer->getTitleOpenedViewText()->setTextLocalized(_BaseContainer->getTitleOpenedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); - if (_BaseContainer->getTitleClosedViewText() != NULL) - _BaseContainer->getTitleClosedViewText()->setTextLocalized(_BaseContainer->getTitleClosedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + if (_ContactType != CPeopleListDesc::Team) + { + if (_BaseContainer->getTitleOpenedViewText() != NULL) + _BaseContainer->getTitleOpenedViewText()->setTextLocalized(_BaseContainer->getTitleOpenedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + if (_BaseContainer->getTitleClosedViewText() != NULL) + _BaseContainer->getTitleClosedViewText()->setTextLocalized(_BaseContainer->getTitleClosedViewText()->getText() + " (" + std::to_string(_Peoples.size()) + ")", true); + } } //================================================================== From 547e5b05aff13045f2f8d65b13db4ce03658103b Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Fri, 14 Jun 2024 00:10:47 +0200 Subject: [PATCH 184/194] Fix rename of first 2 chests --- .../src/entities_game_service/guild_manager/guild.cpp | 6 +++++- .../server/src/entities_game_service/guild_manager/guild.h | 6 +++--- .../mission_manager/missions_commands.cpp | 4 ++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp index 48a2f99e02..74d733f623 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp @@ -216,7 +216,11 @@ void CGuild::setChestParams(uint8 chest, std::string name, EGSPD::CGuildGrade::T _Chests[chest].GetGrade = gradeGet; NLMISC::TStringId strId = CStringMapper::map( name ); - CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setNAME(_DbGroup, name, true); + ucstring ucname; + ucname.fromUtf8(name); + CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setNAME(_DbGroup, 0); + if (name == "") + CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setNAME(_DbGroup, ucname, true); CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setVIEW_GRADE(_DbGroup, gradeView); CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setPUT_GRADE(_DbGroup, gradePut); CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setGET_GRADE(_DbGroup, gradeGet); diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild.h b/ryzom/server/src/entities_game_service/guild_manager/guild.h index a36689fcf2..807032f490 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild.h +++ b/ryzom/server/src/entities_game_service/guild_manager/guild.h @@ -128,11 +128,11 @@ class CGuild : void initChests() { _Chests.resize(GUILD_NB_CHESTS); - for (uint8 chest=0; chest < 2; chest++) + for (uint8 chest=0; chest < _Chests.size(); chest++) { - if (_Chests[chest].BulkMax < 6000) + if (chest < 2 && _Chests[chest].BulkMax < 6000) _Chests[chest].BulkMax = 6000; - if (_Chests[chest].Name.empty()); + if (_Chests[chest].Name == "") _Chests[chest].Name = NLMISC::toString("Chest #%u", chest+1); } } diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index de60b2d9aa..26cc4fc337 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -1333,6 +1333,10 @@ NLMISC_COMMAND(setGuildInventoryChestParams, "Set the chest of inventory", "<uid EGSPD::CGuildGrade::TGuildGrade gradePut = EGSPD::CGuildGrade::fromString(args[4]); EGSPD::CGuildGrade::TGuildGrade gradeGet = EGSPD::CGuildGrade::fromString(args[5]); guild->setChestParams(chest, args[2], gradeView, gradePut, gradeGet); + log.displayNL("%s", guild->getChestName(chest).c_str()); + log.displayNL("%s", EGSPD::CGuildGrade::toString(guild->getChestViewGrade(chest)).c_str()); + log.displayNL("%s", EGSPD::CGuildGrade::toString(guild->getChestPutGrade(chest)).c_str()); + log.displayNL("%s", EGSPD::CGuildGrade::toString(guild->getChestGetGrade(chest)).c_str()); } return true; } From 3edea8523c245951547cc7649dcf91561e18af9b Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 14 Jun 2024 02:31:01 +0200 Subject: [PATCH 185/194] Added AES admin_log --- ryzom/server/src/admin_modules/admin_log.cpp | 67 ++++++++++++++ ryzom/server/src/admin_modules/admin_log.h | 95 ++++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 ryzom/server/src/admin_modules/admin_log.cpp create mode 100644 ryzom/server/src/admin_modules/admin_log.h diff --git a/ryzom/server/src/admin_modules/admin_log.cpp b/ryzom/server/src/admin_modules/admin_log.cpp new file mode 100644 index 0000000000..28d91eb6eb --- /dev/null +++ b/ryzom/server/src/admin_modules/admin_log.cpp @@ -0,0 +1,67 @@ +// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> +// 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 <http://www.gnu.org/licenses/>. + + + +#include "stdpch.h" +#include "mission_log.h" +#include "nel/misc/displayer.h" + +using namespace std; +using namespace NLMISC; + +CAdminCommandLog AdminCommandLog; +bool VerboseAdminCommands = true; + +//----------------------------------------------- +// CAdminCommandLog init +//----------------------------------------------- +void CAdminCommandLog::init(const std::string & logFile) +{ + _LogFile = logFile; + if ( logFile.empty() ) + Log = NLMISC::WarningLog; + else + { + Log = new NLMISC::CLog; + _Fd.setParam ( logFile, true); + Log->addDisplayer (&_Fd); + } +}// CAdminCommandLog init + +//----------------------------------------------- +// CAdminCommandLog release +//----------------------------------------------- +void CAdminCommandLog::release() +{ + if ( Log != NLMISC::WarningLog ) + delete Log; +}// CAdminCommandLog release + +//----------------------------------------------- +//----------------------------------------------- +void CAdminCommandLog::display(const char *format, ...) +{ + if (Log == NULL) return; + + char *str; + NLMISC_CONVERT_VARGS (str, format, 256/*NLMISC::MaxCStringSize*/); + + string toDisp = str; + toDisp = string(IDisplayer::dateToHumanString()) + string(" ") + toDisp; + + Log->displayRawNL(toDisp.c_str()); +} diff --git a/ryzom/server/src/admin_modules/admin_log.h b/ryzom/server/src/admin_modules/admin_log.h new file mode 100644 index 0000000000..6ddc0e728e --- /dev/null +++ b/ryzom/server/src/admin_modules/admin_log.h @@ -0,0 +1,95 @@ +// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> +// 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 <http://www.gnu.org/licenses/>. + + + +#ifndef RY_ADMINCOMMAND_LOG_H +#define RY_ADMINCOMMAND_LOG_H + +#include "nel/misc/log.h" +#include "nel/misc/debug.h" +#include "nel/misc/variable.h" + + +/** + * separate log system for AdminCommands. Logs are in admin_commands.log. use ADMINCMDLOG to log in this file + * \author Nicolas Brigand + * \author Nevrax France + * \date 2002 + */ +class CAdminCommandLog +{ +public: + + /// init the log + void init(const std::string & logFile); + ///release the log + void release(); + ///\return the name of the log file + inline const std::string & getLogFile(){return _LogFile;} + + void display(const char *format, ...); + + /// the NEL log used for in the ADMINCMDsion log + NLADMINCMDC::CLog *Log; +private: + /// the file displayer used to log the ADMINCMDsion information + NLADMINCMDC::CFileDisplayer _Fd; + /// log file name + std::string _LogFile; +}; + +/// the ADMINCMDsion log +extern CAdminCommandLog AdminCommandLog; + +/// macro used to log AdminCommands +#define ADMINCMDLOG AdminCommandLog.display +/// macro used to log AdminCommands +#define ADMINCMDDBG if ( !VerboseAdminCommands ){} else ADMINCMDLOG + +// Syntax error logged to egs_ADMINCMDsion.log +#define ADMINCMDLOGSYNTAXERROR(_PHRASE_) ADMINCMDLOG("sline:%u SYNTAX ERROR %s : " _PHRASE_, line, script[0].c_str()); +#define ADMINCMDLOGSYNTAXERROR1(_PHRASE_,_PARAM_) ADMINCMDLOG("sline:%u SYNTAX ERROR %s : " _PHRASE_, line, script[0].c_str(), _PARAM_); +#define ADMINCMDLOGERROR(_PHRASE_) ADMINCMDLOG("sline:%u ERROR %s : " _PHRASE_, line, script[0].c_str()); +#define ADMINCMDLOGERROR1(_PHRASE_,_PARAM_) ADMINCMDLOG("sline:%u ERROR %s : " _PHRASE_, line, script[0].c_str(), _PARAM_); +#define ADMINCMDLOGERROR2(_PHRASE_,_PARAM1_,_PARAM2_) ADMINCMDLOG("sline:%u ERROR %s : " _PHRASE_, line, script[0].c_str(), _PARAM1_, _PARAM2_); + + + +#endif // RY_ADMINCOMMAND_LOG_H + +/* End of ADMINCMDsion_log.h */ + + + + + + + + + + + + + + + + + + + + + From cdd30e5817cd34aa021c8177736339923ba485eb Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 14 Jun 2024 12:54:22 +0200 Subject: [PATCH 186/194] Remove lof of logs --- ryzom/server/src/admin_modules/admin_log.cpp | 2 +- ryzom/server/src/admin_modules/admin_log.h | 4 +- .../src/admin_modules/aes_client_module.cpp | 32 ++++++----- ryzom/server/src/admin_modules/aes_module.cpp | 54 +++++++++---------- .../src/entities_game_service/cdb_group.cpp | 1 - .../game_item_manager/player_inventory.cpp | 31 +---------- .../guild_manager/guild.cpp | 2 - 7 files changed, 49 insertions(+), 77 deletions(-) diff --git a/ryzom/server/src/admin_modules/admin_log.cpp b/ryzom/server/src/admin_modules/admin_log.cpp index 28d91eb6eb..2da8cd38ff 100644 --- a/ryzom/server/src/admin_modules/admin_log.cpp +++ b/ryzom/server/src/admin_modules/admin_log.cpp @@ -17,7 +17,7 @@ #include "stdpch.h" -#include "mission_log.h" +#include "admin_log.h" #include "nel/misc/displayer.h" using namespace std; diff --git a/ryzom/server/src/admin_modules/admin_log.h b/ryzom/server/src/admin_modules/admin_log.h index 6ddc0e728e..26635d46cb 100644 --- a/ryzom/server/src/admin_modules/admin_log.h +++ b/ryzom/server/src/admin_modules/admin_log.h @@ -44,10 +44,10 @@ class CAdminCommandLog void display(const char *format, ...); /// the NEL log used for in the ADMINCMDsion log - NLADMINCMDC::CLog *Log; + NLMISC::CLog *Log; private: /// the file displayer used to log the ADMINCMDsion information - NLADMINCMDC::CFileDisplayer _Fd; + NLMISC::CFileDisplayer _Fd; /// log file name std::string _LogFile; }; diff --git a/ryzom/server/src/admin_modules/aes_client_module.cpp b/ryzom/server/src/admin_modules/aes_client_module.cpp index 23024247a5..d0aa194130 100644 --- a/ryzom/server/src/admin_modules/aes_client_module.cpp +++ b/ryzom/server/src/admin_modules/aes_client_module.cpp @@ -23,16 +23,19 @@ #include "nel/net/service.h" #include "admin_modules_itf.h" +#include "admin_log.h" using namespace std; using namespace NLMISC; using namespace NLNET; +CVariable<string> LogPath("aes","LogPath", "path of logs", "../logs", 0, true); + void aesclient_forceLink() {} namespace ADMIN { - class CAdminExecutorServiceClient + class CAdminExecutorServiceClient : /*public CManualSingleton<CAdminExecutorService>,*/ public CEmptyModuleServiceBehav<CEmptyModuleCommBehav<CEmptySocketBehav<CModuleBase> > >, public CAdminExecutorServiceClientSkel @@ -86,9 +89,9 @@ namespace ADMIN * nearest integer second. * For 'high rez' var, the service buffer * the relative timestamp in ms at each - * tick loop and send update every seconds + * tick loop and send update every seconds * to the AES service. - * In addition, HighRez var are also sent + * In addition, HighRez var are also sent * every second as normal sample. */ uint32 MeanSamplePeriod; @@ -123,7 +126,8 @@ namespace ADMIN _ProcessUsedMemory(0) { CAdminExecutorServiceClientSkel::init(this); - + std::string logPath = LogPath.get(); + AdminCommandLog.init(CPath::standardizePath(logPath)+"admin_commands.log"); } std::string makeServiceAlias() @@ -214,8 +218,8 @@ namespace ADMIN // if (serviceAlias.empty()) // serviceAlias = getModuleFullyQualifiedName(); // -// aes.serviceConnected(this, -// IService::getInstance()->getServiceLongName(), +// aes.serviceConnected(this, +// IService::getInstance()->getServiceLongName(), // IService::getInstance()->getServiceShortName(), // serviceAlias, // pid); @@ -280,7 +284,7 @@ namespace ADMIN _ProcessUsedMemory = 0; } - // at least one second as passed, check for updates to send to + // at least one second as passed, check for updates to send to // AES TGraphDatas graphDatas; @@ -321,7 +325,7 @@ namespace ADMIN // we have some sample collected, just use the last one gd.setValue(gvi.Samples.back().SampleValue); } - + // if it's a high rez sampler, send the complete buffer if (gvi.MeanSamplePeriod < 1000 && _AdminExecutorService != NULL) { @@ -361,7 +365,7 @@ namespace ADMIN CAdminExecutorServiceProxy aes(_AdminExecutorService); aes.graphUpdate(this, graphDatas); } - + // update the last report date _LastStateReport = now; } @@ -418,7 +422,7 @@ namespace ADMIN status << "\t" << IService::getInstance()->getServiceStatusString(); } - if ((status != _LastSentStatus || (now - _LastStatusStringReport) > MAX_DELAY_BETWEEN_REPORT) + if ((status != _LastSentStatus || (now - _LastStatusStringReport) > MAX_DELAY_BETWEEN_REPORT) && _AdminExecutorService != NULL) { CAdminExecutorServiceProxy aes(_AdminExecutorService); @@ -451,8 +455,8 @@ namespace ADMIN IService::getInstance()->CommandLog.addDisplayer(&stringDisplayer); // retrieve the command from the input message and execute it - nlinfo ("ADMIN: Executing command from network : '%s'", command.c_str()); - ICommand::execute (command, IService::getInstance()->CommandLog); + ADMINCMDLOG("'%s'", command.c_str()); + ICommand::execute (command, IService::getInstance()->CommandLog, true); // unhook our displayer as it's work is now done IService::getInstance()->CommandLog.removeDisplayer(&stringDisplayer); @@ -470,8 +474,8 @@ namespace ADMIN virtual void serviceCmdNoReturn(NLNET::IModuleProxy *sender, const std::string &command) { // retrieve the command from the input message and execute it - nlinfo ("ADMIN: Executing command from network : '%s'", command.c_str()); - ICommand::execute (command, IService::getInstance()->CommandLog); + ADMINCMDLOG("'%s'", command.c_str()); + ICommand::execute (command, IService::getInstance()->CommandLog, true); } }; diff --git a/ryzom/server/src/admin_modules/aes_module.cpp b/ryzom/server/src/admin_modules/aes_module.cpp index aee6da68a5..66c1a8dae3 100644 --- a/ryzom/server/src/admin_modules/aes_module.cpp +++ b/ryzom/server/src/admin_modules/aes_module.cpp @@ -61,7 +61,7 @@ namespace ADMIN { /// The slot table. Each slot accumulate the service start for a time frame uint32 _Slots[CRASH_COUNTER_SLOT]; - /** The last value read from the runner script. This is used to compute + /** The last value read from the runner script. This is used to compute * the delta value to add to the first slot */ uint32 _LastValueRead; @@ -159,14 +159,14 @@ namespace ADMIN }; - class CAdminExecutorService + class CAdminExecutorService : /*public CManualSingleton<CAdminExecutorService>,*/ public CEmptyModuleServiceBehav<CEmptyModuleCommBehav<CEmptySocketBehav<CModuleBase> > >, public CAdminExecutorServiceSkel, public IModuleTrackerCb { public: - enum + enum { SLOW_TO_START_THRESHOLD = 60, // 1 mn SLOW_TO_STOP_THRESHOLD = 60, // 1 mn @@ -174,7 +174,7 @@ namespace ADMIN }; private: - + typedef CModuleTracker<TModuleClassPred> TServiceTracker; // tracker for admin executor client modules TServiceTracker _ServiceTracker; @@ -197,16 +197,16 @@ namespace ADMIN /// A set of data for each registered or connected service struct TServiceState { - string ShardName; + string ShardName; bool DontUseShardOrders; TRunningState RunningState; - set<TRunningTag> RunningTags; + set<TRunningTag> RunningTags; string LongName; string ShortName; uint32 PID; string State; uint32 LastStateDate; - uint32 StopRequestDate; + uint32 StopRequestDate; uint32 StartRequestDate; TModuleProxyPtr ServiceModule; CRunnerLoopCounter RunnerLoopCounter; @@ -232,7 +232,7 @@ namespace ADMIN typedef map<TAliasName, TRunningOrders> TPersistentServiceOrders; /// Persistent service state, i.e state that are restored after a stop/start of the aes TPersistentServiceOrders _PersistentServiceOrders; - + typedef map<TShardName, TShardOrders> TShardsOrders; /// Shard orders (set by AS) TShardsOrders _ShardOrders; @@ -388,7 +388,7 @@ namespace ADMIN removeList.erase(removeList.begin()); } - + } // send the current status sendUpServiceUpdate(); @@ -543,7 +543,7 @@ namespace ADMIN // update the crash counter ss.RunnerLoopCounter.updateCounter(getServiceStartLoopCounter(aliasName)); } - + } @@ -611,7 +611,7 @@ namespace ADMIN _LastNagiosReport = now; } - + // update the last report date _LastStateReport = now; } @@ -643,7 +643,7 @@ namespace ADMIN { line << "ShardOrders "<<first->first<<" "<<first->second.toString()<<"\n"; } - + fputs(line.c_str(), fp); } @@ -755,7 +755,7 @@ namespace ADMIN for (uint i=0; i<_StopingShards.size(); ++i) { const TStopingShardInfo &stopShardInfo = _StopingShards[i]; - + bool timeToStop = stopShardInfo.BeginDate + stopShardInfo.Delay <= now; uint32 timeLeft = (stopShardInfo.BeginDate + stopShardInfo.Delay) - now; // check every service @@ -788,7 +788,7 @@ namespace ADMIN if (timeToStop) { nlinfo("All local service for shard %s are stopped", stopShardInfo.ShardName.c_str()); - // shard stopped, erase this entry + // shard stopped, erase this entry _StopingShards.erase(_StopingShards.begin()+i); --i; } @@ -820,7 +820,7 @@ namespace ADMIN return txt; } - + // the following routine reads the text string contained in the "pid.state" file for this service // it's used to provide a early pid information to the AES (before the service is connected) uint32 getOfflineServicePID(const std::string& serviceAlias) @@ -855,7 +855,7 @@ namespace ADMIN { // open the file for reading FILE* f= nlfopen(getServiceLoopCounterFileName(serviceAlias), "rt"); - if (f==NULL) + if (f==NULL) return 0; // setup a buffer to hold the text read from the file @@ -893,7 +893,7 @@ namespace ADMIN return true; } - + std::string getServiceStateFileName(const std::string& serviceAlias) { string servicePath; @@ -1090,7 +1090,7 @@ namespace ADMIN // ss.RunningTags.insert(TRunningTag::rt_locally_started); // _NeedToWriteStateFile = true; // } -// else if (_ShardOrders.find(ss.ShardName) != _ShardOrders.end() +// else if (_ShardOrders.find(ss.ShardName) != _ShardOrders.end() // && _ShardOrders[ss.ShardName] == TRunningOrders::ro_stopped) // { // // the shard is stopped, flag the service as started @@ -1100,7 +1100,7 @@ namespace ADMIN // } // } - sendUpServiceUpdate(); + sendUpServiceUpdate(); } virtual void onTrackedModuleDown(IModuleProxy *moduleProxy) { @@ -1169,7 +1169,7 @@ namespace ADMIN } - sendUpServiceUpdate(); + sendUpServiceUpdate(); } /////////////////////////////////////////////////////////////////////// @@ -1226,7 +1226,7 @@ namespace ADMIN std::string _Data; }; - nldebug("Control command from '%s' : '%s' '%s'", + nldebug("Control command from '%s' : '%s' '%s'", sender->getModuleName().c_str(), serviceAlias.c_str(), command.c_str()); @@ -1239,7 +1239,7 @@ namespace ADMIN as.commandResult(this, commandId, serviceAlias, "ERROR : AES : service not found will dispatching the control command"); return; } - + // ok, we can execute the command concerning the service. CStringDisplayer stringDisplayer; IService::getInstance()->CommandLog.addDisplayer(&stringDisplayer); @@ -1316,7 +1316,7 @@ namespace ADMIN virtual void graphUpdate(NLNET::IModuleProxy *sender, const TGraphDatas &graphDatas) { if (_AdminService != NULL) - { + { CAdminServiceProxy as(_AdminService); as.graphUpdate(this, graphDatas); } @@ -1401,14 +1401,14 @@ namespace ADMIN for (; first != last; ++first) { TServiceState &ss = first->second; - + ss.RunnerLoopCounter.resetCounter(); } return true; } - + NLMISC_CLASS_COMMAND_DECL(execScript) { string cmdLine("/home/nevrax/patchman/aes_runnable_script.sh"); @@ -1718,7 +1718,7 @@ namespace ADMIN } else { - // just update some data related the registered service + // just update some data related the registered service ss.ShardName = ""; ss.RunningTags.erase(TRunningTag::rt_locally_started); ss.RunningTags.erase(TRunningTag::rt_chain_crashing); @@ -1795,7 +1795,7 @@ namespace ADMIN bool registered = _RegisteredServices.find(aliasName) != _RegisteredServices.end(); - log.displayNL(" + Service alias='%s' (%s) ShardName = '%s' RunningState='%s' RunningTag='%s'", + log.displayNL(" + Service alias='%s' (%s) ShardName = '%s' RunningState='%s' RunningTag='%s'", aliasName.c_str(), registered ? "REGISTERED" : "NOT REGISTERED", ss.ShardName.c_str(), diff --git a/ryzom/server/src/entities_game_service/cdb_group.cpp b/ryzom/server/src/entities_game_service/cdb_group.cpp index 760abb1d5c..0268f4b3c3 100644 --- a/ryzom/server/src/entities_game_service/cdb_group.cpp +++ b/ryzom/server/src/entities_game_service/cdb_group.cpp @@ -130,7 +130,6 @@ void CCDBGroup::sendDeltas( uint32 maxBitSize, IDataProvider& dataProvider, uint DBOutput.serial( noChange, CDBChangedPropertyCountBitSize ); } // Write additional provided data (for guild inventory) - nlinfo("provide update"); dataProvider.provideUpdate( DBOutput ); // Send CMessage msgout( "CDB_MULTI_IMPULSION" ); diff --git a/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp b/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp index ad56765d7a..5a237eee01 100644 --- a/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp +++ b/ryzom/server/src/entities_game_service/game_item_manager/player_inventory.cpp @@ -108,13 +108,6 @@ void CInventoryBase::setSlotCount(uint size) _FreeSlotCount++; } } - if (_InventoryId == INVENTORIES::guild) - { - nlinfo("_InventoryBulk:"); - for (uint8 i = 0; i < GUILD_NB_CHESTS; i++) - nlinfo("_InventoryBulk[%u] = %u", i, _InventoryBulk[i]); - } - } /// Return the inventory size in slot @@ -199,12 +192,10 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it if (_InventoryId == INVENTORIES::guild) { uint8 chest = floor((float)slot / (float)GuildChestSlots); - nlinfo("item stack + InventoryBulk(%u) = %u + %u = %u > getMaxBulk(%u) = %u", chest, item->getStackBulk(), getInventoryBulk(chest), item->getStackBulk() + getInventoryBulk(chest), chest, getMaxBulk(chest)); if (item->getStackBulk() + getInventoryBulk(chest) > getMaxBulk(chest)) return ior_overbulk; minSlotSearch = GuildChestSlots*chest; - nlinfo("Slot = %d, minSlotSearch = %d", slot, minSlotSearch); slot = INVENTORIES::INSERT_IN_FIRST_FREE_SLOT; } @@ -229,8 +220,6 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it slotBegin = slotSearch + GuildChestSlots; } - nlinfo("Search stackable slot %d <-> %d", slotSearch, slotBegin); - // Modification to do : (slot to put item, stack size to put) vector< pair<uint32,uint32> > Modifs; @@ -263,7 +252,6 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it if (bFound) { - nlinfo("Found stackable %d", slotSearch); // We found a slot with an existing stack that is compatible // Try to put as much as we can into this stack if (itemStackSize > _Items[slotSearch]->getMaxStackSize() - _Items[slotSearch]->getStackSize()) @@ -281,15 +269,11 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it Modifs.push_back(make_pair(slotSearch, itemStackSize)); break; // finished } - } else { - nlinfo("Not found stackable", slotSearch); } if (_InventoryId == INVENTORIES::guild) { - nlinfo("Need found free slot"); slotSearch = getFirstFreeSlot(minSlotSearch, minSlotSearch + GuildChestSlots); - nlinfo("Found %d", slotSearch); if (slotSearch == INVENTORIES::INVALID_INVENTORY_SLOT) return ior_no_free_slot; } @@ -323,7 +307,6 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it item->setInventory(CInventoryPtr(this), slotModif); // update weight and bulk "manually" - nlinfo("updateWeightAndBulk"); updateWeightAndBulk(item, sizeModif); --_FreeSlotCount; @@ -366,7 +349,6 @@ CInventoryBase::TInventoryOpResult CInventoryBase::doInsertItem(CGameItemPtr &it _Items[slot] = item; item->setInventory(CInventoryPtr(this), slot); - nlinfo("updateWeightAndBulk"); updateWeightAndBulk(item, item->getStackSize()); --_FreeSlotCount; @@ -458,7 +440,6 @@ CGameItemPtr CInventoryBase::removeItem(uint32 slot, uint32 quantity, TInventory _Items[slot]->getRefInventory()->removeItem(_Items[slot]->getRefInventorySlot()); } - nlinfo("updateWeightAndBulk"); updateWeightAndBulk(ret, -sint32(ret->getStackSize())); // unlink the item @@ -715,7 +696,6 @@ void CInventoryBase::onItemStackSizeChanged(uint32 slot, uint32 previousStackSiz CGameItemPtr item = getItem(slot); sint32 deltaSize = item->getStackSize() - previousStackSize; - nlinfo("updateWeightAndBulk"); updateWeightAndBulk(item, deltaSize); // callback all the views @@ -737,18 +717,11 @@ void CInventoryBase::updateWeightAndBulk(const CGameItemPtr &item, sint32 deltaQ { uint8 chest = 0; if (_InventoryId == INVENTORIES::guild) - { chest = floor((float)item->getInventorySlot() / (float)GuildChestSlots); - nlinfo("updateWeightAndBulk: %u / %u => %u", item->getInventorySlot(), (uint32)GuildChestSlots, chest); - } _InventoryBulk[chest] = uint32(max(sint32(0), sint32(_InventoryBulk[chest] + form->Bulk*deltaQt))); _InventoryWeight = uint32(max(sint32(0), sint32(_InventoryWeight + item->weight()*deltaQt))); - if (_InventoryId == INVENTORIES::guild) - { - nlinfo("_InventoryBulk: %u vs getMaxBulk: %u", _InventoryBulk[chest], getMaxBulk(chest)); - } if (_InventoryWeight > getMaxWeight()) { nlwarning("Inventory '%s' : weight is overload", INVENTORIES::toString(_InventoryId).c_str()); @@ -870,7 +843,6 @@ void CInventoryBase::forceViewUpdateOfInventory(bool skipEmptySlots) uint32 CInventoryBase::getFirstFreeSlot(uint32 start, uint32 end) const { nlassert(_FreeSlotCount > 0); - nlinfo("getFirstFreeSlot %d <-> %d", start, end); // look for a valid slot for (uint i = start; i < end; ++i) { @@ -972,7 +944,7 @@ CInventoryBase::TInventoryOpResult CRefInventory::doInsertItem(CGameItemPtr &ite // insert and link the new item _Items[slot] = item; item->setRefInventory(CInventoryPtr(this), slot); - nlinfo("updateWeightAndBulk"); + updateWeightAndBulk(item, item->getStackSize()); --_FreeSlotCount; @@ -1011,7 +983,6 @@ CGameItemPtr CRefInventory::removeItem(uint32 slot, uint32 quantity, TInventoryO CGameItemPtr item = _Items[slot]; _Items[slot] = NULL; ++_FreeSlotCount; - nlinfo("updateWeightAndBulk"); updateWeightAndBulk(ret, -sint32(ret->getStackSize())); // callbacks for derived class diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp index 74d733f623..22c57fe716 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp @@ -2594,14 +2594,12 @@ class COldGuildInventoryLoader #define PERSISTENT_POST_APPLY\ CGuildVersionAdapter::getInstance()->adaptGuildFromVersion(*this);\ _Chests.resize(GUILD_NB_CHESTS);\ - nlinfo("GUILD HAVE %u CHESTS", _Chests.size());\ for (uint8 chest=0; chest < _Chests.size(); chest++)\ {\ if (chest < 2 && _Chests[chest].BulkMax < 6000)\ _Chests[chest].BulkMax = 6000;\ if (chest < 2 && _Chests[chest].Name.empty())\ _Chests[chest].Name = NLMISC::toString("Chest #%u", chest+1);\ - nlinfo("Send DB for chest %u", chest);\ _Inventory->setChestMaxBulk(chest, _Chests[chest].BulkMax);\ CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setNAME(_DbGroup, _Chests[chest].Name, true);\ CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setVIEW_GRADE(_DbGroup, _Chests[chest].ViewGrade, true);\ From d5df5bd115753afc6c342d997aa7257ce79f5928 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Fri, 14 Jun 2024 14:20:12 +0200 Subject: [PATCH 187/194] Fix issue with return of command to egs --- ryzom/server/src/admin_modules/aes_client_module.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ryzom/server/src/admin_modules/aes_client_module.cpp b/ryzom/server/src/admin_modules/aes_client_module.cpp index d0aa194130..c219df2b3d 100644 --- a/ryzom/server/src/admin_modules/aes_client_module.cpp +++ b/ryzom/server/src/admin_modules/aes_client_module.cpp @@ -456,7 +456,7 @@ namespace ADMIN // retrieve the command from the input message and execute it ADMINCMDLOG("'%s'", command.c_str()); - ICommand::execute (command, IService::getInstance()->CommandLog, true); + ICommand::execute (command, IService::getInstance()->CommandLog); // unhook our displayer as it's work is now done IService::getInstance()->CommandLog.removeDisplayer(&stringDisplayer); @@ -475,7 +475,7 @@ namespace ADMIN { // retrieve the command from the input message and execute it ADMINCMDLOG("'%s'", command.c_str()); - ICommand::execute (command, IService::getInstance()->CommandLog, true); + ICommand::execute (command, IService::getInstance()->CommandLog); } }; From caab1620cef7a60c3716688ca731b0934c594de2 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Sat, 15 Jun 2024 01:44:28 +0200 Subject: [PATCH 188/194] Fixes --- .../client/data/gamedev/interfaces_v3/ark.lua | 3 --- .../data/gamedev/interfaces_v3/ark_shop.lua | 21 +++++++++++++++++-- .../data/gamedev/interfaces_v3/inventory.lua | 1 - .../mission_manager/missions_commands.cpp | 2 ++ 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark.lua b/ryzom/client/data/gamedev/interfaces_v3/ark.lua index dc928f5699..ddbb4d15ab 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark.lua @@ -295,10 +295,7 @@ end function ArkSelectRyform(curwin, id, mod) local curwin = getUICaller().id - debug(curwin) - debug(ArkGetStageEdit(curwin)) local e = ArkGetStageEdit(curwin):find(id..":eb") - debug(ArkGetStageEdit(curwin):find(id)) e.input_string = mod ArkGetStageEdit(curwin):find("send:b"):runLeftClickAction() end diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua b/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua index 86f318a705..eeea0956a4 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua @@ -327,7 +327,6 @@ function arkNpcShop:generateMp(mps) end for sheet in string.gmatch(sheets, "([^|]+)") do - debug(sheet) if string.sub(sheet, 1, 1) == "#" then local all_sheets = game.RawCreaturesMats[string.sub(sheet, 2)] if sheets ~= nil then @@ -375,7 +374,7 @@ function arkNpcShop:getHtmlIcon(id, item) addDbProp("UI:TEMP:ARK:SELECTITEM:USER_COLOR", item[9]) return [[<div class="ryzom-ui-grouptemplate" style="template:arkshop_inv_item;id:inv_special_bag_item;usesheet:true;isvirtual:false;sheetdb:UI:TEMP:ARK:SELECTITEM;w:40;params_r:arkNpcShop:OpenSheetInfosWindow(]]..id..[[);"></div>]] else - return [[<div class="ryzom-ui-grouptemplate" style="template:arkshop_inv_item;id:inv_special_bag_item;usesheet:false;isvirtual:true;w:44;quantity: ;quality:]]..item[4]..[[;tooltip:]]..item[6]..[[;gc2:true;gc1:true;img1:]]..item[2]..[[;col_over:0 0 0 0"></div>]] + return [[<div class="ryzom-ui-grouptemplate" style="template:arkshop_inv_item;id:inv_special_bag_item;usesheet:false;isvirtual:true;w:44;quantity: ;quality:]]..tostring(item[4])..[[;tooltip:]]..tostring(item[6])..[[;gc2:true;gc1:true;img1:]]..tostring(item[2])..[[;col_over:0 0 0 0"></div>]] end end @@ -521,3 +520,21 @@ function arkNpcShop:selectSheet(item, id) whm_html = getUI("ui:interface:webig_html_modal:html") whm_html:renderHtml(html) end + +function arkNpcShop:updateTexts(id, ctrl, text1, text2, text3) + local shop_item = getUI(arkNpcShop.window):find("ark_npc_shop_item_"..id) + if shop_item then + if ctrl then + shop_item:find("ctrl").tooltip = getUCtf8(ctrl) + else + shop_item:find("ctrl").tooltip = "" + end + shop_item:find("text1").uc_hardtext_format = text1 + shop_item:find("text2").uc_hardtext_format = getUCtf8(text2) + if text3 then + shop_item:find("text3").uc_hardtext_format = getUCtf8(text3) + else + shop_item:find("text3").uc_hardtext_format = "" + end + end +end diff --git a/ryzom/client/data/gamedev/interfaces_v3/inventory.lua b/ryzom/client/data/gamedev/interfaces_v3/inventory.lua index c7b05d8239..48976282ac 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/inventory.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/inventory.lua @@ -117,7 +117,6 @@ function updateChestList(init) local all_str_available = true for i=0, 19 do local name_id = getDbProp("SERVER:GUILD:CHEST:"..tostring(i)..":NAME") - debug(name_id) if name_id > 0 then if not isSrvStringAvailable(name_id) then all_str_available = false diff --git a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp index 26cc4fc337..a9d4753da2 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/missions_commands.cpp @@ -1358,6 +1358,8 @@ NLMISC_COMMAND(getGuildInventoryChestParams, "Get the params of a chest of inven log.displayNL("%s", EGSPD::CGuildGrade::toString(guild->getChestViewGrade(chest)).c_str()); log.displayNL("%s", EGSPD::CGuildGrade::toString(guild->getChestPutGrade(chest)).c_str()); log.displayNL("%s", EGSPD::CGuildGrade::toString(guild->getChestGetGrade(chest)).c_str()); + uint32 bulkmax = guild->getChestBulkMax(chest); + log.displayNL("%u", bulkmax); } return true; } From b8b2e8158731df166421b012aaaca1f06232ed56 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Sat, 15 Jun 2024 01:56:23 +0200 Subject: [PATCH 189/194] fix --- ryzom/server/src/entities_game_service/inventory_updater.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/inventory_updater.h b/ryzom/server/src/entities_game_service/inventory_updater.h index 80f6e77f21..8a5db29230 100644 --- a/ryzom/server/src/entities_game_service/inventory_updater.h +++ b/ryzom/server/src/entities_game_service/inventory_updater.h @@ -489,7 +489,7 @@ bool CInventoryUpdater<CInventoryCategoryTemplate>::fillAllUpdates( NLMISC::CBi // Number field uint32 nbChanges = (uint32)_ItemUpdates[invId].size(); - nlinfo("nbChanges= %d", nbChanges); + if ( nbChanges < INVENTORIES::LowNumberBound ) { destStream.serial( nbChanges, INVENTORIES::LowNumberBits ); From f53b6ffc60fcb5ce757670e288385217ff61b6d6 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Sun, 16 Jun 2024 11:23:19 +0200 Subject: [PATCH 190/194] Fix issue with chest rename --- ryzom/server/src/entities_game_service/guild_manager/guild.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp index 22c57fe716..cd3542ad7a 100644 --- a/ryzom/server/src/entities_game_service/guild_manager/guild.cpp +++ b/ryzom/server/src/entities_game_service/guild_manager/guild.cpp @@ -218,8 +218,9 @@ void CGuild::setChestParams(uint8 chest, std::string name, EGSPD::CGuildGrade::T NLMISC::TStringId strId = CStringMapper::map( name ); ucstring ucname; ucname.fromUtf8(name); - CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setNAME(_DbGroup, 0); if (name == "") + CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setNAME(_DbGroup, 0); + else CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setNAME(_DbGroup, ucname, true); CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setVIEW_GRADE(_DbGroup, gradeView); CBankAccessor_GUILD::getGUILD().getCHEST().getArray(chest).setPUT_GRADE(_DbGroup, gradePut); From 5cd0fbdebc9db7cae059cde9239e3b9d5f5beb59 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Wed, 19 Jun 2024 02:32:51 +0200 Subject: [PATCH 191/194] Fix issue with bulk progress bar Added stuff from Ark. Added raw creature mats and world --- .../client/data/gamedev/interfaces_v3/ark.lua | 102 +- .../data/gamedev/interfaces_v3/ark_shop.lua | 36 +- .../gamedev/interfaces_v3/interaction.lua | 328 ------ .../client/data/gamedev/interfaces_v3/map.lua | 6 +- .../data/gamedev/interfaces_v3/player.lua | 7 +- .../interfaces_v3/raw_creature_mats.lua | 45 + .../gamedev/interfaces_v3/webig_widgets.xml | 2 + .../data/gamedev/interfaces_v3/widgets.xml | 2 +- .../data/gamedev/interfaces_v3/world.lua | 1008 +++++++++++++++++ .../src/entities_game_service/cdb_group.cpp | 2 - .../entity_manager/entity_callbacks.cpp | 1 - .../mission_manager/mission_step_item.cpp | 22 +- .../character_inventory_manipulation.cpp | 2 - 13 files changed, 1199 insertions(+), 364 deletions(-) create mode 100644 ryzom/client/data/gamedev/interfaces_v3/raw_creature_mats.lua create mode 100644 ryzom/client/data/gamedev/interfaces_v3/world.lua diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark.lua b/ryzom/client/data/gamedev/interfaces_v3/ark.lua index ddbb4d15ab..aa0614dcec 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark.lua @@ -34,6 +34,27 @@ function tablelength(T) return count end +function table_compare(t1, t2) + local ty1 = type(t1) + local ty2 = type(t2) + if ty1 ~= ty2 then return false end + -- non-table types can be directly compared + if ty1 ~= 'table' and ty2 ~= 'table' then return t1 == t2 end + -- as well as tables which have the metamethod __eq + local mt = getmetatable(t1) + if not ignore_mt and mt and mt.__eq then return t1 == t2 end + + for k1, v1 in pairs(t1) do + local v2 = t2[k1] + if v2 == nil or v1 ~= v2 then return false end + end + for k2,v2 in pairs(t2) do + local v1 = t1[k2] + if v1 == nil or v2 ~= v1 then return false end + end + return true +end + function openPageInWebIg(url) getUI("ui:interface:webig:content:html"):browse(url) getUI("ui:interface:webig").active = true @@ -77,6 +98,68 @@ function getArkScript(id, selected) return url end + +-------------------------------------------------------------------------------- +--- ARK DYNE --- +-------------------------------------------------------------------------------- + +if DynE == nil then + DynE = {} + DynE.lastWinUpdate = 0 + DynE.otherMapPoints = {} +end + +function DynE:OpenStoryline(season, episode) + ArkMissionCatalog:OpenCat("storyline", "https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script=8840&season="..season.."&episode="..tostring(episode+1)) + getUI("ui:interface:encyclopedia").opened = true + getUI("ui:interface:encyclopedia").active = true +end + +function DynE:SetMap(name, x, y, desc) + local link = getUI(DynEWindowId):find(name) + if link ~= nil then + link = link:find(":b") + link.onover = "lua" + link.params_over = "DynE:OpenMap("..x..","..y..")" + end +end + +function DynE:OpenMap(x, y) + local html = [[<img src="https://api.bmsite.net/maps/static?flags=0&language=]]..tostring(getClientCfg("LanguageCode"))..[[&markers=icon:lm_marker|]]..x..[[,]]..y..[[&maptype=atys&size=380x90"/>]]..tostring(i18n.get("uiMovingTargetWarning")) + runAH(nil, "enter_modal", "group=ui:interface:webig_html_modal") + local whm = getUI("ui:interface:webig_html_modal") + whm.child_resize_h=false + whm_html = getUI("ui:interface:webig_html_modal:html") + if whm_html ~= nil then + whm.w = 410 + whm.h = 150 + whm_html:renderHtml(html) + end +end + +function DynE:RunMission(script, posX, posY) + local html = getUI("ui:interface:web_transactions"):find("html") + html:browse("https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script="..script.."&command=reset_all&PosX="..posX.."&PosY="..posY.."&FlagName=Go+to".."&MissionText=Go") +end + +function DynE:OpenHelp(img) + local html = getUI("ui:interface:web_transactions"):find("html") + html:browse("https://app.ryzom.com/app_arcc/index.php?action=mScript_Run&script=9600&command=reset_all&img="..img) +end + +function DynE:UpdateMapWindow() + if (nltime.getLocalTime() - DynE.lastWinUpdate) > 60000 then + local win_html = getUI("ui:interface:app2453:browser:content:html") + local map_html = getUI("ui:interface:map:content:map_content:lm_events:html") + map_html:browse("home") + if win_html ~= nil then + win_html:renderHtml(map_html.html) + end + + DynE.lastWinUpdate = nltime.getLocalTime() + end +end + -------------------------------------------------------------------------------- --- ARK MISSION CATALOG --- -------------------------------------------------------------------------------- @@ -342,10 +425,27 @@ function ArkOnSelectChanged(name) ArkFindUI(name..":eb").input_string = text end +function ArkV5GetSelectEntity(prefix, input) + name = getTargetName() + if name == "" then + name = getTargetTitle() + end + if name ~= "" and name ~= nil then + webig:openUrlInBg("https://app.ryzom.com/app_arcc/scripts/get_bot.php?action=ark_editor&ui="..encodeURLParam(getUICaller().id).."&prefix="..tostring(prefix).."&input="..tostring(input).."&bot="..encodeURLParam(base64.encode(name))) + end +end +function fixUrl(url) + s, n = string.gsub(url, "{amp}", "&") + return s +end +function openUrlInBg(url) + getUI("ui:interface:web_transactions"):find("html"):browse(fixUrl(url)) +end +-- S2E1 STUFF -- if S2E1 == nil then @@ -767,7 +867,5 @@ function S2E1:newQuake(timer) end - - -- VERSION -- RYZOM_ARK_VERSION = 335 diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua b/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua index eeea0956a4..39852ccfd7 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua @@ -266,10 +266,23 @@ function arkNpcShop:timer(id, len) getUI("ui:interface:current_action").active=false setOnDraw(getUI("ui:interface:current_action"), "") local quantity = getUI("ui:interface:ark_shop_buy_item"):find("edit"):find("eb").input_string - getUI("ui:interface:web_transactions"):find("html"):browse(arkNpcShop.ValidateUrl..quantity.."&item_id="..id.."&item_selection="..arkNpcShop.selectedItems[id]) + if id ~= nil then + getUI("ui:interface:web_transactions"):find("html"):browse(arkNpcShop.ValidateUrl..quantity.."&item_id="..tostring(id).."&item_selection="..arkNpcShop.selectedItems[id]) + end end end +function arkNpcShop:StartProgress(id, text, len) + local message = ucstring() + message:fromUtf8(text) + displaySystemInfo(message, "BC") + savedTime = nltime.getLocalTime() + getUI("ui:interface:current_action").active=true + if len > 200 then + len = 200 + end + setOnDraw(getUI("ui:interface:current_action"), "arkNpcShop:timer("..tostring(id)..", "..tostring(len)..")") +end function arkNpcShop:Buy(id) local item = arkNpcShop.items[id] @@ -282,24 +295,21 @@ function arkNpcShop:Buy(id) if arkNpcShop.AtysPoint then if item[8] == 0 then - local message = ucstring() - message:fromUtf8(arkNpcShop.AtysPointsBuyMessage) - displaySystemInfo(message, "BC") - savedTime = nltime.getLocalTime() - getUI("ui:interface:current_action").active=true - local len = item[1] - if len > 200 then - len = 200 - end - setOnDraw(getUI("ui:interface:current_action"), "arkNpcShop:timer("..id..", "..tostring(len)..")") + arkNpcShop:StartProgress(id, arkNpcShop.AtysPointsBuyMessage, item[1]) else + if arkNpcShop.AtysProgressBuyLen > 0 then + arkNpcShop:StartProgress("nil", arkNpcShop.AtysProgressBuyMessage, arkNpcShop.AtysProgressBuyLen) + end getUI("ui:interface:web_transactions"):find("html"):browse(arkNpcShop.ValidateUrl..quantity.."&item_id="..id.."&item_selection="..arkNpcShop.selectedItems[id]) end else - getUI("ui:interface:web_transactions"):find("html"):browse(arkNpcShop.ValidateUrl..quantity.."&item_id="..id.."&item_selection="..arkNpcShop.selectedItems[id]) + if arkNpcShop.AtysProgressBuyLen > 0 then + arkNpcShop:StartProgress("nil", arkNpcShop.AtysProgressBuyMessage, arkNpcShop.AtysProgressBuyLen) + end + -- getUI("ui:interface:web_transactions"):find("html"):browse(arkNpcShop.ValidateUrl..quantity.."&item_id="..id.."&item_selection="..arkNpcShop.selectedItems[id]) end end - arkNpcShop:Close() + -- arkNpcShop:Close() if arkNpcShop.window ~= "ui:interface:ark_npc_shop" then getUI("ui:interface:encyclopedia").active=false end diff --git a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua index b9a71b3c6a..eb3210dde0 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua @@ -989,333 +989,5 @@ function game:TalkWithNpc(bullying) end end - ------------------------------------ ---- ARK NPC SHOP - -function tablelength(T) - if T == nil then - return 0 - end - local count = 0 - for _ in pairs(T) do count = count + 1 end - return count -end - -function arkNpcShop:showBuy() - getUI("ui:interface:ark_shop_buy_item"):find("ok").active=true -end - -function arkNpcShop:openSection(url) - framewin = getUI("ui:interface:ark_npc_shop"):find("buy"):renderHtml(arkNpcShop.PleaseWait) - getUI("ui:interface:web_transactions"):find("html"):browse(url) -end - -function arkNpcShop:updateWindow(px, py) - local x, y, z = getPlayerPos() - local stop = false - if (px-x)*(px-x)+(py-y)*(py-y) > 25 then - local w = getUI("ui:interface:ark_npc_shop") - w.active = false - setOnDraw(w, "") - getUI("ui:interface:ark_shop_buy_item").active = false - arkNpcShop.player_can_buy = false - broadcast(arkNpcShop.TooFar) - end - - local diff = math.floor((nltime.getLocalTime() - arkNpcShop.lastMultipleItemsUpdate ) / 10) - if diff >= 100 then - arkNpcShop.lastMultipleItemsUpdate = nltime.getLocalTime() - if arkNpcShop.player_money_per_items ~= nil then - for item, price in pairs(arkNpcShop.player_money_per_items) do - if arkNpcShop.lastMultipleItemsIndex[item] == nil then - arkNpcShop.lastMultipleItemsIndex[item] = {} - end - for i = 1,5 do - local w = getUI("ui:interface:ark_npc_shop"):find("ark_npc_shop_item_"..item.."_price"..tostring(i)) - if w ~= nil and arkNpcShop.all_items[item] ~= nil and arkNpcShop.all_items[item][i] ~= nil then - if price[i] ~= nil and price[i] < 1 then - if arkNpcShop.lastMultipleItemsIndex[item][i] == nil then - arkNpcShop.lastMultipleItemsIndex[item][i] = 0 - end - - arkNpcShop.lastMultipleItemsIndex[item][i] = arkNpcShop.lastMultipleItemsIndex[item][i] + 1 - if arkNpcShop.lastMultipleItemsIndex[item][i] > tablelength(arkNpcShop.all_items[item][i]) then - arkNpcShop.lastMultipleItemsIndex[item][i] = 1 - end - - local sheet = arkNpcShop.all_items[item][i][arkNpcShop.lastMultipleItemsIndex[item][i]] - if sheet ~= ".sitem" then - setDbProp("UI:TEMP:ARK:ITEM:"..item.."_"..tostring(i)..":SHEET", getSheetId(sheet)) - end - end - end - end - end - end - end -end - -function arkNpcShop:checkitems(db, items, quality, id) - total = 0 - for i = 0, 499, 1 do - local sheet = getDbProp("SERVER:INVENTORY:BAG:"..tostring(i)..":SHEET") - if sheet ~= 0 then - local name = string.lower(getSheetName(sheet)) - for _, item in pairs(items) do - if name == item then - local qual = getDbProp("SERVER:INVENTORY:BAG:"..tostring(i)..":QUALITY") - local quant = getDbProp("SERVER:INVENTORY:BAG:"..tostring(i)..":QUANTITY") - - if qual >= quality then - total = total + quant - setDbProp(db..":SHEET", sheet) - setDbProp(db..":QUALITY", qual) - end - end - end - end - end - return total -end - -function arkNpcShop:getHtmlIcon(id, item) - if string.sub(item[2], 1, 1) == "#" then - addDbProp("UI:TEMP:ARK:SELECTITEM:RESALE_FLAG", 0) - - if string.sub(item[3], 1, 1) == "!" then - webig:addSheet("UI:TEMP:ARK:SELECTITEM", getSheetId(item[7]), item[4], tonumber(string.sub(item[3], 2))) - else - webig:addSheet("UI:TEMP:ARK:SELECTITEM", getSheetId(item[7]), item[4], 1) - end - addDbProp("UI:TEMP:ARK:SELECTITEM:USER_COLOR", item[9]) - return [[<div class="ryzom-ui-grouptemplate" style="template:arkshop_inv_item;id:inv_special_bag_item;usesheet:true;isvirtual:false;sheetdb:UI:TEMP:ARK:SELECTITEM;w:40;params_r:arkNpcShop:OpenSheetInfosWindow(]]..id..[[);"></div>]] - else - return [[<div class="ryzom-ui-grouptemplate" style="template:arkshop_inv_item;id:inv_special_bag_item;usesheet:false;isvirtual:true;w:44;quantity: ;quality:]]..item[4]..[[;tooltip:u:]]..item[6]..[[;gc2:true;gc1:true;img1:]]..item[2]..[[;col_over:0 0 0 0"></div>]] - end -end - - -function arkNpcShop:OpenSheetInfosWindow(id) - local w = getUI("ui:interface:ark_npc_shop") - local x = w:find("buy"):find("ark_npc_shop_item_"..tostring(id)) - runAH(x:find("sheet"), "open_help_auto", "") - -end - -function arkNpcShop:HideHelpWindow(id) - -- Check what help window are active - local help_active={} - for i = 0,7 do - help_active[i] = getUI("ui:interface:sheet_help"..i).active - end - - arkNpcShop:OpenSheetInfosWindow(id) - - -- Apply previous stats of help window - for i = 0,7 do - getUI("ui:interface:sheet_help"..i).active = help_active[i] - end -end - -function arkNpcShop:OpenItemWindow(id, buy) - local item = arkNpcShop.items[id] - if arkNpcShop.all_items[id] ~= nil and arkNpcShop.all_items[id].need_real_item ~= nil then - arkNpcShop.max_quantity = 1 - else - if string.sub(item[3], 1, 1) == "!" then - arkNpcShop.max_quantity = 1 - else - arkNpcShop.max_quantity = item[3] - end - end - - arkNpcShop:HideHelpWindow(id) - - local non_buy_window_w = 400 - - local ui_item_preview = getUI("ui:interface:ark_shop_buy_item:content:header_opened:item_preview") - if ui_item_preview then - ui_item_preview.active = false - end - - local ui_item_show_desc = getUI("ui:interface:ark_shop_buy_item:content:header_opened:desc") - if ui_item_show_desc then - ui_item_show_desc.active = item[2] == "#sheet" - end - - if string.sub(item[2], 1, 1) == "#" then - local item_type = getSheetFamily(item[7]) - local display_preview = item_type == "SHIELD" or item_type == "ARMOR" or item_type == "MELEE_WEAPON" or item_type == "RANGE_WEAPON" - if ui_item_preview then - ui_item_preview.active = display_preview - end - - if display_preview then - non_buy_window_w = 495 - else - -- Items who are not named items must display help window when no buy - if buy == nil and item[2] == "#sheet" then - arkNpcShop:OpenSheetInfosWindow(id) - return - end - end - end - - if buy == true then - arkNpcShop.price = item[1] - setDbProp("UI:TEMP:ARK_MONEY_PRICE", arkNpcShop.price) - setDbProp("UI:TEMP:ARK_MONEY_TOTAL", arkNpcShop.price) - - if arkNpcShop.price > arkNpcShop.player_money then - arkNpcShop.player_can_buy = false - else - arkNpcShop.player_can_buy = true - end - end - - local framewin = getUI("ui:interface:ark_shop_buy_item") - if framewin == nil then - createRootGroupInstance("webig_bot_chat_buy_item", "ark_shop_buy_item", {id="content", infosclick="arkNpcShop:OpenSheetInfosWindow("..id..")", onclick="arkNpcShop:Buy("..id..")"}) - framewin = getUI("ui:interface:ark_shop_buy_item") - framewin.x = math.ceil(((getUI("ui:interface").w - framewin.w))/2) - framewin.y = math.ceil(((getUI("ui:interface").h + framewin.h))/2) - end - - runAH(nil, "proc", "ark_shop_animate_preview_body") - - if buy == true then - local eb = framewin:find("edit"):find("eb") - eb.input_string = 1 - eb:setFocusOnText() - eb:setSelectionAll() - framewin:find("item_total_price"):find("icone").texture = arkNpcShop.MoneyIcon - framewin:find("item_price"):find("icone").texture = arkNpcShop.MoneyIcon - framewin:find("item_total_price"):find("tt").tooltip = arkNpcShop.Money - framewin:find("item_price"):find("tt").tooltip = arkNpcShop.Money - arkNpcShop.window_params = {-70, 305, 408} - else - arkNpcShop.window_params = {-20, 380, non_buy_window_w} - end - - framewin:find("top").active = buy == true -- active onlye if buy - framewin:find("scroll_text").y=arkNpcShop.window_params[1] - framewin:find("scroll_text").h=arkNpcShop.window_params[2] - framewin.w=arkNpcShop.window_params[3] - framewin.uc_title = getUCtf8(item[6]) - - if buy == true then - local html = "" - html = arkNpcShop:getHtmlIcon(id, item) - framewin:find("buy_sell_slot"):renderHtml(html) - if string.sub(item[5], 1 , 8) == "https://" then - framewin:find("ok").active=false - framewin:find("infos"):renderHtml(arkNpcShop.PleaseWait) - framewin:find("infos"):browse(item[5]) - else - framewin:find("ok").active=true - framewin:find("infos"):renderHtml("<table width='380px'><tr><td>"..item[5].."</td></tr></table>") - end - arkNpcShop:CheckMoney() - -- framewin:setModalParentList("ui:interface:ark_npc_shop") - else - html = arkNpcShop:getHtmlIcon(id, item) - framewin:find("infos"):renderHtml([[ - <table width="100%"> - <tr> - <td width="40px" valign="top">]]..html..[[</td> - <td >]]..item[5]..[[</td> - </tr> - </table> - ]]) - end - - framewin:find("desc").params_l = "arkNpcShop:OpenSheetInfosWindow("..id..")" - framewin:find("ok").params_l = "arkNpcShop:Buy("..id..")" - framewin.opened=true - framewin.active=true -end - - -function arkNpcShop:CheckMoney() - local win = getUI("ui:interface:ark_shop_buy_item") - local value = tonumber(win:find("edit"):find("eb").input_string) - if value == nil or value == 0 then - value = 1 - end - if arkNpcShop.max_quantity ~= 0 and value > arkNpcShop.max_quantity then - win:find("edit"):find("eb").input_string = arkNpcShop.max_quantity - value = arkNpcShop.max_quantity - end - - local total = arkNpcShop.price*value - - if total > arkNpcShop.player_money then - win:find("ok").hardtext="uiNotEnoughMoney" - arkNpcShop.player_can_buy = false - else - win:find("ok").hardtext = arkNpcShop.ActionName - arkNpcShop.player_can_buy = true - end - setDbProp("UI:TEMP:ARK_MONEY_TOTAL", total) -end - -function arkNpcShop:Close() - local framewin = getUI("ui:interface:ark_npc_shop") - if framewin ~= nil then - framewin.active=false - end - - framewin = getUI("ui:interface:ark_shop_buy_item") - if framewin ~= nil then - framewin.active=false - end - -end - -function arkNpcShop:timer(id, len) - local diff = math.floor((nltime.getLocalTime() - savedTime) / 50) - getUI("ui:interface:current_action").active=true - setDbProp("UI:PHRASE:ACT_BAR_LEN", (100/len)*diff) - if diff >= len then - getUI("ui:interface:current_action").active=false - setOnDraw(getUI("ui:interface:current_action"), "") - local quantity = getUI("ui:interface:ark_shop_buy_item"):find("edit"):find("eb").input_string - getUI("ui:interface:web_transactions"):find("html"):browse(arkNpcShop.ValidateUrl..quantity.."&item_id="..id.."&item_selection="..arkNpcShop.selectedItems[id]) - end -end - - -function arkNpcShop:Buy(id) - local item = arkNpcShop.items[id] - local win = getUI("ui:interface:ark_shop_buy_item") - local quantity = win:find("edit"):find("eb").input_string - if arkNpcShop.player_can_buy then - local message = ucstring() - message:fromUtf8("@{F5FF}"..getUI("ui:interface:target").title..": @{FF0F}I\'m checking to see if you\'re trying to rip him off... ") - -- displaySystemInfo(message, "BC") - - if arkNpcShop.AtysPoint then - if item[8] == 0 then - local message = ucstring() - message:fromUtf8(arkNpcShop.AtysPointsBuyMessage) - displaySystemInfo(message, "BC") - savedTime = nltime.getLocalTime() - getUI("ui:interface:current_action").active=true - local len = item[1] - if len > 200 then - len = 200 - end - setOnDraw(getUI("ui:interface:current_action"), "arkNpcShop:timer("..id..", "..tostring(len)..")") - else - getUI("ui:interface:web_transactions"):find("html"):browse(arkNpcShop.ValidateUrl..quantity.."&item_id="..id.."&item_selection="..arkNpcShop.selectedItems[id]) - end - else - getUI("ui:interface:web_transactions"):find("html"):browse(arkNpcShop.ValidateUrl..quantity.."&item_id="..id.."&item_selection="..arkNpcShop.selectedItems[id]) - end - end - arkNpcShop:Close() -end - -- VERSION -- RYZOM_INTERACTION_VERSION = 335 diff --git a/ryzom/client/data/gamedev/interfaces_v3/map.lua b/ryzom/client/data/gamedev/interfaces_v3/map.lua index 62b31fb267..05292486ce 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/map.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/map.lua @@ -211,7 +211,7 @@ function game:addSpawnShapesByZone(zone, continent, name, displayIcon, setup, fi id2 = game.spawnShapesByZone[continent][name][10] end - table.insert(setup, id1) + table.insert(setup, id1) -- 3 table.insert(setup, id2) table.insert(setup, finish) table.insert(setup, openShape) @@ -227,9 +227,9 @@ function game:addSpawnShapesByZone(zone, continent, name, displayIcon, setup, fi end if displayIcon == 1 then - game:addMapArkPoint(zone, setup[2], setup[3], setup[1], text, icon..".tga") + game:addMapArkPoint(zone, setup[2], setup[3], name, text, icon..".tga") else - game:delMapArkPoint(zone, setup[1]) + game:delMapArkPoint(zone, name) end end diff --git a/ryzom/client/data/gamedev/interfaces_v3/player.lua b/ryzom/client/data/gamedev/interfaces_v3/player.lua index 7aca937557..5c178fd464 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/player.lua @@ -66,11 +66,15 @@ function game:CheckPosition() local cont, region, places = game:getPositionInfos() game:checkScriptPlace(cont) game:checkScriptPlace(region) + if places == nil then + return + end for place, typ in pairs(places) do game:checkScriptPlace(place) end end + function game:getPositionInfos(x, y) local player_cont = "" local player_region = "" @@ -80,7 +84,7 @@ function game:getPositionInfos(x, y) end if game.World == nil then - return + return "", "", {} end for cont, c in pairs(game.World) do @@ -102,6 +106,7 @@ function game:getPositionInfos(x, y) end + ------------------------------------------------------------------------------------------------------------ -- Update player bars in function of what we wants to display (we can hide each one of the 3 bars : sap,stamina and focus) function game:updatePlayerBars() diff --git a/ryzom/client/data/gamedev/interfaces_v3/raw_creature_mats.lua b/ryzom/client/data/gamedev/interfaces_v3/raw_creature_mats.lua new file mode 100644 index 0000000000..ba3811d042 --- /dev/null +++ b/ryzom/client/data/gamedev/interfaces_v3/raw_creature_mats.lua @@ -0,0 +1,45 @@ +if (game==nil) then + game= {}; +end + +game.RawCreaturesMats = { + amber = { "m0015dxa", "m0050dxa", "m0124dxa", "m0117dxa", "m0155dxa", "m0102dxa" }, + wood = { "m0128dxa", "m0064dxa", "m0093dxa", "m0001dxa", "m0040dxa" }, + moss = { "m0147chl", "m0525cpe", "m0575cpa", "m0640cpc", "m0658cpf", "m0660cpd", "m0661cpb" }, + bark = { "m0101dxa", "m0630dxa", "m0014dxa", "m0623dxa", "m0497dxa" }, + trunk = { "m0087chh", "m0547chq", "m0678chu" }, + wing = { "m0335ccj", "m0366cbc", "m0564cba", "m0570cbb", "m0596ckj", "m0609cki" }, + rostrum = { "m0074cke" }, + fiber = { "m0118dxa", "m0021dxa", "m0037dxa", "m0006dxa" }, + resin = { "m0534dxa", "m0624dxa", "m0046dxa", "m0541dxa" }, + shell = { "m0053dxa", "m0125dxa", "m0123dxa", "m0031dxa", "m0016dxa" }, + pelvis = { "m0500chw", "m0504cha", "m0507chn", "m0510chb", "m0515chr", "m0546chq", "m0555chx", "m0612chg", "m0616chv", "m0620chh", "m0638cht", "m0645chm", "m0650chp", "m0656chs", "m0665chk", "m0676chu", "m0683chl" }, + sap = { "m0535dxa", "m0142dxa", "m0109dxa", "m0119dxa", "m0533dxa" }, + leather = { "m0044cca", "m0107cce", "m0137ccd", "m0141cch", "m0145cbc", "m0369ccf", "m0371cbb", "m0372cba", "m0376cck", "m0463ccg", "m0574ccj", "m0579ccm", "m0670cco", "m0687ccp", "m0694cci" }, + node = { "m0679dxa", "m0100dxa", "m0662dxa", "m0629dxa", "m0652dxa" }, + aranawood = { "m0469chw" }, + horn = { "m0018chb", "m0136ccd" }, + hoof = { "m0025chc", "m0378chf" }, + skull = { "m0284cda", "m0285cdb", "m0286cdc" }, + fang = { "m0135ccd", "m0140cch", "m0346cce", "m0347cca", "m0348cck", "m0349ccp", "m0356cci", "m0385ccm", "m0465ccg", "m0626ccf", "m0632ccl", "m0668cco" }, + kitin = { "m0522ccb", "m0528che", "m0549ccc", "m0557ccn", "m0581ckg", "m0584cka", "m0586ckd", "m0588ckb", "m0591ckh", "m0599cke", "m0601ckf" }, + mandible = { "m0481ckb", "m0487cka", "m0521ccb", "m0527che", "m0548ccc", "m0556ccn", "m0580ckg", "m0585ckd", "m0590ckh", "m0593ckj", "m0598cke", "m0600ckf", "m0606cki" }, + tail = { "m0078cki", "m0488cka", "m0524ccb", "m0529che", "m0551ccc", "m0559ccn", "m0583ckg", "m0587ckd", "m0589ckb", "m0592ckh", "m0595ckj", "m0603ckf" }, + spine = { "m0009cha", "m0082chg", "m0677chu" }, + claw = { "m0043cca", "m0106cce", "m0134ccd", "m0154cci", "m0386cco", "m0387cka", "m0390ccg", "m0467ccl", "m0468ccf", "m0526che", "m0530cck", "m0577ccm", "m0597cke", "m0671cch", "m0685ccp" }, + ligament = { "m0531cck", "m0542cca", "m0562cba", "m0568cbb", "m0573ccj", "m0578ccm", "m0627ccf", "m0633ccl", "m0641cce", "m0666ccd", "m0669cco", "m0672cch", "m0673ccg", "m0681cbc", "m0686ccp", "m0693cci" }, + seed = { "m0023dxa", "m0659dxa", "m0115dxa", "m0113dxa" }, + tooth = { "m0345chk", "m0350chf", "m0383chx", "m0501chw", "m0505cha", "m0508chn", "m0511chb", "m0516chr", "m0520chc", "m0617chv", "m0639cht", "m0646chm", "m0651chp", "m0657chs" }, + whiskers = { "m0083chg" }, + oil = { "m0103dxa", "m0610dxa", "m0049dxa", "m0565dxa" }, + beak = { "m0560cba", "m0566cbb", "m0571ccj", "m0680cbc" }, + hairs = { "m0295cdb", "m0307cda" }, + bud = { "m0472cpa", "m0473cpb", "m0474cpc", "m0475cpd", "m0476cpe", "m0477cpf" }, + bone = { "m0153cci", "m0338cch", "m0339cca", "m0341cck", "m0343cce", "m0384ccl", "m0462cbc", "m0464ccg", "m0561cba", "m0567cbb", "m0572ccj", "m0576ccm", "m0625ccf", "m0667cco", "m0684ccp" }, + nail = { "m0020chb", "m0149chl", "m0359chf", "m0374chn", "m0499chw", "m0514chr", "m0519chc", "m0545chq", "m0554chx", "m0615chv", "m0619chh", "m0637cht", "m0644chm", "m0649chp", "m0655chs", "m0664chk" }, + skin = { "m0019chb", "m0081chg", "m0086chh", "m0133chk", "m0363chu", "m0364chr", "m0365chf", "m0367chn", "m0471chv", "m0503cha", "m0518chc", "m0544chq", "m0553chx", "m0636cht", "m0643chm", "m0648chp", "m0654chs", "m0682chl" }, + eyes = { "m0498chw", "m0502cha", "m0506chn", "m0509chb", "m0512chr", "m0517chc", "m0543chq", "m0552chx", "m0611chg", "m0613chv", "m0618chh", "m0621chf", "m0635cht", "m0642chm", "m0647chp", "m0653chs", "m0663chk", "m0675chu" }, + sting = { "m0067ckd", "m0076ckf", "m0480ckb", "m0496ckh", "m0523ccb", "m0550ccc", "m0558ccn", "m0582ckg", "m0594ckj", "m0608cki" }, + kitinshell = { "m0048ccc", "m0066ckd", "m0068ckg", "m0069ckj", "m0072ckh", "m0073cke", "m0336ccb", "m0368ccn", "m0470che", "m0479ckb", "m0485cka", "m0602ckf", "m0607cki", "m0634ccl" }, + mushroom = { "m0148chl" } +} diff --git a/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml index 088e97b8bf..b925eca3b0 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml @@ -10,6 +10,8 @@ <lua file="ark.lua" /> <lua file="ark_lessons.lua" /> <lua file="ark_shop.lua" /> + <lua file="world.lua" /> + <lua file="raw_creature_mats.lua" /> <!-- //////////// STYLE : webigchat_desc /////////// --> <style style="webigchat_desc" type="text" fontsize="12" justification="dont_clip_word" color="0 0 0 255" global_color="false" multi_line="true" multi_line_space="0" line_maxw="320" multi_line_maxw_only="true" /> diff --git a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml index 230a4ac7dc..8f626311e9 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/widgets.xml +++ b/ryzom/client/data/gamedev/interfaces_v3/widgets.xml @@ -1443,7 +1443,7 @@ <instance template="text_tt" tooltip="uittInventoryWeight" posparent="weight_txt" /> <link expr="identity(getItemsWeight('#inv_branch',0,#inv_branch_nb),@#inv_branch)" target="weight_txt:hardtext" /> <view type="bar" id="encombrement" mini="true" posparent="weight_txt" posref="ML MR" x="-4" range="#inv_bulk_max" color="%bulk_color" /> - <ctrl type="tooltip" id="encombrement_tt" posparent="encombrement" sizeref="wh" w="0" h="0" on_tooltip="get_tt_bulk" on_tooltip_params="dbbranch=#inv_branch|dbmax=#inv_bulk_max" /> + <ctrl type="tooltip" id="encombrement_tt" posparent="encombrement" sizeref="wh" w="0" h="0" on_tooltip="get_tt_bulk" on_tooltip_params="dbbranch=#inv_branch|dbmax=@#inv_bulk_max" /> <link expr="identity(getItemsBulk('#inv_branch',0,#inv_branch_nb),@#inv_branch)" target="encombrement:value" /> </group> <view type="text" id="slots_nb" posparent="bulk_weight" posref="BL BR" color="255 255 255 255" global_color="false" shadow="true" fontsize="10" /> diff --git a/ryzom/client/data/gamedev/interfaces_v3/world.lua b/ryzom/client/data/gamedev/interfaces_v3/world.lua new file mode 100644 index 0000000000..f9fe338588 --- /dev/null +++ b/ryzom/client/data/gamedev/interfaces_v3/world.lua @@ -0,0 +1,1008 @@ +if (game==nil) then + game= {}; +end + +game.World = { + continent_tryker = { true, { { 13560, -29233 }, { 13410, -34979 }, { 19676, -34970 }, { 20388, -29233 } }, { + region_lagoonsofloria = { true, { { 19873, -30039 }, { 19248, -29555 }, { 18869, -29418 }, { 18060, -29414 }, { 17404, -29586 }, { 17087, -29898 }, { 17087, -30413 }, { 18843, -30426 }, { 18856, -31860 }, { 19023, -32186 }, { 19534, -32168 }, { 19701, -31205 }, { 20018, -30738 }, { 20027, -30219 } }, { + place_outpost_tryker_28 = { true, { { 18956, -29784 }, { 18930, -29788 }, { 18917, -29821 }, { 18937, -29887 }, { 19009, -29906 }, { 19016, -29815 } }, "Outpost" }, + place_outpost_tryker_29 = { true, { { 17550, -29946 }, { 17470, -29942 }, { 17466, -29987 }, { 17511, -30006 }, { 17532, -30049 }, { 17567, -30055 }, { 17572, -29981 } }, "Outpost" }, + place_outpost_tryker_30 = { true, { { 19660, -30336 }, { 19623, -30281 }, { 19553, -30262 }, { 19542, -30300 }, { 19578, -30360 }, { 19652, -30379 } }, "Outpost" }, + place_outpost_tryker_31 = { true, { { 19134, -30577 }, { 19065, -30600 }, { 19062, -30698 }, { 19146, -30705 }, { 19163, -30639 } }, "Outpost" }, + place_outpost_tryker_32 = { true, { { 19301, -31378 }, { 19232, -31379 }, { 19223, -31427 }, { 19291, -31494 }, { 19328, -31499 }, { 19340, -31425 } }, "Outpost" }, + place_arrival_from_matis = { false, { { 19130, -29658 }, { 19128, -29625 }, { 19079, -29629 }, { 19083, -29670 } }, "Locality" }, + place_lieudit_lagoonsofloria_1 = { true, { { 19276, -31701 }, { 19252, -31695 }, { 19104, -31748 }, { 19062, -31888 }, { 19051, -31992 }, { 19065, -32119 }, { 19183, -32155 }, { 19318, -32139 }, { 19465, -32128 }, { 19518, -32095 }, { 19496, -31996 }, { 19505, -31937 }, { 19366, -31765 } }, "Locality" }, + place_lieudit_lagoonsofloria_2 = { true, { { 18872, -30152 }, { 18875, -30118 }, { 18873, -30080 }, { 18866, -30054 }, { 18864, -30028 }, { 18862, -30006 }, { 18852, -29999 }, { 18833, -29992 }, { 18832, -29979 }, { 18811, -29962 }, { 18799, -29916 }, { 18830, -29910 }, { 18842, -29874 }, { 18863, -29828 }, { 18829, -29777 }, { 18785, -29767 }, { 18720, -29762 }, { 18651, -29764 }, { 18633, -29736 }, { 18639, -29698 }, { 18633, -29681 }, { 18600, -29679 }, { 18553, -29675 }, { 18511, -29664 }, { 18492, -29645 }, { 18474, -29616 }, { 18418, -29609 }, { 18360, -29607 }, { 18321, -29607 }, { 18289, -29610 }, { 18271, -29645 }, { 18255, -29648 }, { 18254, -29675 }, { 18279, -29714 }, { 18286, -29748 }, { 18313, -29753 }, { 18311, -29783 }, { 18292, -29811 }, { 18260, -29841 }, { 18250, -29890 }, { 18242, -29931 }, { 18244, -29988 }, { 18246, -30023 }, { 18278, -30039 }, { 18291, -30057 }, { 18309, -30063 }, { 18320, -30054 }, { 18341, -30048 }, { 18384, -30035 }, { 18398, -30005 }, { 18421, -30004 }, { 18434, -30024 }, { 18451, -30030 }, { 18459, -30009 }, { 18486, -29994 }, { 18505, -30010 }, { 18502, -30048 }, { 18477, -30071 }, { 18479, -30107 }, { 18476, -30140 }, { 18494, -30157 }, { 18535, -30154 }, { 18564, -30164 }, { 18610, -30162 }, { 18653, -30175 }, { 18682, -30204 }, { 18703, -30197 }, { 18751, -30199 }, { 18805, -30218 }, { 18829, -30220 }, { 18850, -30197 }, { 18870, -30180 } }, "Locality" }, + place_lieudit_lagoonsofloria_3 = { true, { { 17469, -30226 }, { 17427, -30231 }, { 17393, -30259 }, { 17374, -30310 }, { 17388, -30369 }, { 17484, -30395 }, { 17571, -30384 }, { 17531, -30243 } }, "Locality" }, + mission_TF100_endroit_bataille = { false, { { 17306, -30088 }, { 17305, -30104 }, { 17327, -30130 }, { 17365, -30121 }, { 17385, -30090 }, { 17371, -30072 }, { 17348, -30071 }, { 17324, -30073 } }, "Locality" }, + place_ranger_entry_lagoonsofloria = { false, { { 19398, -30263 }, { 19396, -30259 }, { 19393, -30258 }, { 19389, -30259 }, { 19388, -30262 }, { 19389, -30266 }, { 19393, -30268 }, { 19396, -30267 } }, "Locality" } + } }, + region_windsofmuse = { true, { { 16819, -29735 }, { 15015, -29740 }, { 14698, -30048 }, { 14531, -30369 }, { 14540, -30892 }, { 15349, -31526 }, { 15860, -31535 }, { 16489, -31038 }, { 16819, -30730 } }, { + place_outpost_tryker_23 = { true, { { 16582, -29953 }, { 16531, -29941 }, { 16520, -29981 }, { 16537, -29999 }, { 16529, -30048 }, { 16611, -30067 }, { 16624, -29994 } }, "Outpost" }, + place_outpost_tryker_24 = { true, { { 15784, -30281 }, { 15711, -30259 }, { 15704, -30300 }, { 15741, -30359 }, { 15815, -30383 }, { 15824, -30342 } }, "Outpost" }, + place_outpost_tryker_25 = { true, { { 15132, -30579 }, { 15065, -30612 }, { 15055, -30662 }, { 15066, -30705 }, { 15153, -30686 }, { 15148, -30616 } }, "Outpost" }, + place_outpost_tryker_26 = { true, { { 16465, -30611 }, { 16371, -30578 }, { 16355, -30620 }, { 16378, -30690 }, { 16446, -30707 } }, "Outpost" }, + place_outpost_tryker_27 = { true, { { 15624, -31068 }, { 15551, -31056 }, { 15542, -31110 }, { 15593, -31124 }, { 15611, -31174 }, { 15649, -31185 }, { 15660, -31098 } }, "Outpost" }, + place_lieudit_windsofmuse_1 = { true, { { 14807, -30792 }, { 14812, -30646 }, { 14818, -30528 }, { 14839, -30381 }, { 14876, -30289 }, { 14953, -30157 }, { 14918, -30080 }, { 14824, -30078 }, { 14715, -30118 }, { 14634, -30334 }, { 14577, -30458 }, { 14572, -30667 }, { 14557, -30821 }, { 14628, -30849 } }, "Locality" }, + place_lieudit_windsofmuse_2 = { true, { { 15200, -30547 }, { 15270, -30584 }, { 15414, -30563 }, { 15482, -30520 }, { 15531, -30526 }, { 15584, -30541 }, { 15626, -30543 }, { 15677, -30507 }, { 15689, -30428 }, { 15688, -30352 }, { 15679, -30284 }, { 15669, -30247 }, { 15624, -30230 }, { 15540, -30232 }, { 15515, -30175 }, { 15503, -30130 }, { 15447, -30108 }, { 15380, -30106 }, { 15271, -30166 }, { 15194, -30305 }, { 15179, -30439 } }, "Locality" }, + place_lieudit_windsofmuse_3 = { true, { { 16291, -29880 }, { 16188, -29932 }, { 16101, -30022 }, { 16043, -30115 }, { 16047, -30222 }, { 16087, -30340 }, { 16120, -30371 }, { 16135, -30380 }, { 16202, -30417 }, { 16280, -30429 }, { 16371, -30403 }, { 16418, -30384 }, { 16448, -30324 }, { 16468, -30207 }, { 16465, -30103 }, { 16453, -30008 }, { 16420, -29930 }, { 16380, -29890 }, { 16346, -29877 } }, "Locality" }, + place_lieudit_windsofmuse_4 = { true, { { 16398, -30909 }, { 16428, -30878 }, { 16415, -30823 }, { 16393, -30788 }, { 16335, -30702 }, { 16294, -30645 }, { 16282, -30582 }, { 16284, -30551 }, { 16225, -30464 }, { 16201, -30416 }, { 16120, -30371 }, { 16087, -30340 }, { 16000, -30323 }, { 15906, -30344 }, { 15842, -30307 }, { 15766, -30255 }, { 15708, -30245 }, { 15687, -30269 }, { 15680, -30283 }, { 15688, -30353 }, { 15688, -30424 }, { 15739, -30481 }, { 15797, -30494 }, { 15890, -30491 }, { 16114, -30535 }, { 16089, -30632 }, { 16108, -30688 }, { 16164, -30775 }, { 16256, -30810 }, { 16340, -30873 } }, "Locality" }, + r_01_28_mission_tp_1a = { false, { { 16672, -30684 }, { 16720, -30703 }, { 16739, -30654 }, { 16709, -30641 } }, "Locality" }, + r_01_28_mission_tp_2a = { false, { { 16392, -31024 }, { 16418, -30974 }, { 16389, -30963 }, { 16354, -30998 } }, "Locality" }, + r_05_33_creek_1 = { false, { { 15541, -30126 }, { 15503, -30169 }, { 15510, -30202 }, { 15551, -30221 }, { 15582, -30212 }, { 15607, -30170 }, { 15587, -30146 }, { 15579, -30139 } }, "Locality" } + } }, + region_bountybeaches = { true, { { 15217, -31504 }, { 13748, -31486 }, { 13743, -32969 }, { 14219, -33295 }, { 15209, -33286 } }, { + place_outpost_tryker_18 = { true, { { 14545, -31735 }, { 14506, -31707 }, { 14433, -31697 }, { 14420, -31747 }, { 14494, -31810 }, { 14526, -31823 } }, "Outpost" }, + place_outpost_tryker_19 = { true, { { 15022, -31741 }, { 14934, -31698 }, { 14907, -31743 }, { 14901, -31799 }, { 15008, -31827 } }, "Outpost" }, + place_outpost_tryker_20 = { true, { { 14341, -32203 }, { 14274, -32179 }, { 14264, -32221 }, { 14298, -32276 }, { 14368, -32301 }, { 14380, -32253 } }, "Outpost" }, + place_outpost_tryker_21 = { true, { { 14167, -32654 }, { 14099, -32689 }, { 14111, -32787 }, { 14194, -32768 }, { 14197, -32698 } }, "Outpost" }, + place_outpost_tryker_22 = { true, { { 14996, -32672 }, { 14911, -32661 }, { 14904, -32707 }, { 14962, -32768 }, { 15009, -32778 }, { 15017, -32704 } }, "Outpost" }, + place_arrival_from_route_gouffre = { false, { { 13885, -32357 }, { 13841, -32347 }, { 13828, -32379 }, { 13854, -32392 } }, "Locality" }, + place_lieudit_bountybeaches_1 = { true, { { 13876, -31837 }, { 13952, -31800 }, { 14041, -31721 }, { 14074, -31690 }, { 14127, -31556 }, { 14103, -31540 }, { 13976, -31531 }, { 13862, -31528 }, { 13784, -31572 }, { 13773, -31704 } }, "Locality" }, + place_lieudit_bountybeaches_2 = { true, { { 14253, -31723 }, { 14246, -31742 }, { 14237, -31758 }, { 14214, -31765 }, { 14196, -31760 }, { 14177, -31756 }, { 14166, -31762 }, { 14162, -31783 }, { 14168, -31805 }, { 14162, -31827 }, { 14156, -31839 }, { 14140, -31848 }, { 14124, -31852 }, { 14118, -31877 }, { 14112, -31902 }, { 14105, -31912 }, { 14099, -31927 }, { 14100, -31946 }, { 14114, -31952 }, { 14122, -31966 }, { 14124, -31981 }, { 14143, -31988 }, { 14167, -31993 }, { 14201, -31993 }, { 14234, -31993 }, { 14264, -31992 }, { 14276, -31990 }, { 14307, -31995 }, { 14344, -31996 }, { 14374, -31988 }, { 14385, -31983 }, { 14389, -31966 }, { 14393, -31936 }, { 14394, -31879 }, { 14397, -31829 }, { 14394, -31785 }, { 14393, -31752 }, { 14385, -31729 }, { 14366, -31720 }, { 14356, -31719 }, { 14350, -31710 }, { 14348, -31703 }, { 14343, -31698 }, { 14333, -31694 }, { 14317, -31700 }, { 14308, -31708 }, { 14299, -31712 }, { 14285, -31718 } }, "Locality" }, + place_lieudit_bountybeaches_3 = { true, { { 14375, -32032 }, { 14354, -32022 }, { 14323, -32018 }, { 14286, -32018 }, { 14266, -32024 }, { 14251, -32033 }, { 14241, -32051 }, { 14227, -32084 }, { 14232, -32108 }, { 14240, -32128 }, { 14257, -32144 }, { 14276, -32153 }, { 14308, -32158 }, { 14342, -32161 }, { 14369, -32148 }, { 14381, -32125 }, { 14396, -32103 }, { 14394, -32069 }, { 14384, -32044 } }, "Locality" }, + place_lieudit_bountybeaches_4 = { true, { { 15031, -31837 }, { 15000, -31830 }, { 14961, -31824 }, { 14918, -31826 }, { 14873, -31844 }, { 14845, -31862 }, { 14822, -31883 }, { 14813, -31897 }, { 14814, -31940 }, { 14839, -31980 }, { 14890, -32020 }, { 15012, -32037 }, { 15061, -32033 }, { 15081, -31983 }, { 15095, -31928 }, { 15094, -31876 } }, "Locality" }, + place_lieudit_bountybeaches_5 = { true, { { 14869, -32679 }, { 14842, -32676 }, { 14816, -32675 }, { 14784, -32683 }, { 14763, -32697 }, { 14748, -32719 }, { 14747, -32742 }, { 14758, -32772 }, { 14773, -32796 }, { 14808, -32798 }, { 14837, -32795 }, { 14873, -32776 }, { 14880, -32754 }, { 14891, -32720 }, { 14884, -32692 } }, "Locality" }, + place_lieudit_bountybeaches_6 = { true, { { 15076, -32935 }, { 14986, -32940 }, { 14899, -33087 }, { 14902, -33238 }, { 15005, -33281 }, { 15155, -33269 }, { 15175, -33197 } }, "Locality" } + } }, + region_thefount = { true, { { 14540, -33418 }, { 14381, -33739 }, { 14390, -34883 }, { 16177, -34888 }, { 16172, -34373 }, { 15842, -34228 }, { 15688, -33752 }, { 15521, -33594 }, { 15033, -33418 } }, { + place_outpost_tryker_08 = { true, { { 14853, -33658 }, { 14823, -33629 }, { 14750, -33620 }, { 14745, -33666 }, { 14811, -33731 }, { 14848, -33739 } }, "Outpost" }, + place_outpost_tryker_09 = { true, { { 14656, -34097 }, { 14581, -34128 }, { 14591, -34221 }, { 14672, -34218 }, { 14671, -34161 } }, "Outpost" }, + place_outpost_tryker_10 = { true, { { 15299, -34120 }, { 15228, -34095 }, { 15222, -34144 }, { 15262, -34194 }, { 15325, -34219 }, { 15339, -34173 } }, "Outpost" }, + place_outpost_tryker_11 = { true, { { 14697, -34614 }, { 14612, -34578 }, { 14599, -34615 }, { 14617, -34689 }, { 14687, -34711 } }, "Outpost" }, + place_outpost_tryker_12 = { true, { { 15825, -34608 }, { 15727, -34577 }, { 15715, -34617 }, { 15737, -34690 }, { 15808, -34704 } }, "Outpost" }, + place_lieudit_thefount_1 = { true, { { 15496, -33660 }, { 15434, -33619 }, { 15371, -33612 }, { 15310, -33632 }, { 15216, -33720 }, { 15211, -33757 }, { 15246, -33856 }, { 15300, -33903 }, { 15348, -33920 }, { 15417, -33929 }, { 15475, -33919 }, { 15499, -33899 }, { 15524, -33853 } }, "Locality" }, + place_lieudit_thefount_2 = { true, { { 15311, -33927 }, { 15277, -33908 }, { 15234, -33910 }, { 15206, -33937 }, { 15191, -34008 }, { 15223, -34077 }, { 15278, -34089 }, { 15332, -34061 }, { 15340, -34011 }, { 15342, -33961 } }, "Locality" }, + place_lieudit_thefount_3 = { true, { { 15114, -33881 }, { 15123, -33864 }, { 15116, -33847 }, { 15103, -33840 }, { 15076, -33849 }, { 15041, -33835 }, { 15026, -33803 }, { 14982, -33790 }, { 14954, -33774 }, { 14933, -33777 }, { 14923, -33802 }, { 14897, -33807 }, { 14884, -33850 }, { 14889, -33887 }, { 14886, -33929 }, { 14896, -33968 }, { 14895, -33991 }, { 14912, -34001 }, { 14933, -34029 }, { 14950, -34045 }, { 14958, -34087 }, { 14970, -34121 }, { 14961, -34149 }, { 14977, -34163 }, { 14998, -34156 }, { 15025, -34157 }, { 15042, -34161 }, { 15068, -34154 }, { 15091, -34155 }, { 15114, -34158 }, { 15121, -34144 }, { 15118, -34128 }, { 15112, -34107 }, { 15119, -34085 }, { 15124, -34071 }, { 15141, -34069 }, { 15152, -34059 }, { 15163, -34045 }, { 15146, -34031 }, { 15131, -34014 }, { 15122, -33982 }, { 15118, -33966 }, { 15118, -33933 }, { 15123, -33909 }, { 15114, -33896 } }, "Locality" }, + place_lieudit_thefount_4 = { true, { { 15674, -34574 }, { 15640, -34555 }, { 15577, -34552 }, { 15527, -34577 }, { 15514, -34607 }, { 15528, -34652 }, { 15537, -34696 }, { 15559, -34712 }, { 15605, -34714 }, { 15626, -34707 }, { 15667, -34706 }, { 15676, -34689 }, { 15685, -34647 }, { 15679, -34600 } }, "Locality" }, + place_lieudit_thefount_5 = { true, { { 15925, -34544 }, { 15882, -34552 }, { 15856, -34569 }, { 15841, -34603 }, { 15841, -34643 }, { 15856, -34693 }, { 15891, -34709 }, { 15933, -34715 }, { 15979, -34697 }, { 16009, -34644 }, { 16005, -34584 }, { 15987, -34554 }, { 15964, -34538 } }, "Locality" }, + boss_tryker_light_start_spawn_place = { false, { { 15394, -34432 }, { 15389, -34459 }, { 15416, -34472 }, { 15422, -34436 } }, "Locality" } + } }, + region_enchantedisle = { true, { { 18566, -33436 }, { 17919, -33440 }, { 17439, -33600 }, { 17112, -33749 }, { 16959, -34240 }, { 16953, -34730 }, { 17276, -34884 }, { 17769, -34884 }, { 18249, -34730 }, { 18574, -34554 } }, { + place_outpost_tryker_13 = { true, { { 18378, -33657 }, { 18346, -33627 }, { 18271, -33619 }, { 18266, -33664 }, { 18328, -33731 }, { 18369, -33738 } }, "Outpost" }, + place_outpost_tryker_14 = { true, { { 17532, -33942 }, { 17469, -33958 }, { 17461, -33995 }, { 17473, -34061 }, { 17542, -34061 }, { 17551, -33999 } }, "Outpost" }, + place_outpost_tryker_15 = { true, { { 18226, -33976 }, { 18129, -33939 }, { 18117, -33975 }, { 18136, -34046 }, { 18206, -34062 } }, "Outpost" }, + place_outpost_tryker_16 = { true, { { 17861, -34282 }, { 17791, -34260 }, { 17783, -34299 }, { 17818, -34356 }, { 17885, -34379 }, { 17897, -34329 } }, "Outpost" }, + place_outpost_tryker_17 = { true, { { 17400, -34435 }, { 17311, -34418 }, { 17303, -34469 }, { 17373, -34530 }, { 17404, -34534 }, { 17420, -34463 } }, "Outpost" }, + place_lieudit_enchantedisle_1 = { true, { { 17875, -33653 }, { 17898, -33702 }, { 17980, -33708 }, { 18053, -33719 }, { 18097, -33742 }, { 18201, -33735 }, { 18224, -33709 }, { 18237, -33663 }, { 18236, -33599 }, { 18228, -33561 }, { 18122, -33451 }, { 17960, -33451 } }, "Locality" }, + place_lieudit_enchantedisle_2 = { true, { { 18072, -34052 }, { 18071, -34011 }, { 18073, -33959 }, { 18076, -33875 }, { 18072, -33834 }, { 18062, -33809 }, { 18036, -33796 }, { 18025, -33779 }, { 18010, -33776 }, { 17985, -33787 }, { 17960, -33796 }, { 17938, -33800 }, { 17923, -33825 }, { 17885, -33844 }, { 17848, -33843 }, { 17834, -33865 }, { 17847, -33889 }, { 17835, -33915 }, { 17815, -33931 }, { 17805, -33937 }, { 17792, -33979 }, { 17781, -33996 }, { 17772, -34011 }, { 17785, -34032 }, { 17800, -34042 }, { 17809, -34063 }, { 17828, -34075 }, { 17903, -34074 }, { 17953, -34071 }, { 18006, -34074 }, { 18050, -34073 }, { 18066, -34065 } }, "Locality" }, + place_lieudit_enchantedisle_3 = { true, { { 17498, -34718 }, { 17522, -34727 }, { 17564, -34726 }, { 17597, -34702 }, { 17604, -34653 }, { 17593, -34569 }, { 17562, -34505 }, { 17516, -34442 }, { 17440, -34403 }, { 17372, -34397 }, { 17242, -34388 }, { 17177, -34395 }, { 17120, -34432 }, { 17113, -34491 }, { 17151, -34543 }, { 17229, -34564 }, { 17303, -34585 }, { 17380, -34595 }, { 17414, -34628 }, { 17455, -34678 } }, "Locality" }, + place_lieudit_enchantedisle_4 = { true, { { 17848, -34428 }, { 17837, -34417 }, { 17815, -34410 }, { 17786, -34410 }, { 17772, -34422 }, { 17772, -34445 }, { 17781, -34483 }, { 17790, -34498 }, { 17778, -34528 }, { 17751, -34559 }, { 17728, -34613 }, { 17681, -34651 }, { 17627, -34701 }, { 17563, -34740 }, { 17539, -34794 }, { 17553, -34854 }, { 17730, -34877 }, { 17765, -34695 }, { 17768, -34652 }, { 17792, -34572 }, { 17815, -34547 }, { 17834, -34548 }, { 17842, -34538 }, { 17878, -34511 }, { 17902, -34502 }, { 17910, -34474 }, { 17905, -34454 }, { 17882, -34447 } }, "Locality" }, + place_lieudit_enchantedisle_5 = { true, { { 18272, -34040 }, { 18299, -34066 }, { 18332, -34072 }, { 18343, -34045 }, { 18334, -34002 }, { 18304, -33966 }, { 18270, -33966 }, { 18254, -33999 } }, "Locality" } + } }, + region_libertylake = { true, { { 17682, -31013 }, { 17663, -31210 }, { 17618, -31375 }, { 17513, -31569 }, { 17638, -31698 }, { 17720, -31725 }, { 17770, -31791 }, { 17734, -31917 }, { 17664, -31922 }, { 17517, -31946 }, { 17364, -32029 }, { 17383, -32066 }, { 17385, -32099 }, { 17320, -32138 }, { 17295, -32227 }, { 17257, -32232 }, { 17210, -32157 }, { 17118, -32134 }, { 17117, -32089 }, { 17090, -32090 }, { 17020, -32142 }, { 16968, -32202 }, { 16914, -32192 }, { 16902, -32129 }, { 16853, -32103 }, { 16774, -32067 }, { 16802, -32000 }, { 16740, -31983 }, { 16715, -31991 }, { 16617, -31939 }, { 16610, -31914 }, { 16566, -31905 }, { 16522, -31924 }, { 16455, -31850 }, { 16544, -31812 }, { 16526, -31772 }, { 16484, -31756 }, { 16472, -31690 }, { 16444, -31682 }, { 16404, -31631 }, { 16339, -31578 }, { 16021, -31558 }, { 15727, -31658 }, { 15307, -31949 }, { 15333, -33475 }, { 15727, -33658 }, { 15848, -33746 }, { 16277, -33369 }, { 16424, -33333 }, { 16417, -33260 }, { 16442, -33240 }, { 16510, -33250 }, { 16521, -33219 }, { 16589, -33214 }, { 16599, -33208 }, { 16619, -33239 }, { 16633, -33319 }, { 16652, -33361 }, { 16946, -33612 }, { 17290, -33604 }, { 17438, -33598 }, { 17776, -33459 }, { 17919, -33438 }, { 18600, -33292 }, { 18636, -32470 }, { 18576, -30859 }, { 18409, -30705 }, { 18033, -30699 } }, { + place_outpost_tryker_02 = { true, { { 15937, -32180 }, { 15864, -32218 }, { 15852, -32290 }, { 15882, -32310 }, { 15941, -32309 }, { 15970, -32285 }, { 15961, -32210 } }, "Outpost" }, + place_outpost_tryker_03 = { true, { { 18003, -32354 }, { 17946, -32375 }, { 17939, -32452 }, { 18016, -32461 }, { 18043, -32431 }, { 18046, -32358 } }, "Outpost" }, + place_outpost_tryker_04 = { true, { { 16429, -32527 }, { 16378, -32550 }, { 16358, -32582 }, { 16375, -32622 }, { 16419, -32619 }, { 16472, -32593 }, { 16473, -32535 } }, "Outpost" }, + place_outpost_tryker_05 = { true, { { 17692, -32650 }, { 17621, -32678 }, { 17629, -32722 }, { 17665, -32775 }, { 17707, -32765 }, { 17735, -32745 }, { 17720, -32675 } }, "Outpost" }, + place_outpost_tryker_06 = { true, { { 16719, -32810 }, { 16672, -32816 }, { 16667, -32871 }, { 16684, -32911 }, { 16790, -32893 }, { 16777, -32833 } }, "Outpost" }, + place_outpost_tryker_07 = { true, { { 15906, -33149 }, { 15860, -33155 }, { 15852, -33217 }, { 15911, -33235 }, { 15976, -33208 }, { 15979, -33162 } }, "Outpost" }, + place_avendale = { true, { { 18205, -31026 }, { 18168, -30990 }, { 18136, -30969 }, { 18092, -30982 }, { 18070, -30957 }, { 18064, -30917 }, { 18032, -30904 }, { 18009, -30940 }, { 17994, -30957 }, { 17957, -30979 }, { 17951, -31013 }, { 18024, -31042 }, { 18023, -31119 }, { 18048, -31161 }, { 18142, -31145 }, { 18201, -31131 }, { 18236, -31098 }, { 18238, -31043 } }, "Village" }, + avendale_stable = { true, { { 18162, -31128 }, { 18189, -31128 }, { 18202, -31116 }, { 18210, -31082 }, { 18204, -31066 }, { 18177, -31065 }, { 18170, -31089 }, { 18164, -31111 } }, "stable" }, + place_crystabell = { true, { { 17956, -31775 }, { 17930, -31747 }, { 17914, -31744 }, { 17901, -31762 }, { 17926, -31799 }, { 17868, -31828 }, { 17824, -31812 }, { 17779, -31804 }, { 17777, -31840 }, { 17800, -31890 }, { 17838, -31931 }, { 17853, -31988 }, { 17871, -32025 }, { 17911, -32021 }, { 17959, -32017 }, { 17977, -31984 }, { 17940, -31967 }, { 17904, -31969 }, { 17912, -31933 }, { 17914, -31882 }, { 17953, -31861 }, { 17989, -31847 }, { 17996, -31817 }, { 17990, -31786 } }, "Village" }, + crystabell_stable = { true, { { 17902, -32010 }, { 17932, -32014 }, { 17947, -32013 }, { 17954, -32005 }, { 17959, -31995 }, { 17962, -31984 }, { 17940, -31977 }, { 17922, -31976 }, { 17912, -31978 }, { 17893, -31985 }, { 17888, -31998 } }, "stable" }, + place_fairhaven = { true, { { 17287, -32807 }, { 17257, -32803 }, { 17216, -32833 }, { 17172, -32780 }, { 17115, -32740 }, { 17070, -32736 }, { 17055, -32771 }, { 17082, -32828 }, { 17096, -32872 }, { 17083, -32904 }, { 17030, -32910 }, { 16988, -32929 }, { 16986, -32979 }, { 17022, -33009 }, { 17062, -33020 }, { 17069, -33048 }, { 17061, -33122 }, { 17105, -33143 }, { 17154, -33124 }, { 17173, -33067 }, { 17214, -33067 }, { 17217, -33135 }, { 17220, -33223 }, { 17256, -33243 }, { 17300, -33235 }, { 17331, -33125 }, { 17397, -33092 }, { 17392, -33021 }, { 17379, -32950 } }, "Capital" }, + fairhaven_stable = { true, { { 17239, -32949 }, { 17258, -32958 }, { 17280, -32952 }, { 17289, -32937 }, { 17280, -32925 }, { 17251, -32915 }, { 17236, -32918 }, { 17230, -32935 } }, "stable" }, + place_windermeer = { true, { { 15709, -32950 }, { 15719, -32867 }, { 15662, -32841 }, { 15618, -32800 }, { 15561, -32805 }, { 15505, -32802 }, { 15479, -32808 }, { 15460, -32832 }, { 15444, -32915 }, { 15447, -32955 }, { 15412, -33035 }, { 15417, -33123 }, { 15468, -33135 }, { 15509, -33128 }, { 15537, -33049 }, { 15593, -33042 }, { 15644, -33059 }, { 15698, -33027 } }, "Village" }, + windermeer_stable = { true, { { 15624, -33025 }, { 15646, -33032 }, { 15691, -33020 }, { 15697, -32990 }, { 15665, -32972 }, { 15616, -32984 } }, "stable" }, + place_lieudit_libertylake_1 = { true, { { 15777, -32018 }, { 15816, -32074 }, { 15940, -32126 }, { 16047, -32174 }, { 16106, -32177 }, { 16159, -32143 }, { 16199, -32133 }, { 16211, -32095 }, { 16244, -32034 }, { 16347, -31992 }, { 16379, -31937 }, { 16407, -31916 }, { 16445, -31903 }, { 16460, -31883 }, { 16466, -31844 }, { 16501, -31820 }, { 16502, -31773 }, { 16467, -31713 }, { 16417, -31662 }, { 16399, -31632 }, { 16360, -31620 }, { 16279, -31606 }, { 15983, -31781 }, { 15815, -31891 } }, "Locality" }, + place_lieudit_libertylake_2 = { true, { { 17383, -32041 }, { 17367, -32072 }, { 17369, -32077 }, { 17370, -32083 }, { 17371, -32086 }, { 17370, -32091 }, { 17363, -32098 }, { 17360, -32099 }, { 17359, -32105 }, { 17357, -32107 }, { 17351, -32113 }, { 17322, -32117 }, { 17314, -32123 }, { 17306, -32130 }, { 17300, -32131 }, { 17297, -32145 }, { 17296, -32173 }, { 17293, -32199 }, { 17288, -32216 }, { 17283, -32222 }, { 17284, -32231 }, { 17294, -32244 }, { 17307, -32261 }, { 17317, -32275 }, { 17325, -32292 }, { 17348, -32326 }, { 17356, -32350 }, { 17405, -32373 }, { 17458, -32409 }, { 17512, -32445 }, { 17615, -32481 }, { 17701, -32480 }, { 17754, -32443 }, { 17778, -32423 }, { 17805, -32390 }, { 17812, -32389 }, { 17815, -32388 }, { 17818, -32385 }, { 17820, -32378 }, { 17820, -32371 }, { 17817, -32362 }, { 17815, -32352 }, { 17816, -32345 }, { 17819, -32338 }, { 17824, -32335 }, { 17833, -32333 }, { 17844, -32333 }, { 17867, -32333 }, { 17882, -32334 }, { 17891, -32331 }, { 17898, -32329 }, { 17901, -32324 }, { 17904, -32309 }, { 17905, -32305 }, { 17901, -32298 }, { 17895, -32289 }, { 17889, -32282 }, { 17887, -32274 }, { 17887, -32266 }, { 17888, -32249 }, { 17888, -32229 }, { 17889, -32215 }, { 17891, -32205 }, { 17894, -32198 }, { 17899, -32193 }, { 17902, -32190 }, { 17901, -32186 }, { 17898, -32179 }, { 17906, -32148 }, { 17932, -32099 }, { 17930, -32093 }, { 17927, -32094 }, { 17922, -32095 }, { 17917, -32092 }, { 17910, -32089 }, { 17904, -32088 }, { 17902, -32087 }, { 17896, -32089 }, { 17894, -32096 }, { 17894, -32103 }, { 17891, -32108 }, { 17888, -32111 }, { 17884, -32113 }, { 17878, -32113 }, { 17870, -32111 }, { 17862, -32106 }, { 17856, -32101 }, { 17852, -32094 }, { 17850, -32087 }, { 17848, -32084 }, { 17844, -32080 }, { 17832, -32076 }, { 17822, -32073 }, { 17820, -32071 }, { 17818, -32067 }, { 17818, -32059 }, { 17820, -32053 }, { 17822, -32045 }, { 17822, -32040 }, { 17820, -32036 }, { 17818, -32031 }, { 17816, -32024 }, { 17814, -32017 }, { 17815, -32008 }, { 17819, -31991 }, { 17819, -31985 }, { 17825, -31972 }, { 17828, -31967 }, { 17812, -31921 }, { 17672, -31941 }, { 17640, -31942 }, { 17572, -31941 }, { 17507, -31953 }, { 17464, -31974 }, { 17434, -32000 } }, "Locality" }, + place_lieudit_libertylake_3 = { true, { { 18264, -32585 }, { 18262, -32632 }, { 18277, -32680 }, { 18266, -32742 }, { 18275, -32766 }, { 18307, -32775 }, { 18331, -32779 }, { 18347, -32795 }, { 18342, -32818 }, { 18313, -32833 }, { 18276, -32837 }, { 18263, -32852 }, { 18255, -32887 }, { 18230, -32929 }, { 18211, -32964 }, { 18204, -33003 }, { 18205, -33033 }, { 18210, -33072 }, { 18210, -33132 }, { 18216, -33170 }, { 18237, -33232 }, { 18264, -33262 }, { 18289, -33285 }, { 18309, -33291 }, { 18335, -33280 }, { 18389, -33256 }, { 18483, -33221 }, { 18517, -33163 }, { 18562, -33028 }, { 18556, -32947 }, { 18484, -32850 }, { 18476, -32795 }, { 18544, -32747 }, { 18555, -32669 }, { 18559, -32599 }, { 18532, -32546 }, { 18482, -32516 }, { 18448, -32483 }, { 18392, -32475 }, { 18341, -32477 }, { 18305, -32520 } }, "Locality" }, + place_fairhaven_p_1 = { true, { { 17175, -32962 }, { 17181, -32951 }, { 17189, -32943 }, { 17199, -32938 }, { 17194, -32927 }, { 17190, -32915 }, { 17178, -32904 }, { 17166, -32899 }, { 17155, -32894 }, { 17139, -32912 }, { 17148, -32955 } }, "Street" }, + place_fairhaven_p_2 = { true, { { 17096, -32810 }, { 17121, -32802 }, { 17128, -32794 }, { 17139, -32788 }, { 17134, -32776 }, { 17132, -32765 }, { 17117, -32749 }, { 17105, -32748 }, { 17094, -32745 }, { 17078, -32763 }, { 17074, -32786 } }, "Street" }, + place_fairhaven_p_3 = { true, { { 17019, -32998 }, { 17054, -32991 }, { 17064, -32972 }, { 17058, -32964 }, { 17055, -32953 }, { 17040, -32937 }, { 17030, -32933 }, { 17018, -32933 }, { 17001, -32951 }, { 16991, -32973 } }, "Street" }, + place_fairhaven_p_4 = { true, { { 17139, -33088 }, { 17124, -33066 }, { 17101, -33061 }, { 17084, -33075 }, { 17074, -33104 }, { 17086, -33125 }, { 17113, -33126 }, { 17134, -33115 } }, "Street" }, + place_fairhaven_p_5 = { true, { { 17263, -32996 }, { 17261, -32985 }, { 17252, -32987 }, { 17247, -32984 }, { 17247, -32971 }, { 17227, -32966 }, { 17219, -32976 }, { 17203, -32987 }, { 17206, -32998 }, { 17231, -33035 }, { 17250, -33026 }, { 17250, -33020 }, { 17259, -33012 }, { 17268, -33007 } }, "Street" }, + place_fairhaven_p_6 = { true, { { 17303, -32971 }, { 17309, -32986 }, { 17316, -32996 }, { 17338, -33008 }, { 17365, -32980 }, { 17358, -32959 }, { 17345, -32957 }, { 17342, -32943 }, { 17322, -32940 }, { 17305, -32955 } }, "Street" }, + place_fairhaven_p_7 = { true, { { 17275, -33083 }, { 17285, -33095 }, { 17292, -33090 }, { 17307, -33093 }, { 17321, -33090 }, { 17328, -33083 }, { 17322, -33072 }, { 17329, -33065 }, { 17327, -33054 }, { 17326, -33046 }, { 17306, -33042 }, { 17294, -33047 }, { 17275, -33066 } }, "Street" }, + place_fairhaven_p_8 = { true, { { 17282, -33178 }, { 17270, -33175 }, { 17261, -33170 }, { 17242, -33186 }, { 17238, -33220 }, { 17261, -33235 }, { 17296, -33225 }, { 17303, -33199 } }, "Street" }, + place_fairhaven_s_1 = { true, { { 17146, -32940 }, { 17143, -32928 }, { 17054, -32953 }, { 17057, -32962 } }, "Street" }, + place_fairhaven_s_2 = { true, { { 17168, -32901 }, { 17177, -32905 }, { 17188, -32860 }, { 17185, -32853 }, { 17127, -32795 }, { 17121, -32801 }, { 17180, -32859 } }, "Street" }, + place_fairhaven_s_3 = { true, { { 17182, -32949 }, { 17212, -32981 }, { 17219, -32976 }, { 17187, -32944 } }, "Street" }, + place_fairhaven_s_4 = { true, { { 17251, -33019 }, { 17286, -33056 }, { 17294, -33049 }, { 17257, -33013 } }, "Street" }, + place_fairhaven_s_5 = { true, { { 17119, -33065 }, { 17129, -33031 }, { 17213, -33009 }, { 17208, -33000 }, { 17127, -33022 }, { 17120, -33029 }, { 17111, -33064 } }, "Street" }, + place_fairhaven_s_6 = { true, { { 17262, -32995 }, { 17307, -32983 }, { 17305, -32974 }, { 17260, -32986 } }, "Street" }, + place_fairhaven_s_7 = { true, { { 17316, -33044 }, { 17327, -33001 }, { 17319, -32997 }, { 17307, -33042 } }, "Street" }, + place_fairhaven_s_8 = { true, { { 17294, -33090 }, { 17271, -33175 }, { 17279, -33177 }, { 17302, -33092 } }, "Street" }, + r_01_27_place_libertylake = { false, { { 16775, -32742 }, { 16756, -32754 }, { 16756, -32764 }, { 16763, -32777 }, { 16780, -32778 }, { 16786, -32772 }, { 16787, -32757 } }, "Locality" }, + r_01_27_place_libertylake_2 = { false, { { 16461, -32586 }, { 16474, -32626 }, { 16534, -32634 }, { 16574, -32598 }, { 16583, -32538 }, { 16552, -32506 }, { 16508, -32526 } }, "Locality" }, + welcomer_avendale = { false, { { 18054, -31023 }, { 18057, -31022 }, { 18058, -31020 }, { 18059, -31018 }, { 18058, -31016 }, { 18056, -31014 }, { 18053, -31014 }, { 18051, -31015 }, { 18050, -31018 }, { 18050, -31020 }, { 18052, -31022 } }, "Locality" }, + welcomer_windermeer = { false, { { 15490, -33040 }, { 15487, -33041 }, { 15486, -33044 }, { 15487, -33046 }, { 15488, -33048 }, { 15491, -33049 }, { 15493, -33048 }, { 15495, -33045 }, { 15495, -33043 }, { 15493, -33040 } }, "Locality" }, + welcomer_crystabell = { true, { { 17439, -33160 }, { 17404, -33152 }, { 17368, -33164 }, { 17332, -33166 }, { 17324, -33215 }, { 17320, -33276 }, { 17329, -33310 }, { 17320, -33341 }, { 17275, -33339 }, { 17244, -33354 }, { 17252, -33367 }, { 17265, -33367 }, { 17278, -33371 }, { 17288, -33385 }, { 17304, -33396 }, { 17316, -33398 }, { 17334, -33389 }, { 17347, -33386 }, { 17376, -33379 }, { 17395, -33354 }, { 17405, -33347 }, { 17420, -33351 }, { 17425, -33367 }, { 17427, -33386 }, { 17435, -33408 }, { 17498, -33407 }, { 17519, -33369 }, { 17575, -33372 }, { 17609, -33357 }, { 17683, -33358 }, { 17714, -33353 }, { 17753, -33331 }, { 17818, -33297 }, { 17849, -33253 }, { 17845, -33179 }, { 17792, -33136 }, { 17746, -33125 }, { 17717, -33148 }, { 17724, -33157 }, { 17726, -33159 }, { 17734, -33161 }, { 17745, -33168 }, { 17756, -33174 }, { 17764, -33174 }, { 17769, -33180 }, { 17770, -33195 }, { 17774, -33208 }, { 17773, -33220 }, { 17766, -33232 }, { 17753, -33244 }, { 17746, -33253 }, { 17738, -33258 }, { 17724, -33259 }, { 17712, -33264 }, { 17703, -33275 }, { 17702, -33281 }, { 17693, -33285 }, { 17685, -33287 }, { 17676, -33290 }, { 17664, -33292 }, { 17652, -33287 }, { 17649, -33279 }, { 17649, -33270 }, { 17650, -33266 }, { 17651, -33257 }, { 17655, -33248 }, { 17651, -33237 }, { 17647, -33226 }, { 17647, -33212 }, { 17649, -33200 }, { 17654, -33194 }, { 17669, -33198 }, { 17678, -33200 }, { 17680, -33175 }, { 17679, -33154 }, { 17656, -33152 }, { 17653, -33169 }, { 17649, -33174 }, { 17631, -33163 }, { 17591, -33167 }, { 17553, -33165 }, { 17486, -33163 } }, "Locality" }, + episode2_temple_kami_tryker = { false, { { 16708, -32081 }, { 16697, -32087 }, { 16690, -32095 }, { 16688, -32106 }, { 16690, -32117 }, { 16698, -32126 }, { 16711, -32131 }, { 16724, -32129 }, { 16733, -32123 }, { 16739, -32115 }, { 16740, -32106 }, { 16738, -32097 }, { 16734, -32090 }, { 16728, -32084 }, { 16719, -32080 } }, "Locality" }, + episode2_temple_karavan_tryker = { true, { { 16696, -32039 }, { 16655, -32049 }, { 16640, -32079 }, { 16619, -32098 }, { 16620, -32140 }, { 16645, -32158 }, { 16650, -32172 }, { 16685, -32195 }, { 16727, -32179 }, { 16759, -32173 }, { 16762, -32145 }, { 16786, -32107 }, { 16758, -32097 }, { 16754, -32076 }, { 16734, -32072 }, { 16735, -32049 }, { 16721, -32037 } }, "Locality" } + } }, + region_dewdrops = { true, { { 16333, -31579 }, { 16403, -31632 }, { 16444, -31686 }, { 16469, -31691 }, { 16472, -31718 }, { 16480, -31759 }, { 16523, -31773 }, { 16541, -31812 }, { 16451, -31849 }, { 16522, -31928 }, { 16566, -31908 }, { 16608, -31916 }, { 16616, -31941 }, { 16714, -31993 }, { 16741, -31984 }, { 16759, -32005 }, { 16795, -32002 }, { 16772, -32067 }, { 16868, -32114 }, { 16873, -32131 }, { 16909, -32201 }, { 16973, -32206 }, { 17023, -32146 }, { 17091, -32093 }, { 17115, -32091 }, { 17115, -32137 }, { 17207, -32160 }, { 17257, -32236 }, { 17296, -32230 }, { 17323, -32140 }, { 17389, -32100 }, { 17385, -32060 }, { 17367, -32029 }, { 17519, -31948 }, { 17666, -31925 }, { 17739, -31918 }, { 17777, -31791 }, { 17724, -31725 }, { 17638, -31694 }, { 17516, -31569 }, { 17620, -31376 }, { 17665, -31210 }, { 17686, -31015 }, { 17752, -30923 }, { 17576, -30766 }, { 17384, -30733 }, { 17072, -30726 } }, { + r_01_28_mission_tp_1 = { false, { { 17105, -30786 }, { 17040, -30812 }, { 17058, -30843 }, { 17106, -30829 }, { 17124, -30827 }, { 17123, -30800 } }, "Locality" }, + r_01_28_mission_tp_2 = { false, { { 16724, -31258 }, { 16647, -31215 }, { 16604, -31256 }, { 16706, -31312 } }, "Locality" } + } }, + region_restingwater = { true, { { 16276, -33367 }, { 15846, -33743 }, { 16002, -34239 }, { 16471, -34364 }, { 16644, -34340 }, { 16926, -34074 }, { 16946, -33612 }, { 16654, -33359 }, { 16637, -33317 }, { 16619, -33239 }, { 16601, -33207 }, { 16515, -33218 }, { 16507, -33244 }, { 16441, -33237 }, { 16411, -33256 }, { 16407, -33283 }, { 16422, -33331 } }, { } } + } }, + continent_zorai = { true, { { 6643, -1267 }, { 6638, -3832 }, { 9278, -4166 }, { 9837, -5755 }, { 12794, -5760 }, { 12618, -497 } }, { + region_groveofumbra = { true, { { 9599, -4440 }, { 9597, -4958 }, { 9761, -5120 }, { 10083, -5282 }, { 11209, -5596 }, { 12315, -5603 }, { 12317, -4483 }, { 12159, -4164 }, { 12000, -4000 }, { 11680, -4000 }, { 11583, -4000 }, { 11520, -3935 }, { 11519, -3905 }, { 11454, -3840 }, { 11360, -3840 }, { 11105, -3840 }, { 11039, -3903 }, { 11039, -3932 }, { 10974, -3999 }, { 10946, -3999 }, { 10879, -4066 }, { 10879, -4098 }, { 10820, -4159 }, { 10720, -4160 }, { 10560, -4160 }, { 10464, -4160 }, { 10400, -4095 }, { 10400, -4061 }, { 10377, -4006 }, { 10338, -4000 }, { 10238, -3998 }, { 10142, -4001 }, { 10080, -4066 }, { 10079, -4160 }, { 10160, -4258 }, { 10105, -4283 }, { 10098, -4363 }, { 9999, -4373 }, { 9920, -4320 }, { 9759, -4320 } }, { + place_outpost_zorai_01 = { true, { { 11991, -5208 }, { 11977, -5145 }, { 11903, -5136 }, { 11875, -5188 }, { 11881, -5234 }, { 11934, -5245 } }, "Outpost" }, + place_outpost_zorai_02 = { true, { { 11289, -4817 }, { 11220, -4825 }, { 11217, -4877 }, { 11249, -4918 }, { 11308, -4899 }, { 11317, -4849 } }, "Outpost" }, + place_outpost_zorai_03 = { true, { { 10051, -4829 }, { 9958, -4826 }, { 9941, -4898 }, { 9957, -4930 }, { 10049, -4928 } }, "Outpost" }, + place_outpost_zorai_04 = { true, { { 10643, -4665 }, { 10577, -4668 }, { 10575, -4750 }, { 10611, -4764 }, { 10670, -4757 }, { 10680, -4697 } }, "Outpost" }, + place_outpost_zorai_05 = { true, { { 11817, -4494 }, { 11740, -4499 }, { 11727, -4531 }, { 11745, -4593 }, { 11806, -4592 }, { 11825, -4553 } }, "Outpost" }, + place_outpost_zorai_06 = { true, { { 11134, -4176 }, { 11071, -4176 }, { 11059, -4253 }, { 11108, -4285 }, { 11152, -4276 }, { 11165, -4229 } }, "Outpost" }, + place_outpost_zorai_07 = { true, { { 10698, -4188 }, { 10589, -4183 }, { 10580, -4298 }, { 10697, -4303 } }, "Outpost" }, + place_arrival_from_route_gouffre = { false, { { 11000, -4606 }, { 10997, -4605 }, { 10972, -4605 }, { 10968, -4598 }, { 10962, -4600 }, { 10960, -4604 }, { 10956, -4605 }, { 10949, -4605 }, { 10946, -4606 }, { 10945, -4610 }, { 10951, -4612 }, { 10985, -4611 }, { 10997, -4611 }, { 11000, -4610 } }, "Locality" }, + place_lieudit_groveofumbra_1 = { true, { { 9849, -4494 }, { 9838, -4494 }, { 9830, -4496 }, { 9826, -4503 }, { 9824, -4508 }, { 9806, -4508 }, { 9791, -4514 }, { 9786, -4529 }, { 9792, -4546 }, { 9801, -4560 }, { 9819, -4554 }, { 9831, -4544 }, { 9846, -4546 }, { 9851, -4549 }, { 9853, -4557 }, { 9853, -4565 }, { 9849, -4574 }, { 9840, -4574 }, { 9834, -4574 }, { 9828, -4574 }, { 9822, -4577 }, { 9818, -4587 }, { 9817, -4596 }, { 9820, -4602 }, { 9826, -4608 }, { 9832, -4610 }, { 9842, -4614 }, { 9854, -4612 }, { 9864, -4608 }, { 9876, -4605 }, { 9887, -4597 }, { 9890, -4581 }, { 9899, -4575 }, { 9906, -4567 }, { 9911, -4558 }, { 9911, -4544 }, { 9901, -4519 }, { 9890, -4503 }, { 9869, -4494 }, { 9859, -4490 } }, "Locality" }, + place_lieudit_groveofumbra_2 = { true, { { 10320, -4164 }, { 10283, -4169 }, { 10255, -4193 }, { 10236, -4224 }, { 10231, -4255 }, { 10247, -4300 }, { 10285, -4326 }, { 10340, -4329 }, { 10374, -4319 }, { 10396, -4294 }, { 10405, -4253 }, { 10406, -4225 }, { 10393, -4195 }, { 10394, -4179 }, { 10382, -4158 } }, "Locality" }, + place_lieudit_groveofumbra_3 = { true, { { 11021, -4521 }, { 11002, -4499 }, { 10970, -4478 }, { 10924, -4467 }, { 10861, -4460 }, { 10762, -4471 }, { 10717, -4503 }, { 10696, -4553 }, { 10705, -4595 }, { 10729, -4627 }, { 10769, -4645 }, { 10813, -4660 }, { 10876, -4666 }, { 10949, -4652 }, { 10979, -4631 }, { 11014, -4616 }, { 11031, -4584 }, { 11035, -4561 }, { 11035, -4546 } }, "Locality" }, + place_lieudit_groveofumbra_4 = { true, { { 11626, -4972 }, { 11605, -4977 }, { 11562, -4998 }, { 11536, -5021 }, { 11530, -5061 }, { 11535, -5104 }, { 11541, -5146 }, { 11550, -5176 }, { 11572, -5226 }, { 11601, -5246 }, { 11628, -5252 }, { 11659, -5266 }, { 11689, -5268 }, { 11726, -5255 }, { 11748, -5230 }, { 11776, -5196 }, { 11793, -5157 }, { 11803, -5127 }, { 11802, -5092 }, { 11779, -5064 }, { 11752, -5031 }, { 11733, -4999 }, { 11716, -4978 }, { 11689, -4974 }, { 11673, -4975 } }, "Locality" }, + place_r_08_03_espionnage = { true, { { 10256, -4193 }, { 10236, -4225 }, { 10231, -4255 }, { 10247, -4300 }, { 10285, -4326 }, { 10340, -4329 }, { 10374, -4319 }, { 10396, -4294 }, { 10405, -4253 }, { 10399, -4234 }, { 10372, -4217 }, { 10350, -4184 }, { 10340, -4179 }, { 10310, -4176 }, { 10283, -4169 } }, "Locality" }, + rpjob_magnecarto_4_a = { false, { { 11425, -4212 }, { 11429, -4215 }, { 11435, -4215 }, { 11438, -4212 }, { 11438, -4205 }, { 11434, -4203 }, { 11430, -4203 }, { 11425, -4206 } }, "Locality" }, + rpjob_magnecarto_4_b = { false, { { 10511, -4983 }, { 10514, -4987 }, { 10520, -4987 }, { 10524, -4983 }, { 10524, -4977 }, { 10520, -4974 }, { 10515, -4974 }, { 10511, -4977 } }, "Locality" }, + rpjob_magnecarto_4_c = { false, { { 11698, -5449 }, { 11701, -5453 }, { 11707, -5453 }, { 11711, -5449 }, { 11711, -5443 }, { 11707, -5440 }, { 11702, -5440 }, { 11698, -5443 } }, "Locality" }, + rpjob_magnecarto_4_d = { false, { { 11953, -4932 }, { 11957, -4935 }, { 11963, -4935 }, { 11966, -4932 }, { 11966, -4925 }, { 11962, -4922 }, { 11958, -4923 }, { 11953, -4926 } }, "Locality" } + } }, + region_citiesofintuition = { true, { { 8474, -3165 }, { 8510, -3201 }, { 8609, -3201 }, { 8636, -3238 }, { 8636, -3558 }, { 8575, -3576 }, { 8575, -3611 }, { 8636, -3645 }, { 8637, -3679 }, { 8615, -3811 }, { 8477, -3838 }, { 8480, -4000 }, { 9438, -4000 }, { 9438, -4320 }, { 9598, -4319 }, { 9598, -4440 }, { 9758, -4320 }, { 9916, -4320 }, { 9998, -4373 }, { 10098, -4363 }, { 10104, -4283 }, { 10159, -4258 }, { 10078, -4160 }, { 10079, -4066 }, { 10141, -4002 }, { 10237, -3999 }, { 10336, -3999 }, { 10376, -4007 }, { 10438, -3942 }, { 10444, -3932 }, { 10443, -3913 }, { 10398, -3840 }, { 10399, -3742 }, { 10334, -3679 }, { 10299, -3677 }, { 10239, -3571 }, { 10238, -3520 }, { 10238, -3383 }, { 10174, -3359 }, { 10078, -3359 }, { 9758, -3360 }, { 9496, -3359 }, { 9438, -3199 }, { 9332, -3199 }, { 9278, -3156 }, { 9277, -3104 }, { 9211, -3039 }, { 9182, -3039 }, { 9118, -2982 }, { 9119, -2940 }, { 9062, -2879 }, { 8958, -2880 }, { 8838, -2900 }, { 8802, -2831 }, { 8802, -2785 }, { 8745, -2737 }, { 8747, -2701 }, { 8800, -2657 }, { 8845, -2663 }, { 8840, -2626 }, { 8800, -2626 }, { 8801, -2558 }, { 8519, -2560 }, { 8478, -2604 } }, { + place_zora = { true, { { 8542, -2712 }, { 8537, -2745 }, { 8499, -2746 }, { 8493, -2778 }, { 8441, -2768 }, { 8430, -2815 }, { 8506, -2827 }, { 8499, -2911 }, { 8500, -2983 }, { 8506, -3019 }, { 8554, -3020 }, { 8602, -3010 }, { 8627, -2987 }, { 8627, -3009 }, { 8657, -3021 }, { 8679, -3014 }, { 8680, -2988 }, { 8697, -2989 }, { 8700, -3048 }, { 8741, -3047 }, { 8740, -3013 }, { 8766, -3004 }, { 8771, -2976 }, { 8817, -2974 }, { 8825, -2957 }, { 8818, -2941 }, { 8767, -2927 }, { 8779, -2883 }, { 8774, -2825 }, { 8812, -2817 }, { 8815, -2788 }, { 8770, -2750 }, { 8745, -2733 }, { 8734, -2693 }, { 8705, -2696 }, { 8685, -2738 }, { 8638, -2745 }, { 8581, -2746 }, { 8576, -2714 } }, "Capital" }, + zora_stable = { true, { { 8711, -3009 }, { 8728, -3009 }, { 8735, -3005 }, { 8752, -3001 }, { 8751, -2980 }, { 8753, -2975 }, { 8751, -2971 }, { 8741, -2965 }, { 8711, -2974 } }, "stable" }, + place_hoi_cho = { true, { { 9436, -3424 }, { 9434, -3455 }, { 9462, -3647 }, { 9497, -3685 }, { 9536, -3689 }, { 9572, -3660 }, { 9582, -3626 }, { 9635, -3619 }, { 9625, -3570 }, { 9656, -3528 }, { 9704, -3528 }, { 9727, -3498 }, { 9739, -3474 }, { 9806, -3457 }, { 9810, -3422 }, { 9786, -3406 }, { 9741, -3415 }, { 9729, -3382 }, { 9700, -3385 }, { 9697, -3331 }, { 9658, -3329 }, { 9587, -3366 }, { 9477, -3389 } }, "Village" }, + hoi_cho_stable = { true, { { 9534, -3646 }, { 9544, -3647 }, { 9553, -3647 }, { 9564, -3633 }, { 9563, -3624 }, { 9555, -3618 }, { 9548, -3623 }, { 9529, -3623 }, { 9529, -3644 } }, "stable" }, + place_jen_lai = { true, { { 8701, -3507 }, { 8697, -3548 }, { 8668, -3550 }, { 8667, -3574 }, { 8627, -3574 }, { 8592, -3575 }, { 8595, -3615 }, { 8626, -3616 }, { 8655, -3673 }, { 8664, -3731 }, { 8623, -3745 }, { 8621, -3776 }, { 8667, -3813 }, { 8699, -3821 }, { 8702, -3870 }, { 8739, -3866 }, { 8769, -3835 }, { 8824, -3836 }, { 8849, -3826 }, { 8863, -3853 }, { 8896, -3853 }, { 8928, -3807 }, { 8957, -3778 }, { 8957, -3746 }, { 8933, -3707 }, { 8903, -3703 }, { 8897, -3655 }, { 8857, -3643 }, { 8835, -3624 }, { 8841, -3584 }, { 8781, -3574 }, { 8767, -3544 }, { 8738, -3540 }, { 8735, -3506 } }, "Village" }, + jen_lai_stable = { true, { { 8678, -3746 }, { 8685, -3746 }, { 8687, -3752 }, { 8695, -3751 }, { 8705, -3747 }, { 8721, -3732 }, { 8721, -3723 }, { 8710, -3718 }, { 8699, -3719 }, { 8679, -3735 } }, "stable" }, + place_min_cho = { true, { { 9766, -4061 }, { 9764, -4098 }, { 9786, -4129 }, { 9816, -4142 }, { 9809, -4176 }, { 9781, -4200 }, { 9747, -4222 }, { 9750, -4257 }, { 9784, -4292 }, { 9817, -4299 }, { 9814, -4349 }, { 9862, -4347 }, { 9890, -4323 }, { 9931, -4306 }, { 9961, -4328 }, { 9985, -4360 }, { 10023, -4356 }, { 10050, -4298 }, { 10117, -4263 }, { 10135, -4231 }, { 10108, -4204 }, { 10050, -4189 }, { 10023, -4176 }, { 10018, -4135 }, { 9982, -4134 }, { 9924, -4135 }, { 9904, -4109 }, { 9897, -4086 }, { 9891, -4016 }, { 9862, -4016 }, { 9856, -3952 }, { 9819, -3970 } }, "Village" }, + min_cho_stable = { true, { { 9799, -4260 }, { 9806, -4270 }, { 9813, -4279 }, { 9825, -4280 }, { 9831, -4276 }, { 9837, -4271 }, { 9845, -4251 }, { 9838, -4244 }, { 9822, -4242 }, { 9810, -4249 } }, "stable" }, + place_outpost_zorai_08 = { true, { { 10371, -3712 }, { 10273, -3707 }, { 10264, -3811 }, { 10369, -3810 } }, "Outpost" }, + place_lieudit_citiesofintuition_1 = { true, { { 8820, -3357 }, { 8848, -3369 }, { 8872, -3372 }, { 8923, -3363 }, { 8941, -3351 }, { 8961, -3310 }, { 8967, -3279 }, { 8958, -3243 }, { 8944, -3223 }, { 8919, -3206 }, { 8888, -3198 }, { 8850, -3198 }, { 8817, -3214 }, { 8803, -3241 }, { 8798, -3270 }, { 8799, -3302 }, { 8802, -3327 }, { 8808, -3340 } }, "Locality" }, + place_lieudit_citiesofintuition_2 = { true, { { 9021, -3744 }, { 9003, -3756 }, { 8996, -3765 }, { 8991, -3780 }, { 8979, -3834 }, { 8972, -3883 }, { 8987, -3920 }, { 9000, -3937 }, { 9020, -3958 }, { 9066, -3972 }, { 9114, -3986 }, { 9173, -3986 }, { 9206, -3939 }, { 9273, -3895 }, { 9333, -3898 }, { 9367, -3907 }, { 9396, -3904 }, { 9425, -3883 }, { 9435, -3847 }, { 9430, -3819 }, { 9419, -3801 }, { 9388, -3783 }, { 9365, -3766 }, { 9346, -3755 }, { 9306, -3753 }, { 9276, -3763 }, { 9245, -3777 }, { 9217, -3786 }, { 9199, -3794 }, { 9175, -3791 }, { 9159, -3780 }, { 9143, -3771 }, { 9114, -3757 }, { 9044, -3750 } }, "Locality" }, + place_lieudit_citiesofintuition_3 = { true, { { 9871, -3685 }, { 9844, -3685 }, { 9794, -3696 }, { 9767, -3721 }, { 9761, -3751 }, { 9756, -3778 }, { 9772, -3806 }, { 9801, -3829 }, { 9825, -3834 }, { 9868, -3833 }, { 9904, -3818 }, { 9919, -3778 }, { 9926, -3748 }, { 9916, -3715 }, { 9901, -3699 } }, "Locality" }, + place_lieudit_citiesofintuition_4 = { true, { { 9463, -4275 }, { 9470, -4293 }, { 9484, -4300 }, { 9522, -4303 }, { 9573, -4287 }, { 9581, -4267 }, { 9585, -4254 }, { 9586, -4236 }, { 9583, -4220 }, { 9575, -4209 }, { 9561, -4195 }, { 9550, -4179 }, { 9542, -4171 }, { 9536, -4166 }, { 9526, -4162 }, { 9514, -4161 }, { 9502, -4164 }, { 9485, -4177 }, { 9471, -4187 }, { 9467, -4200 }, { 9463, -4218 }, { 9462, -4249 } }, "Locality" }, + place_zora_p_cimetiere = { true, { { 8781, -2974 }, { 8821, -2974 }, { 8819, -2943 }, { 8783, -2941 } }, "Street" }, + place_zora_p_1 = { true, { { 8781, -2974 }, { 8781, -2941 }, { 8775, -2871 }, { 8736, -2868 }, { 8699, -2885 }, { 8692, -2916 }, { 8696, -2939 }, { 8692, -3015 }, { 8767, -3010 } }, "Street" }, + place_zora_p_marche_commun = { true, { { 8633, -3014 }, { 8695, -3015 }, { 8696, -2940 }, { 8691, -2916 }, { 8699, -2885 }, { 8692, -2876 }, { 8681, -2876 }, { 8633, -2891 }, { 8626, -2958 } }, "Street" }, + place_zora_p_2 = { true, { { 8566, -2889 }, { 8634, -2891 }, { 8681, -2876 }, { 8691, -2876 }, { 8698, -2885 }, { 8736, -2868 }, { 8770, -2867 }, { 8777, -2819 }, { 8707, -2826 }, { 8698, -2825 }, { 8689, -2821 }, { 8667, -2820 }, { 8642, -2814 }, { 8634, -2813 }, { 8611, -2816 }, { 8606, -2815 }, { 8601, -2790 }, { 8598, -2785 }, { 8586, -2783 }, { 8576, -2781 }, { 8564, -2785 }, { 8558, -2790 }, { 8558, -2799 }, { 8557, -2814 } }, "Street" }, + place_zora_p_3 = { true, { { 8627, -2980 }, { 8618, -2907 }, { 8561, -2896 }, { 8537, -2849 }, { 8511, -2849 }, { 8500, -3018 }, { 8606, -3018 } }, "Street" }, + place_zora_p_4 = { true, { { 8643, -2765 }, { 8641, -2811 }, { 8671, -2819 }, { 8687, -2819 }, { 8693, -2821 }, { 8700, -2828 }, { 8708, -2827 }, { 8712, -2825 }, { 8778, -2820 }, { 8782, -2813 }, { 8780, -2786 }, { 8765, -2751 }, { 8734, -2738 }, { 8674, -2740 } }, "Street" }, + place_zora_p_5 = { true, { { 8493, -2784 }, { 8494, -2847 }, { 8538, -2849 }, { 8560, -2843 }, { 8556, -2814 }, { 8559, -2790 }, { 8564, -2785 }, { 8576, -2781 }, { 8597, -2783 }, { 8602, -2793 }, { 8606, -2814 }, { 8639, -2813 }, { 8642, -2765 }, { 8631, -2748 }, { 8572, -2746 }, { 8492, -2748 } }, "Street" }, + r_06_12_forage_1 = { false, { { 10195, -3539 }, { 10226, -3557 }, { 10240, -3542 }, { 10226, -3519 }, { 10206, -3523 } }, "Locality" }, + r_06_12_forage_2 = { false, { { 9766, -3604 }, { 9777, -3663 }, { 9866, -3661 }, { 9931, -3644 }, { 9907, -3602 }, { 9840, -3639 }, { 9790, -3629 }, { 9789, -3603 } }, "Locality" }, + r_06_12_hunting_1 = { false, { { 9151, -3075 }, { 9093, -3160 }, { 9201, -3220 }, { 9265, -3121 } }, "Locality" }, + rpjob_magnecarto_1_a = { false, { { 9061, -2979 }, { 9065, -2983 }, { 9070, -2983 }, { 9074, -2979 }, { 9074, -2973 }, { 9070, -2970 }, { 9065, -2970 }, { 9061, -2973 } }, "Locality" }, + rpjob_magnecarto_1_b = { false, { { 8758, -3461 }, { 8761, -3464 }, { 8767, -3464 }, { 8771, -3461 }, { 8771, -3454 }, { 8767, -3452 }, { 8762, -3452 }, { 8758, -3455 } }, "Locality" }, + rpjob_magnecarto_1_c = { false, { { 9379, -3865 }, { 9383, -3869 }, { 9388, -3869 }, { 9392, -3865 }, { 9392, -3859 }, { 9388, -3856 }, { 9383, -3856 }, { 9379, -3859 } }, "Locality" }, + rpjob_magnecarto_1_d = { false, { { 9382, -3356 }, { 9385, -3360 }, { 9391, -3360 }, { 9395, -3356 }, { 9395, -3350 }, { 9391, -3347 }, { 9386, -3347 }, { 9382, -3350 } }, "Locality" }, + r_10_10_goo_hunting = { false, { { 9397, -3261 }, { 9399, -3295 }, { 9420, -3290 }, { 9456, -3291 }, { 9457, -3273 }, { 9423, -3267 } }, "Locality" }, + place_zora_puits_aux_offrandes = { false, { { 8615, -2752 }, { 8599, -2773 }, { 8619, -2788 }, { 8635, -2769 } }, "Street" }, + welcomer_jenlai_guardchief = { false, { { 8875, -3762 }, { 8875, -3761 }, { 8875, -3761 }, { 8875, -3762 } }, "Locality" }, + welcomer_jenlai_intendant = { false, { { 8891, -3764 }, { 8890, -3764 }, { 8891, -3765 }, { 8891, -3765 } }, "Locality" }, + welcomer_jenlai_sage = { false, { { 8885, -3749 }, { 8886, -3750 }, { 8886, -3749 }, { 8885, -3748 } }, "Locality" }, + welcomer_mincho_intendant = { false, { { 9844, -4097 }, { 9843, -4096 }, { 9843, -4097 }, { 9844, -4097 } }, "Locality" }, + welcomer_mincho_guardchief = { false, { { 9840, -4081 }, { 9841, -4080 }, { 9840, -4079 }, { 9839, -4080 } }, "Locality" }, + welcomer_mincho_sage = { false, { { 9855, -4085 }, { 9855, -4086 }, { 9856, -4086 }, { 9856, -4085 } }, "Locality" }, + welcomer_hoicho_intendant = { false, { { 9512, -3429 }, { 9513, -3429 }, { 9513, -3428 }, { 9512, -3428 } }, "Locality" }, + welcomer_hoicho_sage = { false, { { 9504, -3443 }, { 9504, -3442 }, { 9503, -3442 }, { 9503, -3443 } }, "Locality" }, + welcomer_hoicho_guardchief = { true, { { 9045, -3293 }, { 9035, -3300 }, { 9034, -3323 }, { 9034, -3356 }, { 9033, -3386 }, { 9031, -3401 }, { 9028, -3430 }, { 9039, -3419 }, { 9063, -3421 }, { 9082, -3439 }, { 9096, -3439 }, { 9121, -3448 }, { 9135, -3440 }, { 9150, -3447 }, { 9162, -3449 }, { 9158, -3468 }, { 9165, -3482 }, { 9197, -3492 }, { 9207, -3490 }, { 9222, -3479 }, { 9236, -3472 }, { 9246, -3450 }, { 9256, -3438 }, { 9248, -3423 }, { 9230, -3415 }, { 9212, -3405 }, { 9203, -3397 }, { 9204, -3388 }, { 9199, -3370 }, { 9204, -3353 }, { 9202, -3329 }, { 9187, -3316 }, { 9187, -3294 }, { 9177, -3277 }, { 9162, -3273 }, { 9138, -3269 }, { 9099, -3272 }, { 9086, -3282 }, { 9062, -3301 } }, "Locality" }, + episode2_temple_kami_zorai = { false, { { 8953, -2932 }, { 8942, -2938 }, { 8934, -2947 }, { 8932, -2958 }, { 8934, -2969 }, { 8943, -2979 }, { 8956, -2985 }, { 8970, -2983 }, { 8980, -2976 }, { 8985, -2967 }, { 8987, -2958 }, { 8985, -2949 }, { 8981, -2941 }, { 8974, -2935 }, { 8965, -2931 } }, "Locality" }, + episode2_temple_karavan_zorai = { true, { { 9086, -3631 }, { 9075, -3649 }, { 9059, -3667 }, { 9050, -3697 }, { 9056, -3726 }, { 9061, -3741 }, { 9059, -3751 }, { 9074, -3753 }, { 9109, -3756 }, { 9138, -3751 }, { 9156, -3746 }, { 9163, -3739 }, { 9177, -3716 }, { 9188, -3706 }, { 9192, -3696 }, { 9190, -3674 }, { 9164, -3661 }, { 9148, -3642 }, { 9126, -3631 } }, "Locality" } + } }, + region_maidengrove = { true, { { 9923, -3199 }, { 9922, -3302 }, { 9875, -3360 }, { 10179, -3360 }, { 10243, -3384 }, { 10242, -3572 }, { 10303, -3678 }, { 10337, -3680 }, { 10403, -3742 }, { 10402, -3840 }, { 10447, -3913 }, { 10448, -3932 }, { 10442, -3942 }, { 10380, -4006 }, { 10402, -4061 }, { 10403, -4095 }, { 10467, -4159 }, { 10565, -4159 }, { 10725, -4160 }, { 10823, -4159 }, { 10883, -4097 }, { 10882, -4066 }, { 10949, -3999 }, { 10977, -3999 }, { 11043, -3933 }, { 11043, -3903 }, { 11108, -3840 }, { 11457, -3840 }, { 11523, -3905 }, { 11522, -3935 }, { 11586, -4000 }, { 12005, -3999 }, { 12167, -3351 }, { 12165, -2559 }, { 11685, -2720 }, { 11589, -2720 }, { 11522, -2786 }, { 11523, -2879 }, { 11465, -2920 }, { 11426, -2912 }, { 11428, -2879 }, { 11265, -2879 }, { 11203, -2944 }, { 11203, -3200 }, { 11141, -3247 }, { 11113, -3247 }, { 11094, -3199 }, { 10950, -3200 }, { 10884, -3136 }, { 10885, -3039 }, { 10820, -2880 }, { 10565, -2880 }, { 10467, -2879 }, { 10402, -2820 }, { 10403, -2775 }, { 10348, -2718 }, { 10243, -2719 }, { 10242, -2879 }, { 10162, -2960 }, { 10143, -2955 }, { 10107, -2973 }, { 10108, -3013 } }, { + place_outpost_zorai_09 = { true, { { 11820, -3860 }, { 11709, -3860 }, { 11702, -3970 }, { 11817, -3982 } }, "Outpost" }, + place_outpost_zorai_10 = { true, { { 11306, -3544 }, { 11235, -3558 }, { 11228, -3618 }, { 11252, -3646 }, { 11328, -3637 }, { 11337, -3569 } }, "Outpost" }, + place_outpost_zorai_11 = { true, { { 10812, -3402 }, { 10751, -3406 }, { 10736, -3469 }, { 10764, -3502 }, { 10834, -3491 }, { 10842, -3438 } }, "Outpost" }, + place_outpost_zorai_12 = { true, { { 10216, -3224 }, { 10112, -3223 }, { 10096, -3337 }, { 10206, -3336 } }, "Outpost" }, + place_outpost_zorai_13 = { true, { { 11945, -3063 }, { 11872, -3077 }, { 11866, -3140 }, { 11901, -3171 }, { 11970, -3153 }, { 11977, -3088 } }, "Outpost" }, + place_outpost_zorai_14 = { true, { { 11479, -3067 }, { 11398, -3059 }, { 11375, -3095 }, { 11383, -3124 }, { 11410, -3159 }, { 11472, -3155 }, { 11482, -3112 } }, "Outpost" }, + place_lieudit_maidengrove_1 = { true, { { 10349, -3406 }, { 10350, -3433 }, { 10336, -3450 }, { 10332, -3460 }, { 10332, -3473 }, { 10343, -3496 }, { 10357, -3513 }, { 10375, -3527 }, { 10422, -3542 }, { 10463, -3537 }, { 10495, -3526 }, { 10532, -3501 }, { 10566, -3463 }, { 10611, -3443 }, { 10629, -3429 }, { 10637, -3402 }, { 10638, -3363 }, { 10643, -3309 }, { 10637, -3287 }, { 10622, -3273 }, { 10604, -3257 }, { 10589, -3252 }, { 10543, -3255 }, { 10524, -3266 }, { 10495, -3272 }, { 10468, -3269 }, { 10458, -3260 }, { 10450, -3240 }, { 10435, -3219 }, { 10414, -3218 }, { 10377, -3222 }, { 10359, -3224 }, { 10333, -3270 }, { 10318, -3283 }, { 10301, -3300 }, { 10289, -3315 }, { 10273, -3322 }, { 10264, -3330 }, { 10264, -3351 }, { 10285, -3366 }, { 10309, -3387 } }, "Locality" }, + place_lieudit_maidengrove_2 = { true, { { 10649, -3743 }, { 10645, -3768 }, { 10654, -3792 }, { 10665, -3802 }, { 10678, -3807 }, { 10692, -3813 }, { 10724, -3832 }, { 10735, -3856 }, { 10757, -3878 }, { 10795, -3883 }, { 10824, -3868 }, { 10849, -3842 }, { 10873, -3808 }, { 10875, -3774 }, { 10873, -3732 }, { 10871, -3711 }, { 10871, -3684 }, { 10867, -3666 }, { 10857, -3650 }, { 10840, -3642 }, { 10804, -3639 }, { 10780, -3640 }, { 10750, -3657 }, { 10726, -3672 }, { 10706, -3699 }, { 10695, -3702 }, { 10666, -3709 } }, "Locality" }, + place_lieudit_maidengrove_3 = { true, { { 10410, -4059 }, { 10401, -4067 }, { 10396, -4078 }, { 10397, -4092 }, { 10407, -4102 }, { 10434, -4110 }, { 10445, -4119 }, { 10455, -4149 }, { 10464, -4164 }, { 10482, -4168 }, { 10495, -4167 }, { 10508, -4152 }, { 10533, -4140 }, { 10553, -4139 }, { 10577, -4139 }, { 10594, -4094 }, { 10596, -4073 }, { 10584, -4037 }, { 10570, -4008 }, { 10552, -3984 }, { 10521, -3962 }, { 10496, -3954 }, { 10463, -3955 }, { 10440, -3955 }, { 10424, -3959 } }, "Locality" }, + place_lieudit_maidengrove_4 = { true, { { 11527, -3390 }, { 11518, -3429 }, { 11521, -3462 }, { 11532, -3490 }, { 11546, -3522 }, { 11569, -3550 }, { 11590, -3566 }, { 11626, -3572 }, { 11656, -3554 }, { 11679, -3525 }, { 11692, -3499 }, { 11696, -3486 }, { 11686, -3440 }, { 11691, -3415 }, { 11703, -3378 }, { 11699, -3361 }, { 11694, -3345 }, { 11676, -3333 }, { 11639, -3327 }, { 11620, -3326 }, { 11567, -3353 } }, "Locality" }, + place_lieudit_maidengrove_5 = { true, { { 11610, -3125 }, { 11608, -3139 }, { 11596, -3160 }, { 11588, -3187 }, { 11586, -3219 }, { 11594, -3245 }, { 11601, -3266 }, { 11611, -3275 }, { 11662, -3290 }, { 11718, -3278 }, { 11745, -3272 }, { 11769, -3259 }, { 11772, -3239 }, { 11799, -3187 }, { 11816, -3150 }, { 11823, -3104 }, { 11799, -3053 }, { 11774, -3007 }, { 11755, -2991 }, { 11743, -2969 }, { 11722, -2953 }, { 11690, -2943 }, { 11670, -2947 }, { 11630, -2952 }, { 11610, -2959 }, { 11583, -2975 }, { 11568, -2997 }, { 11562, -3030 }, { 11562, -3054 }, { 11574, -3082 }, { 11583, -3093 }, { 11593, -3106 } }, "Locality" }, + r_03_38_village_shadowrunners = { false, { { 11789, -2788 }, { 11771, -2790 }, { 11755, -2801 }, { 11749, -2816 }, { 11748, -2831 }, { 11750, -2844 }, { 11756, -2859 }, { 11766, -2871 }, { 11778, -2878 }, { 11794, -2883 }, { 11811, -2880 }, { 11823, -2871 }, { 11819, -2804 } }, "Locality" }, + place_r_05_41_foreuses = { false, { { 10326, -3234 }, { 10334, -3226 }, { 10334, -3153 }, { 10295, -3153 }, { 10297, -3237 }, { 10315, -3239 } }, "Locality" }, + rpjob_magnecarto_2_a = { false, { { 10675, -3334 }, { 10679, -3337 }, { 10684, -3338 }, { 10688, -3334 }, { 10688, -3328 }, { 10684, -3325 }, { 10679, -3325 }, { 10675, -3328 } }, "Locality" }, + rpjob_magnecarto_2_b = { false, { { 10896, -3857 }, { 10900, -3860 }, { 10905, -3860 }, { 10909, -3857 }, { 10909, -3850 }, { 10905, -3848 }, { 10900, -3848 }, { 10896, -3851 } }, "Locality" }, + rpjob_magnecarto_2_c = { false, { { 11698, -3749 }, { 11701, -3752 }, { 11707, -3753 }, { 11711, -3749 }, { 11711, -3743 }, { 11707, -3740 }, { 11702, -3740 }, { 11698, -3743 } }, "Locality" }, + rpjob_magnecarto_2_d = { false, { { 11344, -3011 }, { 11347, -3015 }, { 11353, -3015 }, { 11357, -3011 }, { 11357, -3005 }, { 11353, -3002 }, { 11348, -3002 }, { 11344, -3005 } }, "Locality" } + } }, + region_thevoid = { true, { { 9921, -1758 }, { 9760, -1919 }, { 9759, -2240 }, { 9760, -2332 }, { 9806, -2344 }, { 9827, -2400 }, { 9922, -2399 }, { 10012, -2400 }, { 10054, -2430 }, { 10079, -2494 }, { 10139, -2507 }, { 10145, -2559 }, { 10172, -2559 }, { 10239, -2620 }, { 10240, -2720 }, { 10344, -2719 }, { 10399, -2775 }, { 10398, -2821 }, { 10464, -2880 }, { 10560, -2880 }, { 10720, -2880 }, { 10817, -2881 }, { 10881, -3040 }, { 10880, -3137 }, { 10946, -3200 }, { 11040, -3200 }, { 11090, -3199 }, { 11110, -3248 }, { 11139, -3247 }, { 11200, -3200 }, { 11200, -3040 }, { 11200, -2944 }, { 11262, -2880 }, { 11359, -2880 }, { 11424, -2880 }, { 11423, -2912 }, { 11462, -2920 }, { 11520, -2880 }, { 11519, -2785 }, { 11586, -2720 }, { 11680, -2720 }, { 12160, -2559 }, { 12159, -1602 }, { 11999, -1439 }, { 12000, -1190 }, { 11679, -1189 }, { 11679, -1441 }, { 11045, -1442 } }, { + place_outpost_zorai_15 = { true, { { 11283, -2575 }, { 11219, -2583 }, { 11213, -2633 }, { 11215, -2671 }, { 11270, -2691 }, { 11309, -2670 }, { 11310, -2612 } }, "Outpost" }, + place_outpost_zorai_16 = { true, { { 10631, -2594 }, { 10576, -2628 }, { 10576, -2684 }, { 10644, -2707 }, { 10688, -2657 }, { 10681, -2608 } }, "Outpost" }, + place_outpost_zorai_17 = { true, { { 11319, -2125 }, { 11253, -2135 }, { 11244, -2175 }, { 11247, -2210 }, { 11299, -2225 }, { 11341, -2216 }, { 11348, -2168 } }, "Outpost" }, + place_outpost_zorai_18 = { true, { { 10813, -2120 }, { 10746, -2127 }, { 10734, -2181 }, { 10757, -2228 }, { 10814, -2228 }, { 10845, -2193 } }, "Outpost" }, + place_outpost_zorai_19 = { true, { { 11774, -1791 }, { 11726, -1794 }, { 11712, -1854 }, { 11749, -1903 }, { 11820, -1887 }, { 11821, -1834 } }, "Outpost" }, + place_arrival_from_terre = { false, { { 10839, -2046 }, { 10836, -2045 }, { 10811, -2045 }, { 10807, -2038 }, { 10801, -2040 }, { 10799, -2044 }, { 10796, -2045 }, { 10788, -2045 }, { 10785, -2046 }, { 10785, -2049 }, { 10790, -2052 }, { 10824, -2051 }, { 10836, -2051 }, { 10839, -2049 } }, "Locality" }, + place_lieudit_thevoid_1 = { true, { { 11646, -1893 }, { 11625, -1854 }, { 11591, -1811 }, { 11563, -1781 }, { 11518, -1762 }, { 11473, -1763 }, { 11423, -1771 }, { 11379, -1805 }, { 11368, -1841 }, { 11362, -1902 }, { 11371, -1948 }, { 11379, -1990 }, { 11415, -2021 }, { 11455, -2041 }, { 11511, -2071 }, { 11552, -2062 }, { 11596, -2035 }, { 11627, -2011 }, { 11650, -1960 } }, "Locality" }, + place_lieudit_thevoid_2 = { true, { { 9866, -1909 }, { 9784, -2118 }, { 9776, -2259 }, { 9805, -2344 }, { 9877, -2370 }, { 9956, -2382 }, { 10025, -2373 }, { 10129, -2452 }, { 10152, -2511 }, { 10186, -2544 }, { 10264, -2547 }, { 10366, -2470 }, { 10429, -2397 }, { 10437, -2325 }, { 10437, -2289 }, { 10416, -2265 }, { 10372, -2221 }, { 10345, -2206 }, { 10279, -2211 }, { 10240, -2188 }, { 10221, -2142 }, { 10224, -2097 }, { 10236, -2067 }, { 10239, -2017 }, { 10212, -1975 }, { 10201, -1950 }, { 10218, -1929 }, { 10261, -1890 }, { 10278, -1843 }, { 10263, -1786 }, { 10254, -1737 }, { 9842, -1717 } }, "Locality" }, + place_lieudit_thevoid_3 = { true, { { 10906, -2879 }, { 10902, -2914 }, { 10940, -2926 }, { 10966, -2951 }, { 10943, -2995 }, { 10905, -2997 }, { 10908, -3072 }, { 10930, -3084 }, { 10860, -3104 }, { 10863, -3146 }, { 10947, -3148 }, { 10923, -3202 }, { 10982, -3202 }, { 11045, -3174 }, { 11090, -3182 }, { 11107, -3245 }, { 11142, -3245 }, { 11151, -3154 }, { 11207, -3140 }, { 11206, -3103 }, { 11145, -3091 }, { 11179, -3062 }, { 11177, -3031 }, { 11149, -3004 }, { 11019, -2902 }, { 10980, -2898 } }, "Locality" }, + rpjob_magnecarto_5_a = { false, { { 10794, -2287 }, { 10797, -2290 }, { 10803, -2290 }, { 10807, -2287 }, { 10807, -2280 }, { 10803, -2278 }, { 10798, -2278 }, { 10794, -2281 } }, "Locality" }, + rpjob_magnecarto_5_b = { false, { { 11046, -2739 }, { 11049, -2743 }, { 11055, -2743 }, { 11059, -2739 }, { 11059, -2733 }, { 11055, -2730 }, { 11050, -2730 }, { 11046, -2733 } }, "Locality" }, + rpjob_magnecarto_5_c = { false, { { 11562, -2361 }, { 11565, -2364 }, { 11571, -2364 }, { 11575, -2361 }, { 11575, -2354 }, { 11571, -2352 }, { 11566, -2352 }, { 11562, -2355 } }, "Locality" }, + rpjob_magnecarto_5_d = { false, { { 11639, -1799 }, { 11642, -1802 }, { 11648, -1803 }, { 11652, -1799 }, { 11652, -1793 }, { 11648, -1790 }, { 11643, -1790 }, { 11639, -1793 } }, "Locality" }, + boss_zorai_light_maincamp = { true, { { 11760, -1217 }, { 11742, -1288 }, { 11771, -1366 }, { 11851, -1399 }, { 11973, -1341 }, { 11964, -1210 } }, "Locality" }, + place_ranger_entry_thevoid = { false, { { 10668, -2200 }, { 10666, -2196 }, { 10662, -2195 }, { 10659, -2196 }, { 10657, -2199 }, { 10659, -2203 }, { 10662, -2205 }, { 10665, -2204 } }, "Locality" } + } }, + region_havenofpurity = { true, { { 8955, -1919 }, { 8955, -2079 }, { 8941, -2182 }, { 8888, -2240 }, { 8808, -2252 }, { 8796, -2561 }, { 8796, -2626 }, { 8837, -2627 }, { 8840, -2663 }, { 8796, -2656 }, { 8743, -2701 }, { 8741, -2737 }, { 8798, -2786 }, { 8797, -2833 }, { 8834, -2900 }, { 8955, -2880 }, { 9059, -2880 }, { 9115, -2942 }, { 9115, -2985 }, { 9174, -3039 }, { 9208, -3040 }, { 9274, -3106 }, { 9275, -3158 }, { 9328, -3199 }, { 9435, -3200 }, { 9492, -3360 }, { 9755, -3359 }, { 9869, -3360 }, { 9915, -3302 }, { 9915, -3200 }, { 10101, -3013 }, { 10100, -2973 }, { 10135, -2955 }, { 10154, -2960 }, { 10235, -2880 }, { 10236, -2620 }, { 10168, -2559 }, { 10141, -2559 }, { 10134, -2507 }, { 10075, -2493 }, { 10049, -2430 }, { 10007, -2399 }, { 9915, -2400 }, { 9823, -2399 }, { 9802, -2344 }, { 9755, -2332 }, { 9755, -2240 }, { 9755, -1920 } }, { + place_outpost_zorai_20 = { true, { { 9715, -2894 }, { 9649, -2903 }, { 9633, -2940 }, { 9647, -2999 }, { 9734, -3001 }, { 9743, -2930 } }, "Outpost" }, + rpjob_magnecarto_3_a = { false, { { 9199, -2236 }, { 9202, -2240 }, { 9208, -2240 }, { 9212, -2236 }, { 9212, -2230 }, { 9208, -2227 }, { 9203, -2227 }, { 9199, -2230 } }, "Locality" }, + rpjob_magnecarto_3_b = { false, { { 9004, -2765 }, { 9008, -2769 }, { 9013, -2769 }, { 9017, -2765 }, { 9017, -2759 }, { 9013, -2756 }, { 9008, -2756 }, { 9004, -2759 } }, "Locality" }, + rpjob_magnecarto_3_c = { false, { { 9626, -3170 }, { 9629, -3174 }, { 9635, -3174 }, { 9639, -3170 }, { 9639, -3164 }, { 9635, -3161 }, { 9630, -3161 }, { 9626, -3164 } }, "Locality" }, + rpjob_magnecarto_3_d = { false, { { 10048, -2754 }, { 10052, -2757 }, { 10057, -2757 }, { 10061, -2754 }, { 10061, -2747 }, { 10057, -2744 }, { 10053, -2745 }, { 10048, -2748 } }, "Locality" }, + place_outpost_zorai_21 = { true, { { 9231, -2580 }, { 9147, -2587 }, { 9147, -2659 }, { 9174, -2687 }, { 9228, -2690 }, { 9253, -2670 }, { 9262, -2611 } }, "Outpost" }, + place_outpost_zorai_22 = { true, { { 9896, -2425 }, { 9791, -2425 }, { 9780, -2532 }, { 9890, -2533 } }, "Outpost" }, + place_outpost_zorai_23 = { true, { { 9354, -2095 }, { 9304, -2094 }, { 9291, -2147 }, { 9319, -2198 }, { 9401, -2179 }, { 9397, -2119 } }, "Outpost" }, + place_lieudit_havenofpurity_1 = { true, { { 9580, -2243 }, { 9556, -2221 }, { 9534, -2210 }, { 9503, -2208 }, { 9465, -2220 }, { 9436, -2239 }, { 9426, -2270 }, { 9421, -2302 }, { 9429, -2340 }, { 9448, -2361 }, { 9491, -2379 }, { 9528, -2376 }, { 9564, -2360 }, { 9583, -2335 }, { 9600, -2300 }, { 9594, -2275 } }, "Locality" }, + place_lieudit_havenofpurity_2 = { true, { { 9433, -2494 }, { 9429, -2458 }, { 9416, -2429 }, { 9388, -2412 }, { 9337, -2403 }, { 9305, -2418 }, { 9289, -2444 }, { 9277, -2481 }, { 9279, -2514 }, { 9294, -2542 }, { 9319, -2556 }, { 9370, -2556 }, { 9403, -2548 }, { 9426, -2524 } }, "Locality" }, + place_lieudit_havenofpurity_3 = { true, { { 9532, -2946 }, { 9523, -2926 }, { 9507, -2912 }, { 9489, -2898 }, { 9464, -2898 }, { 9445, -2906 }, { 9425, -2931 }, { 9427, -2961 }, { 9430, -3006 }, { 9460, -3024 }, { 9488, -3030 }, { 9516, -3030 }, { 9538, -3020 }, { 9541, -3009 }, { 9539, -2997 } }, "Locality" }, + boss_zorai_light_startcamp = { true, { { 10039, -2582 }, { 10035, -2607 }, { 10063, -2605 }, { 10064, -2581 } }, "Locality" } + } }, + region_knotofdementia = { true, { { 6872, -1597 }, { 6880, -2720 }, { 7518, -3524 }, { 8159, -3840 }, { 8478, -3839 }, { 8617, -3811 }, { 8640, -3680 }, { 8640, -3641 }, { 8578, -3611 }, { 8577, -3578 }, { 8638, -3559 }, { 8640, -3358 }, { 8638, -3238 }, { 8610, -3201 }, { 8511, -3201 }, { 8476, -3164 }, { 8478, -3040 }, { 8479, -2720 }, { 8480, -2604 }, { 8520, -2560 }, { 8640, -2559 }, { 8801, -2562 }, { 8814, -2252 }, { 8893, -2241 }, { 8946, -2181 }, { 8960, -2079 }, { 8960, -1919 }, { 8799, -1920 }, { 8800, -1759 }, { 8960, -1759 }, { 8961, -1440 }, { 8797, -1277 }, { 7679, -1277 } }, { + place_outpost_zorai_24 = { true, { { 8299, -3541 }, { 8189, -3544 }, { 8186, -3653 }, { 8291, -3652 } }, "Outpost" }, + place_outpost_zorai_25 = { true, { { 7943, -2898 }, { 7860, -2900 }, { 7853, -2988 }, { 7904, -3008 }, { 7961, -2984 } }, "Outpost" }, + place_outpost_zorai_26 = { true, { { 7611, -2441 }, { 7540, -2450 }, { 7531, -2519 }, { 7563, -2540 }, { 7630, -2540 }, { 7639, -2484 } }, "Outpost" }, + place_outpost_zorai_27 = { true, { { 8255, -2254 }, { 8189, -2255 }, { 8177, -2331 }, { 8225, -2364 }, { 8269, -2359 }, { 8286, -2318 } }, "Outpost" }, + place_outpost_zorai_28 = { true, { { 7618, -1929 }, { 7545, -1932 }, { 7535, -2016 }, { 7583, -2047 }, { 7623, -2043 }, { 7651, -2012 } }, "Outpost" }, + place_outpost_zorai_29 = { true, { { 7168, -1938 }, { 7064, -1941 }, { 7050, -1989 }, { 7089, -2050 }, { 7168, -2021 } }, "Outpost" }, + place_outpost_zorai_30 = { true, { { 8624, -1619 }, { 8540, -1612 }, { 8512, -1666 }, { 8529, -1716 }, { 8574, -1728 }, { 8637, -1690 } }, "Outpost" }, + place_arrival_from_sources = { false, { { 8120, -2366 }, { 8117, -2365 }, { 8092, -2365 }, { 8088, -2358 }, { 8082, -2360 }, { 8080, -2364 }, { 8076, -2365 }, { 8069, -2365 }, { 8066, -2366 }, { 8065, -2370 }, { 8071, -2372 }, { 8105, -2371 }, { 8117, -2371 }, { 8120, -2369 } }, "Locality" }, + place_lieudit_knotofdementia_1 = { true, { { 7331, -2193 }, { 7328, -2172 }, { 7322, -2150 }, { 7321, -2122 }, { 7322, -2103 }, { 7328, -2066 }, { 7346, -2049 }, { 7351, -2047 }, { 7363, -2045 }, { 7376, -2043 }, { 7383, -2041 }, { 7391, -2034 }, { 7404, -2019 }, { 7408, -1999 }, { 7409, -1990 }, { 7404, -1981 }, { 7399, -1965 }, { 7392, -1952 }, { 7390, -1948 }, { 7394, -1939 }, { 7392, -1920 }, { 7394, -1912 }, { 7395, -1901 }, { 7400, -1894 }, { 7424, -1883 }, { 7431, -1872 }, { 7438, -1860 }, { 7439, -1847 }, { 7440, -1843 }, { 7445, -1841 }, { 7456, -1838 }, { 7467, -1835 }, { 7472, -1835 }, { 7477, -1834 }, { 7484, -1827 }, { 7486, -1823 }, { 7485, -1818 }, { 7487, -1812 }, { 7489, -1806 }, { 7486, -1802 }, { 7483, -1800 }, { 7481, -1799 }, { 7483, -1794 }, { 7482, -1787 }, { 7480, -1776 }, { 7486, -1749 }, { 7487, -1742 }, { 7490, -1734 }, { 7486, -1726 }, { 7204, -1613 }, { 6977, -1707 }, { 6890, -1919 }, { 6895, -2121 }, { 6980, -2342 }, { 7010, -2365 }, { 7021, -2366 }, { 7041, -2365 }, { 7051, -2368 }, { 7057, -2372 }, { 7064, -2375 }, { 7074, -2376 }, { 7087, -2375 }, { 7100, -2380 }, { 7108, -2380 }, { 7124, -2370 }, { 7139, -2362 }, { 7149, -2365 }, { 7172, -2361 }, { 7183, -2366 }, { 7203, -2366 }, { 7216, -2363 }, { 7223, -2362 }, { 7226, -2359 }, { 7230, -2356 }, { 7235, -2352 }, { 7241, -2346 }, { 7244, -2340 }, { 7244, -2332 }, { 7246, -2327 }, { 7249, -2321 }, { 7250, -2316 }, { 7250, -2313 }, { 7249, -2309 }, { 7247, -2307 }, { 7245, -2305 }, { 7244, -2298 }, { 7243, -2293 }, { 7240, -2289 }, { 7232, -2276 }, { 7231, -2269 }, { 7236, -2257 }, { 7232, -2238 }, { 7235, -2233 }, { 7236, -2216 }, { 7253, -2213 }, { 7269, -2222 }, { 7290, -2223 }, { 7302, -2218 }, { 7321, -2205 } }, "Locality" }, + place_lieudit_knotofdementia_2 = { true, { { 7475, -2098 }, { 7450, -2097 }, { 7415, -2128 }, { 7384, -2141 }, { 7375, -2161 }, { 7376, -2207 }, { 7373, -2244 }, { 7377, -2283 }, { 7404, -2317 }, { 7441, -2343 }, { 7478, -2371 }, { 7509, -2387 }, { 7540, -2385 }, { 7579, -2364 }, { 7622, -2319 }, { 7639, -2289 }, { 7653, -2238 }, { 7649, -2202 }, { 7638, -2178 }, { 7620, -2136 }, { 7587, -2110 }, { 7551, -2092 }, { 7501, -2085 } }, "Locality" }, + place_lieudit_knotofdementia_3 = { true, { { 7848, -2269 }, { 7805, -2275 }, { 7770, -2295 }, { 7740, -2316 }, { 7713, -2364 }, { 7714, -2443 }, { 7729, -2517 }, { 7772, -2553 }, { 7853, -2552 }, { 7907, -2552 }, { 7947, -2537 }, { 7983, -2508 }, { 7998, -2475 }, { 8022, -2401 }, { 7994, -2334 }, { 7932, -2290 } }, "Locality" }, + place_lieudit_knotofdementia_4 = { true, { { 8117, -2244 }, { 8072, -2248 }, { 8034, -2260 }, { 8012, -2296 }, { 8016, -2358 }, { 8037, -2392 }, { 8108, -2406 }, { 8150, -2377 }, { 8145, -2319 }, { 8141, -2275 } }, "Locality" }, + place_lieudit_knotofdementia_5 = { true, { { 8252, -1774 }, { 8242, -1775 }, { 8228, -1776 }, { 8226, -1783 }, { 8223, -1790 }, { 8213, -1788 }, { 8200, -1787 }, { 8191, -1794 }, { 8187, -1810 }, { 8191, -1824 }, { 8197, -1833 }, { 8208, -1836 }, { 8225, -1828 }, { 8235, -1827 }, { 8244, -1825 }, { 8250, -1827 }, { 8252, -1833 }, { 8253, -1843 }, { 8253, -1850 }, { 8248, -1853 }, { 8236, -1854 }, { 8229, -1854 }, { 8221, -1857 }, { 8218, -1867 }, { 8217, -1876 }, { 8220, -1883 }, { 8225, -1888 }, { 8233, -1892 }, { 8242, -1895 }, { 8253, -1892 }, { 8260, -1889 }, { 8267, -1887 }, { 8275, -1885 }, { 8287, -1878 }, { 8290, -1860 }, { 8297, -1855 }, { 8304, -1850 }, { 8303, -1838 }, { 8301, -1830 }, { 8290, -1823 }, { 8285, -1817 }, { 8285, -1812 }, { 8286, -1801 }, { 8278, -1789 }, { 8269, -1782 }, { 8260, -1779 } }, "Locality" }, + place_lieudit_knotofdementia_6 = { true, { { 8071, -3344 }, { 8089, -3345 }, { 8093, -3340 }, { 8095, -3330 }, { 8100, -3327 }, { 8105, -3331 }, { 8114, -3333 }, { 8128, -3328 }, { 8134, -3314 }, { 8134, -3306 }, { 8130, -3298 }, { 8128, -3294 }, { 8122, -3289 }, { 8111, -3286 }, { 8100, -3288 }, { 8088, -3292 }, { 8080, -3293 }, { 8072, -3292 }, { 8069, -3288 }, { 8068, -3286 }, { 8066, -3277 }, { 8067, -3271 }, { 8069, -3268 }, { 8072, -3266 }, { 8078, -3265 }, { 8083, -3265 }, { 8088, -3265 }, { 8095, -3264 }, { 8099, -3258 }, { 8102, -3250 }, { 8102, -3243 }, { 8097, -3235 }, { 8089, -3229 }, { 8078, -3225 }, { 8068, -3226 }, { 8062, -3229 }, { 8053, -3232 }, { 8045, -3232 }, { 8037, -3236 }, { 8032, -3244 }, { 8031, -3256 }, { 8022, -3264 }, { 8013, -3268 }, { 8015, -3284 }, { 8025, -3295 }, { 8033, -3297 }, { 8032, -3304 }, { 8031, -3312 }, { 8038, -3324 }, { 8049, -3337 }, { 8059, -3343 }, { 8065, -3346 } }, "Locality" }, + place_arrival_from_fyros = { false, { { 6875, -2001 }, { 6879, -2010 }, { 6889, -2011 }, { 6893, -2003 }, { 6890, -1997 }, { 6882, -1995 } }, "Locality" } + } } + } }, + continent_fyros = { true, { { 15781, -23746 }, { 15753, -27137 }, { 20408, -27082 }, { 20384, -25000 }, { 20375, -23777 } }, { + region_imperialdunes = { true, { { 18168, -23956 }, { 18164, -24160 }, { 18150, -24868 }, { 18093, -25009 }, { 18084, -25434 }, { 18228, -25426 }, { 18240, -25469 }, { 18385, -25491 }, { 18488, -25509 }, { 18564, -25476 }, { 18569, -25413 }, { 18595, -25406 }, { 18594, -25362 }, { 18548, -25271 }, { 18557, -25216 }, { 18556, -25204 }, { 18595, -25174 }, { 18590, -25074 }, { 18615, -25072 }, { 18663, -25035 }, { 18685, -24946 }, { 18741, -24973 }, { 18766, -24953 }, { 18786, -24912 }, { 18838, -24880 }, { 18918, -24869 }, { 19057, -24837 }, { 19082, -24805 }, { 19137, -24803 }, { 19149, -24709 }, { 19241, -24636 }, { 19361, -24402 }, { 19426, -24376 }, { 19489, -24325 }, { 19516, -24198 }, { 19621, -23832 }, { 18377, -23830 } }, { + place_pyr = { true, { { 18993, -24379 }, { 18955, -24352 }, { 18938, -24348 }, { 18926, -24304 }, { 18903, -24282 }, { 18817, -24293 }, { 18751, -24329 }, { 18687, -24363 }, { 18653, -24364 }, { 18626, -24343 }, { 18616, -24299 }, { 18613, -24272 }, { 18565, -24272 }, { 18525, -24278 }, { 18511, -24303 }, { 18506, -24336 }, { 18499, -24361 }, { 18530, -24369 }, { 18523, -24393 }, { 18492, -24394 }, { 18477, -24392 }, { 18467, -24402 }, { 18449, -24409 }, { 18424, -24410 }, { 18388, -24503 }, { 18407, -24593 }, { 18519, -24661 }, { 18600, -24661 }, { 18703, -24633 }, { 18729, -24662 }, { 18807, -24651 }, { 18840, -24613 }, { 18938, -24539 }, { 18999, -24443 } }, "Capital" }, + pyr_stable1 = { true, { { 18553, -24331 }, { 18586, -24330 }, { 18605, -24298 }, { 18605, -24284 }, { 18561, -24279 } }, "stable" }, + pyr_stable2 = { true, { { 18758, -24612 }, { 18778, -24642 }, { 18811, -24644 }, { 18820, -24634 }, { 18820, -24609 }, { 18800, -24596 }, { 18782, -24596 } }, "stable" }, + pyr_stable3 = { true, { { 18943, -24389 }, { 18942, -24448 }, { 18994, -24443 }, { 18988, -24382 } }, "stable" }, + place_outpost_fyros_14 = { true, { { 18319, -25294 }, { 18268, -25295 }, { 18259, -25335 }, { 18283, -25373 }, { 18349, -25370 }, { 18363, -25364 }, { 18366, -25336 }, { 18362, -25325 }, { 18333, -25310 } }, "Outpost" }, + place_lieudit_imperialdunes_1 = { true, { { 18852, -23885 }, { 18867, -23893 }, { 18893, -23910 }, { 18897, -23938 }, { 18888, -23961 }, { 18890, -24009 }, { 18900, -24036 }, { 18906, -24070 }, { 18903, -24100 }, { 18891, -24120 }, { 18888, -24130 }, { 18886, -24142 }, { 18897, -24150 }, { 18910, -24151 }, { 18940, -24154 }, { 18960, -24151 }, { 18977, -24152 }, { 18995, -24176 }, { 19018, -24186 }, { 19055, -24192 }, { 19082, -24190 }, { 19143, -24190 }, { 19174, -24176 }, { 19242, -24182 }, { 19276, -24185 }, { 19306, -24175 }, { 19322, -24146 }, { 19345, -24056 }, { 19334, -24021 }, { 19190, -24029 }, { 19162, -24073 }, { 19147, -24104 }, { 19131, -24120 }, { 19121, -24130 }, { 19102, -24132 }, { 19068, -24132 }, { 19041, -24112 }, { 19015, -24111 }, { 18983, -24075 }, { 18955, -24047 }, { 18925, -24001 }, { 18926, -23956 }, { 18936, -23926 }, { 18946, -23918 }, { 18965, -23909 }, { 18988, -23886 }, { 18989, -23866 }, { 18854, -23847 } }, "Locality" }, + place_lieudit_imperialdunes_2 = { true, { { 18184, -24623 }, { 18156, -24624 }, { 18133, -24640 }, { 18114, -24673 }, { 18112, -24703 }, { 18146, -24738 }, { 18175, -24751 }, { 18196, -24755 }, { 18225, -24744 }, { 18244, -24722 }, { 18248, -24701 }, { 18247, -24672 }, { 18220, -24637 }, { 18200, -24624 } }, "Locality" }, + place_lieudit_imperialdunes_3 = { true, { { 18584, -24958 }, { 18560, -24944 }, { 18525, -24951 }, { 18496, -24940 }, { 18439, -24974 }, { 18420, -25000 }, { 18391, -25036 }, { 18371, -25074 }, { 18362, -25096 }, { 18346, -25105 }, { 18307, -25104 }, { 18290, -25100 }, { 18268, -25130 }, { 18254, -25160 }, { 18263, -25184 }, { 18292, -25204 }, { 18318, -25216 }, { 18376, -25218 }, { 18401, -25216 }, { 18421, -25208 }, { 18436, -25207 }, { 18459, -25205 }, { 18469, -25204 }, { 18480, -25202 }, { 18492, -25199 }, { 18503, -25200 }, { 18523, -25205 }, { 18536, -25206 }, { 18551, -25203 }, { 18561, -25203 }, { 18559, -25197 }, { 18560, -25186 }, { 18575, -25185 }, { 18593, -25179 }, { 18595, -25173 }, { 18587, -25140 }, { 18590, -25127 }, { 18591, -25116 }, { 18586, -25091 }, { 18586, -25081 }, { 18594, -25070 }, { 18608, -25071 }, { 18606, -25059 }, { 18585, -25052 }, { 18584, -25049 }, { 18587, -25044 }, { 18594, -25039 }, { 18603, -25038 }, { 18617, -25042 }, { 18623, -25043 }, { 18626, -25041 }, { 18626, -25036 }, { 18625, -25027 }, { 18624, -25020 }, { 18627, -25017 }, { 18630, -25017 }, { 18635, -25019 }, { 18639, -25023 }, { 18642, -25033 }, { 18641, -25045 }, { 18646, -25043 }, { 18652, -25038 }, { 18655, -25035 }, { 18657, -25029 }, { 18662, -25020 }, { 18660, -24999 }, { 18657, -24981 }, { 18651, -24968 }, { 18643, -24970 }, { 18637, -24979 }, { 18619, -24982 }, { 18597, -24975 } }, "Locality" }, + place_pyr_p_market_1 = { true, { { 18849, -24380 }, { 18860, -24360 }, { 18875, -24311 }, { 18840, -24293 }, { 18791, -24312 }, { 18753, -24349 }, { 18756, -24383 }, { 18744, -24392 }, { 18747, -24413 }, { 18767, -24411 }, { 18786, -24453 }, { 18830, -24448 }, { 18856, -24418 } }, "Street" }, + place_pyr_p_west_entrance = { true, { { 18850, -24381 }, { 18861, -24389 }, { 18894, -24390 }, { 18894, -24392 }, { 18900, -24400 }, { 18907, -24403 }, { 18910, -24382 }, { 18903, -24357 }, { 18916, -24369 }, { 18932, -24366 }, { 18929, -24323 }, { 18915, -24292 }, { 18883, -24289 }, { 18874, -24341 } }, "Street" }, + place_pyr_p_market_2 = { true, { { 18703, -24381 }, { 18644, -24394 }, { 18632, -24416 }, { 18627, -24425 }, { 18642, -24441 }, { 18656, -24444 }, { 18701, -24446 }, { 18718, -24447 }, { 18717, -24427 }, { 18719, -24413 }, { 18714, -24396 } }, "Street" }, + place_pyr_p_place_warschool = { true, { { 18578, -24416 }, { 18562, -24420 }, { 18542, -24412 }, { 18544, -24434 }, { 18553, -24438 }, { 18558, -24443 }, { 18559, -24446 }, { 18559, -24451 }, { 18558, -24456 }, { 18548, -24464 }, { 18550, -24484 }, { 18557, -24481 }, { 18565, -24474 }, { 18591, -24466 }, { 18586, -24446 }, { 18588, -24436 } }, "Street" }, + place_pyr_p_fontaine = { true, { { 18682, -24518 }, { 18689, -24519 }, { 18696, -24517 }, { 18704, -24508 }, { 18704, -24502 }, { 18699, -24492 }, { 18691, -24487 }, { 18686, -24487 }, { 18678, -24491 }, { 18672, -24500 }, { 18672, -24512 } }, "Street" }, + place_pyr_p_sheriff = { true, { { 18623, -24488 }, { 18613, -24491 }, { 18608, -24500 }, { 18608, -24511 }, { 18617, -24521 }, { 18625, -24520 }, { 18636, -24514 }, { 18639, -24505 }, { 18637, -24497 }, { 18629, -24489 } }, "Street" }, + place_pyr_p_place_mairie_1 = { true, { { 18475, -24483 }, { 18483, -24481 }, { 18513, -24476 }, { 18515, -24472 }, { 18509, -24459 }, { 18506, -24447 }, { 18506, -24400 }, { 18491, -24395 }, { 18471, -24398 }, { 18463, -24405 }, { 18463, -24427 } }, "Street" }, + place_pyr_p_place_mairie_2 = { true, { { 18524, -24515 }, { 18482, -24522 }, { 18481, -24529 }, { 18481, -24536 }, { 18475, -24544 }, { 18474, -24550 }, { 18474, -24575 }, { 18477, -24586 }, { 18494, -24618 }, { 18514, -24629 }, { 18546, -24632 }, { 18547, -24577 }, { 18547, -24535 } }, "Street" }, + place_pyr_p_place_agora = { true, { { 18459, -24407 }, { 18423, -24431 }, { 18393, -24529 }, { 18433, -24593 }, { 18471, -24623 }, { 18495, -24620 }, { 18477, -24585 }, { 18474, -24546 }, { 18482, -24537 }, { 18473, -24476 }, { 18466, -24439 }, { 18464, -24409 } }, "Street" }, + place_pyr_p_forge = { true, { { 18553, -24598 }, { 18546, -24606 }, { 18546, -24621 }, { 18552, -24634 }, { 18561, -24639 }, { 18572, -24639 }, { 18584, -24633 }, { 18591, -24621 }, { 18592, -24612 }, { 18586, -24603 }, { 18579, -24598 }, { 18578, -24597 }, { 18575, -24600 }, { 18570, -24598 }, { 18568, -24595 }, { 18559, -24596 } }, "Street" }, + place_pyr_p_street_1 = { true, { { 18747, -24391 }, { 18756, -24384 }, { 18751, -24370 }, { 18724, -24368 }, { 18702, -24380 }, { 18714, -24396 } }, "Street" }, + place_pyr_p_street_2 = { true, { { 18767, -24410 }, { 18754, -24412 }, { 18717, -24428 }, { 18718, -24440 }, { 18743, -24452 }, { 18768, -24442 }, { 18772, -24422 } }, "Street" }, + place_pyr_p_street_3 = { true, { { 18632, -24416 }, { 18640, -24403 }, { 18618, -24386 }, { 18601, -24395 }, { 18593, -24400 }, { 18579, -24418 }, { 18584, -24430 } }, "Street" }, + place_pyr_p_street_4 = { true, { { 18641, -24438 }, { 18628, -24424 }, { 18601, -24430 }, { 18588, -24455 }, { 18592, -24470 } }, "Street" }, + place_pyr_p_street_5 = { true, { { 18540, -24350 }, { 18545, -24411 }, { 18562, -24417 }, { 18595, -24400 }, { 18602, -24395 }, { 18589, -24377 }, { 18560, -24345 } }, "Street" }, + place_pyr_p_street_6 = { true, { { 18895, -24392 }, { 18869, -24409 }, { 18824, -24480 }, { 18834, -24490 }, { 18841, -24481 }, { 18857, -24477 }, { 18869, -24469 }, { 18880, -24416 }, { 18887, -24410 }, { 18898, -24406 }, { 18900, -24399 } }, "Street" }, + place_pyr_p_street_7 = { true, { { 18901, -24400 }, { 18898, -24406 }, { 18886, -24412 }, { 18881, -24416 }, { 18878, -24421 }, { 18872, -24470 }, { 18864, -24474 }, { 18850, -24480 }, { 18845, -24491 }, { 18842, -24505 }, { 18838, -24508 }, { 18836, -24517 }, { 18845, -24518 }, { 18892, -24480 }, { 18907, -24402 } }, "Street" }, + place_pyr_p_street_8 = { true, { { 18806, -24472 }, { 18784, -24483 }, { 18778, -24496 }, { 18775, -24512 }, { 18785, -24529 }, { 18796, -24536 }, { 18796, -24544 }, { 18819, -24546 }, { 18837, -24518 }, { 18838, -24508 }, { 18842, -24506 }, { 18837, -24488 }, { 18835, -24490 }, { 18823, -24479 } }, "Street" }, + place_pyr_p_street_9 = { true, { { 18767, -24475 }, { 18748, -24492 }, { 18743, -24502 }, { 18736, -24505 }, { 18738, -24531 }, { 18749, -24537 }, { 18760, -24541 }, { 18776, -24546 }, { 18796, -24535 }, { 18785, -24530 }, { 18768, -24514 }, { 18779, -24495 }, { 18784, -24484 } }, "Street" }, + place_pyr_p_street_10 = { true, { { 18743, -24502 }, { 18748, -24491 }, { 18738, -24484 }, { 18722, -24478 }, { 18700, -24490 }, { 18700, -24494 }, { 18703, -24502 } }, "Street" }, + place_pyr_p_street_11 = { true, { { 18677, -24491 }, { 18672, -24482 }, { 18654, -24470 }, { 18635, -24479 }, { 18630, -24490 }, { 18636, -24496 }, { 18672, -24500 } }, "Street" }, + place_pyr_p_street_12 = { true, { { 18635, -24514 }, { 18625, -24519 }, { 18636, -24540 }, { 18655, -24536 }, { 18670, -24534 }, { 18682, -24518 }, { 18672, -24512 } }, "Street" }, + place_pyr_p_street_13 = { true, { { 18609, -24510 }, { 18608, -24500 }, { 18592, -24497 }, { 18586, -24505 }, { 18593, -24510 } }, "Street" }, + place_pyr_p_street_14 = { true, { { 18592, -24572 }, { 18615, -24558 }, { 18615, -24524 }, { 18594, -24511 }, { 18586, -24505 }, { 18559, -24510 }, { 18546, -24533 }, { 18546, -24537 }, { 18557, -24538 }, { 18584, -24532 }, { 18588, -24560 } }, "Street" }, + place_pyr_p_street_15 = { true, { { 18547, -24576 }, { 18577, -24576 }, { 18570, -24537 }, { 18546, -24537 } }, "Street" }, + place_pyr_p_street_16 = { true, { { 18557, -24576 }, { 18547, -24576 }, { 18548, -24597 }, { 18558, -24597 }, { 18569, -24595 }, { 18578, -24597 }, { 18587, -24604 }, { 18606, -24626 }, { 18646, -24614 }, { 18644, -24597 }, { 18638, -24588 }, { 18611, -24592 } }, "Street" }, + place_pyr_p_street_17 = { true, { { 18636, -24585 }, { 18635, -24576 }, { 18610, -24561 }, { 18603, -24565 }, { 18599, -24569 }, { 18607, -24589 }, { 18629, -24589 } }, "Street" }, + place_pyr_p_street_18 = { true, { { 18723, -24616 }, { 18734, -24606 }, { 18710, -24585 }, { 18698, -24585 }, { 18684, -24582 }, { 18663, -24558 }, { 18658, -24549 }, { 18638, -24552 }, { 18634, -24576 }, { 18636, -24587 }, { 18644, -24598 }, { 18658, -24608 } }, "Street" }, + place_pyr_p_street_19 = { true, { { 18655, -24536 }, { 18656, -24547 }, { 18658, -24549 }, { 18662, -24558 }, { 18674, -24561 }, { 18682, -24561 }, { 18683, -24550 }, { 18673, -24550 }, { 18670, -24547 }, { 18668, -24539 }, { 18670, -24534 } }, "Street" }, + place_pyr_p_street_20 = { true, { { 18716, -24541 }, { 18707, -24536 }, { 18692, -24538 }, { 18682, -24550 }, { 18682, -24562 }, { 18685, -24574 }, { 18701, -24584 }, { 18722, -24569 }, { 18723, -24559 }, { 18722, -24548 } }, "Street" }, + place_pyr_p_street_21 = { true, { { 18707, -24536 }, { 18716, -24541 }, { 18726, -24524 }, { 18706, -24508 }, { 18702, -24510 }, { 18696, -24517 } }, "Street" }, + place_pyr_p_street_22 = { true, { { 18761, -24541 }, { 18750, -24537 }, { 18722, -24560 }, { 18721, -24569 }, { 18741, -24573 }, { 18747, -24570 }, { 18758, -24551 } }, "Street" }, + place_pyr_p_street_23 = { true, { { 18739, -24486 }, { 18746, -24490 }, { 18758, -24469 }, { 18753, -24452 }, { 18739, -24452 }, { 18713, -24446 }, { 18704, -24446 }, { 18700, -24452 }, { 18708, -24471 }, { 18733, -24477 } }, "Street" }, + r_11_10_kitin_hunting_1 = { false, { { 18657, -24827 }, { 18754, -24819 }, { 18749, -24753 }, { 18661, -24758 }, { 18573, -24791 }, { 18574, -24829 } }, "Locality" }, + r_11_10_kitin_hunting_2 = { false, { { 18810, -23983 }, { 18783, -24023 }, { 18823, -24076 }, { 18909, -24037 }, { 18941, -23929 }, { 18908, -23913 } }, "Locality" }, + r_08_04_kitin_boss_1 = { false, { { 19210, -24048 }, { 19183, -24173 }, { 19296, -24188 }, { 19325, -24055 } }, "Locality" }, + episode2_temple_karavan_fyros = { false, { { 18216, -25082 }, { 18205, -25088 }, { 18198, -25097 }, { 18196, -25107 }, { 18198, -25119 }, { 18207, -25128 }, { 18220, -25133 }, { 18233, -25132 }, { 18243, -25125 }, { 18248, -25116 }, { 18250, -25107 }, { 18248, -25098 }, { 18244, -25091 }, { 18237, -25085 }, { 18228, -25081 } }, "Locality" }, + episode2_temple_kami_fyros = { true, { { 19018, -23918 }, { 19003, -23956 }, { 18997, -23968 }, { 19003, -23996 }, { 18999, -24008 }, { 18988, -24008 }, { 18986, -24020 }, { 19001, -24036 }, { 19015, -24056 }, { 19027, -24059 }, { 19045, -24040 }, { 19081, -24041 }, { 19100, -24025 }, { 19112, -23997 }, { 19111, -23976 }, { 19098, -23968 }, { 19098, -23953 }, { 19090, -23947 }, { 19089, -23931 }, { 19078, -23925 }, { 19068, -23906 }, { 19040, -23901 } }, "Locality" } + } }, + region_oflovaksoasis = { true, { { 17599, -24160 }, { 17599, -24320 }, { 17599, -24480 }, { 17599, -24553 }, { 17463, -24742 }, { 17443, -25545 }, { 17407, -25893 }, { 17475, -25880 }, { 17508, -25885 }, { 17599, -25862 }, { 17662, -25857 }, { 17663, -25813 }, { 17672, -25786 }, { 17666, -25752 }, { 17699, -25762 }, { 17699, -25656 }, { 17738, -25702 }, { 17761, -25697 }, { 17771, -25597 }, { 17795, -25596 }, { 17804, -25548 }, { 17786, -25525 }, { 17789, -25500 }, { 17804, -25476 }, { 17826, -25466 }, { 17827, -25443 }, { 17939, -25461 }, { 18087, -25444 }, { 18096, -25009 }, { 18144, -24926 }, { 18159, -24867 }, { 18169, -24158 } }, { + place_outpost_fyros_10 = { true, { { 17684, -24517 }, { 17646, -24522 }, { 17623, -24568 }, { 17642, -24600 }, { 17682, -24594 }, { 17722, -24566 }, { 17722, -24525 } }, "Outpost" }, + place_outpost_fyros_11 = { true, { { 17990, -24545 }, { 17949, -24562 }, { 17934, -24611 }, { 17984, -24625 }, { 18041, -24619 }, { 18051, -24584 }, { 18022, -24574 }, { 18015, -24557 } }, "Outpost" }, + place_outpost_fyros_12 = { true, { { 18070, -24980 }, { 18035, -24976 }, { 18006, -25036 }, { 17938, -25042 }, { 17938, -25109 }, { 18069, -25110 }, { 18072, -25075 }, { 18062, -25048 }, { 18076, -25010 } }, "Outpost" }, + place_outpost_fyros_13 = { true, { { 17526, -25620 }, { 17443, -25640 }, { 17444, -25732 }, { 17528, -25743 }, { 17537, -25673 } }, "Outpost" }, + place_lieudit_oflovaksoasis_1 = { true, { { 17677, -24671 }, { 17671, -24663 }, { 17662, -24660 }, { 17649, -24664 }, { 17638, -24670 }, { 17634, -24691 }, { 17635, -24711 }, { 17629, -24721 }, { 17625, -24729 }, { 17628, -24756 }, { 17629, -24763 }, { 17622, -24770 }, { 17604, -24772 }, { 17594, -24797 }, { 17594, -24825 }, { 17575, -24835 }, { 17565, -24845 }, { 17560, -24862 }, { 17559, -24872 }, { 17550, -24882 }, { 17543, -24888 }, { 17540, -24888 }, { 17512, -24899 }, { 17491, -24915 }, { 17477, -24944 }, { 17476, -24963 }, { 17466, -24987 }, { 17469, -25002 }, { 17474, -25015 }, { 17480, -25041 }, { 17479, -25056 }, { 17489, -25120 }, { 17484, -25217 }, { 17488, -25262 }, { 17488, -25307 }, { 17503, -25345 }, { 17517, -25353 }, { 17532, -25344 }, { 17577, -25340 }, { 17602, -25339 }, { 17609, -25327 }, { 17617, -25309 }, { 17622, -25297 }, { 17622, -25265 }, { 17612, -25237 }, { 17622, -25220 }, { 17623, -25199 }, { 17617, -25177 }, { 17612, -25158 }, { 17598, -25149 }, { 17589, -25089 }, { 17596, -25084 }, { 17603, -25063 }, { 17602, -25034 }, { 17599, -25003 }, { 17594, -24988 }, { 17601, -24976 }, { 17599, -24953 }, { 17599, -24936 }, { 17605, -24929 }, { 17615, -24926 }, { 17627, -24921 }, { 17627, -24898 }, { 17634, -24878 }, { 17632, -24856 }, { 17638, -24837 }, { 17652, -24830 }, { 17659, -24815 }, { 17662, -24801 }, { 17671, -24796 }, { 17694, -24793 }, { 17697, -24779 }, { 17694, -24774 }, { 17696, -24766 }, { 17698, -24745 }, { 17696, -24730 }, { 17696, -24722 }, { 17697, -24707 }, { 17695, -24702 }, { 17695, -24692 }, { 17696, -24678 }, { 17687, -24674 } }, "Locality" }, + place_lieudit_oflovaksoasis_2 = { true, { { 17913, -24869 }, { 17912, -24853 }, { 17899, -24837 }, { 17884, -24830 }, { 17871, -24820 }, { 17857, -24799 }, { 17838, -24784 }, { 17821, -24775 }, { 17790, -24779 }, { 17771, -24779 }, { 17744, -24794 }, { 17733, -24810 }, { 17728, -24845 }, { 17729, -24867 }, { 17736, -24882 }, { 17758, -24892 }, { 17788, -24897 }, { 17819, -24900 }, { 17829, -24904 }, { 17833, -24917 }, { 17840, -24923 }, { 17845, -24925 }, { 17864, -24917 }, { 17876, -24901 }, { 17887, -24893 }, { 17898, -24892 }, { 17907, -24889 }, { 17911, -24877 } }, "Locality" }, + place_lieudit_oflovaksoasis_3 = { true, { { 17767, -24904 }, { 17745, -24906 }, { 17719, -24912 }, { 17700, -24915 }, { 17687, -24926 }, { 17674, -24944 }, { 17673, -24969 }, { 17677, -24983 }, { 17703, -24991 }, { 17715, -25000 }, { 17722, -25021 }, { 17726, -25042 }, { 17728, -25060 }, { 17718, -25080 }, { 17713, -25098 }, { 17707, -25114 }, { 17717, -25134 }, { 17729, -25147 }, { 17739, -25158 }, { 17745, -25170 }, { 17757, -25179 }, { 17786, -25175 }, { 17802, -25171 }, { 17808, -25164 }, { 17827, -25147 }, { 17828, -25123 }, { 17824, -25107 }, { 17828, -25092 }, { 17833, -25070 }, { 17820, -25050 }, { 17815, -25036 }, { 17811, -25011 }, { 17820, -24988 }, { 17817, -24960 }, { 17811, -24939 }, { 17811, -24926 }, { 17809, -24912 }, { 17792, -24905 } }, "Locality" }, + place_lieudit_oflovaksoasis_4 = { true, { { 18054, -24707 }, { 18034, -24711 }, { 18000, -24723 }, { 17977, -24751 }, { 17956, -24792 }, { 17953, -24822 }, { 17949, -24832 }, { 17956, -24848 }, { 17956, -24866 }, { 17946, -24893 }, { 17942, -24920 }, { 17946, -24937 }, { 17953, -24950 }, { 17962, -24956 }, { 17974, -24960 }, { 17988, -24962 }, { 17998, -24962 }, { 18021, -24968 }, { 18038, -24966 }, { 18060, -24967 }, { 18077, -24971 }, { 18079, -24979 }, { 18083, -24988 }, { 18094, -24999 }, { 18114, -24996 }, { 18127, -24979 }, { 18140, -24949 }, { 18149, -24930 }, { 18150, -24911 }, { 18135, -24886 }, { 18127, -24874 }, { 18105, -24846 }, { 18089, -24828 }, { 18082, -24795 }, { 18082, -24771 }, { 18084, -24742 }, { 18075, -24731 }, { 18070, -24720 } }, "Locality" }, + place_lieudit_oflovaksoasis_5 = { true, { { 18077, -25352 }, { 18048, -25351 }, { 18016, -25367 }, { 17986, -25392 }, { 17874, -25397 }, { 17782, -25402 }, { 17722, -25420 }, { 17712, -25459 }, { 17702, -25482 }, { 17686, -25490 }, { 17687, -25513 }, { 17700, -25544 }, { 17719, -25556 }, { 17756, -25566 }, { 17792, -25573 }, { 17805, -25544 }, { 17786, -25527 }, { 17789, -25499 }, { 17797, -25487 }, { 17806, -25473 }, { 17816, -25471 }, { 17825, -25468 }, { 17825, -25446 }, { 17846, -25448 }, { 17896, -25445 }, { 17919, -25445 }, { 17953, -25446 }, { 18003, -25447 }, { 18022, -25451 }, { 18054, -25444 }, { 18079, -25446 }, { 18089, -25435 }, { 18113, -25432 }, { 18116, -25423 }, { 18117, -25400 }, { 18123, -25392 }, { 18092, -25364 } }, "Locality" }, + r_05_34_place_lake_1 = { false, { { 17777, -25200 }, { 17782, -25128 }, { 17734, -25114 }, { 17685, -25114 }, { 17682, -25171 }, { 17710, -25193 } }, "Locality" }, + r_07_04_place_adept_spawn = { false, { { 17704, -24594 }, { 17668, -24647 }, { 17718, -24689 }, { 17750, -24633 } }, "Locality" }, + r_06_13_kitin = { false, { { 17789, -24406 }, { 17790, -24362 }, { 17733, -24348 }, { 17669, -24354 }, { 17688, -24397 }, { 17759, -24459 }, { 17812, -24451 } }, "Locality" }, + mission_FF60_emplacement_message = { false, { { 17643, -25022 }, { 17636, -25022 }, { 17631, -25030 }, { 17633, -25039 }, { 17640, -25044 }, { 17647, -25041 }, { 17651, -25031 } }, "Locality" }, + mission_FF70_camp_WB = { false, { { 17612, -25093 }, { 17600, -25093 }, { 17593, -25102 }, { 17595, -25113 }, { 17605, -25119 }, { 17615, -25114 }, { 17619, -25099 } }, "Locality" } + } }, + region_frahartowers = { true, { { 16958, -24476 }, { 16797, -24640 }, { 16794, -24822 }, { 16839, -25175 }, { 16694, -25495 }, { 16634, -25762 }, { 16637, -26032 }, { 16710, -26033 }, { 16772, -26021 }, { 16772, -25991 }, { 16785, -25985 }, { 16798, -25989 }, { 16796, -26017 }, { 16833, -26024 }, { 16864, -26046 }, { 16900, -26058 }, { 16988, -26058 }, { 17029, -26039 }, { 17026, -25957 }, { 17090, -25946 }, { 17148, -25935 }, { 17155, -25897 }, { 17154, -25708 }, { 17165, -25728 }, { 17171, -26022 }, { 17216, -26033 }, { 17279, -26019 }, { 17312, -25943 }, { 17344, -25919 }, { 17359, -25858 }, { 17385, -25852 }, { 17408, -25890 }, { 17445, -25544 }, { 17466, -24744 }, { 17602, -24552 }, { 17602, -24319 }, { 17279, -24318 } }, { + place_outpost_fyros_06 = { true, { { 16925, -24653 }, { 16874, -24664 }, { 16858, -24702 }, { 16860, -24738 }, { 16893, -24762 }, { 16935, -24753 }, { 16954, -24721 }, { 16947, -24676 } }, "Outpost" }, + place_outpost_fyros_07 = { true, { { 17171, -25338 }, { 17120, -25362 }, { 17120, -25407 }, { 17161, -25438 }, { 17230, -25433 }, { 17253, -25390 }, { 17238, -25340 } }, "Outpost" }, + place_outpost_fyros_08 = { true, { { 17093, -25660 }, { 17080, -25626 }, { 17046, -25625 }, { 17005, -25632 }, { 16994, -25684 }, { 17015, -25739 }, { 17067, -25733 }, { 17099, -25707 } }, "Outpost" }, + place_outpost_fyros_09 = { true, { { 16721, -25814 }, { 16682, -25831 }, { 16665, -25880 }, { 16712, -25906 }, { 16763, -25895 }, { 16774, -25870 }, { 16775, -25826 } }, "Outpost" }, + place_lieudit_frahartowers_1 = { true, { { 17532, -24412 }, { 17530, -24395 }, { 17528, -24375 }, { 17518, -24356 }, { 17499, -24346 }, { 17467, -24345 }, { 17430, -24374 }, { 17402, -24430 }, { 17381, -24482 }, { 17343, -24512 }, { 17323, -24531 }, { 17280, -24575 }, { 17234, -24636 }, { 17205, -24679 }, { 17194, -24705 }, { 17184, -24726 }, { 17184, -24742 }, { 17190, -24759 }, { 17205, -24781 }, { 17226, -24812 }, { 17238, -24832 }, { 17265, -24907 }, { 17285, -24970 }, { 17292, -25006 }, { 17305, -25027 }, { 17329, -25041 }, { 17347, -25053 }, { 17369, -25057 }, { 17389, -25048 }, { 17409, -25030 }, { 17409, -24987 }, { 17402, -24964 }, { 17393, -24951 }, { 17392, -24932 }, { 17396, -24922 }, { 17404, -24887 }, { 17405, -24869 }, { 17402, -24853 }, { 17395, -24841 }, { 17390, -24828 }, { 17383, -24775 }, { 17375, -24641 }, { 17394, -24615 }, { 17412, -24602 }, { 17421, -24588 }, { 17422, -24569 }, { 17445, -24557 }, { 17470, -24547 } }, "Locality" }, + place_lieudit_frahartowers_2 = { true, { { 17258, -25558 }, { 17257, -25596 }, { 17256, -25618 }, { 17237, -25667 }, { 17217, -25701 }, { 17182, -25735 }, { 17165, -25750 }, { 17166, -25766 }, { 17171, -25791 }, { 17176, -25811 }, { 17180, -25824 }, { 17177, -25835 }, { 17172, -25852 }, { 17172, -25864 }, { 17175, -25875 }, { 17180, -25889 }, { 17180, -25899 }, { 17182, -25914 }, { 17183, -25922 }, { 17182, -25938 }, { 17178, -25949 }, { 17179, -25963 }, { 17173, -25976 }, { 17171, -25981 }, { 17175, -25993 }, { 17180, -26021 }, { 17190, -26025 }, { 17211, -26031 }, { 17215, -26033 }, { 17224, -26029 }, { 17242, -26023 }, { 17258, -26020 }, { 17271, -26020 }, { 17280, -26017 }, { 17282, -26008 }, { 17285, -25995 }, { 17290, -25983 }, { 17284, -25959 }, { 17291, -25947 }, { 17307, -25947 }, { 17315, -25939 }, { 17322, -25921 }, { 17331, -25919 }, { 17342, -25920 }, { 17345, -25916 }, { 17351, -25901 }, { 17351, -25883 }, { 17361, -25848 }, { 17361, -25847 }, { 17363, -25844 }, { 17366, -25840 }, { 17365, -25836 }, { 17364, -25833 }, { 17363, -25828 }, { 17359, -25824 }, { 17355, -25822 }, { 17352, -25819 }, { 17350, -25817 }, { 17346, -25815 }, { 17342, -25811 }, { 17341, -25809 }, { 17341, -25806 }, { 17345, -25798 }, { 17355, -25783 }, { 17366, -25759 }, { 17373, -25722 }, { 17381, -25689 }, { 17393, -25669 }, { 17397, -25651 }, { 17391, -25624 }, { 17391, -25601 }, { 17395, -25585 }, { 17396, -25564 }, { 17395, -25552 }, { 17369, -25549 }, { 17356, -25542 }, { 17343, -25537 }, { 17328, -25541 }, { 17314, -25544 }, { 17305, -25547 }, { 17297, -25551 }, { 17285, -25549 }, { 17267, -25553 } }, "Locality" }, + place_lieudit_frahartowers_3 = { true, { { 17195, -24766 }, { 17196, -24918 }, { 17248, -24918 }, { 17247, -25068 }, { 17358, -25073 }, { 17358, -25047 }, { 17336, -25022 }, { 17307, -25016 }, { 17299, -25003 }, { 17297, -24991 }, { 17311, -24957 }, { 17301, -24940 }, { 17284, -24929 }, { 17270, -24877 }, { 17267, -24842 }, { 17243, -24833 }, { 17242, -24788 }, { 17218, -24767 } }, "Locality" } + } }, + region_sawdustmines = { true, { { 20321, -24620 }, { 20070, -24703 }, { 19970, -24774 }, { 19957, -24809 }, { 19967, -24841 }, { 19959, -24844 }, { 19957, -24831 }, { 19934, -24829 }, { 19902, -24840 }, { 19871, -24801 }, { 19827, -24790 }, { 19774, -24831 }, { 19764, -24870 }, { 19780, -24899 }, { 19829, -24923 }, { 19811, -24939 }, { 19747, -24916 }, { 19706, -24938 }, { 19703, -24973 }, { 19625, -24994 }, { 19576, -25029 }, { 19574, -25085 }, { 19517, -25122 }, { 19484, -25112 }, { 19397, -25159 }, { 19396, -25189 }, { 19454, -25214 }, { 19451, -25247 }, { 19418, -25217 }, { 19338, -25218 }, { 19324, -25254 }, { 19325, -25393 }, { 19169, -25498 }, { 19151, -25563 }, { 19169, -25629 }, { 19088, -25796 }, { 19062, -25887 }, { 19100, -25942 }, { 19197, -25968 }, { 19345, -25929 }, { 19442, -25953 }, { 19440, -25967 }, { 19391, -25953 }, { 19317, -25952 }, { 19229, -25994 }, { 19234, -26047 }, { 19520, -26084 }, { 20001, -26087 }, { 20322, -25593 }, { 20321, -24967 } }, { + place_outpost_fyros_17 = { true, { { 20126, -24826 }, { 20031, -24821 }, { 20028, -24873 }, { 20070, -24908 }, { 20117, -24907 }, { 20137, -24878 } }, "Outpost" }, + place_outpost_fyros_18 = { true, { { 19599, -25182 }, { 19562, -25183 }, { 19545, -25233 }, { 19577, -25276 }, { 19621, -25276 }, { 19669, -25200 }, { 19654, -25167 } }, "Outpost" }, + place_outpost_fyros_19 = { true, { { 19669, -25533 }, { 19613, -25486 }, { 19571, -25491 }, { 19543, -25516 }, { 19545, -25555 }, { 19599, -25578 }, { 19665, -25569 } }, "Outpost" }, + place_outpost_fyros_20 = { true, { { 19339, -25821 }, { 19281, -25811 }, { 19213, -25816 }, { 19206, -25865 }, { 19272, -25891 }, { 19341, -25864 } }, "Outpost" }, + place_outpost_fyros_21 = { true, { { 19779, -25941 }, { 19707, -25944 }, { 19698, -26017 }, { 19753, -26052 }, { 19780, -26050 }, { 19798, -25963 } }, "Outpost" }, + place_lieudit_sawdustmines_1 = { true, { { 19139, -25730 }, { 19135, -25731 }, { 19128, -25742 }, { 19124, -25760 }, { 19129, -25778 }, { 19139, -25781 }, { 19149, -25780 }, { 19161, -25780 }, { 19172, -25780 }, { 19183, -25778 }, { 19195, -25777 }, { 19202, -25777 }, { 19217, -25774 }, { 19235, -25776 }, { 19253, -25780 }, { 19262, -25782 }, { 19275, -25783 }, { 19294, -25787 }, { 19310, -25784 }, { 19327, -25780 }, { 19349, -25776 }, { 19355, -25774 }, { 19364, -25774 }, { 19373, -25777 }, { 19387, -25779 }, { 19407, -25778 }, { 19420, -25777 }, { 19426, -25770 }, { 19428, -25758 }, { 19426, -25741 }, { 19425, -25725 }, { 19420, -25705 }, { 19420, -25694 }, { 19421, -25675 }, { 19424, -25661 }, { 19428, -25649 }, { 19429, -25643 }, { 19421, -25629 }, { 19407, -25617 }, { 19389, -25604 }, { 19377, -25587 }, { 19374, -25574 }, { 19374, -25563 }, { 19377, -25551 }, { 19375, -25538 }, { 19370, -25531 }, { 19358, -25523 }, { 19344, -25513 }, { 19331, -25497 }, { 19329, -25485 }, { 19327, -25469 }, { 19328, -25456 }, { 19329, -25443 }, { 19329, -25427 }, { 19325, -25418 }, { 19317, -25405 }, { 19300, -25412 }, { 19289, -25436 }, { 19269, -25441 }, { 19255, -25467 }, { 19227, -25478 }, { 19196, -25479 }, { 19191, -25516 }, { 19176, -25528 }, { 19162, -25533 }, { 19155, -25566 }, { 19166, -25594 }, { 19166, -25598 }, { 19224, -25602 }, { 19224, -25627 }, { 19232, -25658 }, { 19209, -25656 }, { 19194, -25626 }, { 19172, -25634 }, { 19162, -25661 }, { 19159, -25695 }, { 19153, -25705 }, { 19153, -25723 } }, "Locality" }, + place_lieudit_sawdustmines_2 = { true, { { 19484, -25294 }, { 19461, -25285 }, { 19443, -25285 }, { 19430, -25298 }, { 19427, -25325 }, { 19429, -25363 }, { 19446, -25373 }, { 19465, -25391 }, { 19470, -25412 }, { 19460, -25451 }, { 19467, -25505 }, { 19457, -25543 }, { 19468, -25565 }, { 19468, -25595 }, { 19468, -25635 }, { 19480, -25672 }, { 19497, -25698 }, { 19488, -25729 }, { 19494, -25770 }, { 19512, -25796 }, { 19561, -25785 }, { 19572, -25773 }, { 19571, -25741 }, { 19583, -25701 }, { 19601, -25687 }, { 19614, -25653 }, { 19618, -25625 }, { 19639, -25606 }, { 19657, -25590 }, { 19672, -25573 }, { 19680, -25568 }, { 19682, -25541 }, { 19671, -25514 }, { 19644, -25489 }, { 19625, -25473 }, { 19597, -25460 }, { 19556, -25451 }, { 19538, -25432 }, { 19530, -25411 }, { 19525, -25369 }, { 19499, -25316 } }, "Locality" }, + place_lieudit_sawdustmines_3 = { true, { { 20140, -24947 }, { 20103, -24948 }, { 20057, -24961 }, { 20038, -24990 }, { 20020, -25021 }, { 20018, -25048 }, { 20030, -25071 }, { 20041, -25098 }, { 20064, -25116 }, { 20073, -25133 }, { 20084, -25154 }, { 20102, -25183 }, { 20107, -25222 }, { 20117, -25245 }, { 20123, -25275 }, { 20140, -25296 }, { 20190, -25308 }, { 20234, -25303 }, { 20271, -25285 }, { 20290, -25249 }, { 20301, -25137 }, { 20279, -25040 }, { 20240, -24977 }, { 20187, -24937 } }, "Locality" }, + place_lieudit_sawdustmines_4 = { true, { { 19988, -25440 }, { 19953, -25447 }, { 19936, -25460 }, { 19912, -25486 }, { 19882, -25515 }, { 19864, -25545 }, { 19850, -25572 }, { 19841, -25591 }, { 19850, -25616 }, { 19855, -25623 }, { 19879, -25633 }, { 19910, -25620 }, { 19941, -25592 }, { 19969, -25556 }, { 19994, -25528 }, { 20011, -25510 }, { 20017, -25484 }, { 20016, -25463 }, { 20010, -25448 } }, "Locality" }, + place_lieudit_sawdustmines_5 = { true, { { 19974, -25165 }, { 19972, -25194 }, { 19976, -25220 }, { 19984, -25249 }, { 19973, -25311 }, { 19981, -25367 }, { 19971, -25386 }, { 19945, -25410 }, { 19936, -25414 }, { 19927, -25420 }, { 19917, -25430 }, { 19905, -25445 }, { 19904, -25448 }, { 19902, -25454 }, { 19902, -25462 }, { 19903, -25468 }, { 19917, -25466 }, { 19929, -25467 }, { 19936, -25460 }, { 19953, -25447 }, { 19988, -25440 }, { 20010, -25448 }, { 20016, -25463 }, { 20017, -25484 }, { 20037, -25505 }, { 20082, -25468 }, { 20101, -25455 }, { 20140, -25391 }, { 20112, -25304 }, { 20154, -25300 }, { 20177, -25301 }, { 20217, -25286 }, { 20279, -25229 }, { 20284, -25138 }, { 20277, -25113 }, { 20002, -25121 }, { 19980, -25121 }, { 19980, -25137 } }, "Locality" } + } }, + region_dunesofexil = { true, { { 16000, -24000 }, { 15841, -24478 }, { 15839, -24962 }, { 16003, -25277 }, { 16000, -25997 }, { 16319, -26016 }, { 16319, -26042 }, { 16339, -26046 }, { 16504, -26060 }, { 16546, -26051 }, { 16553, -26027 }, { 16640, -26030 }, { 16642, -25761 }, { 16701, -25493 }, { 16844, -25174 }, { 16799, -24820 }, { 16801, -24642 }, { 16959, -24479 }, { 16960, -24162 }, { 16367, -23857 } }, { + place_dyron = { true, { { 16472, -24557 }, { 16485, -24679 }, { 16537, -24759 }, { 16576, -24770 }, { 16634, -24771 }, { 16689, -24785 }, { 16717, -24770 }, { 16748, -24724 }, { 16774, -24704 }, { 16770, -24638 }, { 16742, -24608 }, { 16720, -24569 }, { 16714, -24503 }, { 16647, -24465 }, { 16585, -24471 }, { 16492, -24510 } }, "Village" }, + dyron_stable = { true, { { 16537, -24729 }, { 16573, -24757 }, { 16581, -24736 }, { 16586, -24718 }, { 16559, -24708 }, { 16548, -24712 } }, "stable" }, + place_outpost_fyros_01 = { true, { { 16286, -24200 }, { 16244, -24216 }, { 16223, -24262 }, { 16263, -24305 }, { 16312, -24284 }, { 16321, -24223 } }, "Outpost" }, + place_outpost_fyros_02 = { true, { { 16707, -24219 }, { 16640, -24244 }, { 16640, -24286 }, { 16705, -24310 }, { 16763, -24306 }, { 16765, -24271 } }, "Outpost" }, + place_outpost_fyros_03 = { true, { { 16117, -24669 }, { 16025, -24703 }, { 16036, -24742 }, { 16105, -24756 }, { 16159, -24737 }, { 16155, -24689 } }, "Outpost" }, + place_outpost_fyros_04 = { true, { { 16396, -25280 }, { 16358, -25279 }, { 16319, -25309 }, { 16320, -25382 }, { 16411, -25390 }, { 16428, -25359 } }, "Outpost" }, + place_outpost_fyros_05 = { true, { { 16404, -25762 }, { 16335, -25765 }, { 16317, -25792 }, { 16318, -25841 }, { 16391, -25863 }, { 16414, -25863 }, { 16446, -25786 } }, "Outpost" }, + place_arrival_from_sources = { false, { { 16334, -23894 }, { 16302, -23893 }, { 16301, -23925 }, { 16324, -23925 } }, "Locality" }, + place_lieudit_dunesofexile_1 = { true, { { 16542, -24324 }, { 16524, -24326 }, { 16503, -24328 }, { 16495, -24321 }, { 16491, -24312 }, { 16480, -24303 }, { 16459, -24308 }, { 16448, -24313 }, { 16439, -24326 }, { 16418, -24328 }, { 16400, -24327 }, { 16387, -24335 }, { 16374, -24353 }, { 16363, -24364 }, { 16359, -24383 }, { 16361, -24408 }, { 16357, -24420 }, { 16345, -24435 }, { 16341, -24453 }, { 16343, -24477 }, { 16345, -24493 }, { 16350, -24504 }, { 16363, -24510 }, { 16380, -24509 }, { 16394, -24500 }, { 16413, -24502 }, { 16435, -24502 }, { 16445, -24493 }, { 16462, -24482 }, { 16482, -24479 }, { 16512, -24475 }, { 16532, -24469 }, { 16541, -24454 }, { 16551, -24443 }, { 16562, -24436 }, { 16570, -24417 }, { 16589, -24407 }, { 16605, -24398 }, { 16607, -24386 }, { 16604, -24369 }, { 16605, -24358 }, { 16599, -24343 }, { 16585, -24338 }, { 16569, -24338 }, { 16561, -24330 }, { 16554, -24327 } }, "Locality" }, + place_lieudit_dunesofexile_2 = { true, { { 16233, -24800 }, { 16219, -24803 }, { 16207, -24817 }, { 16207, -24843 }, { 16212, -24866 }, { 16224, -24897 }, { 16233, -24917 }, { 16232, -24949 }, { 16236, -24987 }, { 16232, -25011 }, { 16215, -25023 }, { 16182, -25054 }, { 16171, -25083 }, { 16192, -25145 }, { 16217, -25192 }, { 16234, -25250 }, { 16249, -25298 }, { 16274, -25317 }, { 16301, -25310 }, { 16331, -25263 }, { 16346, -25240 }, { 16358, -25225 }, { 16366, -25188 }, { 16349, -25156 }, { 16325, -25136 }, { 16307, -25097 }, { 16300, -25046 }, { 16299, -25014 }, { 16309, -24970 }, { 16310, -24928 }, { 16313, -24877 }, { 16295, -24837 }, { 16280, -24816 }, { 16260, -24806 } }, "Locality" }, + place_lieudit_dunesofexile_3 = { true, { { 16592, -25390 }, { 16608, -25384 }, { 16625, -25354 }, { 16620, -25324 }, { 16618, -25304 }, { 16625, -25274 }, { 16631, -25245 }, { 16639, -25226 }, { 16651, -25219 }, { 16661, -25212 }, { 16661, -25193 }, { 16667, -25175 }, { 16681, -25154 }, { 16692, -25139 }, { 16703, -25122 }, { 16710, -25109 }, { 16721, -25089 }, { 16712, -25054 }, { 16702, -25039 }, { 16685, -25021 }, { 16673, -25002 }, { 16640, -24988 }, { 16623, -24972 }, { 16595, -24959 }, { 16580, -24957 }, { 16562, -24961 }, { 16551, -24976 }, { 16530, -24994 }, { 16513, -24997 }, { 16491, -25017 }, { 16471, -25039 }, { 16459, -25060 }, { 16451, -25093 }, { 16455, -25125 }, { 16445, -25162 }, { 16435, -25195 }, { 16438, -25226 }, { 16471, -25235 }, { 16496, -25246 }, { 16512, -25270 }, { 16508, -25288 }, { 16513, -25304 }, { 16529, -25321 }, { 16541, -25329 }, { 16553, -25332 }, { 16563, -25342 }, { 16564, -25365 }, { 16562, -25374 }, { 16570, -25387 }, { 16575, -25395 } }, "Locality" }, + place_lieudit_dunesofexile_4 = { true, { { 16660, -25211 }, { 16638, -25225 }, { 16630, -25244 }, { 16617, -25304 }, { 16620, -25329 }, { 16625, -25336 }, { 16640, -25344 }, { 16661, -25349 }, { 16698, -25344 }, { 16715, -25336 }, { 16746, -25309 }, { 16769, -25284 }, { 16782, -25258 }, { 16806, -25226 }, { 16821, -25189 }, { 16825, -25153 }, { 16833, -25131 }, { 16834, -25089 }, { 16830, -25058 }, { 16812, -25042 }, { 16792, -25033 }, { 16771, -25031 }, { 16744, -25045 }, { 16718, -25089 }, { 16694, -25132 }, { 16667, -25173 }, { 16659, -25193 } }, "Locality" }, + place_arrival_from_zorai = { false, { { 16302, -25629 }, { 16294, -25634 }, { 16289, -25641 }, { 16303, -25652 }, { 16309, -25637 }, { 16305, -25635 } }, "Locality" }, + r_11_19_cure_1 = { false, { { 16127, -24858 }, { 16129, -24866 }, { 16146, -24866 }, { 16163, -24866 }, { 16172, -24855 }, { 16172, -24842 }, { 16165, -24833 }, { 16154, -24826 }, { 16139, -24827 }, { 16125, -24836 }, { 16125, -24851 } }, "Locality" } + } }, + region_thesavagedunes = { true, { { 19069, -25979 }, { 19006, -26015 }, { 18920, -26016 }, { 18873, -26082 }, { 18821, -26053 }, { 18693, -26088 }, { 18682, -26189 }, { 18599, -26244 }, { 18578, -26357 }, { 18472, -26415 }, { 18417, -26452 }, { 18497, -26522 }, { 18490, -26535 }, { 18386, -26465 }, { 18299, -26543 }, { 18293, -26558 }, { 18183, -26556 }, { 18166, -26528 }, { 18072, -26557 }, { 17918, -26560 }, { 17921, -26733 }, { 18079, -26788 }, { 18079, -27040 }, { 20317, -27035 }, { 20314, -26399 }, { 20156, -26243 }, { 20003, -26080 }, { 19521, -26082 }, { 19232, -26046 }, { 19238, -26077 }, { 19218, -26080 }, { 19198, -26032 }, { 19144, -25993 }, { 19120, -26013 } }, { + place_thesos = { true, { { 19758, -26148 }, { 19727, -26147 }, { 19706, -26146 }, { 19692, -26144 }, { 19680, -26141 }, { 19662, -26144 }, { 19649, -26129 }, { 19601, -26112 }, { 19529, -26115 }, { 19516, -26162 }, { 19486, -26222 }, { 19477, -26327 }, { 19494, -26373 }, { 19588, -26373 }, { 19618, -26364 }, { 19622, -26341 }, { 19640, -26336 }, { 19654, -26344 }, { 19653, -26362 }, { 19693, -26363 }, { 19696, -26387 }, { 19780, -26391 }, { 19824, -26391 }, { 19839, -26347 }, { 19828, -26310 }, { 19807, -26254 }, { 19812, -26210 }, { 19810, -26144 }, { 19799, -26134 }, { 19792, -26132 }, { 19778, -26138 } }, "Village" }, + thesos_stable = { true, { { 19497, -26174 }, { 19512, -26175 }, { 19520, -26163 }, { 19529, -26156 }, { 19534, -26140 }, { 19529, -26121 }, { 19512, -26111 }, { 19499, -26120 }, { 19493, -26142 } }, "stable" }, + place_outpost_fyros_22 = { true, { { 18966, -26101 }, { 18893, -26115 }, { 18885, -26195 }, { 18939, -26212 }, { 19001, -26175 }, { 19025, -26112 } }, "Outpost" }, + place_outpost_fyros_23 = { true, { { 20084, -26407 }, { 20034, -26412 }, { 20015, -26451 }, { 20018, -26491 }, { 20094, -26520 }, { 20126, -26452 } }, "Outpost" }, + place_outpost_fyros_24 = { true, { { 19137, -26582 }, { 19087, -26596 }, { 19059, -26689 }, { 19111, -26692 }, { 19149, -26676 } }, "Outpost" }, + place_outpost_fyros_25 = { true, { { 18341, -26744 }, { 18263, -26764 }, { 18264, -26866 }, { 18343, -26866 }, { 18362, -26834 } }, "Outpost" }, + place_outpost_fyros_26 = { true, { { 19982, -26778 }, { 19894, -26779 }, { 19884, -26869 }, { 19970, -26868 } }, "Outpost" }, + place_arrival_from_matis = { false, { { 20251, -26799 }, { 20214, -26799 }, { 20217, -26821 }, { 20252, -26823 } }, "Locality" }, + place_lieudit_thesavagedunes_1 = { true, { { 18283, -26557 }, { 18279, -26564 }, { 18294, -26584 }, { 18338, -26611 }, { 18396, -26619 }, { 18437, -26626 }, { 18473, -26619 }, { 18498, -26601 }, { 18518, -26581 }, { 18542, -26552 }, { 18549, -26511 }, { 18549, -26483 }, { 18539, -26462 }, { 18512, -26434 }, { 18493, -26414 }, { 18492, -26412 }, { 18469, -26415 }, { 18459, -26431 }, { 18440, -26440 }, { 18436, -26450 }, { 18427, -26462 }, { 18428, -26473 }, { 18442, -26482 }, { 18448, -26490 }, { 18461, -26492 }, { 18472, -26492 }, { 18481, -26496 }, { 18482, -26506 }, { 18484, -26510 }, { 18497, -26521 }, { 18496, -26533 }, { 18487, -26535 }, { 18465, -26529 }, { 18457, -26517 }, { 18443, -26515 }, { 18431, -26513 }, { 18424, -26502 }, { 18412, -26500 }, { 18407, -26488 }, { 18402, -26476 }, { 18397, -26474 }, { 18383, -26470 }, { 18374, -26486 }, { 18364, -26497 }, { 18349, -26500 }, { 18337, -26519 }, { 18311, -26526 }, { 18306, -26544 }, { 18304, -26548 }, { 18301, -26549 }, { 18293, -26546 }, { 18292, -26545 } }, "Locality" }, + place_lieudit_thesavagedunes_2 = { true, { { 18775, -26247 }, { 18763, -26247 }, { 18746, -26263 }, { 18737, -26279 }, { 18733, -26294 }, { 18729, -26319 }, { 18724, -26331 }, { 18722, -26357 }, { 18724, -26390 }, { 18719, -26406 }, { 18714, -26423 }, { 18716, -26442 }, { 18711, -26461 }, { 18713, -26485 }, { 18721, -26517 }, { 18730, -26529 }, { 18739, -26544 }, { 18746, -26556 }, { 18759, -26558 }, { 18771, -26559 }, { 18801, -26535 }, { 18819, -26520 }, { 18828, -26502 }, { 18838, -26472 }, { 18852, -26437 }, { 18855, -26397 }, { 18864, -26376 }, { 18872, -26355 }, { 18872, -26338 }, { 18876, -26311 }, { 18877, -26273 }, { 18870, -26261 }, { 18848, -26243 }, { 18820, -26239 }, { 18804, -26244 } }, "Locality" }, + place_lieudit_thesavagedunes_3 = { true, { { 18745, -26556 }, { 18728, -26571 }, { 18727, -26590 }, { 18731, -26608 }, { 18744, -26618 }, { 18752, -26631 }, { 18756, -26646 }, { 18759, -26660 }, { 18763, -26668 }, { 18772, -26674 }, { 18778, -26680 }, { 18780, -26689 }, { 18783, -26699 }, { 18789, -26704 }, { 18807, -26712 }, { 18834, -26715 }, { 18864, -26715 }, { 18884, -26708 }, { 18900, -26697 }, { 18919, -26683 }, { 18944, -26670 }, { 18964, -26655 }, { 18982, -26637 }, { 19002, -26621 }, { 19021, -26607 }, { 19041, -26593 }, { 19077, -26567 }, { 19105, -26545 }, { 19148, -26521 }, { 19174, -26504 }, { 19199, -26480 }, { 19223, -26459 }, { 19245, -26444 }, { 19285, -26424 }, { 19327, -26394 }, { 19359, -26370 }, { 19397, -26350 }, { 19425, -26338 }, { 19447, -26328 }, { 19460, -26322 }, { 19466, -26319 }, { 19471, -26313 }, { 19473, -26297 }, { 19471, -26285 }, { 19466, -26281 }, { 19445, -26269 }, { 19429, -26259 }, { 19416, -26258 }, { 19395, -26262 }, { 19362, -26286 }, { 19344, -26301 }, { 19329, -26307 }, { 19311, -26310 }, { 19288, -26318 }, { 19272, -26331 }, { 19263, -26345 }, { 19256, -26358 }, { 19238, -26370 }, { 19226, -26373 }, { 19217, -26376 }, { 19202, -26383 }, { 19196, -26396 }, { 19182, -26409 }, { 19170, -26409 }, { 19162, -26414 }, { 19148, -26419 }, { 19134, -26435 }, { 19131, -26445 }, { 19116, -26454 }, { 19100, -26462 }, { 19090, -26471 }, { 19080, -26484 }, { 19065, -26499 }, { 19055, -26504 }, { 19029, -26513 }, { 19015, -26527 }, { 19004, -26535 }, { 18996, -26553 }, { 18975, -26565 }, { 18956, -26570 }, { 18945, -26578 }, { 18937, -26584 }, { 18930, -26593 }, { 18915, -26601 }, { 18900, -26607 }, { 18889, -26619 }, { 18878, -26630 }, { 18868, -26645 }, { 18851, -26647 }, { 18819, -26652 }, { 18802, -26652 }, { 18790, -26656 }, { 18786, -26661 }, { 18781, -26662 }, { 18774, -26659 }, { 18770, -26646 }, { 18769, -26634 }, { 18770, -26629 }, { 18773, -26620 }, { 18780, -26611 }, { 18785, -26600 }, { 18787, -26592 }, { 18787, -26576 }, { 18782, -26564 }, { 18773, -26559 }, { 18763, -26555 } }, "Locality" }, + place_lieudit_thesavagedunes_4 = { true, { { 19063, -26701 }, { 19049, -26707 }, { 19032, -26722 }, { 19023, -26737 }, { 19013, -26762 }, { 19011, -26803 }, { 19028, -26852 }, { 19049, -26872 }, { 19104, -26874 }, { 19154, -26871 }, { 19183, -26855 }, { 19215, -26811 }, { 19235, -26788 }, { 19258, -26777 }, { 19278, -26765 }, { 19288, -26748 }, { 19295, -26718 }, { 19316, -26697 }, { 19340, -26686 }, { 19353, -26667 }, { 19366, -26646 }, { 19388, -26632 }, { 19399, -26620 }, { 19418, -26606 }, { 19437, -26578 }, { 19439, -26554 }, { 19435, -26502 }, { 19425, -26481 }, { 19398, -26462 }, { 19360, -26461 }, { 19317, -26481 }, { 19295, -26490 }, { 19275, -26489 }, { 19239, -26489 }, { 19191, -26515 }, { 19164, -26522 }, { 19150, -26553 }, { 19145, -26595 }, { 19151, -26628 }, { 19154, -26655 }, { 19154, -26673 }, { 19147, -26688 }, { 19116, -26698 }, { 19096, -26701 } }, "Locality" }, + place_lieudit_thesavagedunes_5 = { true, { { 19613, -26490 }, { 19617, -26471 }, { 19623, -26463 }, { 19636, -26462 }, { 19642, -26463 }, { 19648, -26463 }, { 19649, -26459 }, { 19650, -26451 }, { 19649, -26435 }, { 19645, -26417 }, { 19641, -26399 }, { 19653, -26368 }, { 19654, -26353 }, { 19652, -26340 }, { 19644, -26335 }, { 19630, -26337 }, { 19623, -26342 }, { 19618, -26356 }, { 19613, -26367 }, { 19595, -26371 }, { 19572, -26372 }, { 19557, -26371 }, { 19506, -26371 }, { 19494, -26374 }, { 19493, -26395 }, { 19491, -26414 }, { 19484, -26426 }, { 19482, -26438 }, { 19474, -26451 }, { 19472, -26455 }, { 19468, -26463 }, { 19467, -26492 }, { 19482, -26512 }, { 19506, -26522 }, { 19543, -26532 }, { 19569, -26533 }, { 19590, -26525 }, { 19602, -26515 } }, "Locality" }, + place_lieudit_thesavagedunes_6 = { true, { { 18549, -26483 }, { 18549, -26512 }, { 18543, -26552 }, { 18519, -26581 }, { 18504, -26596 }, { 18543, -26720 }, { 18519, -26819 }, { 18550, -26789 }, { 18640, -26812 }, { 18695, -26810 }, { 18733, -26794 }, { 18783, -26699 }, { 18778, -26680 }, { 18772, -26675 }, { 18763, -26668 }, { 18758, -26660 }, { 18756, -26646 }, { 18752, -26631 }, { 18744, -26618 }, { 18731, -26608 }, { 18727, -26590 }, { 18728, -26571 }, { 18745, -26556 }, { 18739, -26545 }, { 18729, -26529 }, { 18721, -26518 }, { 18713, -26485 }, { 18710, -26460 }, { 18716, -26442 }, { 18713, -26423 }, { 18724, -26390 }, { 18721, -26360 }, { 18598, -26359 }, { 18592, -26366 }, { 18571, -26370 }, { 18562, -26369 }, { 18549, -26371 }, { 18536, -26382 }, { 18518, -26408 }, { 18492, -26412 }, { 18539, -26462 } }, "Locality" } + } }, + region_outlawcanyon = { true, { { 19613, -23839 }, { 19510, -24179 }, { 19497, -24318 }, { 19431, -24318 }, { 19378, -24377 }, { 19261, -24369 }, { 19285, -24442 }, { 19277, -24521 }, { 19234, -24545 }, { 19192, -24587 }, { 19193, -24608 }, { 19235, -24614 }, { 19226, -24636 }, { 19199, -24636 }, { 19141, -24707 }, { 19067, -24694 }, { 19059, -24743 }, { 19104, -24791 }, { 18993, -24827 }, { 18931, -24808 }, { 18867, -24860 }, { 18819, -24845 }, { 18718, -24934 }, { 18696, -24898 }, { 18696, -24787 }, { 18650, -24807 }, { 18635, -24991 }, { 18575, -25034 }, { 18508, -25237 }, { 18606, -25753 }, { 18730, -26003 }, { 18776, -26095 }, { 18913, -26093 }, { 18935, -26025 }, { 19031, -26032 }, { 19149, -26011 }, { 19214, -26087 }, { 19240, -26095 }, { 19307, -25986 }, { 19493, -25987 }, { 19490, -25935 }, { 19328, -25907 }, { 19194, -25955 }, { 19100, -25914 }, { 19110, -25814 }, { 19149, -25802 }, { 19174, -25643 }, { 19231, -25670 }, { 19239, -25611 }, { 19180, -25532 }, { 19331, -25397 }, { 19326, -25336 }, { 19338, -25223 }, { 19454, -25251 }, { 19456, -25212 }, { 19404, -25189 }, { 19405, -25159 }, { 19520, -25127 }, { 19577, -25088 }, { 19600, -25023 }, { 19704, -24976 }, { 19710, -24935 }, { 19803, -24940 }, { 19809, -24971 }, { 19836, -24963 }, { 19832, -24915 }, { 19784, -24895 }, { 19771, -24849 }, { 19830, -24794 }, { 19902, -24842 }, { 19934, -24831 }, { 19957, -24833 }, { 19958, -24845 }, { 19968, -24842 }, { 19961, -24808 }, { 19984, -24787 }, { 20110, -24691 }, { 20319, -24629 }, { 20330, -23819 } }, { + place_outpost_fyros_15 = { true, { { 19173, -25151 }, { 19093, -25147 }, { 19085, -25230 }, { 19162, -25243 }, { 19183, -25195 } }, "Outpost" }, + place_outpost_fyros_16 = { true, { { 18980, -25653 }, { 18922, -25613 }, { 18893, -25640 }, { 18893, -25736 }, { 18942, -25746 }, { 18949, -25704 } }, "Outpost" }, + place_lieudit_outlawcanyon_1 = { true, { { 19624, -24670 }, { 19617, -24666 }, { 19607, -24673 }, { 19597, -24679 }, { 19593, -24696 }, { 19584, -24706 }, { 19562, -24709 }, { 19555, -24728 }, { 19531, -24742 }, { 19533, -24766 }, { 19531, -24788 }, { 19532, -24792 }, { 19538, -24794 }, { 19542, -24801 }, { 19541, -24827 }, { 19540, -24829 }, { 19534, -24828 }, { 19524, -24826 }, { 19513, -24825 }, { 19508, -24818 }, { 19510, -24808 }, { 19511, -24802 }, { 19496, -24803 }, { 19493, -24821 }, { 19481, -24833 }, { 19470, -24835 }, { 19462, -24835 }, { 19459, -24851 }, { 19450, -24862 }, { 19450, -24882 }, { 19446, -24893 }, { 19435, -24900 }, { 19423, -24899 }, { 19412, -24903 }, { 19396, -24902 }, { 19385, -24901 }, { 19383, -24901 }, { 19381, -24901 }, { 19376, -24903 }, { 19353, -24909 }, { 19334, -24912 }, { 19331, -24929 }, { 19326, -24935 }, { 19316, -24938 }, { 19311, -24934 }, { 19304, -24932 }, { 19293, -24927 }, { 19279, -24927 }, { 19276, -24929 }, { 19272, -24938 }, { 19262, -24952 }, { 19259, -24961 }, { 19256, -24977 }, { 19253, -24989 }, { 19250, -24996 }, { 19252, -25006 }, { 19249, -25017 }, { 19238, -25021 }, { 19230, -25021 }, { 19225, -25019 }, { 19218, -25029 }, { 19203, -25032 }, { 19202, -25041 }, { 19198, -25053 }, { 19185, -25058 }, { 19182, -25065 }, { 19171, -25072 }, { 19164, -25073 }, { 19158, -25085 }, { 19155, -25092 }, { 19165, -25106 }, { 19166, -25119 }, { 19156, -25129 }, { 19142, -25127 }, { 19134, -25121 }, { 19128, -25107 }, { 19128, -25100 }, { 19103, -25100 }, { 19086, -25103 }, { 19069, -25099 }, { 19044, -25095 }, { 19038, -25106 }, { 19027, -25118 }, { 19015, -25122 }, { 18986, -25124 }, { 18982, -25131 }, { 18977, -25141 }, { 18974, -25149 }, { 18976, -25159 }, { 18978, -25177 }, { 18963, -25190 }, { 18923, -25191 }, { 18921, -25207 }, { 18913, -25223 }, { 18912, -25236 }, { 18908, -25244 }, { 18896, -25250 }, { 18881, -25254 }, { 18879, -25267 }, { 18876, -25279 }, { 18866, -25287 }, { 18858, -25292 }, { 18857, -25299 }, { 18860, -25311 }, { 18859, -25323 }, { 18858, -25332 }, { 18855, -25338 }, { 18861, -25343 }, { 18867, -25344 }, { 18873, -25346 }, { 18880, -25353 }, { 18879, -25366 }, { 18873, -25372 }, { 18856, -25374 }, { 18839, -25372 }, { 18830, -25375 }, { 18820, -25399 }, { 18817, -25415 }, { 18819, -25430 }, { 18812, -25442 }, { 18802, -25445 }, { 18795, -25449 }, { 18787, -25467 }, { 18783, -25498 }, { 18776, -25536 }, { 18741, -25543 }, { 18732, -25544 }, { 18727, -25572 }, { 18728, -25591 }, { 18781, -25589 }, { 18789, -25603 }, { 18783, -25619 }, { 18730, -25618 }, { 18728, -25637 }, { 18703, -25645 }, { 18708, -25672 }, { 18698, -25691 }, { 18698, -25698 }, { 18701, -25713 }, { 18702, -25724 }, { 18724, -25743 }, { 18721, -25764 }, { 18733, -25763 }, { 18753, -25765 }, { 18784, -25758 }, { 18791, -25731 }, { 18815, -25723 }, { 18819, -25728 }, { 18816, -25786 }, { 18799, -25795 }, { 18778, -25798 }, { 18754, -25795 }, { 18722, -25801 }, { 18722, -25824 }, { 18729, -25842 }, { 18730, -25861 }, { 18726, -25882 }, { 18726, -25890 }, { 18751, -25898 }, { 18762, -25893 }, { 18778, -25892 }, { 18779, -25869 }, { 18802, -25858 }, { 18822, -25860 }, { 18850, -25851 }, { 18857, -25861 }, { 18852, -25877 }, { 18879, -25884 }, { 18886, -25866 }, { 18909, -25854 }, { 18923, -25852 }, { 18941, -25856 }, { 18966, -25854 }, { 18971, -25832 }, { 18981, -25824 }, { 18997, -25824 }, { 18994, -25810 }, { 19002, -25790 }, { 19001, -25782 }, { 18997, -25764 }, { 18993, -25762 }, { 18971, -25758 }, { 18967, -25746 }, { 18970, -25734 }, { 18980, -25728 }, { 18999, -25729 }, { 19004, -25717 }, { 19010, -25710 }, { 19024, -25707 }, { 19038, -25709 }, { 19040, -25695 }, { 19034, -25680 }, { 19036, -25663 }, { 19034, -25652 }, { 19040, -25633 }, { 19042, -25600 }, { 19047, -25570 }, { 19034, -25552 }, { 19034, -25542 }, { 19038, -25535 }, { 19054, -25533 }, { 19060, -25533 }, { 19061, -25513 }, { 19066, -25502 }, { 19060, -25482 }, { 19063, -25469 }, { 19064, -25459 }, { 19070, -25440 }, { 19093, -25431 }, { 19093, -25410 }, { 19070, -25402 }, { 19068, -25391 }, { 19073, -25376 }, { 19056, -25374 }, { 19040, -25358 }, { 19037, -25335 }, { 19036, -25321 }, { 19036, -25306 }, { 19039, -25288 }, { 19050, -25276 }, { 19060, -25275 }, { 19068, -25279 }, { 19072, -25290 }, { 19070, -25306 }, { 19069, -25316 }, { 19063, -25330 }, { 19063, -25338 }, { 19085, -25335 }, { 19099, -25341 }, { 19105, -25352 }, { 19107, -25366 }, { 19132, -25370 }, { 19140, -25373 }, { 19166, -25376 }, { 19173, -25408 }, { 19184, -25409 }, { 19198, -25405 }, { 19202, -25398 }, { 19202, -25380 }, { 19200, -25369 }, { 19203, -25353 }, { 19211, -25349 }, { 19235, -25349 }, { 19247, -25349 }, { 19248, -25320 }, { 19265, -25307 }, { 19265, -25283 }, { 19241, -25280 }, { 19244, -25247 }, { 19232, -25231 }, { 19209, -25236 }, { 19201, -25229 }, { 19202, -25216 }, { 19211, -25209 }, { 19230, -25208 }, { 19253, -25206 }, { 19263, -25208 }, { 19264, -25185 }, { 19278, -25178 }, { 19294, -25179 }, { 19294, -25154 }, { 19295, -25141 }, { 19291, -25113 }, { 19290, -25090 }, { 19303, -25082 }, { 19323, -25080 }, { 19328, -25064 }, { 19343, -25052 }, { 19363, -25056 }, { 19379, -25055 }, { 19391, -25029 }, { 19390, -25016 }, { 19387, -25002 }, { 19393, -24988 }, { 19404, -24987 }, { 19413, -24991 }, { 19415, -25001 }, { 19413, -25023 }, { 19437, -25026 }, { 19453, -25032 }, { 19466, -25030 }, { 19468, -25007 }, { 19474, -24989 }, { 19485, -24989 }, { 19499, -24992 }, { 19515, -24990 }, { 19529, -24962 }, { 19561, -24955 }, { 19581, -24942 }, { 19587, -24934 }, { 19585, -24919 }, { 19576, -24915 }, { 19561, -24913 }, { 19532, -24915 }, { 19519, -24910 }, { 19515, -24897 }, { 19523, -24888 }, { 19535, -24884 }, { 19548, -24886 }, { 19579, -24883 }, { 19609, -24881 }, { 19631, -24884 }, { 19641, -24877 }, { 19640, -24851 }, { 19644, -24839 }, { 19652, -24823 }, { 19655, -24801 }, { 19650, -24780 }, { 19663, -24772 }, { 19697, -24765 }, { 19702, -24763 }, { 19705, -24743 }, { 19719, -24731 }, { 19737, -24727 }, { 19746, -24723 }, { 19750, -24713 }, { 19747, -24701 }, { 19739, -24696 }, { 19717, -24699 }, { 19701, -24704 }, { 19693, -24700 }, { 19693, -24691 }, { 19695, -24678 }, { 19671, -24683 }, { 19646, -24681 }, { 19641, -24676 }, { 19631, -24674 } }, "Locality" }, + place_lieudit_outlawcanyon_2 = { true, { { 19003, -24930 }, { 18985, -24932 }, { 18967, -24928 }, { 18938, -24925 }, { 18915, -24922 }, { 18904, -24919 }, { 18888, -24920 }, { 18883, -24932 }, { 18883, -24948 }, { 18881, -24952 }, { 18870, -24953 }, { 18850, -24960 }, { 18826, -24970 }, { 18821, -24989 }, { 18822, -25005 }, { 18824, -25023 }, { 18819, -25047 }, { 18815, -25050 }, { 18799, -25052 }, { 18776, -25052 }, { 18763, -25052 }, { 18769, -25078 }, { 18767, -25092 }, { 18757, -25119 }, { 18752, -25146 }, { 18741, -25152 }, { 18713, -25155 }, { 18709, -25168 }, { 18712, -25180 }, { 18717, -25184 }, { 18734, -25184 }, { 18747, -25186 }, { 18753, -25191 }, { 18753, -25199 }, { 18755, -25206 }, { 18750, -25216 }, { 18737, -25219 }, { 18717, -25218 }, { 18716, -25224 }, { 18715, -25237 }, { 18711, -25245 }, { 18698, -25250 }, { 18690, -25254 }, { 18690, -25264 }, { 18687, -25266 }, { 18681, -25269 }, { 18668, -25269 }, { 18665, -25271 }, { 18664, -25278 }, { 18667, -25287 }, { 18671, -25302 }, { 18671, -25311 }, { 18672, -25323 }, { 18668, -25333 }, { 18666, -25343 }, { 18667, -25352 }, { 18669, -25373 }, { 18667, -25387 }, { 18668, -25401 }, { 18673, -25405 }, { 18678, -25404 }, { 18680, -25394 }, { 18682, -25385 }, { 18688, -25383 }, { 18695, -25380 }, { 18701, -25376 }, { 18712, -25370 }, { 18717, -25366 }, { 18719, -25357 }, { 18723, -25349 }, { 18730, -25344 }, { 18736, -25342 }, { 18744, -25343 }, { 18748, -25344 }, { 18748, -25328 }, { 18753, -25313 }, { 18753, -25297 }, { 18753, -25286 }, { 18758, -25278 }, { 18767, -25276 }, { 18775, -25275 }, { 18781, -25272 }, { 18778, -25261 }, { 18771, -25248 }, { 18771, -25239 }, { 18776, -25229 }, { 18788, -25213 }, { 18811, -25213 }, { 18812, -25199 }, { 18819, -25186 }, { 18819, -25171 }, { 18832, -25156 }, { 18847, -25149 }, { 18848, -25136 }, { 18852, -25116 }, { 18855, -25099 }, { 18858, -25088 }, { 18852, -25070 }, { 18848, -25056 }, { 18854, -25053 }, { 18869, -25055 }, { 18881, -25059 }, { 18895, -25056 }, { 18903, -25057 }, { 18903, -25045 }, { 18911, -25029 }, { 18908, -25007 }, { 18913, -24993 }, { 18923, -24987 }, { 18941, -24992 }, { 18950, -24986 }, { 18961, -24979 }, { 18963, -24965 }, { 18971, -24955 }, { 18986, -24954 }, { 19005, -24956 }, { 19009, -24949 }, { 19010, -24937 } }, "Locality" }, + place_lieudit_outlawcanyon_3 = { true, { { 19104, -25940 }, { 19087, -25946 }, { 19074, -25964 }, { 19071, -25982 }, { 19072, -25988 }, { 19083, -25989 }, { 19092, -25994 }, { 19097, -26001 }, { 19101, -26010 }, { 19110, -26013 }, { 19133, -26010 }, { 19141, -26000 }, { 19142, -25995 }, { 19156, -26001 }, { 19161, -26010 }, { 19166, -26019 }, { 19183, -26026 }, { 19196, -26029 }, { 19205, -26057 }, { 19218, -26084 }, { 19232, -26087 }, { 19237, -26084 }, { 19240, -26076 }, { 19241, -26068 }, { 19237, -26058 }, { 19235, -26048 }, { 19233, -26031 }, { 19229, -26018 }, { 19232, -26002 }, { 19235, -25989 }, { 19258, -25983 }, { 19284, -25983 }, { 19293, -25967 }, { 19313, -25966 }, { 19319, -25952 }, { 19342, -25955 }, { 19358, -25960 }, { 19379, -25959 }, { 19389, -25960 }, { 19406, -25963 }, { 19438, -25969 }, { 19462, -25967 }, { 19474, -25967 }, { 19481, -25963 }, { 19482, -25957 }, { 19475, -25953 }, { 19465, -25952 }, { 19452, -25953 }, { 19440, -25952 }, { 19421, -25949 }, { 19404, -25942 }, { 19389, -25940 }, { 19374, -25936 }, { 19370, -25934 }, { 19366, -25925 }, { 19360, -25917 }, { 19347, -25917 }, { 19332, -25919 }, { 19309, -25920 }, { 19298, -25924 }, { 19291, -25929 }, { 19288, -25935 }, { 19278, -25938 }, { 19267, -25942 }, { 19259, -25947 }, { 19250, -25949 }, { 19243, -25952 }, { 19230, -25956 }, { 19199, -25964 }, { 19181, -25962 }, { 19167, -25957 }, { 19154, -25952 }, { 19140, -25947 }, { 19128, -25944 }, { 19117, -25941 } }, "Locality" } + } }, + region_thescorchedcorridor = { true, { { 17826, -25444 }, { 17787, -25499 }, { 17784, -25525 }, { 17800, -25551 }, { 17791, -25591 }, { 17754, -25595 }, { 17751, -25693 }, { 17722, -25659 }, { 17696, -25651 }, { 17695, -25752 }, { 17664, -25750 }, { 17657, -25853 }, { 17610, -25850 }, { 17595, -25815 }, { 17535, -25829 }, { 17526, -25862 }, { 17408, -25891 }, { 17405, -25801 }, { 17338, -25801 }, { 17346, -25913 }, { 17318, -25916 }, { 17285, -25947 }, { 17273, -26006 }, { 17201, -26012 }, { 17173, -25721 }, { 17145, -25694 }, { 17144, -25932 }, { 17024, -25943 }, { 17016, -26030 }, { 16897, -26053 }, { 16866, -26044 }, { 16864, -26016 }, { 16873, -25979 }, { 16832, -25937 }, { 16799, -25949 }, { 16786, -25979 }, { 16625, -26014 }, { 16621, -25914 }, { 16593, -25912 }, { 16581, -26020 }, { 16559, -26023 }, { 16547, -25994 }, { 16490, -26000 }, { 16495, -26051 }, { 16391, -26037 }, { 16337, -26045 }, { 16337, -26031 }, { 16343, -26008 }, { 16256, -25999 }, { 15998, -25997 }, { 16001, -26881 }, { 17918, -26879 }, { 17919, -26720 }, { 17919, -26564 }, { 18298, -26562 }, { 18392, -26485 }, { 18486, -26548 }, { 18509, -26522 }, { 18433, -26463 }, { 18600, -26363 }, { 18608, -26251 }, { 18695, -26193 }, { 18697, -26095 }, { 18775, -26089 }, { 18616, -25757 }, { 18560, -25475 }, { 18528, -25467 }, { 18487, -25507 }, { 18460, -25491 }, { 18364, -25470 }, { 18241, -25469 }, { 18228, -25425 }, { 18208, -25395 }, { 18132, -25332 }, { 18108, -25335 }, { 18108, -25432 }, { 17952, -25443 }, { 17942, -25459 }, { 17915, -25442 } }, { + place_outpost_fyros_27 = { true, { { 18182, -25611 }, { 18149, -25612 }, { 18140, -25678 }, { 18181, -25732 }, { 18220, -25710 }, { 18230, -25637 } }, "Outpost" }, + place_outpost_fyros_28 = { true, { { 17888, -25779 }, { 17781, -25787 }, { 17791, -25838 }, { 17821, -25829 }, { 17859, -25850 }, { 17890, -25877 }, { 17915, -25849 } }, "Outpost" }, + place_arrival_from_route_gouffre = { false, { { 17701, -26209 }, { 17641, -26209 }, { 17641, -26232 }, { 17702, -26236 } }, "Locality" }, + place_lieudit_thescorchedcorridor_1 = { true, { { 17663, -25847 }, { 17668, -25851 }, { 17675, -25851 }, { 17685, -25851 }, { 17693, -25854 }, { 17695, -25859 }, { 17696, -25869 }, { 17696, -25872 }, { 17704, -25871 }, { 17718, -25870 }, { 17728, -25871 }, { 17731, -25881 }, { 17735, -25887 }, { 17738, -25887 }, { 17748, -25887 }, { 17764, -25888 }, { 17772, -25891 }, { 17779, -25892 }, { 17790, -25882 }, { 17801, -25877 }, { 17805, -25873 }, { 17808, -25865 }, { 17812, -25855 }, { 17822, -25852 }, { 17836, -25852 }, { 17845, -25856 }, { 17850, -25861 }, { 17853, -25867 }, { 17849, -25874 }, { 17861, -25875 }, { 17873, -25875 }, { 17884, -25880 }, { 17889, -25886 }, { 17891, -25897 }, { 17898, -25893 }, { 17911, -25889 }, { 17918, -25888 }, { 17927, -25888 }, { 17933, -25885 }, { 17936, -25879 }, { 17939, -25876 }, { 17946, -25875 }, { 17952, -25873 }, { 17954, -25862 }, { 17956, -25852 }, { 17958, -25848 }, { 17957, -25843 }, { 17955, -25837 }, { 17953, -25828 }, { 17943, -25825 }, { 17940, -25821 }, { 17941, -25815 }, { 17943, -25809 }, { 17951, -25804 }, { 17955, -25802 }, { 17956, -25799 }, { 17955, -25794 }, { 17952, -25788 }, { 17948, -25778 }, { 17936, -25775 }, { 17935, -25772 }, { 17937, -25767 }, { 17939, -25750 }, { 17942, -25741 }, { 17942, -25734 }, { 17928, -25730 }, { 17925, -25720 }, { 17924, -25713 }, { 17936, -25712 }, { 17931, -25695 }, { 17923, -25690 }, { 17917, -25687 }, { 17912, -25689 }, { 17900, -25697 }, { 17898, -25696 }, { 17901, -25690 }, { 17902, -25682 }, { 17903, -25677 }, { 17895, -25679 }, { 17884, -25679 }, { 17868, -25676 }, { 17856, -25670 }, { 17851, -25664 }, { 17849, -25659 }, { 17859, -25657 }, { 17879, -25659 }, { 17888, -25658 }, { 17896, -25659 }, { 17900, -25660 }, { 17904, -25662 }, { 17908, -25662 }, { 17915, -25661 }, { 17924, -25661 }, { 17930, -25664 }, { 17934, -25670 }, { 17935, -25678 }, { 17942, -25679 }, { 17952, -25673 }, { 17956, -25667 }, { 17964, -25667 }, { 17974, -25666 }, { 17982, -25662 }, { 17985, -25656 }, { 17989, -25649 }, { 17998, -25647 }, { 18001, -25646 }, { 18004, -25637 }, { 18004, -25626 }, { 18020, -25615 }, { 18019, -25639 }, { 18019, -25642 }, { 18014, -25651 }, { 18011, -25657 }, { 17999, -25662 }, { 17997, -25669 }, { 17996, -25675 }, { 17993, -25677 }, { 17984, -25680 }, { 17973, -25680 }, { 17967, -25683 }, { 17963, -25693 }, { 17961, -25696 }, { 17955, -25699 }, { 17950, -25700 }, { 17952, -25716 }, { 17966, -25722 }, { 17969, -25735 }, { 17970, -25745 }, { 17968, -25753 }, { 17966, -25766 }, { 17965, -25772 }, { 17980, -25781 }, { 17983, -25798 }, { 17984, -25806 }, { 17975, -25808 }, { 17972, -25819 }, { 17973, -25822 }, { 17984, -25828 }, { 17986, -25840 }, { 17990, -25850 }, { 17992, -25866 }, { 18001, -25872 }, { 18003, -25880 }, { 18009, -25888 }, { 18035, -25892 }, { 18048, -25895 }, { 18054, -25894 }, { 18070, -25885 }, { 18075, -25884 }, { 18079, -25873 }, { 18103, -25875 }, { 18115, -25891 }, { 18125, -25891 }, { 18146, -25887 }, { 18161, -25883 }, { 18175, -25889 }, { 18179, -25901 }, { 18179, -25905 }, { 18183, -25907 }, { 18188, -25905 }, { 18199, -25901 }, { 18204, -25901 }, { 18214, -25901 }, { 18219, -25901 }, { 18245, -25904 }, { 18253, -25906 }, { 18259, -25905 }, { 18265, -25905 }, { 18272, -25905 }, { 18280, -25903 }, { 18286, -25901 }, { 18288, -25897 }, { 18288, -25890 }, { 18287, -25888 }, { 18284, -25887 }, { 18277, -25888 }, { 18272, -25888 }, { 18270, -25886 }, { 18269, -25881 }, { 18269, -25876 }, { 18270, -25873 }, { 18261, -25872 }, { 18251, -25869 }, { 18242, -25871 }, { 18229, -25873 }, { 18215, -25875 }, { 18198, -25876 }, { 18180, -25873 }, { 18176, -25869 }, { 18178, -25862 }, { 18180, -25858 }, { 18186, -25855 }, { 18193, -25855 }, { 18200, -25855 }, { 18208, -25853 }, { 18209, -25848 }, { 18206, -25843 }, { 18205, -25836 }, { 18214, -25833 }, { 18226, -25836 }, { 18235, -25839 }, { 18247, -25840 }, { 18260, -25841 }, { 18262, -25842 }, { 18268, -25849 }, { 18271, -25855 }, { 18280, -25857 }, { 18284, -25860 }, { 18289, -25869 }, { 18293, -25870 }, { 18301, -25870 }, { 18305, -25875 }, { 18304, -25894 }, { 18308, -25899 }, { 18317, -25894 }, { 18321, -25885 }, { 18330, -25888 }, { 18342, -25890 }, { 18360, -25886 }, { 18371, -25902 }, { 18396, -25904 }, { 18406, -25902 }, { 18415, -25898 }, { 18416, -25892 }, { 18419, -25889 }, { 18430, -25886 }, { 18431, -25875 }, { 18436, -25866 }, { 18442, -25859 }, { 18449, -25857 }, { 18458, -25864 }, { 18460, -25870 }, { 18462, -25878 }, { 18465, -25877 }, { 18481, -25875 }, { 18480, -25870 }, { 18477, -25860 }, { 18475, -25854 }, { 18477, -25846 }, { 18483, -25841 }, { 18493, -25840 }, { 18500, -25824 }, { 18501, -25792 }, { 18497, -25770 }, { 18495, -25758 }, { 18499, -25749 }, { 18510, -25747 }, { 18524, -25746 }, { 18528, -25742 }, { 18528, -25729 }, { 18545, -25729 }, { 18543, -25697 }, { 18537, -25694 }, { 18519, -25698 }, { 18527, -25681 }, { 18545, -25679 }, { 18545, -25662 }, { 18533, -25656 }, { 18526, -25641 }, { 18525, -25631 }, { 18512, -25628 }, { 18497, -25613 }, { 18496, -25602 }, { 18500, -25599 }, { 18524, -25600 }, { 18528, -25598 }, { 18532, -25592 }, { 18529, -25570 }, { 18510, -25554 }, { 18493, -25542 }, { 18487, -25543 }, { 18480, -25545 }, { 18474, -25545 }, { 18466, -25540 }, { 18457, -25536 }, { 18438, -25543 }, { 18435, -25564 }, { 18432, -25568 }, { 18429, -25574 }, { 18428, -25584 }, { 18428, -25599 }, { 18426, -25605 }, { 18424, -25613 }, { 18424, -25618 }, { 18426, -25624 }, { 18428, -25627 }, { 18429, -25633 }, { 18427, -25637 }, { 18426, -25641 }, { 18429, -25653 }, { 18433, -25663 }, { 18431, -25664 }, { 18425, -25662 }, { 18417, -25655 }, { 18412, -25645 }, { 18402, -25645 }, { 18388, -25645 }, { 18383, -25644 }, { 18382, -25653 }, { 18383, -25656 }, { 18364, -25662 }, { 18348, -25668 }, { 18347, -25665 }, { 18354, -25652 }, { 18370, -25648 }, { 18370, -25641 }, { 18368, -25640 }, { 18368, -25632 }, { 18376, -25633 }, { 18379, -25634 }, { 18386, -25634 }, { 18392, -25632 }, { 18400, -25631 }, { 18407, -25629 }, { 18412, -25628 }, { 18413, -25613 }, { 18415, -25603 }, { 18415, -25586 }, { 18414, -25579 }, { 18416, -25561 }, { 18417, -25555 }, { 18414, -25550 }, { 18396, -25550 }, { 18390, -25550 }, { 18380, -25566 }, { 18369, -25569 }, { 18366, -25574 }, { 18363, -25595 }, { 18351, -25604 }, { 18350, -25584 }, { 18348, -25574 }, { 18328, -25569 }, { 18305, -25570 }, { 18300, -25585 }, { 18289, -25587 }, { 18283, -25597 }, { 18268, -25599 }, { 18252, -25604 }, { 18239, -25601 }, { 18234, -25593 }, { 18227, -25580 }, { 18228, -25579 }, { 18233, -25581 }, { 18252, -25587 }, { 18255, -25585 }, { 18254, -25576 }, { 18253, -25570 }, { 18254, -25569 }, { 18265, -25576 }, { 18269, -25575 }, { 18280, -25567 }, { 18283, -25564 }, { 18287, -25544 }, { 18291, -25536 }, { 18301, -25533 }, { 18309, -25535 }, { 18320, -25544 }, { 18335, -25547 }, { 18343, -25550 }, { 18350, -25550 }, { 18352, -25544 }, { 18354, -25537 }, { 18359, -25535 }, { 18365, -25532 }, { 18372, -25531 }, { 18388, -25529 }, { 18398, -25533 }, { 18406, -25533 }, { 18414, -25527 }, { 18415, -25517 }, { 18413, -25508 }, { 18409, -25504 }, { 18405, -25501 }, { 18398, -25499 }, { 18392, -25501 }, { 18385, -25506 }, { 18382, -25507 }, { 18372, -25501 }, { 18356, -25500 }, { 18351, -25487 }, { 18337, -25488 }, { 18321, -25484 }, { 18317, -25483 }, { 18299, -25485 }, { 18289, -25484 }, { 18280, -25471 }, { 18255, -25469 }, { 18240, -25469 }, { 18238, -25451 }, { 18230, -25429 }, { 18225, -25426 }, { 18208, -25424 }, { 18204, -25422 }, { 18204, -25419 }, { 18206, -25414 }, { 18207, -25410 }, { 18207, -25401 }, { 18207, -25397 }, { 18204, -25393 }, { 18199, -25392 }, { 18188, -25391 }, { 18179, -25387 }, { 18175, -25375 }, { 18163, -25370 }, { 18154, -25369 }, { 18149, -25358 }, { 18148, -25346 }, { 18140, -25340 }, { 18130, -25335 }, { 18122, -25333 }, { 18113, -25334 }, { 18109, -25345 }, { 18111, -25361 }, { 18114, -25373 }, { 18117, -25380 }, { 18122, -25389 }, { 18121, -25395 }, { 18118, -25398 }, { 18116, -25401 }, { 18115, -25425 }, { 18117, -25439 }, { 18112, -25440 }, { 18093, -25434 }, { 18085, -25437 }, { 18081, -25446 }, { 18047, -25444 }, { 18010, -25451 }, { 17988, -25443 }, { 17952, -25446 }, { 17921, -25448 }, { 17916, -25442 }, { 17866, -25446 }, { 17825, -25444 }, { 17826, -25467 }, { 17799, -25478 }, { 17787, -25501 }, { 17787, -25525 }, { 17803, -25546 }, { 17789, -25595 }, { 17756, -25597 }, { 17769, -25639 }, { 17757, -25670 }, { 17762, -25699 }, { 17727, -25692 }, { 17720, -25659 }, { 17696, -25655 }, { 17693, -25661 }, { 17704, -25707 }, { 17694, -25737 }, { 17696, -25757 }, { 17692, -25758 }, { 17668, -25752 }, { 17664, -25764 }, { 17673, -25792 }, { 17662, -25812 }, { 17658, -25817 }, { 17659, -25843 } }, "Locality" }, + place_lieudit_thescorchedcorridor_2 = { true, { { 17531, -25914 }, { 17513, -25980 }, { 17533, -26070 }, { 17557, -26154 }, { 17590, -26215 }, { 17627, -26232 }, { 17706, -26240 }, { 17780, -26240 }, { 17892, -26264 }, { 17969, -26268 }, { 18059, -26264 }, { 18129, -26275 }, { 18151, -26244 }, { 18191, -26193 }, { 18206, -26115 }, { 18206, -26015 }, { 18119, -25955 }, { 17932, -25886 }, { 17891, -25896 }, { 17884, -25879 }, { 17850, -25876 }, { 17853, -25866 }, { 17846, -25857 }, { 17837, -25851 }, { 17819, -25853 }, { 17809, -25859 }, { 17806, -25872 }, { 17800, -25878 }, { 17783, -25887 }, { 17772, -25892 }, { 17760, -25887 }, { 17746, -25888 }, { 17739, -25888 }, { 17736, -25888 }, { 17725, -25870 }, { 17696, -25872 }, { 17694, -25855 }, { 17691, -25852 }, { 17669, -25850 }, { 17638, -25855 }, { 17607, -25858 }, { 17603, -25848 }, { 17599, -25834 }, { 17596, -25830 }, { 17593, -25827 }, { 17584, -25824 }, { 17575, -25820 }, { 17561, -25822 }, { 17550, -25825 }, { 17545, -25828 }, { 17535, -25838 }, { 17532, -25849 }, { 17527, -25862 }, { 17524, -25879 } }, "Locality" }, + place_lieudit_thescorchedcorridor_3 = { true, { { 17368, -26323 }, { 17376, -26335 }, { 17387, -26339 }, { 17393, -26339 }, { 17400, -26362 }, { 17411, -26394 }, { 17420, -26397 }, { 17442, -26398 }, { 17456, -26397 }, { 17472, -26398 }, { 17486, -26403 }, { 17503, -26407 }, { 17525, -26408 }, { 17542, -26392 }, { 17542, -26381 }, { 17560, -26380 }, { 17589, -26378 }, { 17611, -26375 }, { 17633, -26365 }, { 17661, -26358 }, { 17676, -26342 }, { 17701, -26345 }, { 17707, -26336 }, { 17704, -26321 }, { 17698, -26312 }, { 17683, -26305 }, { 17671, -26300 }, { 17667, -26293 }, { 17655, -26274 }, { 17629, -26262 }, { 17596, -26240 }, { 17573, -26231 }, { 17564, -26215 }, { 17535, -26204 }, { 17510, -26207 }, { 17486, -26210 }, { 17459, -26211 }, { 17419, -26199 }, { 17401, -26206 }, { 17383, -26213 }, { 17373, -26234 }, { 17342, -26250 }, { 17309, -26252 }, { 17306, -26265 }, { 17309, -26275 }, { 17325, -26278 }, { 17334, -26283 }, { 17343, -26300 } }, "Locality" }, + place_ranger_entry_thescorchedcorridor = { false, { { 16832, -26191 }, { 16830, -26187 }, { 16826, -26186 }, { 16823, -26187 }, { 16822, -26190 }, { 16823, -26194 }, { 16826, -26196 }, { 16829, -26195 } }, "Locality" } + } } + } }, + continent_matis = { true, { { 33, 213 }, { 45, -2431 }, { 1242, -5291 }, { 2899, -5817 }, { 3324, -7847 }, { 6457, -7970 }, { 5999, 195 } }, { + region_groveofconfusion = { true, { { 5435, -319 }, { 3798, -313 }, { 3605, -1209 }, { 3759, -1346 }, { 3752, -1369 }, { 3785, -1403 }, { 3822, -1402 }, { 3854, -1422 }, { 3868, -1447 }, { 3883, -1453 }, { 3905, -1471 }, { 3904, -1479 }, { 3923, -1506 }, { 3930, -1526 }, { 3988, -1537 }, { 4003, -1570 }, { 4026, -1578 }, { 4039, -1606 }, { 4075, -1633 }, { 4093, -1630 }, { 4162, -1671 }, { 4158, -1699 }, { 4205, -1756 }, { 4224, -1755 }, { 4264, -1797 }, { 4307, -1827 }, { 4386, -1899 }, { 5433, -1895 } }, { + place_outpost_matis_24 = { true, { { 4260, -666 }, { 4194, -681 }, { 4195, -741 }, { 4216, -763 }, { 4263, -763 }, { 4289, -742 }, { 4299, -696 } }, "Outpost" }, + place_outpost_matis_25 = { true, { { 4607, -512 }, { 4509, -501 }, { 4500, -545 }, { 4508, -579 }, { 4510, -601 }, { 4544, -610 }, { 4577, -609 }, { 4607, -609 }, { 4613, -578 } }, "Outpost" }, + place_outpost_matis_26 = { true, { { 5087, -829 }, { 4995, -834 }, { 4981, -932 }, { 5026, -939 }, { 5088, -929 } }, "Outpost" }, + place_outpost_matis_27 = { true, { { 4926, -1151 }, { 4832, -1150 }, { 4829, -1248 }, { 4931, -1251 } }, "Outpost" }, + place_lieudit_groveofconfusion_1 = { true, { { 4677, -771 }, { 4662, -758 }, { 4642, -755 }, { 4619, -756 }, { 4600, -768 }, { 4591, -795 }, { 4576, -834 }, { 4566, -864 }, { 4565, -883 }, { 4576, -898 }, { 4594, -904 }, { 4637, -911 }, { 4707, -917 }, { 4727, -913 }, { 4740, -900 } }, "Locality" }, + place_lieudit_groveofconfusion_2 = { true, { { 4500, -965 }, { 4515, -962 }, { 4546, -941 }, { 4560, -922 }, { 4561, -901 }, { 4561, -883 }, { 4551, -860 }, { 4538, -850 }, { 4512, -844 }, { 4482, -843 }, { 4467, -850 }, { 4454, -854 }, { 4437, -884 }, { 4457, -911 }, { 4477, -916 }, { 4494, -918 }, { 4498, -938 } }, "Locality" }, + place_lieudit_groveofconfusion_3 = { true, { { 4075, -1050 }, { 4071, -1069 }, { 4079, -1107 }, { 4086, -1131 }, { 4108, -1149 }, { 4119, -1158 }, { 4130, -1161 }, { 4145, -1150 }, { 4150, -1125 }, { 4155, -1100 }, { 4155, -1073 }, { 4161, -1059 }, { 4164, -1051 }, { 4166, -1042 }, { 4165, -1024 }, { 4151, -1013 }, { 4119, -1011 }, { 4095, -1018 }, { 4084, -1036 } }, "Locality" }, + place_lieudit_groveofconfusion_4 = { true, { { 4902, -474 }, { 4883, -467 }, { 4875, -467 }, { 4867, -472 }, { 4834, -504 }, { 4827, -554 }, { 4821, -622 }, { 4822, -702 }, { 4824, -759 }, { 4843, -776 }, { 4870, -775 }, { 4910, -783 }, { 4957, -783 }, { 5023, -781 }, { 5083, -771 }, { 5115, -759 }, { 5123, -743 }, { 5126, -727 }, { 5126, -711 }, { 5117, -686 }, { 5105, -655 }, { 5102, -578 }, { 5100, -539 }, { 5085, -500 }, { 5009, -492 }, { 4944, -492 } }, "Locality" }, + place_ranger_entry_groveofconfusion = { false, { { 4267, -1318 }, { 4265, -1314 }, { 4262, -1313 }, { 4258, -1314 }, { 4257, -1317 }, { 4258, -1321 }, { 4262, -1323 }, { 4265, -1322 } }, "Locality" } + } }, + region_hiddensource = { true, { { 1863, -285 }, { 301, -296 }, { 319, -2061 }, { 1267, -2080 }, { 1351, -2050 }, { 1476, -1957 }, { 1546, -1972 }, { 1604, -1955 }, { 1693, -2046 }, { 1812, -2065 }, { 1887, -2040 }, { 1902, -1893 }, { 1969, -1873 }, { 2006, -1882 }, { 2064, -1854 }, { 2060, -1795 }, { 2185, -1805 }, { 2208, -1778 }, { 2221, -1635 }, { 2272, -1630 }, { 2370, -1505 }, { 2363, -1403 }, { 2391, -1295 }, { 2523, -1211 } }, { + place_outpost_matis_28 = { true, { { 1728, -1788 }, { 1639, -1788 }, { 1635, -1863 }, { 1714, -1877 }, { 1745, -1835 } }, "Outpost" }, + place_outpost_matis_29 = { true, { { 2183, -1488 }, { 2171, -1484 }, { 2115, -1489 }, { 2115, -1566 }, { 2163, -1565 }, { 2186, -1545 }, { 2188, -1517 } }, "Outpost" }, + place_outpost_matis_30 = { true, { { 1558, -1309 }, { 1475, -1316 }, { 1474, -1377 }, { 1504, -1399 }, { 1564, -1392 } }, "Outpost" }, + place_outpost_matis_31 = { true, { { 1706, -837 }, { 1630, -840 }, { 1620, -920 }, { 1670, -948 }, { 1726, -912 } }, "Outpost" }, + place_outpost_matis_32 = { true, { { 1384, -528 }, { 1329, -535 }, { 1316, -571 }, { 1327, -607 }, { 1404, -605 }, { 1413, -566 } }, "Outpost" }, + place_arrival_from_fyros = { false, { { 358, -835 }, { 320, -835 }, { 319, -911 }, { 351, -911 } }, "Locality" }, + place_lieudit_hiddensource_1 = { true, { { 1894, -1613 }, { 1872, -1613 }, { 1839, -1620 }, { 1817, -1643 }, { 1812, -1665 }, { 1816, -1686 }, { 1833, -1704 }, { 1863, -1716 }, { 1900, -1712 }, { 1915, -1700 }, { 1924, -1680 }, { 1925, -1656 }, { 1918, -1635 }, { 1909, -1620 } }, "Locality" }, + place_lieudit_hiddensource_2 = { true, { { 1145, -971 }, { 1198, -959 }, { 1214, -942 }, { 1280, -960 }, { 1345, -969 }, { 1381, -957 }, { 1415, -961 }, { 1433, -952 }, { 1435, -923 }, { 1423, -897 }, { 1419, -881 }, { 1430, -838 }, { 1435, -799 }, { 1432, -751 }, { 1432, -725 }, { 1442, -685 }, { 1438, -653 }, { 1419, -641 }, { 1396, -641 }, { 1361, -649 }, { 1333, -653 }, { 1272, -642 }, { 1216, -657 }, { 1149, -660 }, { 1140, -676 }, { 1114, -740 }, { 1114, -794 }, { 1126, -836 }, { 1112, -880 }, { 1102, -926 }, { 1110, -956 } }, "Locality" }, + place_lieudit_hiddensource_3 = { true, { { 839, -752 }, { 676, -674 }, { 629, -706 }, { 599, -780 }, { 577, -854 }, { 616, -955 }, { 659, -967 }, { 736, -966 }, { 764, -942 }, { 793, -932 }, { 818, -904 }, { 835, -868 }, { 843, -828 }, { 840, -783 } }, "Locality" }, + place_r_07_17 = { false, { { 1348, -1837 }, { 1352, -1847 }, { 1357, -1849 }, { 1366, -1843 }, { 1371, -1833 }, { 1368, -1822 }, { 1363, -1817 }, { 1354, -1811 }, { 1350, -1823 } }, "Locality" }, + pvp_zone_marauder = { true, { { 887, -1297 }, { 886, -1265 }, { 843, -1265 }, { 843, -1298 } }, "Locality" }, + place_marauder_camp = { true, { { 979, -1236 }, { 869, -1242 }, { 857, -1249 }, { 842, -1249 }, { 827, -1259 }, { 822, -1345 }, { 825, -1400 }, { 885, -1405 }, { 979, -1415 }, { 991, -1380 }, { 1019, -1371 }, { 1026, -1347 }, { 1049, -1341 }, { 1072, -1301 }, { 1066, -1295 }, { 1062, -1284 }, { 1060, -1273 }, { 1059, -1264 }, { 1052, -1256 }, { 1044, -1260 }, { 996, -1310 }, { 985, -1300 }, { 970, -1296 }, { 961, -1284 }, { 997, -1233 } }, "Capital" }, + marauder_stable = { true, { { 883, -1348 }, { 882, -1365 }, { 888, -1374 }, { 907, -1375 }, { 919, -1346 }, { 906, -1324 }, { 890, -1334 } }, "stable" }, + place_lieudit_marauder_arena = { true, { { 886, -1297 }, { 886, -1265 }, { 843, -1265 }, { 843, -1298 } }, "Locality" } + } }, + region_hereticshovel = { true, { { 6216, -6567 }, { 5945, -6422 }, { 5744, -6324 }, { 5738, -6287 }, { 5679, -6261 }, { 5631, -6273 }, { 5547, -6220 }, { 5466, -6244 }, { 5421, -6239 }, { 5321, -6241 }, { 5320, -6275 }, { 5229, -6270 }, { 5198, -6265 }, { 5190, -6280 }, { 5147, -6288 }, { 5076, -6315 }, { 5048, -6308 }, { 4959, -6345 }, { 4729, -6446 }, { 4727, -7883 }, { 6240, -7885 } }, { + place_outpost_matis_10 = { true, { { 5408, -6429 }, { 5317, -6432 }, { 5306, -6533 }, { 5408, -6529 } }, "Outpost" }, + place_outpost_matis_11 = { true, { { 5095, -6741 }, { 4997, -6746 }, { 4984, -6852 }, { 5093, -6848 } }, "Outpost" }, + place_outpost_matis_12 = { true, { { 5412, -7071 }, { 5311, -7068 }, { 5304, -7174 }, { 5415, -7183 } }, "Outpost" }, + place_outpost_matis_13 = { true, { { 5732, -7226 }, { 5630, -7231 }, { 5618, -7338 }, { 5725, -7336 } }, "Outpost" }, + place_outpost_matis_14 = { true, { { 5569, -7546 }, { 5467, -7541 }, { 5460, -7648 }, { 5571, -7652 } }, "Outpost" }, + place_arrival_from_tryker = { false, { { 5151, -7707 }, { 5120, -7707 }, { 5120, -7740 }, { 5151, -7740 } }, "Locality" }, + place_lieudit_hereticshovel_1 = { true, { { 5310, -7784 }, { 5357, -7803 }, { 5415, -7810 }, { 5498, -7822 }, { 5550, -7813 }, { 5601, -7810 }, { 5680, -7815 }, { 5736, -7808 }, { 5742, -7776 }, { 5742, -7730 }, { 5729, -7721 }, { 5700, -7709 }, { 5676, -7703 }, { 5649, -7711 }, { 5603, -7733 }, { 5556, -7728 }, { 5544, -7710 }, { 5513, -7705 }, { 5486, -7705 }, { 5392, -7702 }, { 5329, -7706 }, { 5310, -7717 }, { 5306, -7740 }, { 5306, -7761 } }, "Locality" }, + place_lieudit_hereticshovel_2 = { true, { { 5759, -7571 }, { 5749, -7585 }, { 5746, -7599 }, { 5751, -7614 }, { 5768, -7629 }, { 5786, -7652 }, { 5814, -7654 }, { 5854, -7656 }, { 5906, -7666 }, { 6023, -7660 }, { 6055, -7646 }, { 6058, -7586 }, { 6055, -7529 }, { 6060, -7481 }, { 6055, -7420 }, { 6044, -7393 }, { 6021, -7376 }, { 6000, -7365 }, { 5981, -7366 }, { 5908, -7376 }, { 5814, -7383 }, { 5791, -7399 } }, "Locality" }, + place_lieudit_hereticshovel_3 = { true, { { 5764, -6765 }, { 5756, -6784 }, { 5751, -6804 }, { 5759, -6818 }, { 5768, -6836 }, { 5793, -6854 }, { 5807, -6860 }, { 5827, -6865 }, { 5858, -6868 }, { 5881, -6859 }, { 5896, -6841 }, { 5899, -6822 }, { 5905, -6797 }, { 5901, -6760 }, { 5896, -6746 }, { 5883, -6739 }, { 5834, -6737 }, { 5797, -6749 } }, "Locality" }, + place_lieudit_hereticshovel_4 = { true, { { 5350, -6802 }, { 5332, -6824 }, { 5301, -6838 }, { 5296, -6881 }, { 5298, -6924 }, { 5341, -6941 }, { 5409, -6942 }, { 5474, -6937 }, { 5521, -6966 }, { 5539, -6992 }, { 5554, -7024 }, { 5637, -7025 }, { 5664, -7015 }, { 5703, -6998 }, { 5729, -6964 }, { 5739, -6900 }, { 5718, -6872 }, { 5692, -6842 }, { 5674, -6797 }, { 5662, -6767 }, { 5651, -6732 }, { 5631, -6689 }, { 5601, -6669 }, { 5572, -6646 }, { 5552, -6646 }, { 5519, -6637 }, { 5504, -6661 }, { 5478, -6664 }, { 5445, -6665 }, { 5403, -6709 }, { 5374, -6732 }, { 5353, -6762 } }, "Locality" } + } }, + region_upperbog = { true, { { 4518, -5918 }, { 4463, -5781 }, { 4426, -5749 }, { 4332, -5597 }, { 4267, -5509 }, { 4197, -5413 }, { 4144, -5408 }, { 4103, -5417 }, { 4062, -5373 }, { 4023, -5343 }, { 4027, -5310 }, { 3906, -5197 }, { 3812, -5112 }, { 3675, -4937 }, { 3259, -5038 }, { 3358, -6928 }, { 4619, -6999 }, { 4663, -6224 } }, { + place_outpost_matis_01 = { true, { { 3980, -6583 }, { 3875, -6583 }, { 3859, -6695 }, { 3970, -6695 } }, "Outpost" }, + place_outpost_matis_02 = { true, { { 3656, -6106 }, { 3552, -6107 }, { 3546, -6212 }, { 3647, -6208 } }, "Outpost" }, + place_outpost_matis_03 = { true, { { 4268, -5621 }, { 4180, -5625 }, { 4179, -5682 }, { 4204, -5711 }, { 4273, -5695 } }, "Outpost" }, + place_outpost_matis_04 = { true, { { 3974, -5453 }, { 3885, -5459 }, { 3872, -5517 }, { 3902, -5554 }, { 3952, -5555 }, { 3987, -5517 } }, "Outpost" }, + place_lieudit_upperbog_1 = { true, { { 3862, -5689 }, { 3862, -5697 }, { 3866, -5700 }, { 3870, -5701 }, { 3872, -5703 }, { 3877, -5704 }, { 3880, -5708 }, { 3881, -5710 }, { 3885, -5710 }, { 3892, -5711 }, { 3898, -5711 }, { 3902, -5710 }, { 3905, -5711 }, { 3907, -5711 }, { 3911, -5711 }, { 3913, -5710 }, { 3916, -5706 }, { 3918, -5701 }, { 3919, -5697 }, { 3920, -5694 }, { 3923, -5694 }, { 3926, -5694 }, { 3930, -5692 }, { 3931, -5689 }, { 3931, -5685 }, { 3930, -5681 }, { 3931, -5672 }, { 3933, -5668 }, { 3936, -5664 }, { 3943, -5663 }, { 3947, -5662 }, { 3954, -5660 }, { 3961, -5655 }, { 3965, -5650 }, { 3967, -5647 }, { 3964, -5637 }, { 3949, -5635 }, { 3925, -5637 }, { 3912, -5634 }, { 3900, -5645 }, { 3884, -5652 }, { 3879, -5667 }, { 3873, -5676 }, { 3870, -5682 }, { 3866, -5684 } }, "Locality" }, + place_lieudit_upperbog_2 = { true, { { 4163, -5790 }, { 4104, -5800 }, { 4060, -5821 }, { 4029, -5863 }, { 4015, -5912 }, { 4017, -5980 }, { 4029, -6019 }, { 4054, -6050 }, { 4097, -6068 }, { 4177, -6068 }, { 4253, -6050 }, { 4280, -6038 }, { 4311, -5978 }, { 4315, -5916 }, { 4295, -5865 }, { 4273, -5828 }, { 4236, -5802 }, { 4197, -5785 } }, "Locality" }, + place_lieudit_upperbog_3 = { true, { { 4275, -6095 }, { 4259, -6101 }, { 4239, -6102 }, { 4230, -6101 }, { 4220, -6100 }, { 4206, -6111 }, { 4196, -6127 }, { 4187, -6144 }, { 4180, -6156 }, { 4173, -6172 }, { 4175, -6189 }, { 4185, -6209 }, { 4207, -6223 }, { 4230, -6229 }, { 4258, -6227 }, { 4286, -6212 }, { 4310, -6188 }, { 4316, -6176 }, { 4318, -6156 }, { 4315, -6137 }, { 4314, -6119 }, { 4310, -6106 }, { 4302, -6094 }, { 4288, -6090 }, { 4279, -6090 } }, "Locality" }, + place_lieudit_upperbog_4 = { true, { { 4377, -6488 }, { 4356, -6488 }, { 4341, -6490 }, { 4330, -6502 }, { 4313, -6523 }, { 4310, -6545 }, { 4316, -6581 }, { 4329, -6604 }, { 4336, -6622 }, { 4341, -6642 }, { 4342, -6675 }, { 4344, -6700 }, { 4358, -6735 }, { 4360, -6762 }, { 4339, -6763 }, { 4307, -6759 }, { 4268, -6741 }, { 4207, -6746 }, { 4150, -6758 }, { 4116, -6746 }, { 4090, -6744 }, { 4063, -6743 }, { 4023, -6765 }, { 3969, -6749 }, { 3950, -6736 }, { 3941, -6729 }, { 3929, -6723 }, { 3922, -6720 }, { 3909, -6720 }, { 3902, -6724 }, { 3875, -6738 }, { 3864, -6747 }, { 3859, -6764 }, { 3851, -6776 }, { 3846, -6792 }, { 3848, -6806 }, { 3851, -6818 }, { 3857, -6823 }, { 3870, -6847 }, { 3901, -6858 }, { 3979, -6854 }, { 4043, -6857 }, { 4103, -6857 }, { 4125, -6857 }, { 4181, -6845 }, { 4206, -6851 }, { 4254, -6852 }, { 4287, -6851 }, { 4317, -6839 }, { 4358, -6848 }, { 4395, -6846 }, { 4436, -6845 }, { 4457, -6836 }, { 4462, -6808 }, { 4447, -6774 }, { 4446, -6747 }, { 4451, -6718 }, { 4461, -6678 }, { 4463, -6656 }, { 4453, -6618 }, { 4449, -6581 }, { 4420, -6534 }, { 4414, -6505 }, { 4401, -6492 } }, "Locality" } + } }, + region_knollofdissent = { true, { { 2530, -1213 }, { 2398, -1291 }, { 2366, -1400 }, { 2364, -1502 }, { 2328, -1520 }, { 2279, -1573 }, { 2274, -1621 }, { 2219, -1627 }, { 2180, -1787 }, { 2063, -1795 }, { 2071, -1853 }, { 2014, -1880 }, { 1977, -1873 }, { 1902, -1887 }, { 1879, -1941 }, { 1885, -2027 }, { 1855, -2040 }, { 1819, -2056 }, { 1783, -2038 }, { 1711, -2039 }, { 1686, -1999 }, { 1620, -1941 }, { 1554, -1972 }, { 1483, -1957 }, { 1357, -2047 }, { 1271, -2080 }, { 2016, -2979 }, { 3008, -2780 }, { 3092, -2729 }, { 3102, -2701 }, { 3137, -2702 }, { 3187, -2672 }, { 3210, -2683 }, { 3219, -2672 }, { 3227, -2649 }, { 3295, -2622 }, { 3359, -2565 }, { 3418, -2551 }, { 3537, -2549 }, { 3589, -2584 }, { 3660, -2569 }, { 3662, -2537 }, { 4397, -1899 }, { 4316, -1825 }, { 4274, -1796 }, { 4234, -1753 }, { 4215, -1754 }, { 4192, -1729 }, { 4168, -1697 }, { 4172, -1671 }, { 4097, -1620 }, { 4082, -1626 }, { 4050, -1598 }, { 4043, -1575 }, { 4034, -1574 }, { 4013, -1568 }, { 3998, -1534 }, { 3941, -1521 }, { 3934, -1503 }, { 3915, -1478 }, { 3918, -1471 }, { 3893, -1450 }, { 3877, -1444 }, { 3864, -1420 }, { 3832, -1399 }, { 3796, -1399 }, { 3763, -1367 }, { 3771, -1345 }, { 3611, -1204 } }, { + place_outpost_matis_16 = { true, { { 3002, -2302 }, { 2974, -2263 }, { 2900, -2268 }, { 2890, -2344 }, { 2929, -2363 }, { 2986, -2358 } }, "Outpost" }, + place_outpost_matis_17 = { true, { { 2362, -2449 }, { 2291, -2465 }, { 2289, -2530 }, { 2337, -2547 }, { 2379, -2535 }, { 2389, -2491 } }, "Outpost" }, + place_outpost_matis_18 = { true, { { 2015, -1958 }, { 1973, -1960 }, { 1951, -2016 }, { 1994, -2066 }, { 2053, -2065 }, { 2064, -1985 } }, "Outpost" }, + place_outpost_matis_19 = { true, { { 2655, -1966 }, { 2579, -1977 }, { 2576, -2023 }, { 2592, -2061 }, { 2641, -2062 }, { 2679, -2028 } }, "Outpost" }, + place_outpost_matis_20 = { true, { { 2529, -1454 }, { 2456, -1456 }, { 2430, -1504 }, { 2459, -1558 }, { 2506, -1556 }, { 2546, -1519 } }, "Outpost" }, + place_outpost_matis_21 = { true, { { 3018, -1462 }, { 2947, -1461 }, { 2918, -1512 }, { 2919, -1547 }, { 2943, -1560 }, { 2976, -1566 }, { 3033, -1527 } }, "Outpost" }, + place_outpost_matis_22 = { true, { { 3614, -1641 }, { 3553, -1648 }, { 3532, -1696 }, { 3559, -1747 }, { 3606, -1746 }, { 3642, -1715 } }, "Outpost" }, + place_outpost_matis_23 = { true, { { 3617, -1954 }, { 3573, -1959 }, { 3553, -2017 }, { 3594, -2068 }, { 3648, -2067 }, { 3670, -1981 } }, "Outpost" }, + place_arrival_from_bagne = { false, { { 2199, -2527 }, { 2193, -2525 }, { 2173, -2525 }, { 2167, -2518 }, { 2163, -2519 }, { 2160, -2525 }, { 2158, -2529 }, { 2151, -2530 }, { 2146, -2526 }, { 2148, -2531 }, { 2154, -2532 }, { 2185, -2530 }, { 2198, -2530 } }, "Locality" }, + place_lieudit_knollofdissent_1 = { true, { { 2282, -2147 }, { 2284, -2169 }, { 2296, -2185 }, { 2304, -2196 }, { 2325, -2208 }, { 2356, -2219 }, { 2395, -2223 }, { 2419, -2219 }, { 2464, -2196 }, { 2474, -2171 }, { 2485, -2153 }, { 2507, -2139 }, { 2525, -2131 }, { 2538, -2122 }, { 2553, -2097 }, { 2560, -2082 }, { 2562, -2058 }, { 2556, -2020 }, { 2542, -2016 }, { 2531, -1990 }, { 2531, -1973 }, { 2539, -1962 }, { 2530, -1954 }, { 2516, -1948 }, { 2495, -1946 }, { 2473, -1944 }, { 2462, -1955 }, { 2451, -1964 }, { 2430, -1970 }, { 2403, -1969 }, { 2376, -1969 }, { 2359, -1968 }, { 2346, -1960 }, { 2331, -1957 }, { 2315, -1965 }, { 2299, -1972 }, { 2292, -1974 }, { 2278, -1981 }, { 2259, -1986 }, { 2247, -1991 }, { 2242, -2007 }, { 2240, -2037 }, { 2239, -2057 }, { 2245, -2073 }, { 2248, -2086 }, { 2243, -2101 }, { 2242, -2109 }, { 2248, -2128 }, { 2251, -2134 }, { 2267, -2138 } }, "Locality" }, + place_lieudit_knollofdissent_2 = { true, { { 2750, -2044 }, { 2745, -2063 }, { 2749, -2096 }, { 2761, -2115 }, { 2770, -2114 }, { 2784, -2110 }, { 2800, -2107 }, { 2811, -2106 }, { 2822, -2116 }, { 2824, -2132 }, { 2822, -2148 }, { 2822, -2160 }, { 2827, -2167 }, { 2836, -2172 }, { 2846, -2174 }, { 2851, -2179 }, { 2852, -2188 }, { 2856, -2201 }, { 2860, -2205 }, { 2869, -2206 }, { 2874, -2201 }, { 2880, -2188 }, { 2879, -2174 }, { 2878, -2156 }, { 2884, -2145 }, { 2892, -2141 }, { 2903, -2139 }, { 2916, -2143 }, { 2919, -2153 }, { 2920, -2164 }, { 2927, -2170 }, { 2934, -2174 }, { 2946, -2169 }, { 2977, -2168 }, { 2995, -2173 }, { 3004, -2169 }, { 3004, -2157 }, { 3004, -2147 }, { 3002, -2131 }, { 3001, -2124 }, { 2989, -2114 }, { 2982, -2110 }, { 2978, -2104 }, { 2972, -2094 }, { 2965, -2084 }, { 2960, -2079 }, { 2948, -2080 }, { 2937, -2074 }, { 2933, -2061 }, { 2939, -2049 }, { 2946, -2045 }, { 2954, -2045 }, { 2961, -2045 }, { 2969, -2036 }, { 2970, -2033 }, { 2969, -2023 }, { 2960, -2015 }, { 2945, -2008 }, { 2934, -1997 }, { 2930, -1991 }, { 2921, -1988 }, { 2899, -1984 }, { 2883, -1982 }, { 2874, -1978 }, { 2873, -1968 }, { 2871, -1960 }, { 2866, -1956 }, { 2855, -1956 }, { 2842, -1958 }, { 2836, -1953 }, { 2828, -1952 }, { 2821, -1956 }, { 2819, -1966 }, { 2822, -1979 }, { 2822, -1980 }, { 2822, -1988 }, { 2823, -1997 }, { 2818, -2012 }, { 2816, -2020 }, { 2813, -2027 }, { 2813, -2037 }, { 2810, -2045 }, { 2802, -2049 }, { 2792, -2048 }, { 2781, -2045 }, { 2770, -2043 }, { 2760, -2042 } }, "Locality" }, + place_lieudit_knollofdissent_3 = { true, { { 3309, -2416 }, { 3301, -2418 }, { 3289, -2426 }, { 3277, -2426 }, { 3259, -2428 }, { 3244, -2433 }, { 3228, -2443 }, { 3221, -2456 }, { 3215, -2473 }, { 3212, -2492 }, { 3214, -2505 }, { 3216, -2519 }, { 3221, -2529 }, { 3232, -2539 }, { 3250, -2544 }, { 3272, -2542 }, { 3292, -2535 }, { 3301, -2527 }, { 3312, -2516 }, { 3322, -2499 }, { 3324, -2494 }, { 3334, -2479 }, { 3339, -2471 }, { 3344, -2465 }, { 3350, -2445 }, { 3348, -2436 }, { 3342, -2425 }, { 3332, -2418 }, { 3324, -2415 }, { 3316, -2414 } }, "Locality" }, + place_lieudit_knollofdissent_4 = { true, { { 3105, -1871 }, { 3107, -1881 }, { 3113, -1883 }, { 3120, -1883 }, { 3133, -1881 }, { 3148, -1883 }, { 3154, -1881 }, { 3161, -1873 }, { 3166, -1867 }, { 3171, -1862 }, { 3183, -1854 }, { 3192, -1849 }, { 3197, -1844 }, { 3199, -1842 }, { 3199, -1833 }, { 3199, -1823 }, { 3207, -1814 }, { 3215, -1811 }, { 3224, -1816 }, { 3229, -1820 }, { 3233, -1830 }, { 3234, -1838 }, { 3235, -1843 }, { 3240, -1849 }, { 3247, -1851 }, { 3254, -1850 }, { 3260, -1842 }, { 3266, -1831 }, { 3272, -1820 }, { 3285, -1815 }, { 3291, -1807 }, { 3294, -1790 }, { 3297, -1770 }, { 3296, -1760 }, { 3302, -1754 }, { 3312, -1752 }, { 3319, -1751 }, { 3324, -1743 }, { 3321, -1735 }, { 3320, -1728 }, { 3323, -1721 }, { 3325, -1712 }, { 3325, -1705 }, { 3319, -1700 }, { 3308, -1701 }, { 3297, -1701 }, { 3282, -1694 }, { 3266, -1692 }, { 3257, -1695 }, { 3243, -1695 }, { 3233, -1690 }, { 3232, -1682 }, { 3232, -1676 }, { 3233, -1663 }, { 3234, -1650 }, { 3235, -1636 }, { 3229, -1630 }, { 3215, -1628 }, { 3207, -1628 }, { 3185, -1629 }, { 3166, -1641 }, { 3165, -1657 }, { 3169, -1667 }, { 3174, -1684 }, { 3172, -1693 }, { 3165, -1699 }, { 3157, -1704 }, { 3145, -1707 }, { 3133, -1705 }, { 3123, -1701 }, { 3117, -1705 }, { 3109, -1712 }, { 3103, -1722 }, { 3098, -1732 }, { 3089, -1733 }, { 3077, -1735 }, { 3071, -1742 }, { 3073, -1750 }, { 3083, -1757 }, { 3092, -1760 }, { 3102, -1761 }, { 3117, -1760 }, { 3126, -1760 }, { 3131, -1763 }, { 3136, -1768 }, { 3138, -1777 }, { 3137, -1787 }, { 3135, -1794 }, { 3130, -1798 }, { 3122, -1801 }, { 3114, -1801 }, { 3110, -1809 }, { 3106, -1815 }, { 3109, -1825 }, { 3111, -1829 }, { 3105, -1840 }, { 3102, -1851 }, { 3103, -1864 } }, "Locality" }, + place_lieudit_knollofdissent_5 = { true, { { 3604, -1789 }, { 3574, -1790 }, { 3561, -1803 }, { 3544, -1821 }, { 3538, -1841 }, { 3538, -1863 }, { 3545, -1893 }, { 3573, -1904 }, { 3607, -1907 }, { 3632, -1910 }, { 3652, -1908 }, { 3666, -1880 }, { 3674, -1858 }, { 3673, -1824 }, { 3664, -1803 }, { 3647, -1794 }, { 3630, -1791 } }, "Locality" }, + place_lieudit_knollofdissent_6 = { true, { { 3739, -1670 }, { 3731, -1666 }, { 3722, -1666 }, { 3715, -1675 }, { 3715, -1685 }, { 3716, -1696 }, { 3715, -1708 }, { 3719, -1718 }, { 3727, -1725 }, { 3732, -1729 }, { 3737, -1732 }, { 3742, -1744 }, { 3748, -1753 }, { 3754, -1759 }, { 3759, -1759 }, { 3768, -1758 }, { 3779, -1761 }, { 3786, -1768 }, { 3788, -1782 }, { 3780, -1790 }, { 3766, -1793 }, { 3761, -1794 }, { 3753, -1799 }, { 3748, -1806 }, { 3750, -1817 }, { 3754, -1821 }, { 3764, -1825 }, { 3777, -1834 }, { 3784, -1841 }, { 3787, -1846 }, { 3792, -1849 }, { 3800, -1851 }, { 3812, -1854 }, { 3825, -1856 }, { 3834, -1857 }, { 3840, -1857 }, { 3845, -1864 }, { 3847, -1869 }, { 3848, -1878 }, { 3852, -1883 }, { 3867, -1881 }, { 3876, -1880 }, { 3887, -1885 }, { 3891, -1885 }, { 3898, -1878 }, { 3900, -1871 }, { 3898, -1862 }, { 3900, -1851 }, { 3902, -1838 }, { 3905, -1825 }, { 3903, -1814 }, { 3905, -1801 }, { 3909, -1791 }, { 3921, -1790 }, { 3931, -1792 }, { 3941, -1796 }, { 3957, -1797 }, { 3966, -1793 }, { 3971, -1783 }, { 3973, -1767 }, { 3967, -1745 }, { 3966, -1737 }, { 3961, -1731 }, { 3955, -1726 }, { 3945, -1726 }, { 3938, -1728 }, { 3925, -1733 }, { 3915, -1734 }, { 3907, -1731 }, { 3903, -1726 }, { 3896, -1717 }, { 3893, -1707 }, { 3894, -1698 }, { 3897, -1691 }, { 3897, -1682 }, { 3891, -1672 }, { 3878, -1664 }, { 3869, -1659 }, { 3865, -1646 }, { 3863, -1635 }, { 3856, -1631 }, { 3850, -1633 }, { 3841, -1644 }, { 3839, -1656 }, { 3838, -1666 }, { 3838, -1676 }, { 3839, -1683 }, { 3834, -1692 }, { 3828, -1700 }, { 3814, -1699 }, { 3804, -1695 }, { 3798, -1679 }, { 3795, -1671 }, { 3785, -1664 }, { 3776, -1667 }, { 3771, -1671 }, { 3761, -1666 }, { 3747, -1666 } }, "Locality" }, + place_r_07_13_boss_kill = { false, { { 3417, -1464 }, { 3417, -1478 }, { 3420, -1484 }, { 3424, -1491 }, { 3429, -1498 }, { 3437, -1501 }, { 3446, -1503 }, { 3456, -1502 }, { 3466, -1496 }, { 3472, -1490 }, { 3472, -1478 }, { 3472, -1463 }, { 3459, -1445 }, { 3439, -1443 }, { 3434, -1446 }, { 3428, -1450 }, { 3422, -1458 } }, "Locality" }, + place_r_01_10_escort = { false, { { 4047, -4190 }, { 4029, -4202 }, { 4022, -4226 }, { 4027, -4244 }, { 4045, -4256 }, { 4063, -4259 }, { 4086, -4252 }, { 4093, -4245 }, { 4100, -4229 }, { 4096, -4216 }, { 4088, -4198 }, { 4068, -4188 } }, "Locality" }, + place_r_09_09_arrivee_bagne = { true, { { 2813, -1708 }, { 2786, -1703 }, { 2774, -1701 }, { 2769, -1701 }, { 2766, -1699 }, { 2762, -1712 }, { 2777, -1732 }, { 2793, -1730 }, { 2782, -1777 }, { 2784, -1781 }, { 2787, -1784 }, { 2789, -1791 }, { 2790, -1797 }, { 2795, -1803 }, { 2790, -1809 }, { 2786, -1815 }, { 2787, -1818 }, { 2786, -1819 }, { 2779, -1820 }, { 2773, -1822 }, { 2770, -1822 }, { 2766, -1828 }, { 2753, -1869 }, { 2759, -1876 }, { 2798, -1919 }, { 2817, -1957 }, { 2820, -1959 }, { 2821, -1956 }, { 2828, -1952 }, { 2836, -1953 }, { 2842, -1958 }, { 2855, -1956 }, { 2867, -1955 }, { 2871, -1959 }, { 2873, -1968 }, { 2874, -1978 }, { 2883, -1982 }, { 2903, -1985 }, { 2921, -1987 }, { 2931, -1991 }, { 2934, -1997 }, { 2945, -2008 }, { 2960, -2015 }, { 2970, -2022 }, { 2970, -2033 }, { 2969, -2036 }, { 2961, -2045 }, { 2954, -2045 }, { 2946, -2045 }, { 2939, -2049 }, { 2933, -2061 }, { 2937, -2074 }, { 2948, -2080 }, { 2960, -2079 }, { 2966, -2084 }, { 2972, -2094 }, { 2979, -2104 }, { 2983, -2110 }, { 2990, -2115 }, { 3001, -2124 }, { 3002, -2131 }, { 3005, -2146 }, { 3005, -2156 }, { 3006, -2170 }, { 2995, -2173 }, { 2998, -2180 }, { 3021, -2185 }, { 3064, -2220 }, { 3095, -2248 }, { 3100, -2256 }, { 3105, -2257 }, { 3113, -2259 }, { 3119, -2273 }, { 3125, -2288 }, { 3138, -2293 }, { 3158, -2296 }, { 3161, -2288 }, { 3166, -2283 }, { 3174, -2277 }, { 3181, -2277 }, { 3187, -2288 }, { 3190, -2294 }, { 3194, -2297 }, { 3211, -2299 }, { 3213, -2303 }, { 3222, -2303 }, { 3226, -2302 }, { 3235, -2292 }, { 3242, -2288 }, { 3246, -2282 }, { 3251, -2281 }, { 3255, -2276 }, { 3259, -2269 }, { 3262, -2267 }, { 3270, -2268 }, { 3276, -2272 }, { 3283, -2278 }, { 3289, -2286 }, { 3296, -2286 }, { 3297, -2284 }, { 3300, -2284 }, { 3304, -2281 }, { 3311, -2281 }, { 3322, -2283 }, { 3335, -2268 }, { 3329, -2229 }, { 3329, -2194 }, { 3339, -2171 }, { 3337, -2154 }, { 3327, -2136 }, { 3316, -2131 }, { 3303, -2103 }, { 3290, -2101 }, { 3297, -2069 }, { 3319, -2055 }, { 3319, -2044 }, { 3337, -2058 }, { 3363, -2051 }, { 3391, -2059 }, { 3391, -2035 }, { 3391, -1919 }, { 3421, -1878 }, { 3407, -1885 }, { 3396, -1882 }, { 3387, -1873 }, { 3380, -1861 }, { 3371, -1851 }, { 3362, -1853 }, { 3352, -1860 }, { 3346, -1869 }, { 3337, -1884 }, { 3328, -1888 }, { 3319, -1885 }, { 3315, -1875 }, { 3307, -1875 }, { 3293, -1875 }, { 3278, -1877 }, { 3262, -1865 }, { 3251, -1852 }, { 3249, -1851 }, { 3247, -1851 }, { 3240, -1849 }, { 3234, -1843 }, { 3233, -1830 }, { 3229, -1820 }, { 3224, -1816 }, { 3215, -1811 }, { 3207, -1814 }, { 3199, -1823 }, { 3199, -1842 }, { 3197, -1845 }, { 3192, -1849 }, { 3183, -1854 }, { 3172, -1862 }, { 3166, -1867 }, { 3161, -1874 }, { 3154, -1881 }, { 3148, -1883 }, { 3133, -1881 }, { 3121, -1884 }, { 3112, -1884 }, { 3107, -1881 }, { 3104, -1871 }, { 3102, -1864 }, { 3102, -1851 }, { 3105, -1840 }, { 3111, -1829 }, { 3109, -1825 }, { 3106, -1815 }, { 3110, -1808 }, { 3114, -1801 }, { 3122, -1801 }, { 3130, -1798 }, { 3135, -1794 }, { 3137, -1787 }, { 3138, -1777 }, { 3135, -1768 }, { 3131, -1763 }, { 3126, -1760 }, { 3115, -1760 }, { 3102, -1761 }, { 3092, -1760 }, { 3083, -1757 }, { 3073, -1751 }, { 3069, -1752 }, { 3059, -1747 }, { 3047, -1746 }, { 3036, -1743 }, { 3024, -1736 }, { 3021, -1731 }, { 3015, -1728 }, { 3005, -1728 }, { 2990, -1727 }, { 2977, -1730 }, { 2971, -1733 }, { 2957, -1733 }, { 2950, -1730 }, { 2947, -1728 }, { 2939, -1718 }, { 2939, -1707 }, { 2923, -1704 }, { 2902, -1706 }, { 2861, -1707 } }, "Locality" } + } }, + region_majesticgarden = { true, { { 3871, -2561 }, { 3743, -2455 }, { 3652, -2535 }, { 3651, -2568 }, { 3581, -2583 }, { 3529, -2547 }, { 3410, -2549 }, { 3350, -2563 }, { 3286, -2621 }, { 3217, -2648 }, { 3210, -2671 }, { 3201, -2681 }, { 3179, -2670 }, { 3128, -2700 }, { 3092, -2699 }, { 3083, -2727 }, { 3000, -2775 }, { 3325, -4490 }, { 4382, -4862 }, { 4433, -4862 }, { 4445, -4854 }, { 4486, -4863 }, { 4506, -4871 }, { 4553, -4875 }, { 4571, -4882 }, { 4641, -4861 }, { 4675, -4901 }, { 4781, -4951 }, { 5285, -4794 }, { 4978, -2863 } }, { + place_yrkanis = { true, { { 4747, -3198 }, { 4674, -3192 }, { 4650, -3203 }, { 4641, -3217 }, { 4637, -3235 }, { 4629, -3284 }, { 4628, -3353 }, { 4629, -3414 }, { 4632, -3463 }, { 4617, -3480 }, { 4615, -3518 }, { 4630, -3538 }, { 4626, -3661 }, { 4637, -3682 }, { 4697, -3682 }, { 4709, -3675 }, { 4758, -3694 }, { 4792, -3692 }, { 4808, -3667 }, { 4805, -3644 }, { 4797, -3630 }, { 4808, -3611 }, { 4808, -3575 }, { 4807, -3507 }, { 4809, -3314 }, { 4806, -3279 }, { 4801, -3234 }, { 4783, -3210 } }, "Capital" }, + yrkanis_stable = { true, { { 4712, -3203 }, { 4696, -3207 }, { 4689, -3216 }, { 4693, -3234 }, { 4726, -3236 }, { 4742, -3217 }, { 4728, -3205 } }, "stable" }, + place_natae = { true, { { 3749, -3680 }, { 3680, -3662 }, { 3624, -3694 }, { 3613, -3756 }, { 3639, -3823 }, { 3705, -3854 }, { 3739, -3855 }, { 3808, -3837 }, { 3824, -3807 }, { 3846, -3753 }, { 3838, -3731 }, { 3797, -3705 } }, "Village" }, + natae_stable = { true, { { 3784, -3743 }, { 3796, -3775 }, { 3818, -3773 }, { 3831, -3755 }, { 3814, -3720 }, { 3788, -3716 } }, "stable" }, + place_davae = { true, { { 4236, -3979 }, { 4187, -3984 }, { 4158, -3996 }, { 4149, -4015 }, { 4142, -4121 }, { 4169, -4230 }, { 4244, -4242 }, { 4294, -4236 }, { 4309, -4209 }, { 4313, -4130 }, { 4318, -4081 }, { 4321, -4029 }, { 4299, -3987 } }, "Village" }, + davae_stable = { true, { { 4256, -4172 }, { 4242, -4171 }, { 4232, -4188 }, { 4229, -4205 }, { 4241, -4215 }, { 4259, -4218 }, { 4267, -4192 }, { 4264, -4177 } }, "stable" }, + place_avalae = { true, { { 4952, -4317 }, { 4920, -4322 }, { 4866, -4317 }, { 4818, -4319 }, { 4800, -4329 }, { 4791, -4370 }, { 4800, -4432 }, { 4813, -4492 }, { 4879, -4507 }, { 4911, -4510 }, { 4953, -4487 }, { 4961, -4447 }, { 4982, -4430 }, { 4981, -4405 }, { 4968, -4384 }, { 4968, -4356 }, { 4975, -4333 }, { 4969, -4322 } }, "Village" }, + avalae_stable = { true, { { 4851, -4383 }, { 4881, -4388 }, { 4891, -4362 }, { 4878, -4348 }, { 4862, -4346 }, { 4851, -4349 }, { 4843, -4370 } }, "stable" }, + place_arena_warning = { false, { { 4109, -3672 }, { 4125, -3679 }, { 4153, -3688 }, { 4187, -3688 }, { 4207, -3678 }, { 4213, -3662 }, { 4215, -3649 }, { 4215, -3640 }, { 4105, -3640 }, { 4105, -3656 } }, "Locality" }, + place_outpost_matis_15 = { true, { { 3338, -2748 }, { 3261, -2731 }, { 3235, -2785 }, { 3239, -2831 }, { 3296, -2849 }, { 3349, -2816 } }, "Outpost" }, + place_lieudit_majesticgarden_1 = { true, { { 3584, -2934 }, { 3579, -2947 }, { 3571, -2976 }, { 3581, -2996 }, { 3589, -3003 }, { 3607, -3002 }, { 3617, -3003 }, { 3632, -3002 }, { 3642, -2993 }, { 3653, -2992 }, { 3671, -2992 }, { 3685, -2991 }, { 3700, -2988 }, { 3713, -2982 }, { 3723, -2976 }, { 3731, -2972 }, { 3739, -2968 }, { 3745, -2953 }, { 3756, -2940 }, { 3770, -2932 }, { 3775, -2906 }, { 3774, -2882 }, { 3785, -2875 }, { 3799, -2870 }, { 3804, -2864 }, { 3800, -2853 }, { 3804, -2838 }, { 3806, -2826 }, { 3795, -2809 }, { 3781, -2796 }, { 3764, -2768 }, { 3741, -2760 }, { 3722, -2752 }, { 3712, -2749 }, { 3695, -2747 }, { 3683, -2740 }, { 3673, -2735 }, { 3664, -2739 }, { 3653, -2746 }, { 3649, -2757 }, { 3642, -2769 }, { 3649, -2786 }, { 3656, -2805 }, { 3648, -2819 }, { 3636, -2823 }, { 3622, -2825 }, { 3609, -2822 }, { 3598, -2821 }, { 3591, -2826 }, { 3584, -2837 }, { 3577, -2851 }, { 3559, -2855 }, { 3554, -2860 }, { 3552, -2870 }, { 3562, -2877 }, { 3574, -2882 }, { 3583, -2881 }, { 3600, -2880 }, { 3614, -2883 }, { 3620, -2897 }, { 3619, -2908 }, { 3612, -2916 }, { 3597, -2921 } }, "Locality" }, + place_lieudit_majesticgarden_3 = { true, { { 4654, -4771 }, { 4665, -4890 }, { 4713, -4921 }, { 4833, -4923 }, { 4902, -4902 }, { 4906, -4823 }, { 4939, -4788 }, { 4978, -4759 }, { 5002, -4744 }, { 5011, -4732 }, { 5020, -4707 }, { 5009, -4672 }, { 4999, -4652 }, { 4962, -4640 }, { 4911, -4639 }, { 4847, -4641 }, { 4785, -4645 }, { 4734, -4650 }, { 4689, -4646 }, { 4665, -4640 }, { 4650, -4642 } }, "Locality" }, + place_lieudit_majesticgarden_2 = { true, { { 4116, -3641 }, { 4134, -3645 }, { 4160, -3647 }, { 4184, -3647 }, { 4193, -3644 }, { 4213, -3644 }, { 4233, -3642 }, { 4248, -3630 }, { 4258, -3613 }, { 4275, -3603 }, { 4279, -3594 }, { 4287, -3563 }, { 4284, -3524 }, { 4285, -3493 }, { 4282, -3462 }, { 4276, -3432 }, { 4276, -3415 }, { 4269, -3405 }, { 4252, -3399 }, { 4193, -3393 }, { 4106, -3397 }, { 4090, -3394 }, { 4058, -3404 }, { 4042, -3420 }, { 4031, -3455 }, { 4030, -3515 }, { 4030, -3561 }, { 4038, -3585 }, { 4044, -3604 }, { 4056, -3613 }, { 4072, -3634 }, { 4085, -3642 } }, "Locality" }, + place_yrk_p_1 = { true, { { 4796, -3358 }, { 4797, -3336 }, { 4798, -3319 }, { 4799, -3311 }, { 4787, -3275 }, { 4785, -3268 }, { 4790, -3262 }, { 4794, -3257 }, { 4789, -3243 }, { 4781, -3238 }, { 4786, -3224 }, { 4783, -3220 }, { 4774, -3218 }, { 4765, -3222 }, { 4760, -3228 }, { 4755, -3219 }, { 4745, -3219 }, { 4737, -3208 }, { 4723, -3203 }, { 4709, -3202 }, { 4700, -3204 }, { 4688, -3202 }, { 4684, -3204 }, { 4671, -3202 }, { 4660, -3211 }, { 4653, -3227 }, { 4646, -3238 }, { 4643, -3270 }, { 4645, -3283 }, { 4649, -3298 }, { 4651, -3312 }, { 4643, -3328 }, { 4643, -3348 }, { 4645, -3355 }, { 4641, -3361 }, { 4699, -3362 }, { 4757, -3350 } }, "Street" }, + place_yrk_p_2 = { true, { { 4791, -3486 }, { 4792, -3474 }, { 4788, -3469 }, { 4794, -3458 }, { 4795, -3434 }, { 4796, -3417 }, { 4793, -3409 }, { 4798, -3396 }, { 4796, -3379 }, { 4796, -3357 }, { 4757, -3350 }, { 4699, -3362 }, { 4641, -3361 }, { 4641, -3385 }, { 4652, -3397 }, { 4653, -3413 }, { 4642, -3425 }, { 4644, -3450 }, { 4656, -3462 }, { 4660, -3469 }, { 4690, -3480 } }, "Street" }, + place_yrk_p_3 = { true, { { 4779, -3586 }, { 4790, -3574 }, { 4795, -3558 }, { 4799, -3533 }, { 4797, -3500 }, { 4792, -3486 }, { 4690, -3479 }, { 4660, -3469 }, { 4650, -3473 }, { 4651, -3486 }, { 4640, -3490 }, { 4638, -3513 }, { 4652, -3521 }, { 4652, -3525 }, { 4645, -3542 }, { 4644, -3568 }, { 4648, -3576 }, { 4643, -3603 }, { 4776, -3598 } }, "Street" }, + place_yrk_p_4 = { true, { { 4704, -3600 }, { 4702, -3612 }, { 4708, -3627 }, { 4707, -3638 }, { 4706, -3653 }, { 4713, -3655 }, { 4723, -3669 }, { 4750, -3678 }, { 4768, -3677 }, { 4778, -3668 }, { 4789, -3676 }, { 4800, -3665 }, { 4800, -3652 }, { 4782, -3640 }, { 4785, -3622 }, { 4798, -3607 }, { 4779, -3593 }, { 4776, -3597 } }, "Street" }, + place_yrk_p_5 = { true, { { 4707, -3654 }, { 4707, -3637 }, { 4708, -3627 }, { 4702, -3612 }, { 4704, -3600 }, { 4643, -3603 }, { 4644, -3620 }, { 4641, -3649 }, { 4642, -3669 }, { 4648, -3674 }, { 4659, -3671 }, { 4674, -3671 }, { 4696, -3671 }, { 4713, -3656 } }, "Street" }, + place_yrkanis_bar_indoor = { false, { { 4667, -3655 }, { 4667, -3654 }, { 4666, -3654 }, { 4665, -3655 }, { 4666, -3655 } }, "Locality" }, + place_yrkanis_greenhouse_indoor = { false, { { 4634, -3487 }, { 4634, -3486 }, { 4632, -3486 }, { 4632, -3487 }, { 4633, -3488 } }, "Locality" }, + r_01_06_hill_light = { false, { { 4400, -3077 }, { 4386, -3074 }, { 4375, -3073 }, { 4366, -3077 }, { 4358, -3081 }, { 4348, -3090 }, { 4343, -3095 }, { 4338, -3103 }, { 4337, -3110 }, { 4337, -3117 }, { 4341, -3124 }, { 4344, -3133 }, { 4349, -3140 }, { 4358, -3144 }, { 4367, -3143 }, { 4393, -3133 }, { 4404, -3106 }, { 4403, -3080 } }, "Locality" }, + r_05_36_mission_place_hunting_1 = { false, { { 3534, -3098 }, { 3516, -3093 }, { 3505, -3106 }, { 3507, -3118 }, { 3520, -3124 }, { 3528, -3119 } }, "Locality" }, + r_05_36_mission_place_hunting_2 = { false, { { 3799, -2951 }, { 3784, -2943 }, { 3765, -2949 }, { 3759, -2978 }, { 3782, -2990 }, { 3803, -2974 } }, "Locality" }, + r_05_36_mission_place_hunting_3 = { false, { { 4157, -3090 }, { 4112, -3076 }, { 4072, -3076 }, { 4060, -3145 }, { 4109, -3159 }, { 4148, -3139 } }, "Locality" }, + r_01_06_forage_place_1 = { false, { { 4369, -2917 }, { 4354, -2921 }, { 4360, -2928 }, { 4361, -2933 }, { 4366, -2938 }, { 4372, -2940 }, { 4380, -2936 }, { 4383, -2925 }, { 4377, -2917 } }, "Locality" }, + r_09_10_mission_forage_1 = { false, { { 3531, -3111 }, { 3549, -3105 }, { 3535, -3096 } }, "Locality" }, + r_09_10_mission_forage_2 = { false, { { 4806, -3075 }, { 4796, -3085 }, { 4806, -3102 }, { 4806, -3116 }, { 4827, -3109 }, { 4826, -3095 }, { 4819, -3084 }, { 4822, -3075 } }, "Locality" }, + r_09_10_mission_forage_3 = { false, { { 4073, -2627 }, { 4085, -2634 }, { 4086, -2653 }, { 4090, -2634 }, { 4089, -2626 }, { 4081, -2623 } }, "Locality" }, + pvp_zone_1 = { true, { { 4195, -3545 }, { 4198, -3543 }, { 4203, -3530 }, { 4205, -3518 }, { 4205, -3512 }, { 4202, -3490 }, { 4198, -3470 }, { 4177, -3464 }, { 4167, -3462 }, { 4153, -3462 }, { 4128, -3465 }, { 4117, -3468 }, { 4113, -3471 }, { 4109, -3508 }, { 4109, -3521 }, { 4112, -3532 }, { 4116, -3546 }, { 4134, -3551 }, { 4157, -3552 }, { 4166, -3552 } }, "Locality" }, + welcomer_natae_guardchief = { false, { { 3710, -3717 }, { 3709, -3718 }, { 3710, -3718 }, { 3711, -3718 } }, "Locality" }, + welcomer_natae_intendant = { false, { { 3722, -3708 }, { 3721, -3709 }, { 3722, -3709 }, { 3722, -3708 } }, "Locality" }, + welcomer_natae_sage = { false, { { 3700, -3700 }, { 3701, -3699 }, { 3700, -3698 }, { 3699, -3699 } }, "Locality" }, + welcomer_davae_intendant = { false, { { 4247, -4025 }, { 4247, -4027 }, { 4248, -4027 }, { 4248, -4025 } }, "Locality" }, + welcomer_davae_sage = { false, { { 4224, -4021 }, { 4225, -4020 }, { 4224, -4019 }, { 4223, -4021 } }, "Locality" }, + welcomer_davae_guardchief = { false, { { 4236, -4037 }, { 4236, -4038 }, { 4237, -4037 }, { 4237, -4036 } }, "Locality" }, + welcomer_avalae_guardchief = { false, { { 4858, -4431 }, { 4859, -4432 }, { 4860, -4431 }, { 4858, -4430 } }, "Locality" }, + welcomer_avalae_sage = { false, { { 4843, -4432 }, { 4844, -4431 }, { 4843, -4430 }, { 4842, -4430 } }, "Locality" }, + welcomer_avalae_intendant = { false, { { 4855, -4451 }, { 4853, -4452 }, { 4854, -4453 }, { 4855, -4452 } }, "Locality" }, + episode2_temple_karavan_matis = { false, { { 4133, -3082 }, { 4122, -3089 }, { 4114, -3097 }, { 4112, -3108 }, { 4115, -3119 }, { 4123, -3128 }, { 4136, -3134 }, { 4150, -3132 }, { 4159, -3125 }, { 4164, -3117 }, { 4166, -3108 }, { 4164, -3099 }, { 4160, -3092 }, { 4153, -3085 }, { 4144, -3082 } }, "Locality" }, + episode2_temple_kami_matis = { true, { { 3484, -2620 }, { 3492, -2649 }, { 3482, -2687 }, { 3469, -2724 }, { 3494, -2731 }, { 3501, -2766 }, { 3526, -2772 }, { 3545, -2763 }, { 3561, -2760 }, { 3579, -2754 }, { 3614, -2752 }, { 3630, -2723 }, { 3637, -2692 }, { 3632, -2662 }, { 3619, -2627 }, { 3593, -2613 }, { 3561, -2604 }, { 3521, -2604 } }, "Locality" } + } }, + region_fleetinggarden = { true, { { 4641, -4860 }, { 4571, -4881 }, { 4554, -4874 }, { 4507, -4871 }, { 4488, -4862 }, { 4445, -4852 }, { 4433, -4861 }, { 4386, -4860 }, { 4258, -4815 }, { 3790, -4820 }, { 3704, -4988 }, { 3812, -5114 }, { 4026, -5311 }, { 4022, -5343 }, { 4063, -5374 }, { 4104, -5417 }, { 4145, -5409 }, { 4196, -5414 }, { 4226, -5455 }, { 4333, -5602 }, { 4425, -5752 }, { 4460, -5782 }, { 4506, -5900 }, { 4718, -6115 }, { 4922, -6324 }, { 4958, -6347 }, { 5049, -6309 }, { 5076, -6316 }, { 5146, -6290 }, { 5191, -6280 }, { 5199, -6266 }, { 5228, -6272 }, { 5322, -6276 }, { 5323, -6243 }, { 5422, -6241 }, { 5467, -6245 }, { 5547, -6221 }, { 5631, -6275 }, { 5678, -6262 }, { 5736, -6288 }, { 5741, -6325 }, { 5945, -6423 }, { 6288, -6483 }, { 6255, -5550 }, { 4678, -4898 } }, { + place_outpost_matis_05 = { true, { { 4300, -4982 }, { 4223, -4977 }, { 4199, -5031 }, { 4202, -5069 }, { 4254, -5087 }, { 4309, -5047 } }, "Outpost" }, + place_outpost_matis_06 = { true, { { 4725, -5137 }, { 4674, -5137 }, { 4658, -5163 }, { 4655, -5213 }, { 4702, -5241 }, { 4765, -5210 }, { 4761, -5152 } }, "Outpost" }, + place_outpost_matis_07 = { true, { { 5053, -5482 }, { 4981, -5497 }, { 4977, -5543 }, { 4990, -5582 }, { 5037, -5584 }, { 5080, -5548 } }, "Outpost" }, + place_outpost_matis_08 = { true, { { 5223, -5794 }, { 5169, -5805 }, { 5169, -5869 }, { 5216, -5906 }, { 5278, -5876 }, { 5266, -5806 } }, "Outpost" }, + place_outpost_matis_09 = { true, { { 5890, -6144 }, { 5851, -6091 }, { 5786, -6100 }, { 5772, -6174 }, { 5833, -6200 }, { 5871, -6200 } }, "Outpost" }, + place_lieudit_fleetinggarden_1 = { true, { { 5988, -6009 }, { 6022, -5985 }, { 6042, -5973 }, { 6069, -5922 }, { 6074, -5866 }, { 6038, -5803 }, { 5943, -5783 }, { 5910, -5785 }, { 5840, -5808 }, { 5814, -5837 }, { 5798, -5888 }, { 5796, -5929 }, { 5820, -5971 }, { 5858, -6003 }, { 5901, -6025 }, { 5955, -6029 } }, "Locality" }, + place_lieudit_fleetinggarden_2 = { true, { { 5329, -6013 }, { 5327, -6021 }, { 5321, -6034 }, { 5319, -6047 }, { 5322, -6057 }, { 5330, -6063 }, { 5342, -6068 }, { 5356, -6070 }, { 5365, -6060 }, { 5374, -6050 }, { 5377, -6046 }, { 5384, -6042 }, { 5391, -6040 }, { 5398, -6041 }, { 5400, -6040 }, { 5400, -6039 }, { 5401, -6037 }, { 5401, -6030 }, { 5403, -6025 }, { 5404, -6021 }, { 5402, -6019 }, { 5398, -6020 }, { 5390, -6023 }, { 5385, -6021 }, { 5381, -6019 }, { 5376, -6015 }, { 5374, -6010 }, { 5374, -6002 }, { 5375, -5993 }, { 5381, -5989 }, { 5386, -5992 }, { 5389, -5996 }, { 5395, -5995 }, { 5403, -5991 }, { 5407, -5985 }, { 5411, -5975 }, { 5407, -5967 }, { 5404, -5965 }, { 5405, -5958 }, { 5408, -5951 }, { 5405, -5942 }, { 5405, -5930 }, { 5406, -5924 }, { 5402, -5921 }, { 5397, -5920 }, { 5392, -5916 }, { 5393, -5906 }, { 5399, -5902 }, { 5405, -5901 }, { 5407, -5899 }, { 5408, -5897 }, { 5407, -5891 }, { 5406, -5888 }, { 5402, -5887 }, { 5397, -5888 }, { 5390, -5889 }, { 5382, -5891 }, { 5377, -5892 }, { 5373, -5891 }, { 5369, -5888 }, { 5365, -5885 }, { 5364, -5879 }, { 5365, -5874 }, { 5371, -5870 }, { 5376, -5865 }, { 5376, -5859 }, { 5381, -5854 }, { 5389, -5853 }, { 5395, -5852 }, { 5401, -5851 }, { 5405, -5845 }, { 5408, -5836 }, { 5407, -5825 }, { 5405, -5815 }, { 5404, -5806 }, { 5406, -5797 }, { 5402, -5793 }, { 5396, -5791 }, { 5391, -5790 }, { 5383, -5792 }, { 5378, -5793 }, { 5374, -5791 }, { 5370, -5784 }, { 5365, -5782 }, { 5357, -5781 }, { 5351, -5780 }, { 5345, -5782 }, { 5341, -5788 }, { 5338, -5791 }, { 5332, -5791 }, { 5330, -5791 }, { 5325, -5792 }, { 5320, -5792 }, { 5316, -5793 }, { 5314, -5795 }, { 5311, -5800 }, { 5310, -5808 }, { 5311, -5815 }, { 5308, -5817 }, { 5307, -5818 }, { 5304, -5824 }, { 5303, -5833 }, { 5303, -5838 }, { 5302, -5846 }, { 5300, -5855 }, { 5302, -5862 }, { 5304, -5868 }, { 5303, -5874 }, { 5302, -5881 }, { 5303, -5886 }, { 5307, -5887 }, { 5314, -5888 }, { 5322, -5888 }, { 5328, -5888 }, { 5334, -5889 }, { 5340, -5897 }, { 5339, -5909 }, { 5340, -5924 }, { 5342, -5931 }, { 5344, -5934 }, { 5344, -5938 }, { 5349, -5950 }, { 5346, -5959 }, { 5342, -5966 }, { 5336, -5967 }, { 5330, -5966 }, { 5326, -5961 }, { 5326, -5955 }, { 5321, -5954 }, { 5316, -5954 }, { 5314, -5957 }, { 5313, -5960 }, { 5313, -5966 }, { 5313, -5971 }, { 5315, -5981 }, { 5315, -5990 }, { 5315, -5993 }, { 5314, -5997 }, { 5314, -6004 }, { 5315, -6008 }, { 5318, -6011 }, { 5325, -6012 }, { 5328, -6012 } }, "Locality" }, + place_lieudit_fleetinggarden_3 = { true, { { 4573, -5546 }, { 4579, -5544 }, { 4589, -5547 }, { 4600, -5551 }, { 4614, -5552 }, { 4620, -5544 }, { 4625, -5532 }, { 4621, -5526 }, { 4615, -5517 }, { 4611, -5514 }, { 4609, -5507 }, { 4607, -5502 }, { 4602, -5496 }, { 4600, -5490 }, { 4601, -5483 }, { 4601, -5480 }, { 4600, -5479 }, { 4599, -5478 }, { 4597, -5478 }, { 4593, -5478 }, { 4589, -5478 }, { 4587, -5477 }, { 4584, -5475 }, { 4581, -5475 }, { 4579, -5475 }, { 4578, -5478 }, { 4579, -5482 }, { 4581, -5485 }, { 4582, -5491 }, { 4580, -5495 }, { 4578, -5498 }, { 4576, -5501 }, { 4568, -5505 }, { 4560, -5505 }, { 4553, -5504 }, { 4548, -5502 }, { 4549, -5497 }, { 4550, -5493 }, { 4552, -5486 }, { 4548, -5478 }, { 4543, -5475 }, { 4535, -5475 }, { 4529, -5476 }, { 4524, -5476 }, { 4516, -5472 }, { 4510, -5471 }, { 4504, -5472 }, { 4494, -5474 }, { 4487, -5474 }, { 4483, -5474 }, { 4480, -5480 }, { 4479, -5486 }, { 4476, -5487 }, { 4468, -5486 }, { 4463, -5482 }, { 4460, -5474 }, { 4456, -5471 }, { 4452, -5470 }, { 4448, -5471 }, { 4448, -5475 }, { 4447, -5479 }, { 4448, -5484 }, { 4449, -5490 }, { 4450, -5493 }, { 4451, -5496 }, { 4452, -5501 }, { 4452, -5504 }, { 4449, -5510 }, { 4443, -5514 }, { 4435, -5514 }, { 4429, -5507 }, { 4421, -5504 }, { 4413, -5492 }, { 4411, -5480 }, { 4403, -5475 }, { 4396, -5472 }, { 4382, -5471 }, { 4369, -5475 }, { 4355, -5473 }, { 4353, -5477 }, { 4350, -5490 }, { 4353, -5500 }, { 4355, -5513 }, { 4352, -5525 }, { 4353, -5535 }, { 4355, -5544 }, { 4356, -5551 }, { 4360, -5558 }, { 4363, -5563 }, { 4365, -5565 }, { 4368, -5566 }, { 4371, -5567 }, { 4375, -5568 }, { 4378, -5570 }, { 4382, -5570 }, { 4387, -5570 }, { 4390, -5570 }, { 4395, -5572 }, { 4397, -5573 }, { 4409, -5574 }, { 4420, -5574 }, { 4426, -5574 }, { 4433, -5575 }, { 4441, -5576 }, { 4445, -5576 }, { 4447, -5574 }, { 4448, -5571 }, { 4449, -5567 }, { 4449, -5565 }, { 4447, -5562 }, { 4446, -5558 }, { 4447, -5556 }, { 4449, -5551 }, { 4451, -5544 }, { 4455, -5541 }, { 4469, -5540 }, { 4484, -5538 }, { 4493, -5535 }, { 4497, -5536 }, { 4502, -5534 }, { 4507, -5533 }, { 4511, -5532 }, { 4515, -5532 }, { 4521, -5532 }, { 4526, -5538 }, { 4527, -5545 }, { 4525, -5551 }, { 4521, -5553 }, { 4517, -5553 }, { 4514, -5555 }, { 4514, -5559 }, { 4514, -5563 }, { 4517, -5566 }, { 4523, -5566 }, { 4531, -5565 }, { 4536, -5564 }, { 4542, -5563 }, { 4549, -5563 }, { 4554, -5564 }, { 4559, -5565 }, { 4567, -5565 }, { 4570, -5563 }, { 4572, -5558 }, { 4573, -5555 }, { 4572, -5550 } }, "Locality" }, + place_lieudit_fleetinggarden_4 = { true, { { 3946, -4819 }, { 3912, -4829 }, { 3875, -4862 }, { 3858, -4881 }, { 3827, -4907 }, { 3778, -4977 }, { 3748, -5016 }, { 3749, -5052 }, { 3770, -5089 }, { 3794, -5132 }, { 3829, -5166 }, { 3866, -5183 }, { 3907, -5191 }, { 3957, -5188 }, { 4025, -5141 }, { 4050, -5126 }, { 4074, -5084 }, { 4096, -5053 }, { 4112, -5026 }, { 4138, -4993 }, { 4153, -4978 }, { 4166, -4961 }, { 4173, -4940 }, { 4180, -4925 }, { 4181, -4891 }, { 4175, -4860 }, { 4173, -4844 }, { 4168, -4822 }, { 4144, -4807 }, { 4080, -4824 }, { 4037, -4830 }, { 4012, -4818 }, { 3978, -4808 } }, "Locality" }, + r_08_16_mission_place_2 = { false, { { 5682, -6057 }, { 5683, -6122 }, { 5730, -6121 }, { 5730, -6059 } }, "Locality" }, + r_08_16_mission_place_4 = { false, { { 6025, -5753 }, { 6026, -5809 }, { 6057, -5868 }, { 6109, -5917 }, { 6173, -5920 }, { 6232, -5879 }, { 6233, -5717 }, { 6183, -5665 }, { 6118, -5664 }, { 6063, -5703 } }, "Locality" }, + r_08_16_mission_place_5 = { true, { { 4323, -5276 }, { 4527, -5287 }, { 4525, -5232 }, { 4522, -5196 }, { 4532, -5140 }, { 4552, -5095 }, { 4603, -5051 }, { 4600, -4880 }, { 4320, -4875 }, { 4321, -4901 }, { 4360, -4927 }, { 4393, -4961 }, { 4411, -4988 }, { 4414, -4992 }, { 4418, -4996 }, { 4422, -5003 }, { 4420, -5012 }, { 4417, -5019 }, { 4410, -5025 }, { 4401, -5026 }, { 4387, -5022 }, { 4382, -5026 }, { 4381, -5030 }, { 4384, -5037 }, { 4385, -5049 }, { 4392, -5056 }, { 4429, -5057 }, { 4431, -5058 }, { 4436, -5055 }, { 4440, -5053 }, { 4445, -5056 }, { 4448, -5061 }, { 4448, -5065 }, { 4444, -5070 }, { 4443, -5073 }, { 4447, -5071 }, { 4448, -5071 }, { 4445, -5079 }, { 4441, -5083 }, { 4429, -5090 }, { 4419, -5085 }, { 4416, -5094 }, { 4416, -5105 }, { 4397, -5153 }, { 4353, -5195 }, { 4314, -5213 } }, "Locality" } + } } + } }, + newbieland = { true, { { 8053, -9639 }, { 7610, -11541 }, { 10644, -12527 }, { 11247, -10632 } }, { + region_newbieland = { true, { { 8179, -10260 }, { 8179, -11022 }, { 8661, -11045 }, { 8643, -12106 }, { 11195, -12129 }, { 11212, -10266 } }, { + region_newbieland_hunting_grounds = { true, { { 10247, -10876 }, { 10263, -11047 }, { 10251, -11113 }, { 10253, -11156 }, { 10236, -11181 }, { 10209, -11168 }, { 10180, -11229 }, { 10209, -11246 }, { 10215, -11279 }, { 10121, -11429 }, { 10303, -11508 }, { 10691, -11508 }, { 10826, -11461 }, { 11015, -11311 }, { 11022, -11013 }, { 11001, -10933 }, { 10703, -10722 } }, "Locality" }, + place_hunting_grounds_gingo_lair = { false, { { 10754, -11080 }, { 10747, -11106 }, { 10802, -11181 }, { 10832, -11170 }, { 10838, -11146 }, { 10832, -11106 }, { 10811, -11075 } }, "Locality" }, + region_newbieland_the_shattered_ruins = { true, { { 10241, -10807 }, { 9840, -10559 }, { 9459, -10595 }, { 9327, -10988 }, { 9779, -11285 }, { 10122, -11429 }, { 10215, -11279 }, { 10209, -11246 }, { 10180, -11229 }, { 10209, -11168 }, { 10236, -11181 }, { 10253, -11155 }, { 10251, -11113 }, { 10263, -11047 } }, "Locality" }, + place_shattered_ruins_silan = { true, { { 9701, -11025 }, { 9713, -11111 }, { 9736, -11163 }, { 9862, -11205 }, { 10066, -11209 }, { 10109, -11082 }, { 10086, -10938 }, { 10024, -10876 }, { 9935, -10876 }, { 9704, -10723 }, { 9671, -10733 }, { 9613, -10775 }, { 9612, -10812 }, { 9761, -10959 } }, "Locality" }, + place_shattered_ruins_trone = { true, { { 9620, -10778 }, { 9622, -10802 }, { 9641, -10828 }, { 9671, -10820 }, { 9720, -10783 }, { 9723, -10753 }, { 9720, -10746 }, { 9695, -10745 }, { 9680, -10741 } }, "Locality" }, + region_newbieland_starting_zone = { true, { { 9945, -11355 }, { 9839, -11646 }, { 10169, -11986 }, { 10503, -11986 }, { 10691, -11740 }, { 10691, -11509 }, { 10304, -11508 } }, "Locality" }, + place_starting_zone_starting_city = { true, { { 10244, -11732 }, { 10244, -11834 }, { 10257, -11852 }, { 10369, -11871 }, { 10398, -11842 }, { 10422, -11827 }, { 10433, -11790 }, { 10450, -11760 }, { 10456, -11726 }, { 10449, -11716 }, { 10444, -11719 }, { 10387, -11661 }, { 10380, -11651 }, { 10362, -11645 }, { 10347, -11648 }, { 10323, -11668 }, { 10306, -11666 }, { 10287, -11670 }, { 10257, -11693 } }, "Capital" }, + place_starting_zone_arena = { true, { { 10138, -11663 }, { 10180, -11665 }, { 10192, -11654 }, { 10202, -11645 }, { 10211, -11620 }, { 10209, -11601 }, { 10205, -11590 }, { 10206, -11556 }, { 10192, -11544 }, { 10186, -11533 }, { 10139, -11532 }, { 10131, -11548 }, { 10119, -11559 }, { 10109, -11583 }, { 10111, -11599 }, { 10116, -11615 }, { 10119, -11637 }, { 10127, -11648 } }, "Locality" }, + newbieland_pvp_arena = { true, { { 10138, -11664 }, { 10181, -11665 }, { 10202, -11645 }, { 10211, -11620 }, { 10209, -11601 }, { 10206, -11590 }, { 10205, -11555 }, { 10192, -11543 }, { 10186, -11533 }, { 10140, -11533 }, { 10131, -11548 }, { 10120, -11558 }, { 10109, -11584 }, { 10111, -11600 }, { 10115, -11614 }, { 10119, -11637 } }, "Locality" }, + region_newbieland_blight_zone = { true, { { 9170, -11132 }, { 9113, -11359 }, { 9164, -11825 }, { 9722, -11834 }, { 9839, -11646 }, { 9945, -11355 }, { 9779, -11285 }, { 9327, -10988 } }, "Locality" }, + region_newbieland_shining_lake = { true, { { 9433, -10671 }, { 9377, -10424 }, { 8921, -10404 }, { 8839, -10441 }, { 8767, -10519 }, { 8654, -10682 }, { 8654, -11238 }, { 8723, -11288 }, { 8829, -11297 }, { 9166, -11149 }, { 9170, -11131 }, { 9327, -10987 } }, "Locality" }, + region_newbieland_kitins_jungle = { true, { { 8617, -10256 }, { 8180, -10256 }, { 8179, -11017 }, { 8617, -11017 } }, "Locality" }, + ["Karavan Embassy"] = { true, { { 10399, -11844 }, { 10398, -11843 }, { 10388, -11852 }, { 10389, -11853 }, { 10369, -11873 }, { 10409, -11897 }, { 10445, -11869 }, { 10420, -11831 } }, "Locality" }, + mission_place_tryker_02 = { false, { { 10303, -11734 }, { 10315, -11732 }, { 10322, -11723 }, { 10324, -11712 }, { 10322, -11701 }, { 10312, -11693 }, { 10298, -11692 }, { 10288, -11697 }, { 10283, -11708 }, { 10286, -11723 }, { 10293, -11731 } }, "Locality" }, + mission_place_tryker_03 = { false, { { 10647, -11545 }, { 10642, -11540 }, { 10633, -11546 }, { 10637, -11550 } }, "Locality" }, + mission_place_ranger_01 = { false, { { 8874, -10915 }, { 8878, -10921 }, { 8888, -10921 }, { 8894, -10916 }, { 8894, -10898 }, { 8888, -10893 }, { 8879, -10893 }, { 8874, -10899 } }, "Locality" }, + mission_place_ranger_02 = { false, { { 8595, -10924 }, { 8599, -10930 }, { 8609, -10930 }, { 8615, -10925 }, { 8615, -10907 }, { 8609, -10902 }, { 8600, -10902 }, { 8595, -10908 } }, "Locality" }, + mission_place_ilot = { false, { { 8972, -10896 }, { 8992, -10913 }, { 9028, -10918 }, { 9059, -10907 }, { 9076, -10925 }, { 9099, -10933 }, { 9130, -10922 }, { 9161, -10879 }, { 9140, -10795 }, { 9114, -10781 }, { 9087, -10774 }, { 9064, -10775 }, { 9051, -10719 }, { 9044, -10699 }, { 9028, -10684 }, { 9005, -10676 }, { 8988, -10667 }, { 8972, -10669 }, { 8960, -10677 }, { 8953, -10692 }, { 8951, -10720 }, { 8946, -10738 }, { 8942, -10768 }, { 8951, -10793 }, { 8971, -10809 }, { 8981, -10827 }, { 8982, -10848 }, { 8972, -10861 }, { 8969, -10881 } }, "Locality" }, + Kami_Enclave = { true, { { 10387, -11661 }, { 10444, -11718 }, { 10448, -11715 }, { 10459, -11686 }, { 10459, -11679 }, { 10458, -11669 }, { 10452, -11658 }, { 10440, -11648 }, { 10424, -11648 }, { 10410, -11650 } }, "Locality" }, + mission_place_tryker_04 = { false, { { 10402, -11895 }, { 10393, -11905 }, { 10393, -11922 }, { 10397, -11935 }, { 10416, -11944 }, { 10433, -11939 }, { 10443, -11928 }, { 10444, -11913 }, { 10440, -11902 }, { 10433, -11893 }, { 10422, -11889 }, { 10410, -11891 } }, "Locality" }, + place_mission_fyros_01_yubo = { false, { { 10381, -11629 }, { 10377, -11634 }, { 10384, -11636 }, { 10387, -11631 } }, "Locality" }, + place_mission_fyros_02_huntingground_t1 = { false, { { 10322, -11549 }, { 10322, -11570 }, { 10343, -11570 }, { 10343, -11549 } }, "Locality" }, + place_mission_fyros_02_huntingground = { false, { { 10425, -11435 }, { 10426, -11455 }, { 10447, -11455 }, { 10447, -11435 } }, "Locality" }, + place_mission_fyros_02_huntingground_t1exit = { false, { { 10362, -11599 }, { 10360, -11522 }, { 10341, -11520 }, { 10344, -11548 }, { 10345, -11571 }, { 10321, -11571 }, { 10321, -11548 }, { 10344, -11548 }, { 10340, -11520 }, { 10301, -11520 }, { 10299, -11597 } }, "Locality" }, + place_mission_fyros_02_huntingground_t2exit = { false, { { 10361, -11509 }, { 10397, -11427 }, { 10295, -11411 }, { 10313, -11460 }, { 10313, -11485 }, { 10280, -11475 }, { 10280, -11460 }, { 10312, -11460 }, { 10294, -11411 }, { 10252, -11410 }, { 10254, -11506 } }, "Locality" }, + place_mission_fyros_02_huntingground_t2 = { false, { { 10280, -11460 }, { 10280, -11476 }, { 10312, -11484 }, { 10312, -11460 } }, "Locality" }, + place_mission_slavezone = { false, { { 10176, -11273 }, { 10172, -11278 }, { 10179, -11281 }, { 10181, -11275 } }, "Locality" }, + place_mission_javezone = { false, { { 10004, -11253 }, { 10000, -11258 }, { 10008, -11260 }, { 10010, -11255 } }, "Locality" }, + place_mission_zorai_rendor = { false, { { 10533, -11016 }, { 10529, -11021 }, { 10537, -11024 }, { 10539, -11019 } }, "Locality" }, + place_mission_fyros_04_carcasse = { false, { { 10755, -11200 }, { 10740, -11223 }, { 10768, -11238 }, { 10776, -11213 } }, "Locality" }, + place_mission_fyros_04_ragus = { false, { { 10800, -11130 }, { 10796, -11135 }, { 10803, -11137 }, { 10806, -11132 } }, "Locality" }, + place_shooting_range = { false, { { 10476, -11839 }, { 10472, -11837 }, { 10469, -11844 }, { 10473, -11846 } }, "Locality" }, + place_shooting_range_fail = { false, { { 10544, -11833 }, { 10452, -11764 }, { 10424, -11832 }, { 10470, -11901 }, { 10518, -11864 }, { 10466, -11844 }, { 10471, -11834 }, { 10486, -11843 }, { 10482, -11850 }, { 10518, -11864 } }, "Locality" }, + place_forage_start = { false, { { 10235, -11877 }, { 10227, -11872 }, { 10222, -11881 }, { 10233, -11886 } }, "Locality" }, + place_forage_zun = { false, { { 10422, -11918 }, { 10414, -11912 }, { 10410, -11922 }, { 10421, -11927 } }, "Locality" }, + place_forage_shat = { false, { { 10115, -11174 }, { 10106, -11169 }, { 10102, -11178 }, { 10113, -11183 } }, "Locality" }, + place_forage_chloro = { false, { { 8868, -10617 }, { 8859, -10612 }, { 8855, -10621 }, { 8866, -10626 } }, "Locality" }, + ragusrespawn = { false, { { 10271, -10957 }, { 10885, -11511 }, { 11177, -11212 }, { 11010, -10734 }, { 10372, -10721 } }, "Locality" }, + ruinerespawn = { false, { { 9258, -10948 }, { 9623, -11634 }, { 10266, -11350 }, { 9942, -10648 }, { 9511, -10770 } }, "Locality" }, + ranger_rite_start_zone = { false, { { 9985, -11754 }, { 9985, -11766 }, { 9995, -11776 }, { 10007, -11780 }, { 10012, -11793 }, { 10022, -11802 }, { 10038, -11802 }, { 10046, -11799 }, { 10058, -11781 }, { 10040, -11762 }, { 10015, -11756 }, { 9996, -11749 } }, "Locality" }, + ranger_rite_enrty = { false, { { 10018, -11785 }, { 10017, -11788 }, { 10019, -11791 }, { 10022, -11792 }, { 10024, -11790 }, { 10025, -11788 }, { 10024, -11785 }, { 10022, -11785 } }, "Locality" } + } } + } }, + continent_bagne = { true, { { 786, -9742 }, { 473, -10400 }, { 482, -11320 }, { 962, -11317 }, { 1604, -11040 }, { 1611, -9747 } }, { + region_the_abyss_of_ichor = { true, { { 799, -9759 }, { 639, -10079 }, { 480, -10401 }, { 489, -11310 }, { 961, -11308 }, { 1597, -11034 }, { 1599, -9759 } }, { + place_outpost_pr_01 = { true, { { 951, -10271 }, { 859, -10248 }, { 832, -10298 }, { 821, -10368 }, { 881, -10384 }, { 933, -10378 }, { 954, -10321 } }, "Outpost" }, + place_outpost_pr_02 = { true, { { 1238, -10416 }, { 1149, -10419 }, { 1141, -10499 }, { 1202, -10537 }, { 1262, -10493 } }, "Outpost" }, + place_outpost_pr_03 = { true, { { 747, -10736 }, { 650, -10748 }, { 644, -10841 }, { 708, -10864 }, { 761, -10816 } }, "Outpost" }, + place_arrival_from_matis_bagne = { false, { { 1374, -9772 }, { 1306, -9773 }, { 1298, -9853 }, { 1368, -9849 } }, "Locality" }, + place_arrival_from_nexus_bagne = { false, { { 767, -11163 }, { 683, -11167 }, { 680, -11257 }, { 734, -11260 } }, "Locality" }, + place_lieudit_the_abyss_of_ichor_1 = { true, { { 1340, -10261 }, { 1375, -10265 }, { 1405, -10236 }, { 1450, -10201 }, { 1468, -10169 }, { 1456, -10129 }, { 1417, -10108 }, { 1397, -10076 }, { 1358, -10069 }, { 1320, -10068 }, { 1276, -10091 }, { 1261, -10132 }, { 1261, -10195 }, { 1275, -10228 }, { 1319, -10244 } }, "Locality" }, + place_lieudit_the_abyss_of_ichor_2 = { true, { { 1101, -10247 }, { 1060, -10246 }, { 1036, -10264 }, { 1015, -10266 }, { 995, -10277 }, { 984, -10316 }, { 972, -10355 }, { 973, -10376 }, { 975, -10411 }, { 972, -10449 }, { 980, -10481 }, { 994, -10496 }, { 989, -10518 }, { 977, -10577 }, { 982, -10594 }, { 990, -10603 }, { 979, -10632 }, { 974, -10673 }, { 986, -10697 }, { 1025, -10710 }, { 1066, -10707 }, { 1093, -10686 }, { 1088, -10627 }, { 1092, -10551 }, { 1087, -10505 }, { 1105, -10472 }, { 1104, -10426 }, { 1087, -10393 }, { 1088, -10351 }, { 1099, -10310 }, { 1106, -10284 }, { 1110, -10259 } }, "Locality" }, + place_lieudit_the_abyss_of_ichor_3 = { true, { { 1399, -10579 }, { 1387, -10571 }, { 1358, -10571 }, { 1333, -10573 }, { 1320, -10571 }, { 1308, -10570 }, { 1293, -10580 }, { 1291, -10588 }, { 1284, -10623 }, { 1285, -10640 }, { 1298, -10655 }, { 1294, -10681 }, { 1288, -10708 }, { 1286, -10737 }, { 1290, -10764 }, { 1288, -10784 }, { 1291, -10813 }, { 1289, -10847 }, { 1298, -10868 }, { 1332, -10860 }, { 1359, -10852 }, { 1393, -10870 }, { 1418, -10870 }, { 1430, -10852 }, { 1428, -10828 }, { 1429, -10787 }, { 1424, -10770 }, { 1410, -10754 }, { 1418, -10738 }, { 1430, -10711 }, { 1434, -10674 }, { 1429, -10621 }, { 1423, -10595 } }, "Locality" }, + place_ranger_entry_abyss_of_ichor = { false, { { 706, -10437 }, { 704, -10433 }, { 700, -10432 }, { 697, -10433 }, { 696, -10436 }, { 697, -10440 }, { 700, -10442 }, { 703, -10441 } }, "Locality" } + } } + } }, + continent_nexus = { true, { { 7807, -6556 }, { 7802, -7665 }, { 8480, -8333 }, { 9281, -8338 }, { 9773, -7524 }, { 9769, -6067 }, { 8797, -6054 } }, { + region_nexus = { true, { { 8792, -6067 }, { 7820, -6569 }, { 7815, -7665 }, { 8471, -8320 }, { 9267, -8325 }, { 9756, -7519 }, { 9756, -6081 } }, { + place_outpost_nexus_01 = { true, { { 9245, -6411 }, { 9178, -6414 }, { 9155, -6453 }, { 9183, -6510 }, { 9248, -6517 }, { 9272, -6458 } }, "Outpost" }, + place_outpost_nexus_02 = { true, { { 8586, -6756 }, { 8504, -6764 }, { 8492, -6810 }, { 8514, -6862 }, { 8592, -6861 }, { 8609, -6819 } }, "Outpost" }, + place_outpost_nexus_03 = { true, { { 8300, -7055 }, { 8218, -7055 }, { 8191, -7106 }, { 8196, -7155 }, { 8256, -7170 }, { 8310, -7119 } }, "Outpost" }, + place_outpost_nexus_04 = { true, { { 9536, -7071 }, { 9490, -7077 }, { 9470, -7136 }, { 9509, -7186 }, { 9572, -7181 }, { 9587, -7101 } }, "Outpost" }, + place_outpost_nexus_05 = { true, { { 9076, -7241 }, { 8986, -7241 }, { 8972, -7286 }, { 8988, -7346 }, { 9067, -7346 }, { 9096, -7308 } }, "Outpost" }, + place_outpost_nexus_06 = { true, { { 8483, -7527 }, { 8413, -7528 }, { 8402, -7602 }, { 8448, -7629 }, { 8507, -7615 }, { 8514, -7553 } }, "Outpost" }, + place_outpost_nexus_07 = { true, { { 8895, -7721 }, { 8813, -7733 }, { 8814, -7822 }, { 8878, -7825 }, { 8921, -7794 } }, "Outpost" }, + place_arrival_from_bagne_nexus = { false, { { 9314, -6279 }, { 9307, -6279 }, { 9306, -6333 }, { 9316, -6333 }, { 9321, -6315 } }, "Locality" }, + place_arrival_from_route_gouffre_nexus = { false, { { 8130, -7000 }, { 8132, -6947 }, { 8125, -6947 }, { 8118, -6964 }, { 8125, -7000 } }, "Locality" }, + place_arrival_from_terre_nexus = { false, { { 8838, -8130 }, { 8892, -8132 }, { 8887, -8122 }, { 8874, -8117 }, { 8840, -8126 } }, "Locality" }, + place_lieudit_nexus_1 = { true, { { 9580, -6533 }, { 9503, -6494 }, { 9437, -6519 }, { 9410, -6562 }, { 9394, -6623 }, { 9404, -6716 }, { 9515, -6760 }, { 9641, -6699 }, { 9633, -6639 } }, "Locality" }, + place_lieudit_nexus_2 = { true, { { 9084, -7055 }, { 9200, -7054 }, { 9248, -7041 }, { 9294, -7008 }, { 9305, -6941 }, { 9308, -6857 }, { 9291, -6792 }, { 9267, -6730 }, { 9248, -6710 }, { 9126, -6683 }, { 9069, -6686 }, { 8996, -6727 }, { 8964, -6787 }, { 8947, -6845 }, { 8951, -6906 }, { 8973, -6978 }, { 9012, -7025 } }, "Locality" }, + place_lieudit_nexus_3 = { true, { { 8417, -7194 }, { 8337, -7313 }, { 8455, -7358 }, { 8476, -7506 }, { 8616, -7555 }, { 8631, -7692 }, { 8708, -7722 }, { 8732, -7624 }, { 8833, -7547 }, { 8825, -7270 }, { 8865, -7191 }, { 8937, -7169 }, { 8931, -7053 }, { 8802, -7041 }, { 8639, -7050 }, { 8540, -6953 }, { 8436, -6966 }, { 8402, -7038 } }, "Locality" }, + place_lieudit_nexus_4 = { true, { { 8968, -7571 }, { 8979, -7626 }, { 9036, -7687 }, { 9086, -7734 }, { 9167, -7712 }, { 9207, -7639 }, { 9202, -7542 }, { 9098, -7510 } }, "Locality" } + } }, + pvp_zone_nexus = { true, { { 9778, -7547 }, { 9531, -7307 }, { 9404, -7262 }, { 9347, -7127 }, { 9410, -7000 }, { 9527, -6939 }, { 9645, -7006 }, { 9552, -6885 }, { 9340, -6972 }, { 9169, -6747 }, { 9062, -6619 }, { 9010, -6473 }, { 9076, -6363 }, { 9204, -6300 }, { 9332, -6370 }, { 9378, -6474 }, { 9335, -6613 }, { 9196, -6670 }, { 9062, -6619 }, { 9173, -6750 }, { 9340, -6972 }, { 9552, -6885 }, { 9645, -7006 }, { 9692, -7113 }, { 9660, -7240 }, { 9531, -7307 }, { 9778, -7547 }, { 9767, -7235 }, { 9777, -6065 }, { 8794, -6049 }, { 8247, -6946 }, { 8365, -6988 }, { 8396, -7107 }, { 8359, -7233 }, { 8251, -7292 }, { 8108, -7240 }, { 8082, -7121 }, { 8115, -7015 }, { 8246, -6946 }, { 8794, -6049 }, { 7807, -6551 }, { 7789, -7668 }, { 8037, -7927 }, { 8749, -7632 }, { 8887, -7561 }, { 9005, -7663 }, { 9054, -7796 }, { 8997, -7931 }, { 8850, -7965 }, { 8727, -7915 }, { 8692, -7785 }, { 8749, -7632 }, { 8038, -7928 }, { 8475, -8335 }, { 9302, -8337 } }, { } } + } }, + continent_route_gouffre = { true, { { 5434, -9423 }, { 5274, -16320 }, { 5281, -16983 }, { 7204, -16983 }, { 7204, -16468 }, { 7371, -12951 }, { 7368, -12299 }, { 6247, -9434 } }, { + region_the_windy_gate = { true, { { 5441, -9432 }, { 5441, -10879 }, { 5761, -12000 }, { 5887, -11999 }, { 5937, -11985 }, { 6010, -11997 }, { 6055, -11981 }, { 6097, -11993 }, { 6140, -12019 }, { 6215, -12015 }, { 6246, -11998 }, { 6341, -11987 }, { 6401, -12000 }, { 6398, -11047 }, { 6245, -9441 } }, { + place_outpost_pr_04 = { true, { { 6070, -9791 }, { 5999, -9772 }, { 5931, -9800 }, { 5926, -9882 }, { 6014, -9918 }, { 6054, -9860 } }, "Outpost" }, + place_outpost_pr_05 = { true, { { 6018, -10733 }, { 5966, -10752 }, { 5941, -10815 }, { 5985, -10866 }, { 6062, -10843 }, { 6071, -10762 } }, "Outpost" }, + place_outpost_pr_06 = { true, { { 6203, -11536 }, { 6131, -11558 }, { 6108, -11635 }, { 6159, -11664 }, { 6201, -11662 }, { 6234, -11632 }, { 6233, -11566 } }, "Outpost" }, + place_arrival_from_fyros_route_gouffre = { false, { { 5736, -9642 }, { 5674, -9528 }, { 5618, -9580 }, { 5702, -9655 } }, "Locality" }, + place_ranger_entry_windy_gate = { false, { { 6197, -10335 }, { 6195, -10331 }, { 6192, -10330 }, { 6188, -10331 }, { 6187, -10334 }, { 6188, -10338 }, { 6191, -10340 }, { 6194, -10339 } }, "Locality" }, + place_lieudit_the_windy_gate_1 = { true, { { 5674, -10306 }, { 5724, -10361 }, { 5867, -10391 }, { 5909, -10371 }, { 5933, -10337 }, { 5934, -10236 }, { 5901, -10173 }, { 5820, -10111 }, { 5760, -10105 }, { 5687, -10139 }, { 5661, -10159 }, { 5657, -10186 }, { 5630, -10226 } }, "Locality" }, + place_lieudit_the_windy_gate_2 = { true, { { 5594, -10358 }, { 5452, -10524 }, { 5453, -10580 }, { 5550, -10854 }, { 5638, -10877 }, { 5728, -10874 }, { 5758, -10865 }, { 5804, -10825 }, { 5814, -10765 }, { 5832, -10719 }, { 5843, -10660 }, { 5843, -10584 }, { 5826, -10517 }, { 5788, -10472 }, { 5725, -10440 }, { 5685, -10377 } }, "Locality" }, + place_lieudit_the_windy_gate_3 = { true, { { 5793, -11178 }, { 5778, -11200 }, { 5770, -11376 }, { 5887, -11535 }, { 5966, -11552 }, { 6018, -11538 }, { 6072, -11514 }, { 6183, -11488 }, { 6213, -11485 }, { 6273, -11494 }, { 6316, -11503 }, { 6373, -11496 }, { 6389, -11356 }, { 6386, -11158 }, { 6296, -11133 }, { 6168, -11139 }, { 6118, -11130 }, { 6000, -11132 }, { 5889, -11153 }, { 5828, -11142 }, { 5805, -11145 } }, "Locality" }, + place_lieudit_the_windy_gate_4 = { true, { { 6195, -11909 }, { 6140, -11891 }, { 6094, -11861 }, { 6068, -11834 }, { 6014, -11810 }, { 5964, -11819 }, { 5930, -11851 }, { 5917, -11884 }, { 5923, -11940 }, { 5953, -11979 }, { 5993, -11996 }, { 6038, -11999 }, { 6102, -11981 }, { 6143, -11963 }, { 6199, -11944 } }, "Locality" } + } }, + region_the_elusive_forest = { true, { { 5599, -12000 }, { 5600, -12479 }, { 5759, -12808 }, { 5759, -13275 }, { 5920, -13600 }, { 6050, -13599 }, { 6078, -13625 }, { 6148, -13619 }, { 6200, -13615 }, { 6333, -13610 }, { 6342, -13587 }, { 6430, -13574 }, { 6494, -13591 }, { 6560, -13578 }, { 6720, -13600 }, { 6880, -13120 }, { 7359, -12960 }, { 7359, -12320 }, { 6719, -12000 }, { 6400, -11998 }, { 6341, -11986 }, { 6246, -11997 }, { 6215, -12014 }, { 6140, -12017 }, { 6099, -11991 }, { 6055, -11980 }, { 6011, -11995 }, { 5937, -11983 }, { 5888, -11997 }, { 5760, -11998 } }, { + place_outpost_pr_07 = { true, { { 5834, -12157 }, { 5774, -12184 }, { 5769, -12227 }, { 5791, -12287 }, { 5828, -12307 }, { 5886, -12307 }, { 5908, -12254 }, { 5890, -12190 } }, "Outpost" }, + place_outpost_pr_08 = { true, { { 6815, -12509 }, { 6756, -12528 }, { 6748, -12596 }, { 6803, -12615 }, { 6859, -12593 }, { 6852, -12524 } }, "Outpost" }, + place_outpost_pr_09 = { true, { { 6016, -13012 }, { 5987, -13014 }, { 5987, -13053 }, { 5976, -13069 }, { 5969, -13114 }, { 6063, -13101 }, { 6072, -13030 }, { 6063, -13013 } }, "Outpost" }, + place_arrival_from_nexus_route_gouffre = { false, { { 6779, -12249 }, { 6720, -12202 }, { 6678, -12191 }, { 6667, -12224 }, { 6706, -12263 }, { 6774, -12273 } }, "Locality" }, + place_ranger_entry_elusive_forest = { false, { { 6338, -12448 }, { 6336, -12443 }, { 6333, -12442 }, { 6329, -12444 }, { 6328, -12447 }, { 6330, -12451 }, { 6333, -12452 }, { 6336, -12451 } }, "Locality" }, + place_lieudit_the_elusive_forest_1 = { true, { { 5608, -12459 }, { 5962, -12514 }, { 6003, -12525 }, { 6066, -12511 }, { 6116, -12482 }, { 6130, -12406 }, { 6102, -12351 }, { 6041, -12311 }, { 5975, -12313 }, { 5907, -12353 }, { 5817, -12366 }, { 5749, -12333 }, { 5677, -12330 }, { 5632, -12356 }, { 5612, -12393 } }, "Locality" }, + place_lieudit_the_elusive_forest_2 = { true, { { 6341, -12104 }, { 6281, -12119 }, { 6227, -12137 }, { 6161, -12140 }, { 6137, -12153 }, { 6134, -12193 }, { 6183, -12269 }, { 6233, -12314 }, { 6307, -12330 }, { 6370, -12317 }, { 6400, -12290 }, { 6426, -12209 }, { 6409, -12147 }, { 6379, -12116 } }, "Locality" }, + place_lieudit_the_elusive_forest_3 = { true, { { 7031, -12447 }, { 6969, -12452 }, { 6908, -12511 }, { 6885, -12593 }, { 6858, -12701 }, { 6826, -12769 }, { 6792, -12821 }, { 6780, -12909 }, { 6799, -12969 }, { 6849, -12978 }, { 7331, -12982 }, { 7357, -12824 }, { 7358, -12666 }, { 7312, -12325 }, { 7140, -12295 } }, "Locality" }, + place_lieudit_the_elusive_forest_4 = { true, { { 6756, -13087 }, { 6785, -13044 }, { 6788, -12988 }, { 6747, -12847 }, { 6701, -12823 }, { 6667, -12785 }, { 6605, -12763 }, { 6524, -12802 }, { 6491, -12843 }, { 6495, -12913 }, { 6508, -12963 }, { 6511, -13012 }, { 6550, -13096 }, { 6623, -13151 }, { 6694, -13153 } }, "Locality" }, + place_lieudit_the_elusive_forest_5 = { true, { { 6245, -13153 }, { 6232, -13130 }, { 6185, -13093 }, { 6132, -13097 }, { 6095, -13139 }, { 6029, -13148 }, { 5985, -13163 }, { 5937, -13230 }, { 5948, -13328 }, { 5993, -13376 }, { 6069, -13408 }, { 6134, -13408 }, { 6186, -13409 }, { 6227, -13350 } }, "Locality" }, + place_lieudit_the_elusive_forest_6 = { true, { { 6693, -13206 }, { 6665, -13207 }, { 6626, -13179 }, { 6594, -13144 }, { 6539, -13141 }, { 6474, -13161 }, { 6433, -13186 }, { 6408, -13221 }, { 6384, -13262 }, { 6341, -13334 }, { 6346, -13445 }, { 6391, -13462 }, { 6447, -13470 }, { 6521, -13443 }, { 6591, -13442 }, { 6662, -13417 }, { 6699, -13355 }, { 6708, -13280 } }, "Locality" } + } }, + region_gate_of_obscurity = { true, { { 5919, -13599 }, { 5920, -14560 }, { 6080, -15519 }, { 6400, -15680 }, { 6400, -15839 }, { 6523, -15868 }, { 6618, -15853 }, { 6661, -15851 }, { 6695, -15865 }, { 6880, -15839 }, { 6880, -14399 }, { 6719, -13599 }, { 6560, -13576 }, { 6494, -13589 }, { 6430, -13572 }, { 6342, -13585 }, { 6332, -13609 }, { 6202, -13613 }, { 6107, -13621 }, { 6079, -13618 }, { 6050, -13597 } }, { + place_outpost_pr_10 = { true, { { 6516, -13604 }, { 6450, -13611 }, { 6413, -13682 }, { 6408, -13727 }, { 6502, -13754 }, { 6556, -13732 }, { 6550, -13642 } }, "Outpost" }, + place_outpost_pr_11 = { true, { { 6330, -13933 }, { 6284, -13949 }, { 6258, -14003 }, { 6299, -14066 }, { 6376, -14055 }, { 6394, -13992 }, { 6382, -13947 } }, "Outpost" }, + place_outpost_pr_12 = { true, { { 6675, -14593 }, { 6582, -14605 }, { 6573, -14655 }, { 6587, -14715 }, { 6693, -14705 }, { 6696, -14634 } }, "Outpost" }, + place_outpost_pr_13 = { true, { { 6326, -15216 }, { 6263, -15223 }, { 6242, -15300 }, { 6314, -15362 }, { 6394, -15325 }, { 6371, -15236 } }, "Outpost" }, + place_lieudit_gateofobscurity_1 = { true, { { 6218, -13901 }, { 6212, -13844 }, { 6174, -13785 }, { 6184, -13763 }, { 6173, -13709 }, { 6155, -13662 }, { 6108, -13632 }, { 6048, -13610 }, { 5941, -13628 }, { 5924, -13807 }, { 6130, -13891 } }, "Locality" }, + place_lieudit_gateofobscurity_2 = { true, { { 6132, -14459 }, { 6161, -14423 }, { 6215, -14372 }, { 6231, -14325 }, { 6239, -14222 }, { 6223, -14172 }, { 6182, -14128 }, { 6123, -14087 }, { 6051, -14084 }, { 5936, -14201 }, { 5931, -14458 } }, "Locality" }, + place_lieudit_gateofobscurity_3 = { true, { { 6529, -14864 }, { 6559, -14834 }, { 6550, -14779 }, { 6508, -14752 }, { 6440, -14757 }, { 6407, -14823 }, { 6393, -14897 }, { 6400, -14989 }, { 6407, -15043 }, { 6403, -15086 }, { 6416, -15131 }, { 6450, -15170 }, { 6497, -15174 }, { 6528, -15166 }, { 6527, -15092 }, { 6502, -15047 }, { 6529, -15002 }, { 6525, -14974 }, { 6568, -14925 }, { 6556, -14883 } }, "Locality" }, + place_lieudit_gateofobscurity_4 = { true, { { 6460, -15554 }, { 6416, -15711 }, { 6507, -15792 }, { 6582, -15830 }, { 6654, -15836 }, { 6832, -15819 }, { 6854, -15772 }, { 6848, -15715 }, { 6763, -15687 }, { 6714, -15681 }, { 6662, -15647 }, { 6601, -15576 }, { 6563, -15541 }, { 6508, -15539 } }, "Locality" }, + place_ranger_entry_gate_of_obscurity = { false, { { 6750, -14436 }, { 6748, -14432 }, { 6744, -14431 }, { 6741, -14432 }, { 6740, -14435 }, { 6741, -14439 }, { 6744, -14441 }, { 6747, -14440 } }, "Locality" } + } }, + region_the_trench_of_trials = { true, { { 5920, -15680 }, { 5281, -16320 }, { 5290, -16968 }, { 7200, -16960 }, { 7199, -16480 }, { 6879, -15840 }, { 6695, -15863 }, { 6663, -15850 }, { 6617, -15848 }, { 6523, -15865 }, { 6400, -15840 }, { 6399, -15680 } }, { + place_outpost_pr_14 = { true, { { 6184, -16169 }, { 6106, -16170 }, { 6092, -16214 }, { 6093, -16265 }, { 6173, -16260 }, { 6173, -16223 }, { 6182, -16222 } }, "Outpost" }, + place_outpost_pr_15 = { true, { { 6831, -16346 }, { 6752, -16361 }, { 6756, -16409 }, { 6763, -16446 }, { 6781, -16447 }, { 6799, -16450 }, { 6846, -16428 }, { 6845, -16399 }, { 6842, -16379 } }, "Outpost" }, + place_outpost_pr_16 = { true, { { 5699, -16644 }, { 5636, -16665 }, { 5604, -16723 }, { 5611, -16758 }, { 5732, -16793 }, { 5752, -16688 } }, "Outpost" }, + place_arrival_from_zorai_route_gouffre = { false, { { 5493, -16575 }, { 5455, -16536 }, { 5383, -16526 }, { 5377, -16559 }, { 5484, -16616 } }, "Locality" }, + place_arrival_from_tryker_route_gouffre = { false, { { 7171, -16703 }, { 7112, -16737 }, { 7105, -16762 }, { 7158, -16786 }, { 7196, -16715 } }, "Locality" }, + place_lieudit_the_trench_of_trials_1 = { true, { { 6295, -16157 }, { 6340, -16201 }, { 6392, -16211 }, { 6443, -16165 }, { 6451, -16094 }, { 6504, -16020 }, { 6504, -15980 }, { 6497, -15925 }, { 6485, -15868 }, { 6372, -15789 }, { 6307, -15786 }, { 6275, -15830 }, { 6242, -15869 }, { 6191, -15903 }, { 6150, -15943 }, { 6092, -15988 }, { 6048, -16019 }, { 6022, -16064 }, { 6084, -16119 }, { 6111, -16152 }, { 6201, -16161 } }, "Locality" }, + place_lieudit_the_trench_of_trials_2 = { true, { { 5576, -16445 }, { 5571, -16490 }, { 5587, -16568 }, { 5608, -16616 }, { 5686, -16641 }, { 5742, -16635 }, { 5777, -16596 }, { 5869, -16588 }, { 5937, -16517 }, { 5913, -16415 }, { 5890, -16353 }, { 5774, -16325 }, { 5649, -16353 } }, "Locality" }, + place_lieudit_the_trench_of_trials_3 = { true, { { 7077, -16777 }, { 7036, -16749 }, { 6958, -16759 }, { 6914, -16785 }, { 6873, -16835 }, { 6861, -16886 }, { 6866, -16938 }, { 6925, -16941 }, { 7177, -16940 }, { 7187, -16813 } }, "Locality" }, + place_ranger_entry_trench_of_trials = { false, { { 5964, -16150 }, { 5963, -16146 }, { 5959, -16145 }, { 5956, -16146 }, { 5954, -16149 }, { 5956, -16153 }, { 5959, -16155 }, { 5962, -16154 } }, "Locality" } + } }, + pvp_zone_route = { true, { { 7193, -16982 }, { 7201, -16760 }, { 7160, -16743 }, { 7170, -16705 }, { 7189, -16708 }, { 7187, -16733 }, { 7182, -16751 }, { 7202, -16758 }, { 7204, -16733 }, { 7369, -12353 }, { 7180, -11898 }, { 6728, -12229 }, { 6736, -12249 }, { 6780, -12247 }, { 6778, -12262 }, { 6767, -12269 }, { 6716, -12263 }, { 6703, -12258 }, { 6697, -12241 }, { 7177, -11894 }, { 6605, -10492 }, { 6571, -10401 }, { 6243, -9599 }, { 5682, -9593 }, { 5682, -9619 }, { 5662, -9617 }, { 5653, -9594 }, { 5433, -9599 }, { 5438, -10879 }, { 5592, -12476 }, { 5917, -15679 }, { 5363, -16331 }, { 5368, -16533 }, { 5413, -16531 }, { 5456, -16536 }, { 5457, -16559 }, { 5436, -16563 }, { 5381, -16973 } }, { } } + } }, + continent_sources = { true, { { 3046, -9640 }, { 2519, -10223 }, { 2445, -10941 }, { 3011, -11437 }, { 3548, -11400 }, { 3901, -10752 }, { 3901, -10223 }, { 3777, -9626 } }, { + region_the_under_spring = { true, { { 3129, -9685 }, { 2559, -10244 }, { 2559, -10879 }, { 3040, -11363 }, { 3516, -11361 }, { 3841, -10714 }, { 3841, -10239 }, { 3681, -9680 } }, { + place_outpost_pr_17 = { true, { { 3145, -10100 }, { 3080, -10121 }, { 3070, -10171 }, { 3110, -10220 }, { 3174, -10189 }, { 3174, -10116 } }, "Outpost" }, + place_outpost_pr_18 = { true, { { 3480, -10420 }, { 3411, -10449 }, { 3402, -10484 }, { 3411, -10531 }, { 3488, -10534 }, { 3515, -10500 }, { 3511, -10456 } }, "Outpost" }, + place_outpost_pr_19 = { true, { { 2982, -10751 }, { 2913, -10771 }, { 2918, -10827 }, { 2933, -10847 }, { 3002, -10842 }, { 3003, -10791 }, { 2992, -10759 } }, "Outpost" }, + place_arrival_from_fyros_sources = { false, { { 3500, -9798 }, { 3423, -9698 }, { 3385, -9726 }, { 3447, -9817 } }, "Locality" }, + place_arrival_from_zorai_sources = { false, { { 3339, -11346 }, { 3336, -11266 }, { 3250, -11282 }, { 3259, -11349 } }, "Locality" }, + place_lieudit_the_under_spring_1 = { true, { { 3279, -10403 }, { 3353, -10391 }, { 3372, -10338 }, { 3358, -10254 }, { 3278, -10234 }, { 3210, -10247 }, { 3185, -10305 }, { 3203, -10372 } }, "Locality" }, + place_lieudit_the_under_spring_2 = { true, { { 3619, -10401 }, { 3582, -10402 }, { 3547, -10422 }, { 3537, -10449 }, { 3536, -10499 }, { 3547, -10532 }, { 3576, -10548 }, { 3617, -10544 }, { 3641, -10528 }, { 3657, -10509 }, { 3663, -10474 }, { 3657, -10437 }, { 3644, -10408 } }, "Locality" }, + place_lieudit_the_under_spring_3 = { true, { { 3183, -10585 }, { 3163, -10573 }, { 3128, -10569 }, { 3082, -10574 }, { 3069, -10604 }, { 3065, -10629 }, { 3082, -10659 }, { 3073, -10686 }, { 3094, -10697 }, { 3116, -10705 }, { 3145, -10708 }, { 3173, -10700 }, { 3189, -10688 }, { 3191, -10669 }, { 3190, -10650 }, { 3190, -10620 } }, "Locality" }, + place_lieudit_the_under_spring_4 = { true, { { 3190, -10623 }, { 3189, -10647 }, { 3191, -10665 }, { 3213, -10715 }, { 3291, -10741 }, { 3352, -10731 }, { 3369, -10687 }, { 3372, -10627 }, { 3354, -10578 }, { 3317, -10556 }, { 3287, -10541 }, { 3250, -10549 }, { 3218, -10560 }, { 3201, -10594 } }, "Locality" }, + place_lieudit_the_under_spring_5 = { true, { { 2795, -10403 }, { 2751, -10412 }, { 2720, -10443 }, { 2711, -10504 }, { 2702, -10608 }, { 2722, -10685 }, { 2770, -10720 }, { 2812, -10746 }, { 2843, -10748 }, { 2876, -10693 }, { 2874, -10612 }, { 2894, -10553 }, { 2865, -10443 }, { 2841, -10421 } }, "Locality" }, + place_ranger_entry_under_spring = { false, { { 2980, -10048 }, { 2978, -10044 }, { 2974, -10042 }, { 2971, -10044 }, { 2970, -10047 }, { 2971, -10051 }, { 2974, -10052 }, { 2977, -10052 } }, "Locality" } + } } + } }, + continent_terre = { true, { { 632, -13097 }, { 120, -13341 }, { 124, -14067 }, { 472, -14824 }, { 1902, -15854 }, { 2560, -15852 }, { 3050, -15359 }, { 3059, -14721 }, { 2890, -13757 }, { 2412, -13099 } }, { + region_the_land_of_continuty = { true, { { 155, -13440 }, { 155, -14080 }, { 481, -14719 }, { 795, -15040 }, { 1176, -15022 }, { 1249, -15003 }, { 1281, -14922 }, { 1302, -14868 }, { 1333, -14765 }, { 1364, -14688 }, { 1389, -14635 }, { 1421, -14595 }, { 1460, -14567 }, { 1492, -14566 }, { 1553, -14587 }, { 1631, -14595 }, { 1700, -14594 }, { 1763, -14588 }, { 1808, -14572 }, { 1854, -14550 }, { 1827, -14501 }, { 1809, -14462 }, { 1789, -14413 }, { 1778, -14354 }, { 1761, -14244 }, { 1743, -14190 }, { 1727, -14145 }, { 1724, -14101 }, { 1736, -14049 }, { 1743, -14021 }, { 1768, -13942 }, { 1777, -13891 }, { 1771, -13863 }, { 1767, -13801 }, { 1755, -13769 }, { 1727, -13765 }, { 1707, -13772 }, { 1662, -13774 }, { 1578, -13755 }, { 1574, -13742 }, { 1578, -13725 }, { 1586, -13698 }, { 1592, -13675 }, { 1596, -13622 }, { 1601, -13499 }, { 1598, -13440 }, { 1275, -13120 }, { 635, -13120 }, { 315, -13280 } }, { + place_outpost_pr_20 = { true, { { 591, -13447 }, { 508, -13457 }, { 478, -13534 }, { 534, -13569 }, { 609, -13585 }, { 624, -13496 } }, "Outpost" }, + place_outpost_pr_21 = { true, { { 1395, -13772 }, { 1295, -13782 }, { 1282, -13831 }, { 1313, -13901 }, { 1407, -13876 } }, "Outpost" }, + place_outpost_pr_22 = { true, { { 914, -13934 }, { 828, -13953 }, { 813, -14040 }, { 887, -14064 }, { 939, -14007 } }, "Outpost" }, + place_outpost_pr_23 = { true, { { 1040, -14397 }, { 968, -14422 }, { 978, -14523 }, { 1070, -14549 }, { 1110, -14500 }, { 1085, -14435 } }, "Outpost" }, + place_outpost_pr_24 = { true, { { 1043, -14749 }, { 992, -14772 }, { 995, -14805 }, { 1004, -14853 }, { 1089, -14846 }, { 1083, -14790 }, { 1072, -14767 }, { 1074, -14756 }, { 1065, -14751 }, { 1052, -14752 } }, "Outpost" }, + place_arrival_from_zorai_terre = { false, { { 518, -14423 }, { 417, -14488 }, { 446, -14541 }, { 537, -14468 } }, "Locality" }, + place_lieudit_the_land_of_continuity_1 = { true, { { 589, -14695 }, { 675, -14592 }, { 787, -14413 }, { 900, -14376 }, { 910, -14311 }, { 840, -14251 }, { 730, -14225 }, { 673, -14247 }, { 488, -14261 }, { 489, -14699 } }, "Locality" }, + place_lieudit_the_land_of_continuity_2 = { true, { { 340, -14223 }, { 602, -14221 }, { 635, -14196 }, { 697, -14177 }, { 772, -14122 }, { 794, -14045 }, { 805, -13937 }, { 800, -13851 }, { 807, -13785 }, { 787, -13695 }, { 778, -13651 }, { 681, -13624 }, { 571, -13662 }, { 490, -13624 }, { 453, -13587 }, { 415, -13558 }, { 327, -13552 }, { 164, -13561 }, { 162, -14073 } }, "Locality" }, + place_lieudit_the_land_of_continuity_3 = { true, { { 785, -13649 }, { 811, -13728 }, { 1111, -13745 }, { 1170, -13651 }, { 1190, -13578 }, { 1168, -13481 }, { 1091, -13435 }, { 985, -13442 }, { 952, -13512 }, { 877, -13563 }, { 833, -13578 }, { 803, -13598 } }, "Locality" }, + place_lieudit_the_land_of_continuity_4 = { true, { { 656, -13281 }, { 724, -13395 }, { 819, -13430 }, { 926, -13437 }, { 986, -13386 }, { 1047, -13320 }, { 1100, -13292 }, { 1199, -13279 }, { 1261, -13252 }, { 1263, -13121 }, { 659, -13120 } }, "Locality" }, + place_lieudit_the_land_of_continuity_5 = { true, { { 1513, -14293 }, { 1464, -14368 }, { 1457, -14377 }, { 1459, -14391 }, { 1473, -14494 }, { 1503, -14522 }, { 1637, -14527 }, { 1723, -14503 }, { 1739, -14396 }, { 1742, -14388 }, { 1739, -14380 }, { 1720, -14295 }, { 1699, -14276 } }, "Locality" }, + place_ranger_entry_land_of_continuty = { false, { { 1172, -13857 }, { 1170, -13853 }, { 1166, -13852 }, { 1163, -13853 }, { 1162, -13856 }, { 1163, -13860 }, { 1166, -13862 }, { 1169, -13861 } }, "Locality" } + } }, + region_the_sunken_city = { true, { { 1760, -13120 }, { 1599, -13279 }, { 1606, -13501 }, { 1597, -13675 }, { 1586, -13712 }, { 1579, -13741 }, { 1584, -13754 }, { 1599, -13760 }, { 1621, -13765 }, { 1665, -13774 }, { 1707, -13769 }, { 1731, -13763 }, { 1762, -13766 }, { 1773, -13805 }, { 1775, -13853 }, { 1782, -13895 }, { 1773, -13937 }, { 1760, -13981 }, { 1740, -14047 }, { 1729, -14104 }, { 1733, -14148 }, { 1744, -14183 }, { 1763, -14242 }, { 1776, -14325 }, { 1794, -14420 }, { 1827, -14499 }, { 1858, -14552 }, { 1891, -14560 }, { 1983, -14565 }, { 2036, -14572 }, { 2075, -14556 }, { 2095, -14545 }, { 2144, -14530 }, { 2190, -14554 }, { 2234, -14561 }, { 2284, -14550 }, { 2317, -14539 }, { 2379, -14523 }, { 2425, -14517 }, { 2493, -14532 }, { 2570, -14548 }, { 2658, -14559 }, { 2879, -14560 }, { 2879, -13760 }, { 2399, -13120 } }, { + place_outpost_pr_25 = { true, { { 1872, -13469 }, { 1792, -13477 }, { 1796, -13529 }, { 1805, -13549 }, { 1808, -13559 }, { 1815, -13568 }, { 1826, -13567 }, { 1837, -13570 }, { 1879, -13558 }, { 1887, -13547 }, { 1885, -13533 }, { 1880, -13494 } }, "Outpost" }, + place_outpost_pr_26 = { true, { { 2335, -13611 }, { 2244, -13658 }, { 2241, -13698 }, { 2277, -13749 }, { 2361, -13730 }, { 2389, -13689 }, { 2392, -13637 } }, "Outpost" }, + place_outpost_pr_27 = { true, { { 2677, -14261 }, { 2610, -14294 }, { 2595, -14330 }, { 2617, -14385 }, { 2717, -14375 }, { 2714, -14294 } }, "Outpost" }, + place_arrival_from_nexus_terre = { false, { { 2867, -14142 }, { 2792, -14170 }, { 2777, -14209 }, { 2866, -14215 } }, "Locality" }, + place_lieudit_the_sunken_city_1 = { true, { { 2025, -13737 }, { 2059, -13691 }, { 2075, -13593 }, { 2075, -13478 }, { 2033, -13430 }, { 1998, -13425 }, { 1941, -13440 }, { 1912, -13491 }, { 1921, -13558 }, { 1906, -13625 }, { 1892, -13677 }, { 1893, -13709 }, { 1948, -13737 }, { 1985, -13745 } }, "Locality" }, + place_lieudit_the_sunken_city_2 = { true, { { 2585, -14159 }, { 2653, -14189 }, { 2723, -14126 }, { 2849, -13987 }, { 2875, -13855 }, { 2838, -13767 }, { 2583, -13758 }, { 2554, -13958 }, { 2589, -14035 } }, "Locality" }, + place_lieudit_the_sunken_city_3 = { true, { { 2195, -14700 }, { 2250, -14727 }, { 2323, -14742 }, { 2400, -14718 }, { 2449, -14677 }, { 2464, -14607 }, { 2436, -14560 }, { 2324, -14514 }, { 2273, -14467 }, { 2240, -14413 }, { 2211, -14381 }, { 2167, -14365 }, { 2132, -14366 }, { 2090, -14382 }, { 2048, -14417 }, { 2038, -14488 }, { 2043, -14527 } }, "Locality" }, + place_ranger_entry_sunken_city = { false, { { 1739, -13317 }, { 1738, -13313 }, { 1734, -13312 }, { 1731, -13313 }, { 1729, -13316 }, { 1731, -13320 }, { 1734, -13322 }, { 1737, -13321 } }, "Locality" } + } }, + region_forbidden_depths = { true, { { 1463, -14565 }, { 1423, -14593 }, { 1391, -14633 }, { 1371, -14674 }, { 1336, -14762 }, { 1303, -14870 }, { 1287, -14913 }, { 1268, -14960 }, { 1254, -15004 }, { 1278, -15360 }, { 1918, -15840 }, { 2558, -15840 }, { 3038, -15360 }, { 3038, -14720 }, { 2718, -14560 }, { 2657, -14559 }, { 2558, -14545 }, { 2427, -14516 }, { 2375, -14523 }, { 2327, -14535 }, { 2285, -14549 }, { 2235, -14560 }, { 2190, -14553 }, { 2144, -14528 }, { 2094, -14544 }, { 2064, -14559 }, { 2036, -14570 }, { 1985, -14564 }, { 1921, -14560 }, { 1856, -14548 }, { 1811, -14570 }, { 1767, -14586 }, { 1707, -14593 }, { 1634, -14594 }, { 1558, -14586 }, { 1498, -14565 } }, { + place_outpost_pr_28 = { true, { { 2343, -14738 }, { 2275, -14757 }, { 2266, -14816 }, { 2307, -14864 }, { 2371, -14844 }, { 2385, -14757 } }, "Outpost" }, + place_outpost_pr_29 = { true, { { 1554, -15049 }, { 1503, -15053 }, { 1495, -15105 }, { 1498, -15130 }, { 1534, -15131 }, { 1537, -15142 }, { 1591, -15149 }, { 1596, -15074 } }, "Outpost" }, + place_outpost_pr_30 = { true, { { 2703, -15230 }, { 2636, -15215 }, { 2573, -15249 }, { 2563, -15318 }, { 2660, -15355 }, { 2696, -15305 } }, "Outpost" }, + place_lieudit_forbidden_depths_1 = { true, { { 1864, -14861 }, { 1904, -14855 }, { 1955, -14861 }, { 2034, -14861 }, { 2060, -14802 }, { 2056, -14666 }, { 2047, -14582 }, { 1990, -14582 }, { 1928, -14591 }, { 1867, -14648 }, { 1809, -14690 }, { 1792, -14736 }, { 1790, -14817 }, { 1825, -14850 } }, "Locality" }, + place_lieudit_forbidden_depths_2 = { true, { { 2404, -15029 }, { 2298, -15049 }, { 2268, -15081 }, { 2247, -15136 }, { 2248, -15184 }, { 2263, -15197 }, { 2294, -15208 }, { 2355, -15211 }, { 2434, -15201 }, { 2460, -15214 }, { 2478, -15231 }, { 2537, -15244 }, { 2558, -15292 }, { 2559, -15330 }, { 2605, -15353 }, { 2654, -15364 }, { 2680, -15356 }, { 2730, -15305 }, { 2784, -15216 }, { 2869, -15189 }, { 2886, -15169 }, { 2901, -15140 }, { 2905, -15115 }, { 2884, -15073 }, { 2826, -15048 }, { 2562, -15023 } }, "Locality" }, + place_lieudit_forbidden_depths_3 = { true, { { 2227, -15344 }, { 2158, -15362 }, { 2117, -15394 }, { 2091, -15429 }, { 2085, -15538 }, { 2099, -15631 }, { 2133, -15673 }, { 2195, -15680 }, { 2356, -15670 }, { 2378, -15640 }, { 2405, -15568 }, { 2402, -15443 }, { 2364, -15397 }, { 2315, -15362 } }, "Locality" }, + place_ranger_entry_forbidden_depths = { false, { { 2752, -15486 }, { 2751, -15482 }, { 2747, -15480 }, { 2744, -15482 }, { 2742, -15485 }, { 2744, -15489 }, { 2747, -15491 }, { 2750, -15490 } }, "Locality" } + } } + } }, + continent_kitiniere = { true, { { 1729, -16274 }, { 1725, -17469 }, { 2977, -17447 }, { 2939, -16276 } }, { + kitiniere = { true, { { 1753, -16292 }, { 1746, -17445 }, { 2967, -17438 }, { 2936, -16283 } }, { + kitiniere_cattle_room = { true, { { 2608, -17089 }, { 2703, -17249 }, { 2863, -17230 }, { 2851, -17144 }, { 2732, -16999 }, { 2659, -16999 } }, "Locality" }, + kitiniere_dark_mines = { true, { { 1763, -16809 }, { 1782, -16943 }, { 1932, -16915 }, { 2012, -16848 }, { 2135, -16835 }, { 2268, -16742 }, { 2262, -16694 }, { 2268, -16467 }, { 2061, -16464 }, { 1866, -16490 }, { 1783, -16714 } }, "Locality" }, + kitiniere_eggs_room = { true, { { 1893, -16928 }, { 1902, -17011 }, { 2007, -17104 }, { 2077, -17101 }, { 2141, -17018 }, { 2160, -16963 }, { 2094, -16873 }, { 2030, -16854 }, { 2002, -16861 }, { 1953, -16912 } }, "Locality" }, + kitiniere_entrance = { false, { { 2391, -17221 }, { 2410, -17275 }, { 2474, -17319 }, { 2486, -17390 }, { 2496, -17419 }, { 2550, -17425 }, { 2595, -17400 }, { 2614, -17349 }, { 2611, -17282 }, { 2640, -17224 }, { 2665, -17208 }, { 2669, -17194 }, { 2622, -17114 }, { 2544, -17182 }, { 2470, -17167 }, { 2505, -17119 }, { 2492, -17068 }, { 2457, -17065 }, { 2452, -17106 }, { 2400, -17190 } }, "Locality" }, + kitiniere_old_mines = { true, { { 2518, -16550 }, { 2456, -16672 }, { 2498, -16818 }, { 2607, -16860 }, { 2616, -16911 }, { 2645, -16975 }, { 2735, -16994 }, { 2792, -17055 }, { 2863, -17135 }, { 2878, -17212 }, { 2929, -17110 }, { 2942, -17020 }, { 2789, -16793 }, { 2671, -16677 }, { 2643, -16570 } }, "Locality" }, + kitiniere_princes_room = { true, { { 2318, -16301 }, { 2271, -16332 }, { 2296, -16413 }, { 2280, -16479 }, { 2277, -16553 }, { 2277, -16614 }, { 2286, -16684 }, { 2338, -16704 }, { 2444, -16697 }, { 2482, -16602 }, { 2494, -16582 }, { 2513, -16531 }, { 2527, -16349 }, { 2479, -16296 } }, "Locality" }, + kitiniere_queen_room = { true, { { 2341, -16814 }, { 2239, -16865 }, { 2216, -16951 }, { 2213, -17008 }, { 2235, -17066 }, { 2277, -17117 }, { 2402, -17101 }, { 2504, -17003 }, { 2530, -16865 }, { 2479, -16794 } }, "Locality" }, + mission_visiter_salle_reine_1 = { false, { { 2449, -17062 }, { 2455, -17099 }, { 2500, -17094 }, { 2493, -17059 } }, "Locality" }, + mission_visiter_salle_reine_2 = { false, { { 2558, -16950 }, { 2560, -16997 }, { 2588, -16996 }, { 2587, -16950 } }, "Locality" }, + mission_visiter_salle_reine_3 = { false, { { 2541, -16888 }, { 2543, -16934 }, { 2572, -16934 }, { 2570, -16888 } }, "Locality" }, + mission_visiter_salle_reine_4 = { false, { { 2354, -16835 }, { 2354, -16870 }, { 2423, -16863 }, { 2421, -16831 } }, "Locality" }, + mission_cartographie_1 = { false, { { 2572, -16932 }, { 2578, -16968 }, { 2623, -16963 }, { 2615, -16929 } }, "Locality" }, + mission_cartographie_2 = { false, { { 2839, -17009 }, { 2845, -17046 }, { 2891, -17041 }, { 2883, -17007 } }, "Locality" }, + mission_cartographie_3 = { false, { { 2600, -16745 }, { 2606, -16782 }, { 2651, -16777 }, { 2644, -16742 } }, "Locality" }, + mission_cartographie_4 = { false, { { 2112, -16595 }, { 2118, -16632 }, { 2163, -16627 }, { 2155, -16592 } }, "Locality" }, + mission_cartographie_5 = { false, { { 1827, -16658 }, { 1833, -16695 }, { 1878, -16689 }, { 1871, -16655 } }, "Locality" }, + mission_cartographie_6 = { false, { { 2184, -16738 }, { 2190, -16775 }, { 2235, -16770 }, { 2228, -16735 } }, "Locality" }, + mission_cartographie_7 = { false, { { 2404, -17178 }, { 2410, -17215 }, { 2455, -17210 }, { 2448, -17175 } }, "Locality" }, + mission_source_magique = { false, { { 1946, -16491 }, { 1921, -16510 }, { 1928, -16523 }, { 1934, -16524 }, { 1940, -16529 }, { 1942, -16534 }, { 1965, -16534 }, { 1967, -16532 }, { 1973, -16529 }, { 1978, -16529 }, { 1987, -16531 }, { 1995, -16519 }, { 1969, -16487 }, { 1963, -16486 }, { 1952, -16487 } }, "Locality" }, + mission_extrait_substance = { false, { { 2548, -17216 }, { 2542, -17217 }, { 2537, -17218 }, { 2532, -17219 }, { 2529, -17219 }, { 2527, -17246 }, { 2530, -17248 }, { 2531, -17252 }, { 2531, -17257 }, { 2533, -17257 }, { 2537, -17257 }, { 2540, -17257 }, { 2544, -17256 }, { 2549, -17256 }, { 2550, -17259 }, { 2576, -17260 }, { 2586, -17255 }, { 2590, -17251 }, { 2592, -17248 }, { 2594, -17245 }, { 2597, -17242 }, { 2598, -17239 }, { 2599, -17236 }, { 2600, -17232 }, { 2601, -17228 }, { 2602, -17226 }, { 2603, -17224 }, { 2601, -17216 }, { 2593, -17218 }, { 2583, -17217 }, { 2573, -17216 }, { 2564, -17216 } }, "Locality" }, + mission_substance_royale = { false, { { 2693, -17011 }, { 2685, -17016 }, { 2665, -17034 }, { 2662, -17036 }, { 2659, -17039 }, { 2660, -17044 }, { 2663, -17047 }, { 2667, -17051 }, { 2670, -17054 }, { 2676, -17051 }, { 2675, -17047 }, { 2676, -17044 }, { 2678, -17041 }, { 2685, -17038 }, { 2691, -17038 }, { 2700, -17038 }, { 2716, -17029 }, { 2718, -17029 }, { 2720, -17033 }, { 2721, -17036 }, { 2721, -17039 }, { 2720, -17041 }, { 2730, -17043 }, { 2731, -17041 }, { 2734, -17037 }, { 2736, -17033 }, { 2736, -17029 }, { 2736, -17022 }, { 2735, -17018 }, { 2731, -17015 }, { 2725, -17014 }, { 2720, -17013 }, { 2709, -17011 }, { 2703, -17010 }, { 2698, -17010 } }, "Locality" }, + ["endroit_résidu_oeuf"] = { false, { { 2021, -16955 }, { 2018, -16954 }, { 2009, -16961 }, { 2010, -16963 }, { 2010, -16965 }, { 2009, -16969 }, { 2007, -16971 }, { 2013, -16977 }, { 2017, -16977 }, { 2021, -16977 }, { 2025, -16978 }, { 2032, -16971 }, { 2032, -16969 }, { 2032, -16966 }, { 2033, -16963 }, { 2034, -16961 }, { 2031, -16957 }, { 2028, -16953 }, { 2027, -16954 }, { 2026, -16955 } }, "Locality" }, + emplacement_materiau1 = { false, { { 1816, -16853 }, { 1810, -16853 }, { 1805, -16856 }, { 1798, -16863 }, { 1790, -16862 }, { 1784, -16864 }, { 1781, -16868 }, { 1779, -16871 }, { 1777, -16877 }, { 1777, -16881 }, { 1778, -16884 }, { 1780, -16887 }, { 1786, -16892 }, { 1790, -16894 }, { 1800, -16901 }, { 1804, -16901 }, { 1811, -16901 }, { 1816, -16898 }, { 1819, -16895 }, { 1826, -16883 }, { 1830, -16876 }, { 1832, -16869 }, { 1832, -16864 }, { 1833, -16861 } }, "Locality" }, + emplacement_materiau2 = { false, { { 2621, -17167 }, { 2612, -17173 }, { 2607, -17176 }, { 2603, -17183 }, { 2605, -17191 }, { 2610, -17197 }, { 2612, -17200 }, { 2615, -17207 }, { 2621, -17214 }, { 2622, -17213 }, { 2637, -17203 }, { 2640, -17203 }, { 2633, -17197 }, { 2630, -17198 }, { 2627, -17196 }, { 2623, -17192 }, { 2623, -17188 }, { 2623, -17184 }, { 2625, -17179 }, { 2632, -17176 }, { 2637, -17178 }, { 2640, -17183 }, { 2641, -17188 }, { 2639, -17192 }, { 2637, -17195 }, { 2634, -17197 }, { 2641, -17202 }, { 2643, -17201 }, { 2647, -17200 }, { 2651, -17196 }, { 2652, -17192 }, { 2654, -17188 }, { 2653, -17184 }, { 2652, -17181 }, { 2649, -17178 }, { 2646, -17175 }, { 2642, -17170 }, { 2638, -17166 }, { 2632, -17162 } }, "Locality" }, + emplacement_materiau3 = { false, { { 2588, -16927 }, { 2586, -16920 }, { 2582, -16915 }, { 2573, -16911 }, { 2569, -16906 }, { 2568, -16900 }, { 2562, -16899 }, { 2558, -16899 }, { 2554, -16899 }, { 2551, -16904 }, { 2551, -16911 }, { 2551, -16918 }, { 2554, -16923 }, { 2557, -16926 }, { 2560, -16927 }, { 2564, -16927 }, { 2570, -16927 }, { 2575, -16927 }, { 2579, -16931 }, { 2582, -16937 }, { 2583, -16943 }, { 2583, -16951 }, { 2580, -16957 }, { 2569, -16964 }, { 2565, -16970 }, { 2564, -16982 }, { 2564, -16989 }, { 2567, -16994 }, { 2573, -16994 }, { 2578, -16990 }, { 2583, -16976 }, { 2583, -16967 }, { 2586, -16951 }, { 2586, -16940 } }, "Locality" }, + emplacement_2_materiau1 = { false, { { 2433, -16633 }, { 2418, -16633 }, { 2418, -16634 }, { 2419, -16638 }, { 2420, -16644 }, { 2421, -16650 }, { 2423, -16652 }, { 2427, -16655 }, { 2431, -16655 }, { 2441, -16655 }, { 2447, -16654 }, { 2453, -16653 }, { 2456, -16652 }, { 2461, -16650 }, { 2467, -16646 }, { 2469, -16644 }, { 2471, -16641 }, { 2471, -16638 }, { 2474, -16635 }, { 2465, -16634 }, { 2457, -16633 }, { 2446, -16633 } }, "Locality" }, + emplacement_2_materiau2 = { false, { { 2335, -16632 }, { 2323, -16632 }, { 2312, -16631 }, { 2306, -16631 }, { 2304, -16634 }, { 2308, -16649 }, { 2315, -16651 }, { 2324, -16653 }, { 2329, -16654 }, { 2340, -16655 }, { 2347, -16655 }, { 2356, -16653 }, { 2358, -16651 }, { 2360, -16644 }, { 2360, -16638 }, { 2360, -16635 }, { 2356, -16635 }, { 2353, -16635 }, { 2349, -16635 }, { 2345, -16634 } }, "Locality" }, + emplacement_2_materiau3 = { false, { { 2390, -16634 }, { 2383, -16634 }, { 2374, -16634 }, { 2373, -16637 }, { 2372, -16638 }, { 2372, -16641 }, { 2372, -16645 }, { 2372, -16650 }, { 2374, -16653 }, { 2378, -16655 }, { 2384, -16655 }, { 2388, -16655 }, { 2393, -16654 }, { 2397, -16652 }, { 2401, -16650 }, { 2402, -16642 }, { 2405, -16637 }, { 2404, -16633 }, { 2397, -16633 } }, "Locality" }, + kitinslair_zone_1 = { false, { { 2226, -17094 }, { 2170, -17046 }, { 2094, -16907 }, { 2009, -16853 }, { 1961, -16906 }, { 1892, -16942 }, { 2014, -17125 }, { 2080, -17075 }, { 2176, -17100 }, { 2243, -17195 }, { 2317, -17218 }, { 2358, -17214 }, { 2394, -17209 }, { 2416, -17251 }, { 2442, -17279 }, { 2493, -17347 }, { 2501, -17419 }, { 2534, -17429 }, { 2556, -17421 }, { 2572, -17400 }, { 2570, -17374 }, { 2523, -17348 }, { 2578, -17312 }, { 2579, -17284 }, { 2621, -17232 }, { 2658, -17201 }, { 2707, -17197 }, { 2726, -17234 }, { 2789, -17223 }, { 2796, -17205 }, { 2792, -17180 }, { 2813, -17173 }, { 2821, -17147 }, { 2886, -17123 }, { 2942, -17060 }, { 2904, -17021 }, { 2897, -17001 }, { 2819, -16945 }, { 2775, -16958 }, { 2774, -16975 }, { 2730, -17007 }, { 2692, -17006 }, { 2647, -17038 }, { 2664, -17062 }, { 2505, -17159 }, { 2518, -17093 }, { 2474, -17060 }, { 2451, -17067 }, { 2449, -17119 }, { 2373, -17177 }, { 2343, -17189 }, { 2290, -17171 }, { 2273, -17163 }, { 2262, -17141 }, { 2236, -17133 }, { 2231, -17122 } }, "Locality" } + } } + } }, + continent_indoors = { true, { { 19997, -319 }, { 19997, -641 }, { 21281, -638 }, { 21279, -319 } }, { } }, + continent_zorai_island = { true, { { 13629, -3229 }, { 13594, -5217 }, { 19068, -5305 }, { 19050, -3229 } }, { + region_zorai_islands = { true, { { 13922, -3526 }, { 13922, -4802 }, { 18723, -4802 }, { 18723, -3522 } }, { + respwan_zorai_island_ranger_camp = { false, { { 14754, -3562 }, { 14749, -3578 }, { 14752, -3587 }, { 14757, -3592 }, { 14762, -3590 }, { 14763, -3583 }, { 14766, -3580 }, { 14767, -3570 }, { 14772, -3566 }, { 14775, -3562 }, { 14774, -3559 }, { 14773, -3555 }, { 14767, -3552 }, { 14763, -3555 }, { 14760, -3554 }, { 14756, -3554 } }, "Locality" }, + ["respwan_zorai_island3_rescue_camp 3"] = { false, { { 17001, -4040 }, { 17001, -4049 }, { 17005, -4055 }, { 17010, -4058 }, { 17014, -4064 }, { 17014, -4073 }, { 17028, -4077 }, { 17033, -4068 }, { 17031, -4066 }, { 17028, -4064 }, { 17031, -4061 }, { 17032, -4055 }, { 17025, -4048 }, { 17025, -4045 }, { 17025, -4041 }, { 17024, -4037 }, { 17020, -4037 }, { 17018, -4035 }, { 17014, -4035 }, { 17010, -4035 }, { 17005, -4035 } }, "Locality" } + } } + } }, + continent_zorai_newbie = { true, { { 6889, -4077 }, { 7073, -5767 }, { 8913, -5749 }, { 9221, -4895 }, { 8974, -4174 } }, { + zorai_nland = { true, { { 6941, -4087 }, { 7100, -5733 }, { 8886, -5698 }, { 9185, -4888 }, { 8956, -4210 }, { 7856, -4149 } }, { + place_qai_lo = { true, { { 7254, -4464 }, { 7287, -4467 }, { 7317, -4455 }, { 7334, -4449 }, { 7335, -4422 }, { 7356, -4412 }, { 7356, -4384 }, { 7325, -4352 }, { 7297, -4345 }, { 7293, -4323 }, { 7266, -4327 }, { 7218, -4342 }, { 7217, -4382 }, { 7211, -4416 }, { 7225, -4439 } }, "Village" }, + place_sheng_wo = { true, { { 7747, -4812 }, { 7712, -4833 }, { 7696, -4871 }, { 7696, -4894 }, { 7709, -4928 }, { 7747, -4942 }, { 7772, -4945 }, { 7803, -4922 }, { 7824, -4891 }, { 7824, -4862 }, { 7806, -4827 }, { 7769, -4812 } }, "Village" }, + place_men_xing = { true, { { 8385, -4490 }, { 8346, -4507 }, { 8336, -4547 }, { 8336, -4574 }, { 8349, -4604 }, { 8384, -4671 }, { 8406, -4684 }, { 8422, -4673 }, { 8455, -4606 }, { 8460, -4542 }, { 8446, -4506 }, { 8412, -4488 } }, "Village" }, + place_koi_zun = { true, { { 7425, -5302 }, { 7393, -5313 }, { 7382, -5351 }, { 7383, -5377 }, { 7392, -5411 }, { 7429, -5416 }, { 7452, -5418 }, { 7492, -5393 }, { 7503, -5373 }, { 7502, -5344 }, { 7487, -5309 }, { 7451, -5301 } }, "Village" }, + place_yin_piang = { true, { { 8339, -5183 }, { 8338, -5218 }, { 8352, -5249 }, { 8378, -5258 }, { 8412, -5261 }, { 8462, -5245 }, { 8463, -5218 }, { 8463, -5178 }, { 8444, -5149 }, { 8409, -5140 }, { 8383, -5138 }, { 8352, -5150 } }, "Village" }, + place_qai_lo_indoors = { false, { { 7255, -4368 }, { 7253, -4371 }, { 7256, -4370 } }, "Village" }, + place_sheng_wo_indoors = { false, { { 7738, -4870 }, { 7735, -4873 }, { 7738, -4875 } }, "Village" }, + place_men_xing_indoors = { false, { { 8409, -4549 }, { 8406, -4552 }, { 8411, -4553 } }, "Village" }, + place_koi_zun_indoors = { false, { { 7456, -5373 }, { 7454, -5376 }, { 7458, -5376 } }, "Village" }, + place_yin_piang_indoors = { false, { { 8399, -5199 }, { 8398, -5205 }, { 8402, -5202 } }, "Village" } + } } + } }, + continent_matis_island = { true, { { 14054, -125 }, { 13949, -1673 }, { 18806, -1709 }, { 18806, -125 } }, { + region_matis_island_1 = { true, { { 14175, -386 }, { 14159, -1539 }, { 15301, -1519 }, { 15290, -389 } }, { + place_matis_island_1 = { true, { { 15216, -488 }, { 14777, -447 }, { 14272, -493 }, { 14210, -975 }, { 14258, -1418 }, { 14711, -1492 }, { 15204, -1428 }, { 15266, -957 } }, "Village" }, + episode2_camp_kami_matis_island = { true, { { 15128, -1160 }, { 15059, -1217 }, { 15057, -1221 }, { 15043, -1238 }, { 15040, -1239 }, { 15032, -1368 }, { 15122, -1387 }, { 15186, -1337 }, { 15176, -1182 }, { 15150, -1169 }, { 15135, -1176 } }, "Locality" }, + episode2_camp_karavan_matis_island = { true, { { 14424, -658 }, { 14441, -503 }, { 14349, -508 }, { 14285, -510 }, { 14260, -587 }, { 14264, -675 }, { 14254, -735 }, { 14306, -779 }, { 14404, -677 }, { 14404, -675 }, { 14421, -659 } }, "Locality" } + } }, + region_matis_island_2 = { true, { { 15832, -460 }, { 15837, -1441 }, { 16506, -1441 }, { 16507, -441 } }, { + boss_tryker_light_island_zone = { false, { { 15848, -1400 }, { 16115, -1482 }, { 16488, -1425 }, { 16551, -972 }, { 16497, -506 }, { 16171, -463 }, { 15858, -489 }, { 15805, -960 } }, "Locality" }, + place_matis_island_2 = { true, { { 16506, -497 }, { 16177, -447 }, { 15851, -484 }, { 15789, -966 }, { 15838, -1410 }, { 16111, -1492 }, { 16493, -1437 }, { 16555, -966 } }, "Village" } + } }, + region_matis_island_3 = { true, { { 16937, -299 }, { 16932, -1460 }, { 18420, -1465 }, { 18415, -290 } }, { + place_matis_island_3 = { true, { { 18318, -374 }, { 17708, -341 }, { 17066, -388 }, { 17004, -869 }, { 17052, -1313 }, { 17642, -1386 }, { 18306, -1314 }, { 18368, -843 } }, "Village" } + } } + } }, + continent_matis_newbie = { true, { { 114, -5285 }, { 96, -7450 }, { 2789, -7995 }, { 2718, -5971 } }, { + matis_nland = { true, { { 2628, -6087 }, { 269, -5488 }, { 252, -7354 }, { 2672, -7776 } }, { + place_stalli = { true, { { 844, -6376 }, { 871, -6374 }, { 907, -6359 }, { 915, -6335 }, { 920, -6308 }, { 908, -6291 }, { 906, -6273 }, { 890, -6253 }, { 872, -6243 }, { 841, -6243 }, { 819, -6256 }, { 806, -6277 }, { 803, -6320 }, { 823, -6354 } }, "Village" }, + place_borea = { true, { { 1517, -6699 }, { 1543, -6700 }, { 1569, -6690 }, { 1587, -6652 }, { 1586, -6619 }, { 1576, -6610 }, { 1562, -6591 }, { 1540, -6583 }, { 1513, -6581 }, { 1489, -6588 }, { 1475, -6604 }, { 1464, -6651 }, { 1496, -6687 } }, "Village" }, + place_nistia = { true, { { 2115, -6675 }, { 2141, -6684 }, { 2168, -6688 }, { 2207, -6680 }, { 2231, -6654 }, { 2233, -6617 }, { 2229, -6595 }, { 2211, -6570 }, { 2177, -6568 }, { 2139, -6573 }, { 2117, -6594 }, { 2106, -6627 } }, "Village" }, + place_rosilio = { true, { { 1007, -6998 }, { 1051, -7001 }, { 1067, -6979 }, { 1088, -6952 }, { 1087, -6916 }, { 1068, -6899 }, { 1040, -6886 }, { 994, -6888 }, { 973, -6901 }, { 964, -6917 }, { 962, -6947 }, { 972, -6975 } }, "Village" }, + place_miani = { true, { { 1792, -7174 }, { 1823, -7180 }, { 1857, -7168 }, { 1886, -7147 }, { 1890, -7098 }, { 1887, -7084 }, { 1866, -7058 }, { 1821, -7051 }, { 1776, -7058 }, { 1747, -7098 }, { 1751, -7120 }, { 1763, -7140 } }, "Village" }, + place_stalli_indoors = { false, { { 842, -6304 }, { 841, -6304 }, { 840, -6306 }, { 844, -6307 }, { 845, -6304 } }, "Village" }, + place_borea_indoors = { false, { { 1512, -6628 }, { 1511, -6630 }, { 1510, -6632 }, { 1512, -6633 }, { 1515, -6630 } }, "Village" }, + place_nistia_indoors = { false, { { 2186, -6611 }, { 2184, -6611 }, { 2183, -6614 }, { 2185, -6615 }, { 2187, -6614 } }, "Village" }, + place_rosilio_indoors = { false, { { 1008, -6931 }, { 1006, -6932 }, { 1006, -6933 }, { 1009, -6935 }, { 1009, -6932 } }, "Village" }, + place_miani_indoors = { false, { { 1808, -7104 }, { 1803, -7104 }, { 1805, -7107 }, { 1808, -7107 }, { 1809, -7106 } }, "Village" } + } } + } }, + continent_fyros_islands = { true, { { 20962, -23672 }, { 20962, -25080 }, { 26075, -25098 }, { 26084, -23681 } }, { + ["region_fyros_island1PvP 3"] = { true, { { 21096, -23824 }, { 21100, -24972 }, { 22257, -24976 }, { 22257, -23817 } }, { } }, + region_fyros_island2 = { true, { { 22702, -23830 }, { 22703, -24816 }, { 24337, -24817 }, { 24336, -23821 } }, { } }, + region_fyros_island3 = { true, { { 24775, -23825 }, { 24775, -24507 }, { 25936, -24507 }, { 25941, -23821 } }, { } } + } }, + continent_fyros_newbie = { true, { { 20876, -25174 }, { 20902, -27092 }, { 23305, -27145 }, { 23287, -25235 } }, { + ["region_fyros_island1PvP 3"] = { true, { { 21096, -23824 }, { 21100, -24972 }, { 22257, -24976 }, { 22257, -23817 } }, { } }, + region_fyros_island2 = { true, { { 22702, -23830 }, { 22703, -24816 }, { 24337, -24817 }, { 24336, -23821 } }, { } }, + region_fyros_island3 = { true, { { 24775, -23825 }, { 24775, -24507 }, { 25936, -24507 }, { 25941, -23821 } }, { } } + } }, + continent_tryker_island = { true, { { 20790, -29117 }, { 20799, -31036 }, { 27513, -31062 }, { 27504, -29126 } }, { + region_tryker_island1 = { true, { { 21063, -29399 }, { 21056, -29962 }, { 21784, -29962 }, { 21787, -29395 } }, { } }, + region_tryker_island2 = { true, { { 22033, -29400 }, { 22028, -30276 }, { 22754, -30280 }, { 22746, -29405 } }, { } }, + region_tryker_island3 = { true, { { 22996, -29400 }, { 22996, -30276 }, { 24352, -30263 }, { 24343, -29405 } }, { } }, + region_tryker_island4 = { true, { { 24761, -29550 }, { 24761, -30593 }, { 25790, -30602 }, { 25777, -29563 } }, { } }, + region_tryker_island5 = { true, { { 26208, -29383 }, { 26204, -30430 }, { 27220, -30439 }, { 27234, -29387 } }, { } } + } }, + continent_tryker_newbie = { true, { { 20625, -32667 }, { 20537, -35219 }, { 23494, -35202 }, { 23423, -32826 } }, { + tryker_nland = { true, { { 20793, -32950 }, { 20787, -34128 }, { 20951, -34740 }, { 21109, -34898 }, { 23214, -34895 }, { 23222, -33422 }, { 23055, -33109 }, { 22560, -32937 } }, { + place_aubermouth = { true, { { 21191, -33753 }, { 21138, -33765 }, { 21114, -33795 }, { 21111, -33841 }, { 21114, -33886 }, { 21141, -33929 }, { 21203, -33936 }, { 21264, -33924 }, { 21282, -33872 }, { 21281, -33821 }, { 21268, -33784 }, { 21230, -33755 } }, "Village" }, + place_barkdell = { true, { { 22223, -33764 }, { 22187, -33747 }, { 22141, -33746 }, { 22106, -33771 }, { 22086, -33794 }, { 22067, -33819 }, { 22059, -33844 }, { 22058, -33899 }, { 22086, -33922 }, { 22158, -33929 }, { 22191, -33913 }, { 22235, -33867 }, { 22237, -33808 } }, "Village" }, + place_hobwelly = { true, { { 22825, -33428 }, { 22720, -33455 }, { 22700, -33477 }, { 22698, -33528 }, { 22723, -33581 }, { 22748, -33594 }, { 22880, -33556 }, { 22909, -33520 }, { 22913, -33489 }, { 22862, -33428 } }, "Village" }, + place_waverton = { true, { { 21410, -34556 }, { 21341, -34547 }, { 21319, -34553 }, { 21273, -34598 }, { 21262, -34632 }, { 21269, -34682 }, { 21291, -34706 }, { 21331, -34717 }, { 21367, -34718 }, { 21427, -34683 }, { 21447, -34625 }, { 21441, -34597 } }, "Village" }, + place_dingleton = { true, { { 22668, -34547 }, { 22591, -34550 }, { 22544, -34592 }, { 22533, -34624 }, { 22563, -34690 }, { 22590, -34719 }, { 22628, -34729 }, { 22708, -34728 }, { 22731, -34701 }, { 22723, -34630 }, { 22721, -34592 }, { 22696, -34558 } }, "Village" }, + place_aubermouth_indoors = { false, { { 21206, -33818 }, { 21206, -33819 }, { 21206, -33819 } }, "Village" }, + place_barkdell_indoors = { false, { { 22159, -33844 }, { 22158, -33845 }, { 22159, -33845 } }, "Village" }, + place_hobwelly_indoors = { false, { { 22800, -33498 }, { 22799, -33499 }, { 22800, -33499 } }, "Village" }, + place_waverton_indoors = { false, { { 21339, -34630 }, { 21339, -34631 }, { 21339, -34631 } }, "Village" }, + place_dingleton_indoors = { false, { { 22646, -34630 }, { 22645, -34632 }, { 22646, -34632 } }, "Village" } + } } + } }, + continent_r2_roots = { true, { { 40959, -20800 }, { 30960, -20800 }, { 30960, -30799 }, { 40959, -30799 } }, { + uiR2_Primes30 = { true, { { 33927, -22559 }, { 33519, -22559 }, { 33519, -23046 }, { 33927, -23046 } }, { } }, + uiR2_Primes22 = { true, { { 37767, -21753 }, { 37275, -21753 }, { 37275, -22407 }, { 37767, -22407 } }, { } }, + uiR2_Primes21 = { true, { { 37124, -21753 }, { 36558, -21753 }, { 36558, -22407 }, { 37124, -22407 } }, { } }, + uiR2_Primes23 = { true, { { 38481, -21759 }, { 37914, -21759 }, { 37914, -22406 }, { 38481, -22406 } }, { } }, + uiR2_Primes15 = { true, { { 32484, -21753 }, { 31834, -21753 }, { 31834, -22325 }, { 32484, -22325 } }, { } }, + uiR2_Primes05 = { true, { { 34407, -20954 }, { 33755, -20954 }, { 33755, -21601 }, { 34407, -21601 } }, { } }, + uiR2_Primes29 = { true, { { 33287, -22559 }, { 32633, -22559 }, { 32633, -23206 }, { 33287, -23206 } }, { } }, + uiR2_Primes20 = { true, { { 36029, -21914 }, { 35677, -21914 }, { 35677, -22247 }, { 36029, -22247 } }, { } }, + uiR2_Primes01 = { true, { { 31367, -20959 }, { 31033, -20959 }, { 31033, -21606 }, { 31367, -21606 } }, { } }, + uiR2_Primes19 = { true, { { 35514, -21746 }, { 34874, -21746 }, { 34874, -22485 }, { 35514, -22485 } }, { } }, + uiR2_Primes09 = { true, { { 37594, -20953 }, { 36799, -20953 }, { 36799, -21446 }, { 37594, -21446 } }, { } }, + uiR2_Primes14 = { true, { { 31685, -21754 }, { 31033, -21754 }, { 31033, -22406 }, { 31685, -22406 } }, { } }, + uiR2_Primes16 = { true, { { 33127, -21753 }, { 32635, -21753 }, { 32635, -22247 }, { 33127, -22247 } }, { } }, + uiR2_Primes25 = { true, { { 40163, -21913 }, { 39677, -21913 }, { 39677, -22406 }, { 40163, -22406 } }, { } }, + uiR2_Primes28 = { true, { { 32486, -22559 }, { 31834, -22559 }, { 31834, -23207 }, { 32486, -23207 } }, { } }, + uiR2_Primes27 = { true, { { 31686, -22553 }, { 31033, -22553 }, { 31033, -23206 }, { 31686, -23206 } }, { } }, + uiR2_Primes18 = { true, { { 34726, -21766 }, { 34078, -21766 }, { 34078, -22309 }, { 34726, -22309 } }, { } }, + uiR2_Primes10 = { true, { { 38247, -20955 }, { 37753, -20955 }, { 37753, -21594 }, { 38247, -21594 } }, { } }, + uiR2_Primes08 = { true, { { 36648, -20953 }, { 35994, -20953 }, { 35994, -21607 }, { 36648, -21607 } }, { } }, + uiR2_Primes26 = { true, { { 40806, -21914 }, { 40313, -21914 }, { 40313, -22406 }, { 40806, -22406 } }, { } }, + uiR2_Primes03 = { true, { { 32807, -20953 }, { 32153, -20953 }, { 32153, -21604 }, { 32807, -21604 } }, { } }, + uiR2_Primes13 = { true, { { 40641, -21211 }, { 39995, -21211 }, { 39995, -21762 }, { 40641, -21762 } }, { } }, + uiR2_Primes17 = { true, { { 33926, -21754 }, { 33273, -21754 }, { 33273, -22401 }, { 33926, -22401 } }, { } }, + uiR2_Primes06 = { true, { { 35046, -20954 }, { 34554, -20954 }, { 34554, -21521 }, { 35046, -21521 } }, { } }, + uiR2_Primes04 = { true, { { 33606, -20954 }, { 32953, -20954 }, { 32953, -21607 }, { 33606, -21607 } }, { } }, + uiR2_Primes24 = { true, { { 39429, -21753 }, { 38798, -21753 }, { 38798, -22407 }, { 39429, -22407 } }, { } }, + uiR2_Primes07 = { true, { { 35845, -20954 }, { 35193, -20954 }, { 35193, -21615 }, { 35845, -21615 } }, { } }, + uiR2_Primes11 = { true, { { 39047, -20956 }, { 38393, -20956 }, { 38393, -21607 }, { 39047, -21607 } }, { } }, + uiR2_Primes12 = { true, { { 39841, -21063 }, { 39199, -21063 }, { 39199, -21497 }, { 39841, -21497 } }, { } } + } }, + continent_r2_desert = { true, { { 30959, -800 }, { 20960, -800 }, { 20960, -10799 }, { 30959, -10799 } }, { + uiR2_Deserts35 = { true, { { 23529, -2288 }, { 23192, -2288 }, { 23192, -2725 }, { 23529, -2725 } }, { } }, + uiR2_Deserts34 = { true, { { 21958, -2362 }, { 21271, -2362 }, { 21271, -2895 }, { 21958, -2895 } }, { } }, + uiR2_Deserts33 = { true, { { 30885, -961 }, { 30235, -961 }, { 30235, -1598 }, { 30885, -1598 } }, { } }, + uiR2_Deserts32 = { true, { { 29278, -1052 }, { 28635, -1052 }, { 28635, -1599 }, { 29278, -1599 } }, { } }, + uiR2_Deserts31 = { true, { { 25776, -1864 }, { 25108, -1864 }, { 25108, -2412 }, { 25776, -2412 } }, { } }, + uiR2_Deserts30 = { true, { { 27079, -2395 }, { 26523, -2395 }, { 26523, -2816 }, { 27079, -2816 } }, { } }, + uiR2_Deserts29 = { true, { { 30885, -1756 }, { 30235, -1756 }, { 30235, -2405 }, { 30885, -2405 } }, { } }, + uiR2_Deserts28 = { true, { { 24005, -962 }, { 23355, -962 }, { 23355, -1605 }, { 24005, -1605 } }, { } }, + uiR2_Deserts27 = { true, { { 21764, -962 }, { 21275, -962 }, { 21275, -1445 }, { 21764, -1445 } }, { } }, + uiR2_Deserts26 = { true, { { 26255, -2335 }, { 25807, -2335 }, { 25807, -2707 }, { 26255, -2707 } }, { } }, + uiR2_Deserts25 = { true, { { 28370, -1704 }, { 27846, -1704 }, { 27846, -2090 }, { 28370, -2090 } }, { } }, + uiR2_Deserts24 = { true, { { 24015, -1750 }, { 23510, -1750 }, { 23510, -2334 }, { 24015, -2334 } }, { } }, + uiR2_Deserts23 = { true, { { 27690, -1808 }, { 27345, -1808 }, { 27345, -2416 }, { 27690, -2416 } }, { } }, + uiR2_Deserts22 = { true, { { 30077, -962 }, { 29441, -962 }, { 29441, -1599 }, { 30077, -1599 } }, { } }, + uiR2_Deserts21 = { true, { { 22992, -2235 }, { 22236, -2235 }, { 22236, -2724 }, { 22992, -2724 } }, { } }, + uiR2_Deserts20 = { true, { { 24709, -956 }, { 24161, -956 }, { 24161, -1598 }, { 24709, -1598 } }, { } }, + uiR2_Deserts19 = { true, { { 27134, -1808 }, { 26843, -1808 }, { 26843, -2117 }, { 27134, -2117 } }, { } }, + uiR2_Deserts18 = { true, { { 25604, -956 }, { 24955, -956 }, { 24955, -1605 }, { 25604, -1605 } }, { } }, + uiR2_Deserts17 = { true, { { 27813, -2550 }, { 27349, -2550 }, { 27349, -2785 }, { 27813, -2785 } }, { } }, + uiR2_Deserts16 = { true, { { 25215, -2466 }, { 24785, -2466 }, { 24785, -2874 }, { 25215, -2874 } }, { } }, + uiR2_Deserts15 = { true, { { 22090, -1704 }, { 21401, -1704 }, { 21401, -2084 }, { 22090, -2084 } }, { } }, + uiR2_Deserts14 = { true, { { 28359, -2225 }, { 27946, -2225 }, { 27946, -2760 }, { 28359, -2760 } }, { } }, + uiR2_Deserts13 = { true, { { 23363, -1648 }, { 23000, -1648 }, { 23000, -1985 }, { 23363, -1985 } }, { } }, + uiR2_Deserts12 = { true, { { 24963, -1864 }, { 24156, -1864 }, { 24156, -2145 }, { 24963, -2145 } }, { } }, + uiR2_Deserts11 = { true, { { 27909, -956 }, { 27361, -956 }, { 27361, -1605 }, { 27909, -1605 } }, { } }, + uiR2_Deserts10 = { true, { { 29029, -1851 }, { 28483, -1851 }, { 28483, -2309 }, { 29029, -2309 } }, { } }, + uiR2_Deserts9 = { true, { { 29959, -1917 }, { 29430, -1917 }, { 29430, -2566 }, { 29959, -2566 } }, { } }, + uiR2_Deserts8 = { true, { { 26238, -956 }, { 25755, -956 }, { 25755, -1597 }, { 26238, -1597 } }, { } }, + uiR2_Deserts7 = { true, { { 23109, -1051 }, { 22723, -1051 }, { 22723, -1349 }, { 23109, -1349 } }, { } }, + uiR2_Deserts6 = { true, { { 22730, -1750 }, { 22234, -1750 }, { 22234, -2067 }, { 22730, -2067 } }, { } }, + uiR2_Deserts5 = { true, { { 26494, -1808 }, { 25915, -1808 }, { 25915, -2095 }, { 26494, -2095 } }, { } }, + uiR2_Deserts4 = { true, { { 22558, -962 }, { 21921, -962 }, { 21921, -1599 }, { 22558, -1599 } }, { } }, + uiR2_Deserts3 = { true, { { 27038, -962 }, { 26401, -962 }, { 26401, -1605 }, { 27038, -1605 } }, { } } + } }, + continent_r2_lakes = { true, { { 40959, -800 }, { 30960, -800 }, { 30960, -10799 }, { 40959, -10799 } }, { + uiR2_Lakes41 = { true, { { 38632, -3351 }, { 38074, -3351 }, { 38074, -3912 }, { 38632, -3912 } }, { } }, + uiR2_Lakes40 = { true, { { 33774, -3511 }, { 33103, -3511 }, { 33103, -4168 }, { 33774, -4168 } }, { } }, + uiR2_Lakes39 = { true, { { 36009, -802 }, { 35351, -802 }, { 35351, -1413 }, { 36009, -1413 } }, { } }, + uiR2_Lakes38 = { true, { { 31691, -953 }, { 31029, -953 }, { 31029, -1611 }, { 31691, -1611 } }, { } }, + uiR2_Lakes37 = { true, { { 34190, -2672 }, { 33746, -2672 }, { 33746, -3345 }, { 34190, -3345 } }, { } }, + uiR2_Lakes36 = { true, { { 38602, -1744 }, { 38066, -1744 }, { 38066, -2385 }, { 38602, -2385 } }, { } }, + uiR2_Lakes35 = { true, { { 32814, -2704 }, { 32463, -2704 }, { 32463, -3207 }, { 32814, -3207 } }, { } }, + uiR2_Lakes34 = { true, { { 36247, -1753 }, { 35826, -1753 }, { 35826, -2407 }, { 36247, -2407 } }, { } }, + uiR2_Lakes33 = { true, { { 33600, -2672 }, { 33076, -2672 }, { 33076, -3252 }, { 33600, -3252 } }, { } }, + uiR2_Lakes32 = { true, { { 37933, -3485 }, { 37236, -3485 }, { 37236, -4048 }, { 37933, -4048 } }, { } }, + uiR2_Lakes31 = { true, { { 38566, -2587 }, { 38007, -2587 }, { 38007, -3173 }, { 38566, -3173 } }, { } }, + uiR2_Lakes30 = { true, { { 32170, -3521 }, { 31855, -3521 }, { 31855, -3950 }, { 32170, -3950 } }, { } }, + uiR2_Lakes29 = { true, { { 34726, -1787 }, { 34008, -1787 }, { 34008, -2152 }, { 34726, -2152 } }, { } }, + uiR2_Lakes28 = { true, { { 36641, -2554 }, { 35991, -2554 }, { 35991, -3209 }, { 36641, -3209 } }, { } }, + uiR2_Lakes27 = { true, { { 34533, -3514 }, { 33947, -3514 }, { 33947, -4166 }, { 34533, -4166 } }, { } }, + uiR2_Lakes26 = { true, { { 39046, -987 }, { 38398, -987 }, { 38398, -1609 }, { 39046, -1609 } }, { } }, + uiR2_Lakes25 = { true, { { 37449, -987 }, { 36827, -987 }, { 36827, -1609 }, { 37449, -1609 } }, { } }, + uiR2_Lakes24 = { true, { { 32486, -1848 }, { 31839, -1848 }, { 31839, -2569 }, { 32486, -2569 } }, { } }, + uiR2_Lakes23 = { true, { { 35682, -1753 }, { 34869, -1753 }, { 34869, -2411 }, { 35682, -2411 } }, { } }, + uiR2_Lakes22 = { true, { { 32835, -3506 }, { 32308, -3506 }, { 32308, -4036 }, { 32835, -4036 } }, { } }, + uiR2_Lakes21 = { true, { { 35752, -2551 }, { 35038, -2551 }, { 35038, -3173 }, { 35752, -3173 } }, { } }, + uiR2_Lakes20 = { true, { { 32336, -2715 }, { 31833, -2715 }, { 31833, -3287 }, { 32336, -3287 } }, { } }, + uiR2_Lakes19 = { true, { { 32483, -949 }, { 31833, -949 }, { 31833, -1611 }, { 32483, -1611 } }, { } }, + uiR2_Lakes18 = { true, { { 37858, -1864 }, { 37276, -1864 }, { 37276, -2385 }, { 37858, -2385 } }, { } }, + uiR2_Lakes17 = { true, { { 35266, -3506 }, { 34823, -3506 }, { 34823, -3888 }, { 35266, -3888 } }, { } }, + uiR2_Lakes16 = { true, { { 34830, -2546 }, { 34415, -2546 }, { 34415, -3198 }, { 34830, -3198 } }, { } }, + uiR2_Lakes15 = { true, { { 31653, -1847 }, { 31034, -1847 }, { 31034, -2406 }, { 31653, -2406 } }, { } }, + uiR2_Lakes14 = { true, { { 33446, -827 }, { 32639, -827 }, { 32639, -1609 }, { 33446, -1609 } }, { } }, + uiR2_Lakes13 = { true, { { 35101, -827 }, { 34554, -827 }, { 34554, -1353 }, { 35101, -1353 } }, { } }, + uiR2_Lakes12 = { true, { { 37672, -2719 }, { 36888, -2719 }, { 36888, -3173 }, { 37672, -3173 } }, { } }, + uiR2_Lakes11 = { true, { { 31694, -3632 }, { 31152, -3632 }, { 31152, -4174 }, { 31694, -4174 } }, { } }, + uiR2_Lakes10 = { true, { { 36009, -3506 }, { 35511, -3506 }, { 35511, -4014 }, { 36009, -4014 } }, { } }, + uiR2_Lakes9 = { true, { { 34373, -952 }, { 33627, -952 }, { 33627, -1352 }, { 34373, -1352 } }, { } }, + uiR2_Lakes8 = { true, { { 33672, -2008 }, { 33368, -2008 }, { 33368, -2312 }, { 33672, -2312 } }, { } }, + uiR2_Lakes7 = { true, { { 38249, -959 }, { 37599, -959 }, { 37599, -1609 }, { 38249, -1609 } }, { } }, + uiR2_Lakes6 = { true, { { 36552, -951 }, { 36154, -951 }, { 36154, -1413 }, { 36552, -1413 } }, { } }, + uiR2_Lakes5 = { true, { { 31591, -2678 }, { 31032, -2678 }, { 31032, -3244 }, { 31591, -3244 } }, { } }, + uiR2_Lakes4 = { true, { { 37004, -1878 }, { 36530, -1878 }, { 36530, -2327 }, { 37004, -2327 } }, { } }, + uiR2_Lakes3 = { true, { { 36945, -3521 }, { 36146, -3521 }, { 36146, -4174 }, { 36945, -4174 } }, { } } + } }, + continent_r2_forest = { true, { { 30959, -10800 }, { 20960, -10800 }, { 20960, -20799 }, { 30959, -20799 } }, { + uiR2_Forest48 = { true, { { 29826, -12477 }, { 29277, -12477 }, { 29277, -13123 }, { 29826, -13123 } }, { } }, + uiR2_Forest47 = { true, { { 27334, -12474 }, { 26865, -12474 }, { 26865, -13026 }, { 27334, -13026 } }, { } }, + uiR2_Forest46 = { true, { { 25094, -13282 }, { 24465, -13282 }, { 24465, -14878 }, { 25094, -14878 } }, { } }, + uiR2_Forest45 = { true, { { 21924, -12465 }, { 21466, -12465 }, { 21466, -12805 }, { 21924, -12805 } }, { } }, + uiR2_Forest44 = { true, { { 23170, -12465 }, { 22714, -12465 }, { 22714, -13055 }, { 23170, -13055 } }, { } }, + uiR2_Forest43 = { true, { { 30730, -12506 }, { 30076, -12506 }, { 30076, -13094 }, { 30730, -13094 } }, { } }, + uiR2_Forest42 = { true, { { 25768, -12475 }, { 25105, -12475 }, { 25105, -13124 }, { 25768, -13124 } }, { } }, + uiR2_Forest41 = { true, { { 28178, -13425 }, { 26590, -13425 }, { 26590, -14566 }, { 28178, -14566 } }, { } }, + uiR2_Forest40 = { true, { { 25917, -10972 }, { 25282, -10972 }, { 25282, -11552 }, { 25917, -11552 } }, { } }, + uiR2_Forest39 = { true, { { 24934, -12474 }, { 24475, -12474 }, { 24475, -13126 }, { 24934, -13126 } }, { } }, + uiR2_Forest38 = { true, { { 21615, -11672 }, { 20954, -11672 }, { 20954, -12326 }, { 21615, -12326 } }, { } }, + uiR2_Forest37 = { true, { { 28808, -10906 }, { 28474, -10906 }, { 28474, -11334 }, { 28808, -11334 } }, { } }, + uiR2_Forest36 = { true, { { 28324, -10865 }, { 27665, -10865 }, { 27665, -11371 }, { 28324, -11371 } }, { } }, + uiR2_Forest35 = { true, { { 26245, -11825 }, { 25594, -11825 }, { 25594, -12326 }, { 26245, -12326 } }, { } }, + uiR2_Forest34 = { true, { { 28655, -11857 }, { 27825, -11857 }, { 27825, -12290 }, { 28655, -12290 } }, { } }, + uiR2_Forest33 = { true, { { 24015, -11672 }, { 23345, -11672 }, { 23345, -12326 }, { 24015, -12326 } }, { } }, + uiR2_Forest32 = { true, { { 24638, -11752 }, { 24149, -11752 }, { 24149, -12158 }, { 24638, -12158 } }, { } }, + uiR2_Forest31 = { true, { { 30054, -10910 }, { 29786, -10910 }, { 29786, -11204 }, { 30054, -11204 } }, { } }, + uiR2_Forest30 = { true, { { 26730, -10875 }, { 26065, -10875 }, { 26065, -11525 }, { 26730, -11525 } }, { } }, + uiR2_Forest29 = { true, { { 24068, -12475 }, { 23345, -12475 }, { 23345, -13126 }, { 24068, -13126 } }, { } }, + uiR2_Forest28 = { true, { { 23526, -10872 }, { 22872, -10872 }, { 22872, -11535 }, { 23526, -11535 } }, { } }, + uiR2_Forest27 = { true, { { 27528, -10865 }, { 26872, -10865 }, { 26872, -11535 }, { 27528, -11535 } }, { } }, + uiR2_Forest26 = { true, { { 22415, -11665 }, { 21752, -11665 }, { 21752, -12335 }, { 22415, -12335 } }, { } }, + uiR2_Forest25 = { true, { { 23215, -11670 }, { 22622, -11670 }, { 22622, -12335 }, { 23215, -12335 } }, { } }, + uiR2_Forest24 = { true, { { 23457, -13275 }, { 22712, -13275 }, { 22712, -13764 }, { 23457, -13764 } }, { } }, + uiR2_Forest23 = { true, { { 29615, -10872 }, { 28952, -10872 }, { 28952, -11526 }, { 29615, -11526 } }, { } }, + uiR2_Forest22 = { true, { { 29444, -11706 }, { 28826, -11706 }, { 28826, -12290 }, { 29444, -12290 } }, { } }, + uiR2_Forest21 = { true, { { 22575, -12956 }, { 21946, -12956 }, { 21946, -13615 }, { 22575, -13615 } }, { } }, + uiR2_Forest20 = { true, { { 22488, -12475 }, { 22106, -12475 }, { 22106, -12811 }, { 22488, -12811 } }, { } }, + uiR2_Forest19 = { true, { { 26895, -11717 }, { 26385, -11717 }, { 26385, -12326 }, { 26895, -12326 } }, { } }, + uiR2_Forest18 = { true, { { 21926, -10883 }, { 21283, -10883 }, { 21283, -11528 }, { 21926, -11528 } }, { } }, + uiR2_Forest17 = { true, { { 28319, -12454 }, { 27674, -12454 }, { 27674, -13135 }, { 28319, -13135 } }, { } }, + uiR2_Forest16 = { true, { { 24330, -13275 }, { 23674, -13275 }, { 23674, -13925 }, { 24330, -13925 } }, { } }, + uiR2_Forest15 = { true, { { 21250, -12510 }, { 20990, -12510 }, { 20990, -12770 }, { 21250, -12770 } }, { } }, + uiR2_Forest14 = { true, { { 25130, -10943 }, { 24469, -10943 }, { 24469, -11531 }, { 25130, -11531 } }, { } }, + uiR2_Forest13 = { true, { { 29094, -12453 }, { 28476, -12453 }, { 28476, -13094 }, { 29094, -13094 } }, { } }, + uiR2_Forest12 = { true, { { 21605, -13119 }, { 21032, -13119 }, { 21032, -13606 }, { 21605, -13606 } }, { } }, + uiR2_Forest11 = { true, { { 25444, -11839 }, { 24785, -11839 }, { 24785, -12326 }, { 25444, -12326 } }, { } }, + uiR2_Forest10 = { true, { { 26725, -12472 }, { 26065, -12472 }, { 26065, -12963 }, { 26725, -12963 } }, { } }, + uiR2_Forest9 = { true, { { 30095, -11665 }, { 29594, -11665 }, { 29594, -12166 }, { 30095, -12166 } }, { } }, + uiR2_Forest8 = { true, { { 30884, -11675 }, { 30270, -11675 }, { 30270, -12015 }, { 30884, -12015 } }, { } }, + uiR2_Forest7 = { true, { { 24335, -10876 }, { 23674, -10876 }, { 23674, -11525 }, { 24335, -11525 } }, { } }, + uiR2_Forest6 = { true, { { 26255, -13432 }, { 25425, -13432 }, { 25425, -14246 }, { 26255, -14246 } }, { } }, + uiR2_Forest5 = { true, { { 27686, -11825 }, { 27025, -11825 }, { 27025, -12335 }, { 27686, -12335 } }, { } }, + uiR2_Forest4 = { true, { { 30882, -10875 }, { 30266, -10875 }, { 30266, -11366 }, { 30882, -11366 } }, { } }, + uiR2_Forest3 = { true, { { 22557, -10875 }, { 22083, -10875 }, { 22083, -11528 }, { 22557, -11528 } }, { } } + } }, + continent_r2_jungle = { true, { { 40959, -10800 }, { 30960, -10800 }, { 30960, -20799 }, { 40959, -20799 } }, { + uiR2_Jungle51 = { true, { { 32577, -12475 }, { 32154, -12475 }, { 32154, -12898 }, { 32577, -12898 } }, { } }, + uiR2_Jungle50 = { true, { { 35685, -13274 }, { 35034, -13274 }, { 35034, -13765 }, { 35685, -13765 } }, { } }, + uiR2_Jungle49 = { true, { { 37217, -12630 }, { 36702, -12630 }, { 36702, -13131 }, { 37217, -13131 } }, { } }, + uiR2_Jungle48 = { true, { { 34488, -12636 }, { 34052, -12636 }, { 34052, -13058 }, { 34488, -13058 } }, { } }, + uiR2_Jungle47 = { true, { { 39526, -12634 }, { 38873, -12634 }, { 38873, -13126 }, { 39526, -13126 } }, { } }, + uiR2_Jungle46 = { true, { { 38558, -11675 }, { 37910, -11675 }, { 37910, -12097 }, { 38558, -12097 } }, { } }, + uiR2_Jungle45 = { true, { { 32577, -11669 }, { 31902, -11669 }, { 31902, -12325 }, { 32577, -12325 } }, { } }, + uiR2_Jungle44 = { true, { { 31684, -10879 }, { 31038, -10879 }, { 31038, -11361 }, { 31684, -11361 } }, { } }, + uiR2_Jungle43 = { true, { { 37764, -13274 }, { 37270, -13274 }, { 37270, -13918 }, { 37764, -13918 } }, { } }, + uiR2_Jungle42 = { true, { { 32646, -10876 }, { 32002, -10876 }, { 32002, -11523 }, { 32646, -11523 } }, { } }, + uiR2_Jungle41 = { true, { { 33848, -13274 }, { 33352, -13274 }, { 33352, -13827 }, { 33848, -13827 } }, { } }, + uiR2_Jungle40 = { true, { { 31690, -11676 }, { 31034, -11676 }, { 31034, -12327 }, { 31690, -12327 } }, { } }, + uiR2_Jungle39 = { true, { { 33057, -13270 }, { 32552, -13270 }, { 32552, -13771 }, { 33057, -13771 } }, { } }, + uiR2_Jungle38 = { true, { { 35366, -11742 }, { 34622, -11742 }, { 34622, -12322 }, { 35366, -12322 } }, { } }, + uiR2_Jungle37 = { true, { { 35690, -10943 }, { 35030, -10943 }, { 35030, -11529 }, { 35690, -11529 } }, { } }, + uiR2_Jungle36 = { true, { { 31370, -12470 }, { 31102, -12470 }, { 31102, -12888 }, { 31370, -12888 } }, { } }, + uiR2_Jungle35 = { true, { { 36970, -11675 }, { 36316, -11675 }, { 36316, -12330 }, { 36970, -12330 } }, { } }, + uiR2_Jungle34 = { true, { { 33446, -10865 }, { 32793, -10865 }, { 32793, -11517 }, { 33446, -11517 } }, { } }, + uiR2_Jungle33 = { true, { { 38718, -12634 }, { 38236, -12634 }, { 38236, -13118 }, { 38718, -13118 } }, { } }, + uiR2_Jungle32 = { true, { { 36257, -13275 }, { 35834, -13275 }, { 35834, -13858 }, { 36257, -13858 } }, { } }, + uiR2_Jungle31 = { true, { { 35531, -12469 }, { 34792, -12469 }, { 34792, -13048 }, { 35531, -13048 } }, { } }, + uiR2_Jungle30 = { true, { { 33277, -12635 }, { 32954, -12635 }, { 32954, -13121 }, { 33277, -13121 } }, { } }, + uiR2_Jungle29 = { true, { { 39205, -13274 }, { 38622, -13274 }, { 38622, -13828 }, { 39205, -13828 } }, { } }, + uiR2_Jungle28 = { true, { { 33930, -12542 }, { 33502, -12542 }, { 33502, -13058 }, { 33930, -13058 } }, { } }, + uiR2_Jungle27 = { true, { { 37057, -13270 }, { 36475, -13270 }, { 36475, -13930 }, { 37057, -13930 } }, { } }, + uiR2_Jungle26 = { true, { { 31845, -12475 }, { 31514, -12475 }, { 31514, -12645 }, { 31845, -12645 } }, { } }, + uiR2_Jungle25 = { true, { { 31518, -13192 }, { 31029, -13192 }, { 31029, -13758 }, { 31518, -13758 } }, { } }, + uiR2_Jungle24 = { true, { { 40327, -10876 }, { 39669, -10876 }, { 39669, -11526 }, { 40327, -11526 } }, { } }, + uiR2_Jungle23 = { true, { { 38308, -13343 }, { 37992, -13343 }, { 37992, -14018 }, { 38308, -14018 } }, { } }, + uiR2_Jungle22 = { true, { { 34328, -11743 }, { 33672, -11743 }, { 33672, -12331 }, { 34328, -12331 } }, { } }, + uiR2_Jungle21 = { true, { { 31998, -12795 }, { 31514, -12795 }, { 31514, -13126 }, { 31998, -13126 } }, { } }, + uiR2_Jungle20 = { true, { { 34881, -10869 }, { 34234, -10869 }, { 34234, -11526 }, { 34881, -11526 } }, { } }, + uiR2_Jungle19 = { true, { { 33377, -11670 }, { 32862, -11670 }, { 32862, -12258 }, { 33377, -12258 } }, { } }, + uiR2_Jungle18 = { true, { { 40956, -11674 }, { 40314, -11674 }, { 40314, -12327 }, { 40956, -12327 } }, { } }, + uiR2_Jungle17 = { true, { { 38648, -10870 }, { 38234, -10870 }, { 38234, -11371 }, { 38648, -11371 } }, { } }, + uiR2_Jungle16 = { true, { { 36330, -12475 }, { 35669, -12475 }, { 35669, -13127 }, { 36330, -13127 } }, { } }, + uiR2_Jungle15 = { true, { { 37763, -11653 }, { 37116, -11653 }, { 37116, -12320 }, { 37763, -12320 } }, { } }, + uiR2_Jungle14 = { true, { { 40957, -10875 }, { 40474, -10875 }, { 40474, -11531 }, { 40958, -11530 } }, { } }, + uiR2_Jungle13 = { true, { { 39847, -13274 }, { 39349, -13274 }, { 39349, -13858 }, { 39847, -13858 } }, { } }, + uiR2_Jungle12 = { true, { { 32002, -13275 }, { 31674, -13275 }, { 31674, -13469 }, { 32002, -13469 } }, { } }, + uiR2_Jungle11 = { true, { { 36486, -10942 }, { 35903, -10942 }, { 35903, -11525 }, { 36486, -11525 } }, { } }, + uiR2_Jungle10 = { true, { { 39366, -11743 }, { 38782, -11743 }, { 38782, -12331 }, { 39366, -12331 } }, { } }, + uiR2_Jungle9 = { true, { { 40161, -11680 }, { 39514, -11680 }, { 39514, -12326 }, { 40161, -12326 } }, { } }, + uiR2_Jungle8 = { true, { { 34086, -11196 }, { 33602, -11196 }, { 33602, -11365 }, { 34086, -11365 } }, { } }, + uiR2_Jungle7 = { true, { { 39526, -10877 }, { 38878, -10877 }, { 38878, -11525 }, { 39526, -11525 } }, { } }, + uiR2_Jungle6 = { true, { { 34817, -13276 }, { 34073, -13276 }, { 34073, -14087 }, { 34817, -14087 } }, { } }, + uiR2_Jungle5 = { true, { { 40897, -12470 }, { 40552, -12470 }, { 40552, -13131 }, { 40897, -13131 } }, { } }, + uiR2_Jungle4 = { true, { { 33965, -10884 }, { 33707, -10884 }, { 33707, -11038 }, { 33965, -11038 } }, { } }, + uiR2_Jungle3 = { true, { { 37278, -10874 }, { 36636, -10874 }, { 36636, -11521 }, { 37278, -11521 } }, { } } + } } +} diff --git a/ryzom/server/src/entities_game_service/cdb_group.cpp b/ryzom/server/src/entities_game_service/cdb_group.cpp index 0268f4b3c3..3b3a0a70b1 100644 --- a/ryzom/server/src/entities_game_service/cdb_group.cpp +++ b/ryzom/server/src/entities_game_service/cdb_group.cpp @@ -189,7 +189,6 @@ void CCDBGroup::sendDeltas( uint32 maxBitSize, IDataProvider& dataProvider, uint void CCDBGroup::sendDeltasToClient(IDataProvider& dataProvider, const CEntityId &id ) { - nlinfo("sendDeltasToClient"); DBOutput.resetBufPos(); GenericMsgManager.pushNameToStream( "DB_GROUP:UPDATE_BANK", DBOutput ); // Write the server tick, to ensure old DB update are not applied after newer @@ -207,7 +206,6 @@ void CCDBGroup::sendDeltasToClient(IDataProvider& dataProvider, const CEntityId DBOutput.serial( noInitialDelta, 16 ); } // Write additional provided data (for guild inventory) - nlinfo("provide contents to %s", id.toString().c_str()); dataProvider.provideContents( DBOutput, id ); // Send CMessage msgout( "CDB_IMPULSION" ); diff --git a/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp b/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp index 294dcbbec1..789d1df577 100644 --- a/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp +++ b/ryzom/server/src/entities_game_service/entity_manager/entity_callbacks.cpp @@ -2614,7 +2614,6 @@ void cbItemSwap( NLNET::CMessage& msgin, const std::string &serviceName, NLNET:: inventoryDst = INVENTORIES::TInventory(temp); msgin.serial( slotDst ); msgin.serial( quantity ); - nlinfo("slotDst = %u", slotDst); CCharacter *character = PlayerManager.getChar( charId ); if (character == NULL) diff --git a/ryzom/server/src/entities_game_service/mission_manager/mission_step_item.cpp b/ryzom/server/src/entities_game_service/mission_manager/mission_step_item.cpp index b9bd1b5aa0..fa5833b21a 100644 --- a/ryzom/server/src/entities_game_service/mission_manager/mission_step_item.cpp +++ b/ryzom/server/src/entities_game_service/mission_manager/mission_step_item.cpp @@ -157,7 +157,7 @@ inline void IMissionStepItem::getTextParams(uint & nbSubSteps, TVectorParamCheck if (params.size() > 2) NLMISC::fromString(params[2], quantity); - + if (status.size() > 0) // Use saved step quantity NLMISC::fromString(status[0], quantity); @@ -165,7 +165,7 @@ inline void IMissionStepItem::getTextParams(uint & nbSubSteps, TVectorParamCheck NLMISC::fromString(params[3], quality); } - nlinfo("Sheet : %s, Quality : %d, Quantity: %d", itemSheet.toString().c_str(), quality, quantity); + //nlinfo("Sheet : %s, Quality : %d, Quantity: %d", itemSheet.toString().c_str(), quality, quantity); //// } @@ -200,7 +200,7 @@ class CMissionStepForage : public IMissionStepItem { string webAppUrl; _User = PlayerManager.getChar(getEntityIdFromRow(userRow)); - + if ( event.Type == CMissionEvent::Forage ) { CMissionEventForage & eventSpe = (CMissionEventForage&)event; @@ -208,7 +208,7 @@ class CMissionStepForage : public IMissionStepItem uint16 quality; uint32 quantity; - + if (_SubSteps[subStepIndex].Dynamic.empty()) { itemSheet = _SubSteps[subStepIndex].Sheet; quality = _SubSteps[subStepIndex].Quality; @@ -275,7 +275,7 @@ class CMissionStepLootItem : public IMissionStepItem _User = PlayerManager.getChar(getEntityIdFromRow(userRow)); nlinfo("ok"); - + if ( event.Type == CMissionEvent::LootItem ) { nlinfo("ok"); @@ -307,14 +307,14 @@ class CMissionStepLootItem : public IMissionStepItem if (status.size() == 0) // If no saved quantity => use mission param status.push_back(params[2]); - + NLMISC::fromString(status[0], quantity); // Use saved quantity if (params.size() > 3) NLMISC::fromString(params[3], quality); } - + CMissionEventLootItem & eventSpe = (CMissionEventLootItem&)event; nlinfo("Sheet : %s, Quality : %d / %d, Quantity: %d / %d", eventSpe.Sheet.toString().c_str(), eventSpe.Quality, quality, eventSpe.Quantity, quantity); if ( eventSpe.Sheet == itemSheet && eventSpe.Quality >= quality ) @@ -334,7 +334,7 @@ class CMissionStepLootItem : public IMissionStepItem _User->setCustomMissionParams(_SubSteps[subStepIndex].Dynamic+"_STATUS", NLMISC::toString("%d", quantity-eventSpe.Quantity)); } } - + LOGMISSIONSTEPSUCCESS("loot_item"); return eventSpe.Quantity; } @@ -392,13 +392,13 @@ uint CMissionStepLootRm::processEvent( const TDataSetRow & userRow, const CMissi if (status.size() == 0) // If no saved quantity => use mission param status.push_back(params[2]); - + NLMISC::fromString(status[0], quantity); // Use saved quantity if (params.size() > 3) NLMISC::fromString(params[3], quality); } - + CMissionEventLootRm & eventSpe = (CMissionEventLootRm&)event; nlinfo("Sheet : %s, Quality : %d / %d, Quantity: %d / %d", eventSpe.Sheet.toString().c_str(), eventSpe.Quality, quality, eventSpe.Quantity, quantity); if ( eventSpe.Sheet == itemSheet && eventSpe.Quality >= quality ) @@ -418,7 +418,7 @@ uint CMissionStepLootRm::processEvent( const TDataSetRow & userRow, const CMissi _User->setCustomMissionParams(_SubSteps[subStepIndex].Dynamic+"_STATUS", NLMISC::toString("%d", quantity-eventSpe.Quantity)); } } - + LOGMISSIONSTEPSUCCESS("loot_mp"); return eventSpe.Quantity; } diff --git a/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp b/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp index d1fe8a6782..add04561b1 100644 --- a/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/character_inventory_manipulation.cpp @@ -3585,10 +3585,8 @@ void CCharacter::applyItemModifiers(const CGameItemPtr &item) } // init all modifiers due to equipment - nlinfo("Current _ParryModifier = Total : %d", _ParryModifier); _DodgeModifier += item->dodgeModifier(); _ParryModifier += item->parryModifier(); - nlinfo("+ Item Parry = Total : + %d = %d", item->parryModifier(), _ParryModifier); _AdversaryDodgeModifier += item->adversaryDodgeModifier(); _AdversaryParryModifier += item->adversaryParryModifier(); // update DB for modifiers From a8082954d434b05265b5c8ced6cc26b13ec45273 Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Wed, 19 Jun 2024 02:43:27 +0200 Subject: [PATCH 192/194] Update lua versions --- ryzom/client/data/gamedev/interfaces_v3/ark.lua | 2 +- .../client/data/gamedev/interfaces_v3/ark_shop.lua | 3 +++ .../gamedev/interfaces_v3/check_lua_versions.lua | 13 ++++++++----- .../data/gamedev/interfaces_v3/interaction.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/map.lua | 2 +- ryzom/client/data/gamedev/interfaces_v3/player.lua | 2 +- .../gamedev/interfaces_v3/raw_creature_mats.lua | 3 +++ .../data/gamedev/interfaces_v3/search_command.lua | 4 +++- ryzom/client/data/gamedev/interfaces_v3/world.lua | 3 +++ 9 files changed, 24 insertions(+), 10 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark.lua b/ryzom/client/data/gamedev/interfaces_v3/ark.lua index aa0614dcec..61b2418a26 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark.lua @@ -868,4 +868,4 @@ function S2E1:newQuake(timer) end -- VERSION -- -RYZOM_ARK_VERSION = 335 +RYZOM_ARK_VERSION = 366 diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua b/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua index 39852ccfd7..f5a9163b6d 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua @@ -548,3 +548,6 @@ function arkNpcShop:updateTexts(id, ctrl, text1, text2, text3) end end end + +-- VERSION -- +RYZOM_ARK_SHOP_VERSION = 366 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua index 1655b31188..1ab596c4da 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua @@ -1,7 +1,8 @@ local ryzom_have_all_good_version = true if RYZOM_APPZONE_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_APPZONE_VERSION, 324, "appzone") end -if RYZOM_ARK_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_ARK_VERSION, 335, "ark") end +if RYZOM_ARK_VERSION ~= 366 then broadcastBadLuaVersions(RYZOM_ARK_VERSION, 366, "ark") end if RYZOM_ARK_LESSONS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_ARK_LESSONS_VERSION, 324, "ark_lessons") end +if RYZOM_ARK_SHOP_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_ARK_SHOP_VERSION, 324, "ark_shop") end if RYZOM_BG_DOWNLOADER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_BG_DOWNLOADER_VERSION, 324, "bg_downloader") end if RYZOM_BOT_CHAT_V4_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_BOT_CHAT_V4_VERSION, 324, "bot_chat_v4") end if RYZOM_COMPASS_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_COMPASS_VERSION, 335, "compass") end @@ -10,28 +11,30 @@ if RYZOM_GAME_R2_LOADING_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_GAME_ if RYZOM_GUILD_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_GUILD_VERSION, 324, "guild") end if RYZOM_HELP_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_HELP_VERSION, 335, "help") end if RYZOM_INFO_PLAYER_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_INFO_PLAYER_VERSION, 335, "info_player") end -if RYZOM_INTERACTION_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_INTERACTION_VERSION, 335, "interaction") end +if RYZOM_INTERACTION_VERSION ~= 366 then broadcastBadLuaVersions(RYZOM_INTERACTION_VERSION, 366, "interaction") end if RYZOM_INVENTORY_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_INVENTORY_VERSION, 324, "inventory") end if RYZOM_JSON_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_JSON_VERSION, 324, "json") end -if RYZOM_MAP_VERSION ~= 328 then broadcastBadLuaVersions(RYZOM_MAP_VERSION, 328, "map") end +if RYZOM_MAP_VERSION ~= 366 then broadcastBadLuaVersions(RYZOM_MAP_VERSION, 366, "map") end if RYZOM_MISC_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_MISC_VERSION, 324, "misc") end if RYZOM_NAMES_FYROS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_FYROS_VERSION, 324, "names_fyros") end if RYZOM_NAMES_MATIS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_MATIS_VERSION, 324, "names_matis") end if RYZOM_NAMES_TRYKER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_TRYKER_VERSION, 324, "names_tryker") end if RYZOM_NAMES_ZORAI_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_NAMES_ZORAI_VERSION, 324, "names_zorai") end if RYZOM_OUT_V2_APPEAR_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_APPEAR_VERSION, 324, "out_v2_appear") end -if RYZOM_OUT_V2_INTRO_VERSION ~= 341 then broadcastBadLuaVersions(RYZOM_OUT_V2_INTRO_VERSION, 341, "out_v2_intro") end if RYZOM_OUT_V2_SELECT_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_SELECT_VERSION, 324, "out_v2_select") end if RYZOM_OUTPOST_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_OUTPOST_VERSION, 335, "outpost") end -if RYZOM_PLAYER_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_PLAYER_VERSION, 335, "player") end +if RYZOM_PLAYER_VERSION ~= 366 then broadcastBadLuaVersions(RYZOM_PLAYER_VERSION, 366, "player") end if RYZOM_PLAYER_TRADE_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_PLAYER_TRADE_VERSION, 324, "player_trade") end +if RYZOM_RAW_CREATURE_MATS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RAW_CREATURE_MATS_VERSION, 324, "raw_creature_mats") end if RYZOM_RING_ACCESS_POINT_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RING_ACCESS_POINT_VERSION, 324, "ring_access_point") end if RYZOM_RING_ACCESS_POINT_FILTER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RING_ACCESS_POINT_FILTER_VERSION, 324, "ring_access_point_filter") end if RYZOM_RING_WINDOW_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RING_WINDOW_VERSION, 324, "ring_window") end if RYZOM_RYZHOME_TOOLBAR_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RYZHOME_TOOLBAR_VERSION, 324, "ryzhome_toolbar") end if RYZOM_SCENEEDIT_VERSION ~= 328 then broadcastBadLuaVersions(RYZOM_SCENEEDIT_VERSION, 328, "sceneedit") end +if RYZOM_SEARCH_COMMAND_VERSION ~= 328 then broadcastBadLuaVersions(RYZOM_SEARCH_COMMAND_VERSION, 328, "search_command") end if RYZOM_TASKBAR_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_TASKBAR_VERSION, 324, "taskbar") end if RYZOM_TP_INTERFACE_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_TP_INTERFACE_VERSION, 324, "tp_interface") end if RYZOM_WEB_QUEUE_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_WEB_QUEUE_VERSION, 335, "web_queue") end if RYZOM_WEBBROWSER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_WEBBROWSER_VERSION, 324, "webbrowser") end if RYZOM_WEBIG_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_WEBIG_VERSION, 324, "webig") end +if RYZOM_WORLD_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_WORLD_VERSION, 324, "world") end diff --git a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua index eb3210dde0..053798d997 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/interaction.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/interaction.lua @@ -990,4 +990,4 @@ function game:TalkWithNpc(bullying) end -- VERSION -- -RYZOM_INTERACTION_VERSION = 335 +RYZOM_INTERACTION_VERSION = 366 diff --git a/ryzom/client/data/gamedev/interfaces_v3/map.lua b/ryzom/client/data/gamedev/interfaces_v3/map.lua index 05292486ce..94de2404d9 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/map.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/map.lua @@ -274,4 +274,4 @@ game:addMapArkPoint("Vip", 4154, -3305, "vip_allegory", "", "allegory_16.tga", " -- game:setAltMap("fyros_map.tga", "fyros_map_sp.tga") -- VERSION -- -RYZOM_MAP_VERSION = 328 +RYZOM_MAP_VERSION = 366 diff --git a/ryzom/client/data/gamedev/interfaces_v3/player.lua b/ryzom/client/data/gamedev/interfaces_v3/player.lua index 5c178fd464..5a35f9fcda 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/player.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/player.lua @@ -1096,4 +1096,4 @@ function game:fixVpx(vpx) end -- VERSION -- -RYZOM_PLAYER_VERSION = 335 +RYZOM_PLAYER_VERSION = 366 diff --git a/ryzom/client/data/gamedev/interfaces_v3/raw_creature_mats.lua b/ryzom/client/data/gamedev/interfaces_v3/raw_creature_mats.lua index ba3811d042..291501e274 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/raw_creature_mats.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/raw_creature_mats.lua @@ -43,3 +43,6 @@ game.RawCreaturesMats = { kitinshell = { "m0048ccc", "m0066ckd", "m0068ckg", "m0069ckj", "m0072ckh", "m0073cke", "m0336ccb", "m0368ccn", "m0470che", "m0479ckb", "m0485cka", "m0602ckf", "m0607cki", "m0634ccl" }, mushroom = { "m0148chl" } } + +-- VERSION -- +RYZOM_RAW_CREATURE_MATS_VERSION = 366 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua index be681df530..74e0731fa5 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/search_command.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/search_command.lua @@ -1580,4 +1580,6 @@ function SearchCommand:finish_commands(command_name,uiId) SearchCommand:close_modal(uiId) SearchCommand:search(uiId) -end \ No newline at end of file +end +-- VERSION -- +RYZOM_SEARCH_COMMAND_VERSION = 366 \ No newline at end of file diff --git a/ryzom/client/data/gamedev/interfaces_v3/world.lua b/ryzom/client/data/gamedev/interfaces_v3/world.lua index f9fe338588..f41adb06cc 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/world.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/world.lua @@ -1006,3 +1006,6 @@ game.World = { uiR2_Jungle3 = { true, { { 37278, -10874 }, { 36636, -10874 }, { 36636, -11521 }, { 37278, -11521 } }, { } } } } } + +-- VERSION -- +RYZOM_WORLD_VERSION = 366 \ No newline at end of file From 1a2058c877c597ebb182c1988002478f5160005c Mon Sep 17 00:00:00 2001 From: Ulu Kyn <ulukyn@gmail.com> Date: Wed, 19 Jun 2024 03:13:48 +0200 Subject: [PATCH 193/194] Fix --- ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua | 6 +++--- .../data/gamedev/interfaces_v3/check_lua_versions.lua | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua b/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua index f5a9163b6d..b4500860e7 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/ark_shop.lua @@ -306,10 +306,10 @@ function arkNpcShop:Buy(id) if arkNpcShop.AtysProgressBuyLen > 0 then arkNpcShop:StartProgress("nil", arkNpcShop.AtysProgressBuyMessage, arkNpcShop.AtysProgressBuyLen) end - -- getUI("ui:interface:web_transactions"):find("html"):browse(arkNpcShop.ValidateUrl..quantity.."&item_id="..id.."&item_selection="..arkNpcShop.selectedItems[id]) + getUI("ui:interface:web_transactions"):find("html"):browse(arkNpcShop.ValidateUrl..quantity.."&item_id="..id.."&item_selection="..arkNpcShop.selectedItems[id]) end end - -- arkNpcShop:Close() + arkNpcShop:Close() if arkNpcShop.window ~= "ui:interface:ark_npc_shop" then getUI("ui:interface:encyclopedia").active=false end @@ -550,4 +550,4 @@ function arkNpcShop:updateTexts(id, ctrl, text1, text2, text3) end -- VERSION -- -RYZOM_ARK_SHOP_VERSION = 366 \ No newline at end of file +RYZOM_ARK_SHOP_VERSION = 366 diff --git a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua index 1ab596c4da..9599e0a50b 100644 --- a/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua +++ b/ryzom/client/data/gamedev/interfaces_v3/check_lua_versions.lua @@ -2,7 +2,7 @@ local ryzom_have_all_good_version = true if RYZOM_APPZONE_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_APPZONE_VERSION, 324, "appzone") end if RYZOM_ARK_VERSION ~= 366 then broadcastBadLuaVersions(RYZOM_ARK_VERSION, 366, "ark") end if RYZOM_ARK_LESSONS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_ARK_LESSONS_VERSION, 324, "ark_lessons") end -if RYZOM_ARK_SHOP_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_ARK_SHOP_VERSION, 324, "ark_shop") end +if RYZOM_ARK_SHOP_VERSION ~= 366 then broadcastBadLuaVersions(RYZOM_ARK_SHOP_VERSION, 366, "ark_shop") end if RYZOM_BG_DOWNLOADER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_BG_DOWNLOADER_VERSION, 324, "bg_downloader") end if RYZOM_BOT_CHAT_V4_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_BOT_CHAT_V4_VERSION, 324, "bot_chat_v4") end if RYZOM_COMPASS_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_COMPASS_VERSION, 335, "compass") end @@ -25,16 +25,16 @@ if RYZOM_OUT_V2_SELECT_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_OUT_V2_ if RYZOM_OUTPOST_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_OUTPOST_VERSION, 335, "outpost") end if RYZOM_PLAYER_VERSION ~= 366 then broadcastBadLuaVersions(RYZOM_PLAYER_VERSION, 366, "player") end if RYZOM_PLAYER_TRADE_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_PLAYER_TRADE_VERSION, 324, "player_trade") end -if RYZOM_RAW_CREATURE_MATS_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RAW_CREATURE_MATS_VERSION, 324, "raw_creature_mats") end +if RYZOM_RAW_CREATURE_MATS_VERSION ~= 366 then broadcastBadLuaVersions(RYZOM_RAW_CREATURE_MATS_VERSION, 366, "raw_creature_mats") end if RYZOM_RING_ACCESS_POINT_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RING_ACCESS_POINT_VERSION, 324, "ring_access_point") end if RYZOM_RING_ACCESS_POINT_FILTER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RING_ACCESS_POINT_FILTER_VERSION, 324, "ring_access_point_filter") end if RYZOM_RING_WINDOW_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RING_WINDOW_VERSION, 324, "ring_window") end if RYZOM_RYZHOME_TOOLBAR_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_RYZHOME_TOOLBAR_VERSION, 324, "ryzhome_toolbar") end if RYZOM_SCENEEDIT_VERSION ~= 328 then broadcastBadLuaVersions(RYZOM_SCENEEDIT_VERSION, 328, "sceneedit") end -if RYZOM_SEARCH_COMMAND_VERSION ~= 328 then broadcastBadLuaVersions(RYZOM_SEARCH_COMMAND_VERSION, 328, "search_command") end +if RYZOM_SEARCH_COMMAND_VERSION ~= 366 then broadcastBadLuaVersions(RYZOM_SEARCH_COMMAND_VERSION, 366, "search_command") end if RYZOM_TASKBAR_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_TASKBAR_VERSION, 324, "taskbar") end if RYZOM_TP_INTERFACE_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_TP_INTERFACE_VERSION, 324, "tp_interface") end if RYZOM_WEB_QUEUE_VERSION ~= 335 then broadcastBadLuaVersions(RYZOM_WEB_QUEUE_VERSION, 335, "web_queue") end if RYZOM_WEBBROWSER_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_WEBBROWSER_VERSION, 324, "webbrowser") end if RYZOM_WEBIG_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_WEBIG_VERSION, 324, "webig") end -if RYZOM_WORLD_VERSION ~= 324 then broadcastBadLuaVersions(RYZOM_WORLD_VERSION, 324, "world") end +if RYZOM_WORLD_VERSION ~= 366 then broadcastBadLuaVersions(RYZOM_WORLD_VERSION, 366, "world") end From 2e1994f593f21565449f3a8d4a89b6778a741202 Mon Sep 17 00:00:00 2001 From: Nuno <ulukyn@gmail.com> Date: Thu, 20 Jun 2024 03:19:39 +0200 Subject: [PATCH 194/194] Fix crash of IOS --- ryzom/server/src/admin_modules/admin_log.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/server/src/admin_modules/admin_log.cpp b/ryzom/server/src/admin_modules/admin_log.cpp index 2da8cd38ff..d2921b17f7 100644 --- a/ryzom/server/src/admin_modules/admin_log.cpp +++ b/ryzom/server/src/admin_modules/admin_log.cpp @@ -63,5 +63,5 @@ void CAdminCommandLog::display(const char *format, ...) string toDisp = str; toDisp = string(IDisplayer::dateToHumanString()) + string(" ") + toDisp; - Log->displayRawNL(toDisp.c_str()); + Log->displayRawNL("%s", toDisp.c_str()); }