Jump to content

Tiburon

Miembro
  • Contador contenido

    19
  • Ingreso

  • Última visita

Actividad de reputación

  1. Me Gusta
    Tiburon reacted to ChuchoGamer in [PhotoShop]Full Package   
    genial
  2. Me Gusta
    Tiburon reacted to caanmasu in borrar   
    borrar
  3. Me Gusta
    Tiburon reacted to Break in ¿Ataques a servidores de Metin2?   
    Hola Zoneros,
    Ayer me comento un viejo amigo, que podía hacer para sentirse más seguro a la hora de abrir un servidor. La verdad que la mejor manera de aprender es con la experiencia, pero entiendo que mucho de vosotros, no quiere pasar por el mal rato de que le tumben la página web o que le acosen porque le hayan pillado los datos etc.
    A continuación voy a dar unos tips a la hora de abrir el servidor.
     
    Tip 0: Dominio
     
    Cuando compréis un dominio, por favor mirar que vuestros datos no sean públicos, que tengáis protección de datos, sino con cualquier plataforma de whois, se pueden ver vuestros datos personales, donde vivís, vuestro número de teléfono etc. El mejor sitio, donde los datos no son almacenados, y webzen no puede hacer mucho con vosotros es
    Debes iniciar sesión para ver el contenido del enlace en esta publicación., comprar un dominio .to, lo recomiendo, aunque sea más caro.  
    Tip 1: ¿Qué vps/dedicado compro?
     
    Lo que os recomiendo para cualquier infraestructura, es estar en OVH, ya que permiten muchísimas configuraciones beneficiosas para nuestro servidor.
    Cualquier servidor de aquí: 
    Debes iniciar sesión para ver el contenido del enlace en esta publicación. son aconsejables, la marca blanca de OVH conocida como soyoustart, no la recomiendo ya que no tiene para configurar un firewall personalizado para nuestro servidor. Una vez que elijamos nuestro servidor, lo que tenemos que instalar es PROXMOX, para hacer diferentes máquinas virtuales en nuestro propio dedicado, aquí deberemos de instalar 3 vps. Un vps para el servidor del metin2, otro para el hosting web y otro para el hosting patcher.
     
    Tip 2: ¿Es aconsejable tener las tres cosas en el mismo dedicado? 
     
    Si os digo la verdad, la web y el vps del metin, si es aconsejable ya que va a cargar más rápido con el servidor con las sentencias SQL y va ser más optima, nuestro hosting web, tiene que estar con las DNS de cloudflare.

    Debes iniciar sesión para ver el contenido del enlace en esta publicación. ¿Por que usar cloudflare? 
    OVH, tiene una exceleten protección para los ataques pero no todo es un camino de rosas, por ejemplo los ataques de 
    Debes iniciar sesión para ver el contenido del enlace en esta publicación. , OVH le cuesta mucho detectar estos ataques y cuando lo detecta ya tenemos nuestra página web offline, por lo que una correcta configuración de Cloudflare, nos protegerá del ataque layer 7, de muchas maneras configurando el firewall de CloudFlare o haciéndolo más rudo poniendo captcha a la hora de conectar con nuestro sitio web. La mayor parte de la comunidad de metin2 utiliza la famosa web de ionut Debes iniciar sesión para ver el contenido del enlace en esta publicación. , hay un problema y es que cada vez que un usuario entra al ranking hace un SELECT, una petición directa a la mysql, imaginaros 300-500 bots haciendo F5 al ranking, ¿Qué pasaría? pues para eso usamos CloudFlare, para mitigar el ataque, y no nos provoque una saturación la base de datos de nuestro servidor de Metin2. Pequeño inciso CloudFlare, también nos ayuda a ocultar la dirección ip de nuestro hosting, esto también es vital.
     
    Tip 3: ¿Actualizador en otro hosting, que no sea en la web?
     
    Pues si amigos, debemos de instalar un tercer VPS para tener nuestro actualizador ya que cualquier persona, puede ver de donde se descarga las actualizaciones, es decir con dale actualizar nuestro cliente, se puede ver de donde se esta realizando la descarga, sería de tontos poner nuestro actualizador en el mismo hosting que la web, porque estaríamos dando la ip de nuestro hosting. Y es mejor mitigar un ataque donde solo tenemos nuestro actualizador, que tener la página web offline etc.
     
    Tip 4: ¿Por estar en OVH mi vps de metin2, estoy fuera de que me tumben?
     
    Realmente no, he visto gente que realiza ataques a los puertos de metin2, falseando paquetes, ya que el metin los tiene que procesar y alfinal termina en .core, esto por desgracia, OVH no lo para, tenemos que ser nosotros mismos con el código fuente del juego en fixearlo, creo recordar que en metin2dev, ya han publicado algo sobre ello.
    Por otro lado, existe los famosos ataques de Cheper, que son de DDos puro, lo hace de tal manera que ovh, no lo detecta como ataque, ya será por una gran magnitud de la botnet y limitando las peticiones por cada bot, que hace indetectable a ovh. Para ello, recomiendo utilizar el pf, en
    Debes iniciar sesión para ver el contenido del enlace en esta publicación. publicaron un firewall y comentan como utilizarlo, sinceramente mejor que nada es. Pero no parara al cheper, recomiendo editar el firewall, y en caso de ataque, cerrar la lista de acceso a jugadores, es decir que solo puedan conectar con el vps, los jugadores nuestros que sabemos su dirección ip en nuestra tabla player, y para los nuevos con logear en la página web o hacer un catpcha se añada la ip a nuestro firewall y ya permita el acceso. Esto último lo puse aprueba en dos servidores y es eficaz.  
    Además que es obligatorio, de configurar nuestro firewall en OVH, que es independiente a nuestro firewall interno del vps, poniendo los puertos de nuestro metin2, sino no hará mucho el firewall externo.  
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    No he querido entrar mucho en detalle por pereza, pero si alguien necesita ayuda o requiere servicios de administración me puede comentar, animo a que preguntéis y os respondo encantado.
    ¡Un saludo y que no os tumbe!
     
     
     
     
     
     
  4. Me Gusta
    Tiburon reacted to neyhd in [Metin2Zone]Banners Editables   
    thanks
  5. Me Gusta
    Tiburon reacted to LovePlay in [KillGui] New Design + (Hide-Show)   
    Hola, antes que nada queria pedir a todos por si ofendi a alguien.. 
     
    Tambien pedir perdon a Shakelum.., supongo que me deje llevar un poco ..
     
    Espero que me perdonen por estos ultimos momentos mios.
     
     
    Hoy os draigo un KillGui, diseñado por mi, python por DeuS, y mejorado por Felipe Ard.
     
     

     

     
    - Como implementarlo -
     
     
    Vamos a game.py y debajo de :
     
    class GameWindow(ui.ScriptWindow): def __init__(self, stream): ui.ScriptWindow.__init__(self, "GAME") self.SetWindowName("game") net.SetPhaseWindow(net.PHASE_WINDOW_GAME, self) player.SetGameWindow(self) self.quickSlotPageIndex = 0 self.lastPKModeSendedTime = 0 self.pressNumber = None self.guildWarQuestionDialog = None self.interface = None self.targetBoard = None self.console = None self.mapNameShower = None self.affectShower = None self.playerGauge = None self.petInventoryWnd = None self.petButtonWnd = None self.stream=stream self.interface = interfaceModule.Interface() self.interface.MakeInterface() self.interface.ShowDefaultWindows() self.curtain = uiPhaseCurtain.PhaseCurtain() self.curtain.speed = 0.03 self.curtain.Hide() self.targetBoard = uiTarget.TargetBoard() self.targetBoard.SetWhisperEvent(ui.__mem_func__(self.interface.OpenWhisperDialog)) self.targetBoard.Hide() self.console = consoleModule.ConsoleWindow() self.console.BindGameClass(self) self.console.SetConsoleSize(wndMgr.GetScreenWidth(), 200) self.console.Hide() Ponemos esto:
    ##START_KILLGUI KillGuiBg = ui.ImageBox() KillGuiBg.LoadImage("d:/ymir work/ui/v1.dds") self.KillGuiBg = KillGuiBg self.KillGuiBg.SetPosition(-166,465) self.KillGuiBg.Show() self.KillGuiBg_open = ui.Button() self.KillGuiBg_open.SetPosition(+11,570) self.KillGuiBg_open.SetUpVisual('d:/ymir work/ui/abrir_kg.tga') self.KillGuiBg_open.SetOverVisual('d:/ymir work/ui/abrir_raton_kg.tga') self.KillGuiBg_open.SetDownVisual('d:/ymir work/ui/abrir_pulsado_kg.tga') self.KillGuiBg_open.SetEvent(self.__OpenKillGui) self.KillGuiBg_open.Show() self.KillGuiBg_close = ui.Button() self.KillGuiBg_close.SetPosition(+178,570) self.KillGuiBg_close.SetUpVisual('d:/ymir work/ui/cerrar_kg.tga') self.KillGuiBg_close.SetOverVisual('d:/ymir work/ui/cerrar_raton_kg.tga') self.KillGuiBg_close.SetDownVisual('d:/ymir work/ui/cerrar_pulsado_kg.tga') self.KillGuiBg_close.SetEvent(self.__CloseKillGui) self.KillGuiBg_close.Hide() self.KillBlauReich = ui.TextLine() self.KillBlauReich.SetDefaultFontName() self.KillBlauReich.SetPosition(40,535) self.KillBlauReich.SetText("Jinno: ") self.KillBlauReich.SetFontColor(253,250,5) self.KillBlauReich.SetOutline() #self.KillBlauReich.SetEvent(self.__KillBlauReich) self.KillBlauReich.Hide() self.KillGelbReich = ui.TextLine() self.KillGelbReich.SetDefaultFontName() self.KillGelbReich.SetPosition(40, 565) self.KillGelbReich.SetText("Chunjo: ") self.KillGelbReich.SetFontColor(17,5,253) self.KillGelbReich.SetOutline() #self.KillGelbReich.SetEvent(self.__KillGelbReich) self.KillGelbReich.Hide() self.KillRotReich = ui.TextLine() self.KillRotReich.SetDefaultFontName() self.KillRotReich.SetPosition(40, 595) self.KillRotReich.SetText("Shinsoo: ") self.KillRotReich.SetFontColor(50,0,0) self.KillRotReich.SetOutline() #self.KillRotReich.SetEvent(self.__KillRotReich) self.KillRotReich.Hide() self.KillMob = ui.TextLine() self.KillMob.SetDefaultFontName() self.KillMob.SetPosition(40, 625) self.KillMob.SetText("Mounstruos: ") self.KillMob.SetOutline() #self.KillMob.SetEvent(self.__KillMob) self.KillMob.Hide() Debajo de :
    app.HideCursor() Ponemos: 
    self.KillGuiBg.Hide() self.KillBlauReich.Hide() self.KillGelbReich.Hide() self.KillRotReich.Hide() self.KillMob.Hide() self.KillGuiBg_close.Hide() Debajo de:
    self.interface.BUILD_OnUpdate() Ponemos :
    def __hidekillgui(self): self.KillGuiBg.Hide() self.KillBlauReich.Hide() self.KillGelbReich.Hide() self.KillRotReich.Hide() self.KillMob.Hide() def __showkillgui(self): self.KillGuiBg.Show() self.KillBlauReich.Show() self.KillGelbReich.Show() self.KillRotReich.Show() self.KillMob.Show() def __KillBlauReich(self, KillBlauReich): self.KillBlauReich.SetText("Jinno: " + KillBlauReich) def __KillGelbReich(self, KillGelbReich): self.KillGelbReich.SetText("Chunjo: " + KillGelbReich) def __KillRotReich(self, KillRotReich): self.KillRotReich.SetText("Shinsoo: " + KillRotReich) def __KillMob(self, KillMob): self.KillMob.SetText("Monster: " + KillMob) def __OpenKillGui(self): self.KillGuiBg_open.Hide() self.KillBlauReich.Show() self.KillGelbReich.Show() self.KillRotReich.Show() self.KillMob.Show() self.KillGuiBg.SetPosition(+1,465) self.KillGuiBg_close.Show() def __CloseKillGui(self): self.KillGuiBg_close.Hide() self.KillBlauReich.Hide() self.KillGelbReich.Hide() self.KillRotReich.Hide() self.KillMob.Hide() self.KillGuiBg.SetPosition(-166,465) self.KillGuiBg_open.Show() Debajo de:
    # ITEM_MALL "CloseMall" : self.CommandCloseMall, "ShowMeMallPassword" : self.AskMallPassword, "item_mall" : self.__ItemMall_Open, # END_OF_ITEM_MALL Ponemos:
    ##KILLGUI "ShowKillGui" : self.__showkillgui, "HideKillGui" : self.__hidekillgui, "KillBlauReich" : self.__KillBlauReich, "KillGelbReich" : self.__KillGelbReich, "KillRotReich" : self.__KillRotReich, "KillMob" : self.__KillMob, ##END_KILLGUI Y aqui os dejo los .tga, si quereis tambien os dejo el psd, me lo pediis y os lo adjunto.
     
    Se coloca en ETC/ ymir work / ui/
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    La quest : 

    (Tambien la hizo DeuS)
    quest killgui begin state start begin when kill begin if npc.is_pc() then local new_point = pc.getqf("empire"..npc.get_empire())+1 pc.setqf("empire"..npc.get_empire(), new_point) cmdchat("KillRotReich "..pc.getqf("empire1")) cmdchat("KillGelbReich "..pc.getqf("empire2")) cmdchat("KillBlauReich "..pc.getqf("empire3")) else local new_point = pc.getqf("mob")+1 pc.setqf("mob", new_point) cmdchat("KillMob "..pc.getqf("mob")) end end when login begin cmdchat("KillRotReich "..pc.getqf("empire1")) cmdchat("KillGelbReich "..pc.getqf("empire2")) cmdchat("KillBlauReich "..pc.getqf("empire3")) cmdchat("KillMob "..pc.getqf("mob")) end end end Y vuelvo a pedir perdona a todos
  6. Me Gusta
    Tiburon reacted to PENTAGRAMA in Como crear un foro para metin2   
    Aqui esta el video para poder hacerlo.
     
    El video es completamente ablando, pero creo que no se escucha bien.
     
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
     
    links:
    Para Descargar:
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    las plantillas web :
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
     
    Si te sirvió da gracias no cuesta nada
  7. Me Gusta
    Tiburon reacted to caanmasu in borrar   
    borrar
  8. Me Gusta
    Tiburon reacted to 𝗔𝗿𝗲𝘀 in Gran Aporte "SISTEMA SHINING COMPLETO"   
    Buenas noches zoneros y zoneras:
     
    En esta ocasion os traigo el sistema Shining completo y reparado para alas y skin de armas ya que veo que no esta publico en ningun foro. 
    Bueno los archivos que vamos a precisar son los siguientes:
     
    Parte del Src Client o Binario como lo conozcan:
    De la carpeta UserInterface:
    -.PythonAplication.cpp
    -.Locale_inc.h
    -.Instancebase.h
    -.Instancebase.cpp
    De la carpeta GameLib:
    -.ItemData.h
    -.ItemData.cpp
    -.ItemManager.cpp
    -.ItemManager.h
     
    Bueno sabiendo ya todo lo que vamos a precisar vamos con la guia
    UserInterface/PythonApplication.cpp Buscamos esta linea: snprintf(szSkillDescFileName, sizeof(szSkillDescFileName), "%s/skilldesc.txt", localePath); Damos un enter y pegamos la siguiente: #ifdef ENABLE_SHINING_SYSTEM snprintf(szShiningTable, sizeof(szShiningTable), "%s/shiningtable.txt", localePath); #endif Buscamos esta linea: char szItemDesc[256]; Damos un enter y pegamos la siguiente: #ifdef ENABLE_SHINING_SYSTEM char szShiningTable[256]; #endif Buscamos esta linea: if (!rkSkillMgr.RegisterSkillTable("data/common/skilltable.txt")) { TraceError("Error while loading skilltable.txt."); return false; } Damos un enter y pegamos la siguiente: #ifdef ENABLE_SHINING_SYSTEM if (!rkItemMgr.LoadShiningTable(szShiningTable)) { Tracenf("LoadLocaleData - LoadShiningTable(%s) Error", szShiningTable); } #endif  
    UserInterface/Locale_inc.h Aca agregaremos el siguiente define: #define ENABLE_SHINING_SYSTEM UserInterface/InstanceBase.h Aca buscamos la siguiente linea: DWORD m_armorRefineEffect; Pulsamos un enter y agregamos la siguiente linea: #ifdef ENABLE_SHINING_SYSTEM //2-Dimensions for Left & Right sided effects DWORD m_weaponShiningEffects[2][CItemData::ITEM_SHINING_MAX_COUNT]; DWORD m_armorShiningEffects[CItemData::ITEM_SHINING_MAX_COUNT]; DWORD m_acceShiningEffects[CItemData::ITEM_SHINING_MAX_COUNT]; #endif Aca quiero aclarar una cosa: Si en vuestro sistema de estolas de envez de llevar acce lleva sash cambian la linea anterior por esta: #ifdef ENABLE_SHINING_SYSTEM //2-Dimensions for Left & Right sided effects DWORD m_weaponShiningEffects[2][CItemData::ITEM_SHINING_MAX_COUNT]; DWORD m_armorShiningEffects[CItemData::ITEM_SHINING_MAX_COUNT]; DWORD m_sashShiningEffects[CItemData::ITEM_SHINING_MAX_COUNT]; #endif Ahora buscamos la siguiente linea: UINT __GetRefinedEffect(CItemData* pItem); Pulsamos un enter y agregamos la siguiente: #ifdef ENABLE_SHINING_SYSTEM void __GetShiningEffect(CItemData* pItem); void __ClearWeaponShiningEffect(bool detaching = true); void __ClearArmorShiningEffect(bool detaching = true); void __ClearAcceShiningEffect(bool detaching = true); void __AttachAcceShiningEffect(int effectIndex, const char* effectFileName, const char* boneName = "Bip01 Spine2"); void __AttachWeaponShiningEffect(int effectIndex, const char* effectFileName, const char* boneName = "Bip01"); void __AttachArmorShiningEffect(int effectIndex, const char* effectFileName, const char* boneName = "Bip01"); #endif Aca quiero explicar 1 cosa: Aca es lo mismo que en la anterior linea, si ustedes de envez de usar acce usan sash remplazan la linea por esta: #ifdef ENABLE_SHINING_SYSTEM void __GetShiningEffect(CItemData* pItem); void __ClearWeaponShiningEffect(bool detaching = true); void __ClearArmorShiningEffect(bool detaching = true); void __ClearSashShiningEffect(bool detaching = true); void __AttachSashShiningEffect(int effectIndex, const char* effectFileName, const char* boneName = "Bip01 Spine2"); void __AttachWeaponShiningEffect(int effectIndex, const char* effectFileName, const char* boneName = "Bip01"); void __AttachArmorShiningEffect(int effectIndex, const char* effectFileName, const char* boneName = "Bip01"); #endif UserInterface/InstanceBase.cpp Buscamos la siguiente funcion void CInstanceBase::SetArmor(DWORD dwArmor) { ... } Y dentro de esta funcion buscamos lo siguiente __GetRefinedEffect(pItemData); Pulsamos un enter y agregamos la siguiente linea: #ifdef ENABLE_SHINING_SYSTEM __GetShiningEffect(pItemData); #endif Quedando asi: __GetRefinedEffect(pItemData); #ifdef ENABLE_SHINING_SYSTEM __GetShiningEffect(pItemData); #endif Ahora dentro de la misma funcion buscamos la siguiente linea: __ClearArmorRefineEffect(); Pulsamos un enter y agregamos lo siguiente: #ifdef ENABLE_SHINING_SYSTEM __ClearArmorShiningEffect(); #endif UserInterface/InstanceBase.cpp Aca buscamos la siguiente funcion: void CInstanceBase::SetAcce "Recuerden que si su sistema de estolas no es acce lo cambian por Sash" { .... } Dentro de esta funcion buscamos lo siguiente: ClearAcceEffect(); Pulsamos un enter y agregamos la siguiente linea: #ifdef ENABLE_SHINING_SYSTEM __ClearAcceShiningEffect(); #endif Luego dentro de la misma funcion mas abajo buscamos lo siguiente: CItemManager::Instance().GetItemDataPointer(dwAcce, &pItemData); "Si no usan acce lo cambian por sash" Pulsamos enter y mas abajo pegamos lo siguiente: #ifdef ENABLE_SHINING_SYSTEM if (pItemData) __GetShiningEffect(pItemData); #endif Quedando asi: CItemManager::Instance().GetItemDataPointer(dwAcce, &pItemData); #ifdef ENABLE_SHINING_SYSTEM if (pItemData) __GetShiningEffect(pItemData); #endif m_GraphicThingInstance.AttachAcce(pItemData, fSpecular); UserInterface/InstanceBase.cpp "Ahora atentos en la siguiente funcion ya que si no lo hacen bien no funcionara en las armas ni en las skin" Buscamos la siguiente funcion: bool CInstanceBase::SetWeapon(DWORD eWeapon) { ... } Dentro de esta funcion buscamos la siguiente linea: __GetRefinedEffect(pItemData); Pulsamos un enter y agregamos lo siguiente: #ifdef ENABLE_SHINING_SYSTEM __GetShiningEffect(pItemData); #endif Ahora buscamos la siguiente linea: __ClearWeaponRefineEffect(); Pulsamos un enter y agregamos lo siguiente: #ifdef ENABLE_SHINING_SYSTEM __ClearWeaponShiningEffect(); #endif "AHORA MUY ATENTOS AL CODIGO QUE PONDRE EN PANTALLA DEBERAN DE HACERLO TAL CUAL LO DEJO ACA" "CON LOS CORCHETES TAL CUAL ESTAN EN LA FUNCION" MI CODIGO CItemData * pItemData; if (CItemManager::Instance().GetItemDataPointer(eWeapon, &pItemData)) { ---------------------------ESTOS CORCHETES DEBERAN DE AGREGARLOS TAL CUAL PUSE ACA __GetRefinedEffect(pItemData); #ifdef ENABLE_SHINING_SYSTEM __GetShiningEffect(pItemData); #endif } ---------------------------ESTOS CORCHETES DEBERAN DE AGREGARLOS TAL CUAL PUSE ACA else { ---------------------------ESTOS CORCHETES DEBERAN DE AGREGARLOS TAL CUAL PUSE ACA __ClearWeaponRefineEffect(); #ifdef ENABLE_SHINING_SYSTEM __ClearWeaponShiningEffect(); #endif } ---------------------------ESTOS CORCHETES DEBERAN DE AGREGARLOS TAL CUAL PUSE ACA return true; } UserInterface/Instancebase.cpp Ahora buscamos esta funcion void CInstanceBase::__Initialize() { ..... } Y dentro de ella vamos a buscar la siguiente linea: m_armorRefineEffect = 0; Pulsamos enter y agregamos la siguiente linea: #ifdef ENABLE_SHINING_SYSTEM __ClearWeaponShiningEffect(false); #endif UserInterface/InstanceBase.cpp Ahora agregamos todo este bloque completo al final del archivo #ifdef ENABLE_SHINING_SYSTEM void CInstanceBase::__GetShiningEffect(CItemData* pItem) { bool removeRefineEffect = true; CItemData::TItemShiningTable shiningTable = pItem->GetItemShiningTable(); if (pItem->GetType() == CItemData::ITEM_TYPE_WEAPON) { __ClearWeaponShiningEffect(); if (removeRefineEffect) { bool bRemove = false; for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++) if (strcmp(shiningTable.szShinings[i], "")) bRemove = true; if (bRemove) __ClearWeaponRefineEffect(); } for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++) { if (strcmp(shiningTable.szShinings[i], "")) { #ifdef ENABLE_WOLFMAN_CHARACTER bool twoSidedWeapon = pItem->GetSubType() == CItemData::WEAPON_DAGGER || pItem->GetSubType() == CItemData::WEAPON_CLAW || (IsMountingHorse() && pItem->GetSubType() == CItemData::WEAPON_FAN); #else bool twoSidedWeapon = pItem->GetSubType() == CItemData::WEAPON_DAGGER || (IsMountingHorse() && pItem->GetSubType() == CItemData::WEAPON_FAN); #endif if (twoSidedWeapon) { __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON_LEFT"); } if (pItem->GetSubType() == CItemData::WEAPON_BOW) __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON_LEFT"); else __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON"); } } } #ifdef ENABLE_COSTUME_SYSTEM else if (pItem->GetType() == CItemData::ITEM_TYPE_COSTUME) { #ifdef ENABLE_ACCE_SYSTEM if (pItem->GetSubType() == CItemData::COSTUME_ACCE) { for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++) { if (strcmp(shiningTable.szShinings[i], "")) { __AttachAcceShiningEffect(i, shiningTable.szShinings[i], "Bip01 Spine2"); } } } #endif else if (pItem->GetSubType() == CItemData::COSTUME_BODY) { if (removeRefineEffect) { __ClearArmorRefineEffect(); } for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++) { if (strcmp(shiningTable.szShinings[i], "")) { __AttachArmorShiningEffect(i, shiningTable.szShinings[i]); } } } #ifdef ENABLE_WEAPON_COSTUME_SYSTEM else if (pItem->GetSubType() == CItemData::COSTUME_WEAPON) { __ClearWeaponShiningEffect(); if (removeRefineEffect) { __ClearWeaponRefineEffect(); } for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++) { if (strcmp(shiningTable.szShinings[i], "")) { bool twoSidedWeapon = pItem->GetValue(3) == CItemData::WEAPON_DAGGER || (IsMountingHorse() && pItem->GetValue(3) == CItemData::WEAPON_FAN); if (twoSidedWeapon) { __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON_LEFT"); } if (pItem->GetValue(3) == CItemData::WEAPON_BOW) __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON_LEFT"); else __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON"); } } } #endif } #endif else { if (removeRefineEffect) { __ClearArmorRefineEffect(); } for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++) { if (strcmp(shiningTable.szShinings[i], "")) { __AttachArmorShiningEffect(i, shiningTable.szShinings[i]); } } } } //Attaching the shining effect. //BoneName can be "PART_WEAPON" or "PART_WEAPON_LEFT" to get the attaching bone name dynamically. //If boneName is not given "Bip01" is used as boneName. void CInstanceBase::__AttachWeaponShiningEffect(int effectIndex, const char* effectFileName, const char* boneName) { if (IsAffect(AFFECT_INVISIBILITY)) { return; } if (effectIndex >= CItemData::ITEM_SHINING_MAX_COUNT) { return; } CEffectManager::Instance().RegisterEffect(effectFileName, false, false); if (!strcmp(boneName, "PART_WEAPON")) { const char* c_szRightBoneName; m_GraphicThingInstance.GetAttachingBoneName(CRaceData::PART_WEAPON, &c_szRightBoneName); if (c_szRightBoneName == NULL) return; if (strcmp(c_szRightBoneName, "")) { m_weaponShiningEffects[0][effectIndex] = m_GraphicThingInstance.AttachEffectByName(0, c_szRightBoneName, effectFileName); } } else if (!strcmp(boneName, "PART_WEAPON_LEFT")) { const char* c_szLeftBoneName; m_GraphicThingInstance.GetAttachingBoneName(CRaceData::PART_WEAPON_LEFT, &c_szLeftBoneName); if (c_szLeftBoneName == NULL) return; if (strcmp(c_szLeftBoneName, "")) { m_weaponShiningEffects[1][effectIndex] = m_GraphicThingInstance.AttachEffectByName(0, c_szLeftBoneName, effectFileName); } } else { Tracef("Invalid partname for getting attaching bone name. %s - %s", effectFileName, boneName); } } //Attaching the armor shining effect. //If boneName is not given "Bip01" is used as boneName. void CInstanceBase::__AttachArmorShiningEffect(int effectIndex, const char* effectFileName, const char* boneName) { if (IsAffect(AFFECT_INVISIBILITY)) { return; } if (effectIndex >= CItemData::ITEM_SHINING_MAX_COUNT) { return; } if (!strcmp(boneName, "")) { Tracef("Empty bone name for attaching armor shining. Effect Index: %i, EffectFileName: %s", effectIndex, effectFileName); return; } CEffectManager::Instance().RegisterEffect(effectFileName, false, false); m_armorShiningEffects[effectIndex] = m_GraphicThingInstance.AttachEffectByName(0, boneName, effectFileName); } //Clears all weapon shining effects. Left & Right if set. void CInstanceBase::__ClearWeaponShiningEffect(bool detaching) { for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++) { if (m_weaponShiningEffects[0][i]) { if (detaching) { __DetachEffect(m_weaponShiningEffects[0][i]); } m_weaponShiningEffects[0][i] = 0; } if (m_weaponShiningEffects[1][i]) { if (detaching) { __DetachEffect(m_weaponShiningEffects[1][i]); } m_weaponShiningEffects[1][i] = 0; } } } //Clears all armor shining effects. void CInstanceBase::__ClearArmorShiningEffect(bool detaching) { if (detaching) { for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++) { if (m_armorShiningEffects[i]) { __DetachEffect(m_armorShiningEffects[i]); } } } memset(&m_armorShiningEffects, 0, sizeof(m_armorShiningEffects)); } #endif #ifdef ENABLE_SHINING_SYSTEM #ifdef ENABLE_ACCE_SYSTEM void CInstanceBase::__AttachAcceShiningEffect(int effectIndex, const char* effectFileName, const char* boneName) { if (IsAffect(AFFECT_INVISIBILITY)) { return; } if (effectIndex >= CItemData::ITEM_SHINING_MAX_COUNT) { return; } if (!strcmp(boneName, "")) { Tracef("Empty bone name for attaching armor shining. Effect Index: %i, EffectFileName: %s", effectIndex, effectFileName); return; } CEffectManager::Instance().RegisterEffect(effectFileName, false, false); m_acceShiningEffects[effectIndex] = m_GraphicThingInstance.AttachEffectByName(0, boneName, effectFileName); } #ifdef ENABLE_ACCE_SYSTEM void CInstanceBase::__ClearAcceShiningEffect(bool detaching) { for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++) { if (detaching) { __DetachEffect(m_acceShiningEffects[i]); } m_acceShiningEffects[i] = 0; } } #endif #endif #endif UserInterface/InstanceBase.cpp "Ahora os voy a explicar algo" En el caso de que vuestro sistema de estolas no lleve el define acce, deberan de cambiar el codigo del sistema en las partes que llevan acce por sash "Por ejemplo en el bloque que agregan en InstanceBase.cpp" Ese lleva ACCE como Define, ustedes deberan de agregar el define de su sistema de estolas GameLib/ItemManager.h Aca buscan la siguiente linea: bool LoadItemTable(const char* c_szFileName); Pulsan enter y agregan lo siguiente: #ifdef ENABLE_SHINING_SYSTEM bool LoadShiningTable(const char* c_szFileName); #endif GameLib/ItemManager.cpp Ahora buscan la siguiente funcion bool CItemManager::LoadItemTable(const char* c_szFileName) { ... } Y debajo de la funcion completa pulsan enter y agregan el siguiente bloque #ifdef ENABLE_SHINING_SYSTEM bool CItemManager::LoadShiningTable(const char* szShiningTable) { CMappedFile File; LPCVOID pData; if (!CEterPackManager::Instance().Get(File, szShiningTable, &pData)) return false; CMemoryTextFileLoader textFileLoader; textFileLoader.Bind(File.Size(), pData); CTokenVector TokenVector; for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i) { if (!textFileLoader.SplitLine(i, &TokenVector, "\t")) continue; if (TokenVector.size() > (1 + CItemData::ITEM_SHINING_MAX_COUNT)) { TraceError("CItemManager::LoadShiningTable(%s) - LoadShiningTable in %d\n - RowSize: %d MaxRowSize: %d", szShiningTable, i, TokenVector.size(), CItemData::ITEM_SHINING_MAX_COUNT); } const std::string & c_rstrID = TokenVector[0]; DWORD dwItemVNum = atoi(c_rstrID.c_str()); CItemData * pItemData = MakeItemData(dwItemVNum); if (pItemData) { for (BYTE i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++) { if (i < (TokenVector.size()-1)) { const std::string & c_rstrEffectPath = TokenVector[i + 1]; pItemData->SetItemShiningTableData(i, c_rstrEffectPath.c_str()); } else { pItemData->SetItemShiningTableData(i, ""); } } } } return true; } #endif GameLib/ItemData.h Buscan la siguiente linea: ITEM_SOCKET_MAX_NUM = 3, Pulsan un enter y agregan la siguiente debajo #ifdef ENABLE_SHINING_SYSTEM ITEM_SHINING_MAX_COUNT = 3, #endif Ahora buscan la siguiente linea: void SetItemTableData(TItemTable * pItemTable); Pulsan enter y debajo agregan la siguiente: #ifdef ENABLE_SHINING_SYSTEM typedef struct SItemShiningTable { char szShinings[ITEM_SHINING_MAX_COUNT][256]; public: //Checking if any shining is set for this item. bool Any() const { for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++) { if (strcmp(szShinings[i], "")) { return true; } } return false; } } TItemShiningTable; void SetItemShiningTableData(BYTE bIndex, const char* szEffectname); CItemData::TItemShiningTable GetItemShiningTable() { return m_ItemShiningTable; } #endif Ahora buscan la siguiente linea: TItemTable m_ItemTable; Pulsan enter y debajo pegan la siguiente: #ifdef ENABLE_SHINING_SYSTEM TItemShiningTable m_ItemShiningTable; #endif GameLib/ItemData.cpp Ahora buscan la siguiente funcion: BOOL CItemData::IsEquipment() const { .... } Debajo de la funcion agregan lo siguiente: #ifdef ENABLE_SHINING_SYSTEM void CItemData::SetItemShiningTableData(BYTE bIndex, const char* szEffectname) { sprintf(m_ItemShiningTable.szShinings[bIndex], szEffectname); } #endif Ahora buscan la siguiente funcion: void CItemData::Clear() { ..... } Dentro de esa misma funcion buscan la siguiente linea: memset(&m_ItemTable, 0, sizeof(m_ItemTable)); Pulsan un enter y agregan la siguiente linea: #ifdef ENABLE_SHINING_SYSTEM memset(&m_ItemShiningTable, 0, sizeof(m_ItemShiningTable)); #endif  
    Parte del cliente Va a su locale y agregan el archivo que os dejare debajo "Como funciona el sistema y que hago para implementar un arma, ala o efecto de armadura" Bueno para implementar todo el mundo ya conoce como se implementa una arma o estola. Agregan la parte de la db luego item_list.txt, item_proto "Pero aca si usan arma 3D en el archivo haran lo siguiente" 61202 "D:/ymir work/effect/plechito/weapons/dark_cult_set/bell_glow.mse" El 61202 es el vnum del arma, armadura o ala que llevara el efecto Y al lado va la ruta del mse "Asegurese que el efecto esta completo Y ya eso es todo  
    Y eso seria todo
     
    Adjunto foto de como funciona el sistema correctamente
     

     
    Si lo hacen tal cual le explique en la guia el sistema le funcionara correctamente. 
     
    Adjunte foto cuando metan el sistema, no cuesta nada.
     
    Archivo parte del cliente

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  9. Me Gusta
    Tiburon reacted to guba in borrar   
    No veas lo útil que es esto, con el tiempo que tarde yo a traducir unos files turcos a mano t.t 
    para el tema de la codificación probaste de añadir encoding='cp1252' en la función open? algo así open(path, encoding='cp1252')
    según la documentación de Python esto debería funcionar aun que yo no he trabajado nunca con Python.
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
    Y por el tema de las variables podrías solucionar las mas típicas con un replace() haciendo algo así:
    lines_translate.replace("% D", "%d").replace("% U", "%U").replace("% S", "%S").replace("% Lld", "%lld") O si el locale_string no es Keysensitive simplemente así:
    lines_translate.replace("% ", "%")
    si fuera otro lenguaje podría intentar hacer algo mas complejo pero como dije no he trabajado nunca con Python y lo tendría que buscar. 
  10. Me Gusta
    Tiburon reacted to caanmasu in borrar   
    borrar
  11. Me Gusta
    Tiburon reacted to caanmasu in borrar   
    borrar
  12. Me Gusta
    Tiburon reacted to caanmasu in borrar   
    borrar
  13. Me Gusta
    Tiburon reacted to caanmasu in Evento: Super Metines   
    Hola a todos!
     
    He creado un evento llamado Super Metines, que consiste en invocar metines en un mapa, con la diferencia de que cada metin tiene en las mismas coordenadas 5 veces del mismo.
    Vídeo:
    (ignoren el color del desierto)
     
    El evento consiste en invocar metines en el desierto. Cada metin aparecerá con x metines superpuestos. No es un evento de activar. Solo se soltarán oleadas.
     
    Parámetros de configuración:
    Metines: lista de los vnums de los metines que se van a invocar. Puedes agregar varias veces el mismo vnum si quieres que sea más frecuente.
    Superposición: cantidad de metines del mismo tipo que caerán en la misma ubicación.
    Cantidad de metines a invocar: la cantidad a invocar por el GM está controlada por botones, aunque no hay control sobre la cantidad de oleadas que se pueden lanzar.
     
    La quest está adaptada a multiidioma.
     
    Más detalles:
    - Un pergamino aparece en el GM y tiene la opción de elegir con botones la cantidad de metines que va a lanzar.
    - El mapa seleccionado es el desierto.
    - Puedes agregar los vnums de los metines que quieras, todos caerán aleatorios.
    - Puedes modificar la cantidad de metines superpuestos, por defecto está en 5.
    - Una vez lanzada una oleada, aparecerá un anuncio a todos los personajes.
    - Una vez lanzada una oleada, le aparecerá al GM las coordenadas de los metines invocados.
     
    Cualquier personalización te la puedo hacer a pedido.
     
    Precio de la quest al privado o mensaje a mi Discord: Camilo#0869
     
    Saludos!
  14. Me Gusta
    Tiburon reacted to ChuchoGamer in Efecto de GM Movimiento   
    buenas hoy les vengo a compartir este efecto de gm de movimiento espero que les Guste 

    Link de Descarga 

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  15. Me Gusta
    Tiburon reacted to topekone in [Quest]Ox automatico   
    Toma fein
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  16. Me Gusta
    Tiburon reacted to Happy in [Quest]Ox automatico   
    Código traducido y con tabs: 
    Debes iniciar sesión para ver el contenido del enlace en esta publicación. Creditos: HaverBeen [EPVP]PD: Si no tienen este código: printañadirlo en quest_functions

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  17. Me Gusta
    Tiburon reacted to TTV_RANDARON in [System] BUDOKAN TÁCTICO Y DUELO TACTICO   
    Información del sistema:

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  18. Me Gusta
    Tiburon reacted to Tesio13 in [Plechito] All New Stuff (Refreshed)   
    ENG
    Welcome!
    I have a fully updated model list for you from Plechito and many other interesting models.
    Let me add that this is the largest list of free download models ever!
    ESP
    Bienvenido!
    Tengo una lista de modelos completamente actualizada para ti de Plechito y muchos otros modelos interesantes. Permítanme agregar que esta es la lista más grande de modelos de descarga gratuita.
     
    Here you will find things like
    - [Plechito] All Dungeon - [Plechito] All Map's - [Plechito] All Armor - [Plechito] All Weapon - [Plechito] All Pet's - [Plechito] All Mount's - [Plechito] All Costume And many others!
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
     
     
    Last Actualisation : 25/08/2021
     
  19. Me Gusta
    Tiburon reacted to Kenshi Torres in [FIX]socket_bind: bind: Address already in use   
    Algunos de mis amigos me han preguntado este error, la descripción del error está en rar, les deseo un buen día.
    Link de descarga 
     
  20. Me Gusta
    Tiburon reacted to nilsonmax in Web Beyond2 antigua - FREE (GRATIS)   
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
  21. Me Gusta
    Tiburon reacted to Sasa8112 in [SERVERFILES] Zentoria2 𝓟𝓡𝓔𝓜𝓘𝓤𝓜   
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  22. Me Gusta
    Tiburon reacted to Kronixer™ in WebSite Premiunm (CMS)   
    Descarga :   
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  23. Me Gusta
    Tiburon reacted to Jonga in [SERVERFILES] Zentoria2 𝓟𝓡𝓔𝓜𝓘𝓤𝓜   
    ty, did u fix cryptopp?
  24. Me Gusta
    Tiburon reacted to Sasa8112 in [SERVERFILES] Zentoria2 𝓟𝓡𝓔𝓜𝓘𝓤𝓜   
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  25. Me Gusta
    Tiburon reacted to Kronixer™ in PACHI y Tunga ServerFiles   
    FOTO::
    DESCARGA :
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
    Si tiene problemas con Github ----
    Descarga alternativa Se incluyen todas las actualizaciones hasta el 12.04.2021. La publicación no está incluida.

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
    Debes iniciar sesión para ver el contenido del enlace en esta publicación. FreeBSD
    [Información del archivo]
    Versión FreeBSD: 11.3
    Versión SQL: MariaDB 10.3

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    DumpProto

    Debes iniciar sesión para ver el contenido del enlace en esta publicación. INFORMACION
    VISUAL STUDIO 2019

    Compilation Engine: gmake
    Build Tool: clang-devel (llvm-devel)

    [Información de cuenta]
    ID: pachi
    Contraseña: 12345
    PIN: 1234

    [Información de Navicat]
    MariaDB
    ID: root
    Contraseña: contraseña Puede especificar sus
    Creditos:
    Productores de archivos: Debes iniciar sesión para ver el contenido del enlace en esta publicación. , Debes iniciar sesión para ver el contenido del enlace en esta publicación.
    For;

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
×
×
  • Crear nuevo...