Tipo de Conteúdo
Perfis
Fóruns
Atualizações
Quizzes
Raffles
Store
Tudo que hamiltoncw postou
-
Tutorial Banco de Dados Tutorial 11 - Transações (Garantindo Consistência e Atomicidade)
hamiltoncw postou um tópico no fórum em Banco de Dados
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] -
Tutorial Banco de Dados Tutorial 10 - Normalização (Eliminando Redundância e Melhorando Integridade)
hamiltoncw postou um tópico no fórum em Banco de Dados
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] -
Tutorial Banco de Dados Tutorial 09 - Índices (Acelerando Consultas no Banco)
hamiltoncw postou um tópico no fórum em Banco de Dados
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] -
Tutorial Banco de Dados Tutorial 08 - JOINs em SQL (Combinando Dados de Múltiplas Tabelas)
hamiltoncw postou um tópico no fórum em Banco de Dados
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] -
Tutorial Banco de Dados Tutorial 07 - SQL: INSERT, UPDATE, DELETE (Modificando Dados com Segurança)
hamiltoncw postou um tópico no fórum em Banco de Dados
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] -
Tutorial Banco de Dados Tutorial 06 - SQL Básico: SELECT (Consultando Dados com Eficiência)
hamiltoncw postou um tópico no fórum em Banco de Dados
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] -
Tutorial Banco de Dados Tutorial 05 - Chaves Primárias e Estrangeiras (Garantindo Integridade)
hamiltoncw postou um tópico no fórum em Banco de Dados
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] -
Tutorial Banco de Dados Tutorial 04 - Tabelas e Relacionamentos (Construindo a Estrutura do Banco)
hamiltoncw postou um tópico no fórum em Banco de Dados
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] -
Tutorial Banco de Dados Tutorial 03 - Modelo Relacional (Estrutura e Organização de Dados)
hamiltoncw postou um tópico no fórum em Banco de Dados
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] -
Tutorial Banco de Dados Tutorial 02 - Tipos de Bancos de Dados (Relacionais vs. NoSQL)
hamiltoncw postou um tópico no fórum em Banco de Dados
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] -
Tutorial Banco de Dados Tutorial 01 - O que é um Banco de Dados? (Guia Completo para Iniciantes)
hamiltoncw postou um tópico no fórum em Banco de Dados
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] -
Olá, Administração, Moderação e Comunidade, Venho aqui expor um problema grave e persistente que está minando a motivação e a justiça dentro do nosso fórum: os sistemas de TOP WCOINS e TOP REPUTAÇÃO estão seriamente bugados e não refletem a realidade das pontuações dos usuários. Há muito tempo, eu e outros membros ativos, como o usuário Grego, temos observado e comentado sobre essas inconsistências. A situação se tornou insustentável e não posso mais ficar calado, pois é desrespeitoso com todo o trabalho que dedicamos a esta comunidade. Os Principais Problemas: TOP WCOINS é Inconsistente e Excludente: O ranking frequentemente não mostra todos os usuários que deveriam estar na lista. Por exemplo: quando se atinge a pontuação do terceiro lugar, só aparecem dois usuários; quando se atinge o segundo, só aparece um. Isso é uma falha técnica evidente que ignora o esforço de membros dedicados. TOP REPUTAÇÃO está Congelado e é Injusto: Atualmente, eu e o Grego temos as pontuações de reputação mais altas do fórum, mas nossos nomes nunca aparecem no topo desse ranking. O sistema está claramente desatualizado, mostrando uma realidade paralela que não condiz com os fatos. Ver usuários como I-System e Odin permanentemente no topo, enquanto quem realmente acumulou a reputação fica de fora, é profundamente desmotivador. O Impacto Disso Tudo: Desmotivação Total: Para que nos esforçamos para postar conteúdo de qualidade, ajudar outros usuários e acumular WCoins e reputação se o sistema não nos reconhece? O principal objetivo desses rankings – incentivar a participação – está sendo completamente perdido. Percepção de Favoritismo ou Manipulação: A forma como está gera a séria suspeita de que o ranking não é automático e justo, mas sim controlado manualmente para beneficiar algumas pessoas. A frase "só aceitando as pessoas que querem no fórum" reflete o sentimento de vários membros. Descredibiliza o Fórum: Um sistema de reconhecimento quebrado passa a imagem de uma administração negligente ou que não se importa com a contribuição real de sua base de usuários. Meu Apelo Final: Não se trata apenas de um "bugzinho", mas de uma falha sistêmica que está prejudicando a saúde da comunidade. Nós, usuários que trabalhamos para o crescimento e benefício do fórum, merecemos transparência e justiça. Solicitamos formalmente que a Administração: Reconheça publicamente este problema. Investigue a fundo as causas (se é um bug técnico ou uma configuração errônea). Corrija os rankings para que eles reflitam, com precisão e em tempo real, as pontuações de TODOS os usuários. Esperamos uma posição e, mais importante, ações concretas para resolver esta situação. A credibilidade do fórum e a motivação de seus membros mais ativos estão em jogo. Atenciosamente,
-
Personalizar WYD 🎵 🎵 Tutorial: Como Personalizar as Músicas do WYD 🎵🎵
hamiltoncw postou um tópico no fórum em Tutoriais
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] -
Dava pra usar email temporário mas ele removeram isso agora só criando email verdadeiros pra usar, da um trampo mas é issou ou pagar e já fiz o teste com ela paga e consome U$20 muito mais muito rápido mesmo.
- 4 respostas
-
INOVAÇÃO NO WYD 🔥 INOVAÇÃO NO WYD ! MOSTROS AGRESSIVOS ,OS MONSTROS VÃO PERSEGUIR VOCÊ! 🔥
hamiltoncw postou um tópico no fórum em Tutoriais
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ Neste tutorial COMPLETO E INÉDITO, eu te mostro o PASSO A PASSO para modificar a Inteligência Artificial dos monstros no WYD - With Your Destiny! Deixe o seu servidor com um gameplay muito mais desafiador e dinâmico, igual aos MMOs modernos. 🛠️ O que você vai aprender neste vídeo: ✅ Como os monstros agressivos funcionam nos MMOs atuais ✅ Demonstração prática do novo comportamento no jogo ✅ Localização EXATA do código na source do servidor ✅ Quais linhas modificar para ativar a agressividade ✅ Tutorial detalhado para aplicar no SEU servidor 💻 CÓDIGO FONTE E MODIFICAÇÕES COMPARTILHADOS NO VÍDEO! 📁 Material do Vídeo: • Demonstração do sistema em ação • Análise completa do código • Explicação das variáveis e funções 🎮 Deixe seu WYD mais profissional e atrativo para os players! [Hidden Content] 🔔 INSCREVA-SE e ative o sininho para não perder os próximos tutoriais de desenvolvimento e moderação de servidores! 💬 Nos comentários, me conta: qual próxima modificação você gostaria de ver no WYD? #WYD #MMORPG #DesenvolvimentoDeJogos-
- 19
-
-
- MONSTROS
- AGRESSIVOS
- (e 1 mais)
-
mysql 🔧 Como Corrigir Erro MySQL no Servidor WYD ❌ Client does not support authentication protocol ✅
hamiltoncw postou um tópico no fórum em Tutoriais
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️ 📝 Descrição: 🔥 Aprenda passo a passo como resolver o erro do MySQL no servidor de WYD: ⚠️ Client does not support authentication protocol requested by server ✅ Usando apenas dois comandos no MySQL, seu servidor volta a funcionar sem complicação! 📌 Também ensino como reverter para o método padrão do MySQL 8. ✏️ CÓDIGO UTILIZADO ABAIXO: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456'; FLUSH PRIVILEGES; [Hidden Content] 🔔 Inscreva-se para mais tutoriais de servidores e games!-
- 3
-
-
- servididor wyd
- authentication
- (e 1 mais)
-
BATE-PAPO 🚨 Servidor Privado de WYD é Permitido? 🚨
hamiltoncw respondeu ao tópico de hamiltoncw em WYD - Bate Papo
Acompanhando...- 11 respostas
-
- 1
-
-
- DIREITOS AUTORAIS
- LICENÇA
- (e 2 mais)
-
BATE-PAPO 🚨 Servidor Privado de WYD é Permitido? 🚨
hamiltoncw respondeu ao tópico de hamiltoncw em WYD - Bate Papo
è Tenso mas todos sabem do risco, ai fica a escolha é igual vender drogas muitos se aventuram e outros não mas todos sabem do risco kkkkkkkkkkkk, peguei pesando na comparação né shahshahshas- 11 respostas
-
- 5
-
-
- DIREITOS AUTORAIS
- LICENÇA
- (e 2 mais)
-
LINEAGE 2 🖥️ Modificações no Cliente L2 🖥️
hamiltoncw postou um tópico no fórum em Lineage 2 - Tutoriais & Dicas
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] -
LINEAGE 2 🎨 Personalização de Interface 🎨
hamiltoncw postou um tópico no fórum em Lineage 2 - Tutoriais & Dicas
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] Vírus Total: [Hidden Content]-
- 5
-
-
- L2J
- PERSONALIZAÇÃO
-
(e 2 mais)
Tags:
-
LINEAGE 2 🏆 Sistema de Rankings 🏆
hamiltoncw postou um tópico no fórum em Lineage 2 - Tutoriais & Dicas
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content] Vírus Total: [Hidden Content] -
LINEAGE 2 🎪 Criação de Eventos Automáticos 🎪
hamiltoncw postou um tópico no fórum em Lineage 2 - Tutoriais & Dicas
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ ## 📝 Introdução Eventos são fundamentais para manter os jogadores engajados e criar momentos especiais no servidor. Este tutorial ensina como criar um sistema completo de eventos automáticos com agendamento, mecânicas variadas e recompensas. ## 🎯 O que você vai aprender - Sistema de agendamento de eventos - Eventos PvP automáticos - Eventos PvE cooperativos - Sistema de recompensas dinâmicas - Interface de gerenciamento de eventos ## 🏗️ Sistema Base de Eventos ### Event Manager Framework ```java // EventManager.java public class EventManager { private static final Map<String, AutomaticEvent> REGISTERED_EVENTS = new HashMap<>(); private static final Map<String, EventSchedule> EVENT_SCHEDULES = new HashMap<>(); private static final ScheduledExecutorService SCHEDULER = Executors.newScheduledThreadPool(3); private static AutomaticEvent currentEvent = null; private static long lastEventEnd = 0; static { registerEvents(); startEventScheduler(); } private static void registerEvents() { // Registrar todos os tipos de evento REGISTERED_EVENTS.put("team_vs_team", new TeamVsTeamEvent()); REGISTERED_EVENTS.put("treasure_hunt", new TreasureHuntEvent()); REGISTERED_EVENTS.put("boss_raid", new BossRaidEvent()); REGISTERED_EVENTS.put("capture_flag", new CaptureFlagEvent()); REGISTERED_EVENTS.put("monster_invasion", new MonsterInvasionEvent()); REGISTERED_EVENTS.put("race_event", new RaceEvent()); REGISTERED_EVENTS.put("survival_challenge", new SurvivalChallengeEvent()); } private static void startEventScheduler() { // Verificar eventos a cada minuto SCHEDULER.scheduleAtFixedRate(() -> { checkScheduledEvents(); }, 1, 1, TimeUnit.MINUTES); // Anunciar próximos eventos SCHEDULER.scheduleAtFixedRate(() -> { announceUpcomingEvents(); }, 5, 5, TimeUnit.MINUTES); } public static void scheduleEvent(String eventType, String cronExpression, EventConfig config) { EventSchedule schedule = new EventSchedule(eventType, cronExpression, config); EVENT_SCHEDULES.put(eventType + "_" + System.currentTimeMillis(), schedule); System.out.println("Evento agendado: " + eventType + " - " + cronExpression); } public static boolean startEvent(String eventType, EventConfig config) { if (currentEvent != null && currentEvent.isActive()) { return false; // Já há evento ativo } AutomaticEvent event = REGISTERED_EVENTS.get(eventType); if (event == null) { System.out.println("Tipo de evento desconhecido: " + eventType); return false; } try { // Configurar evento event.configure(config); // Verificar se há players suficientes if (!hasMinimumPlayers(event.getMinPlayers())) { announceToAll("Evento " + event.getName() + " cancelado por falta de jogadores!"); return false; } // Iniciar evento currentEvent = event; event.start(); // Log do evento logEventStart(eventType, config); return true; } catch (Exception e) { System.err.println("Erro ao iniciar evento " + eventType + ": " + e.getMessage()); return false; } } public static void endCurrentEvent(boolean forced) { if (currentEvent != null) { try { currentEvent.end(forced); logEventEnd(currentEvent.getEventType(), forced); lastEventEnd = System.currentTimeMillis(); } catch (Exception e) { System.err.println("Erro ao finalizar evento: " + e.getMessage()); } finally { currentEvent = null; } } } private static void checkScheduledEvents() { long currentTime = System.currentTimeMillis(); // Cooldown entre eventos (mínimo 15 minutos) if (currentTime - lastEventEnd < 15 * 60 * 1000) { return; } for (EventSchedule schedule : EVENT_SCHEDULES.values()) { if (schedule.shouldTrigger(currentTime)) { startEvent(schedule.getEventType(), schedule.getConfig()); break; // Apenas um evento por vez } } } private static void announceUpcomingEvents() { long currentTime = System.currentTimeMillis(); long nextHour = currentTime + 60 * 60 * 1000; // Próxima hora for (EventSchedule schedule : EVENT_SCHEDULES.values()) { long nextTrigger = schedule.getNextTriggerTime(currentTime); if (nextTrigger > currentTime && nextTrigger <= nextHour) { long minutesUntil = (nextTrigger - currentTime) / (60 * 1000); AutomaticEvent event = REGISTERED_EVENTS.get(schedule.getEventType()); if (event != null) { announceToAll(String.format("🎪 %s começará em %d minutos!", event.getName(), minutesUntil)); } } } } // Métodos auxiliares private static boolean hasMinimumPlayers(int minPlayers) { int onlinePlayers = L2World.getInstance().getAllPlayersCount(); return onlinePlayers >= minPlayers; } private static void logEventStart(String eventType, EventConfig config) { System.out.println(String.format("[EVENT] %s iniciado - Config: %s", eventType, config.toString())); } private static void logEventEnd(String eventType, boolean forced) { System.out.println(String.format("[EVENT] %s finalizado %s", eventType, forced ? "(forçado)" : "(normal)")); } // Getters public static AutomaticEvent getCurrentEvent() { return currentEvent; } public static boolean hasActiveEvent() { return currentEvent != null && currentEvent.isActive(); } } ``` ### Base Event Class ```java // AutomaticEvent.java public abstract class AutomaticEvent { protected String eventType; protected String eventName; protected EventConfig config; protected boolean active = false; protected long startTime; protected long duration; protected List<L2PcInstance> participants = new ArrayList<>(); protected EventState currentState = EventState.WAITING; public AutomaticEvent(String eventType, String eventName) { this.eventType = eventType; this.eventName = eventName; } public void configure(EventConfig config) { this.config = config; this.duration = config.getDurationMinutes() * 60 * 1000; } public final void start() { this.startTime = System.currentTimeMillis(); this.active = true; this.currentState = EventState.REGISTRATION; // Anunciar início announceEventStart(); // Período de registro ThreadPoolManager.getInstance().scheduleGeneral(() -> { if (active) { beginEvent(); } }, config.getRegistrationTimeMinutes() * 60 * 1000); // Auto-finalizar após duração ThreadPoolManager.getInstance().scheduleGeneral(() -> { if (active) { end(false); } }, duration); // Chamada específica do evento onEventStart(); } public final void end(boolean forced) { this.active = false; this.currentState = EventState.FINISHED; try { // Finalizar lógica específica onEventEnd(forced); // Distribuir recompensas finais distributeRewards(); // Teleportar participantes de volta teleportParticipantsBack(); // Anunciar fim announceEventEnd(forced); } catch (Exception e) { System.err.println("Erro ao finalizar evento: " + e.getMessage()); } } protected void beginEvent() { this.currentState = EventState.ACTIVE; if (participants.size() < getMinPlayers()) { announceToAll("Evento cancelado: jogadores insuficientes!"); end(true); return; } // Teleportar participantes teleportParticipantsToEvent(); // Iniciar lógica específica onEventBegin(); } public boolean registerPlayer(L2PcInstance player) { if (currentState != EventState.REGISTRATION) { player.sendMessage("Período de registro encerrado!"); return false; } if (participants.contains(player)) { player.sendMessage("Você já está registrado neste evento!"); return false; } if (!canPlayerParticipate(player)) { return false; } participants.add(player); onPlayerRegister(player); player.sendMessage("Você se registrou para o evento: " + eventName); announceToAll(player.getName() + " se registrou! (" + participants.size() + " participantes)"); return true; } protected boolean canPlayerParticipate(L2PcInstance player) { // Verificações básicas if (player.getLevel() < config.getMinLevel()) { player.sendMessage("Level mínimo necessário: " + config.getMinLevel()); return false; } if (player.getLevel() > config.getMaxLevel()) { player.sendMessage("Level máximo permitido: " + config.getMaxLevel()); return false; } if (player.isInOlympiadMode() || player.isInDuel()) { player.sendMessage("Você não pode participar durante olympiad ou duel!"); return false; } if (player.getKarma() > 0 && !config.allowsKarmaPlayers()) { player.sendMessage("Jogadores com karma não podem participar!"); return false; } return true; } protected void teleportParticipantsToEvent() { EventLocation eventLoc = getEventLocation(); for (L2PcInstance player : participants) { // Salvar localização anterior player.setVar("event_return_x", String.valueOf(player.getX())); player.setVar("event_return_y", String.valueOf(player.getY())); player.setVar("event_return_z", String.valueOf(player.getZ())); // Teleportar para evento player.teleToLocation(eventLoc.getX(), eventLoc.getY(), eventLoc.getZ()); player.sendMessage("Você foi teleportado para o evento!"); // Aplicar proteções applyEventProtections(player); } } protected void teleportParticipantsBack() { for (L2PcInstance player : participants) { // Remover proteções removeEventProtections(player); // Teleportar de volta try { int returnX = Integer.parseInt(player.getVar("event_return_x")); int returnY = Integer.parseInt(player.getVar("event_return_y")); int returnZ = Integer.parseInt(player.getVar("event_return_z")); player.teleToLocation(returnX, returnY, returnZ); // Limpar variáveis player.unsetVar("event_return_x"); player.unsetVar("event_return_y"); player.unsetVar("event_return_z"); } catch (Exception e) { // Fallback para cidade segura player.teleToLocation(83400, 147943, -3404); // Giran } } } protected void applyEventProtections(L2PcInstance player) { // Proteção contra logout player.setEventParticipant(true); // Buffs de evento se configurado if (config.providesBuffs()) { applyEventBuffs(player); } // Heal completo player.setCurrentHp(player.getMaxHp()); player.setCurrentMp(player.getMaxMp()); player.setCurrentCp(player.getMaxCp()); } // Métodos abstratos que cada evento deve implementar protected abstract void onEventStart(); protected abstract void onEventBegin(); protected abstract void onEventEnd(boolean forced); protected abstract void onPlayerRegister(L2PcInstance player); protected abstract void distributeRewards(); protected abstract EventLocation getEventLocation(); public abstract int getMinPlayers(); // Getters public String getEventType() { return eventType; } public String getName() { return eventName; } public boolean isActive() { return active; } public EventState getCurrentState() { return currentState; } public List<L2PcInstance> getParticipants() { return new ArrayList<>(participants); } // Enums public enum EventState { WAITING, REGISTRATION, ACTIVE, FINISHED } } ``` ## ⚔️ Eventos PvP ### Team vs Team Event ```java // TeamVsTeamEvent.java public class TeamVsTeamEvent extends AutomaticEvent { private List<L2PcInstance> teamRed = new ArrayList<>(); private List<L2PcInstance> teamBlue = new ArrayList<>(); private Map<L2PcInstance, Integer> playerKills = new HashMap<>(); private Map<L2PcInstance, Integer> playerDeaths = new HashMap<>(); private int redTeamScore = 0; private int blueTeamScore = 0; private final int SCORE_TO_WIN = 50; public TeamVsTeamEvent() { super("team_vs_team", "Team vs Team"); } @Override protected void onEventStart() { announceToAll("🔥 TEAM VS TEAM iniciando!"); announceToAll("Primeiro time a fazer " + SCORE_TO_WIN + " kills ganha!"); announceToAll("Digite .join para participar!"); } @Override protected void onEventBegin() { // Dividir players em times dividePlayersIntoTeams(); // Teleportar times para lados opostos teleportTeamsToPositions(); // Iniciar contagem regressiva startCountdown(); } private void dividePlayersIntoTeams() { Collections.shuffle(participants); for (int i = 0; i < participants.size(); i++) { L2PcInstance player = participants.get(i); if (i % 2 == 0) { teamRed.add(player); player.setTeam(1); // Red team player.setTitle("Red Team"); player.getAppearance().setNameColor(0xFF0000); } else { teamBlue.add(player); player.setTeam(2); // Blue team player.setTitle("Blue Team"); player.getAppearance().setNameColor(0x0000FF); } player.broadcastUserInfo(); playerKills.put(player, 0); playerDeaths.put(player, 0); } announceToAll("Times formados: Red (" + teamRed.size() + ") vs Blue (" + teamBlue.size() + ")"); } private void teleportTeamsToPositions() { // Posições do evento (exemplo: Coliseum) EventLocation redSpawn = new EventLocation(150086, 46733, -3412); EventLocation blueSpawn = new EventLocation(150986, 46733, -3412); // Teleportar time vermelho for (L2PcInstance player : teamRed) { int x = redSpawn.getX() + Rnd.get(-100, 100); int y = redSpawn.getY() + Rnd.get(-100, 100); player.teleToLocation(x, y, redSpawn.getZ()); } // Teleportar time azul for (L2PcInstance player : teamBlue) { int x = blueSpawn.getX() + Rnd.get(-100, 100); int y = blueSpawn.getY() + Rnd.get(-100, 100); player.teleToLocation(x, y, blueSpawn.getZ()); } } private void startCountdown() { // Congelar players for (L2PcInstance player : participants) { player.setIsImmobilized(true); } // Countdown 5 segundos for (int i = 5; i >= 1; i--) { final int count = i; ThreadPoolManager.getInstance().scheduleGeneral(() -> { announceToParticipants("Começando em: " + count); }, (5 - i) * 1000); } // Liberar movimento e iniciar batalha ThreadPoolManager.getInstance().scheduleGeneral(() -> { for (L2PcInstance player : participants) { player.setIsImmobilized(false); } announceToParticipants("🚀 LUTA COMEÇOU! BOA SORTE!"); }, 5000); } public void onPlayerKill(L2PcInstance killer, L2PcInstance victim) { if (!participants.contains(killer) || !participants.contains(victim)) { return; } // Aumentar kills do assassino int kills = playerKills.get(killer) + 1; playerKills.put(killer, kills); // Aumentar deaths da vítima int deaths = playerDeaths.get(victim) + 1; playerDeaths.put(victim, deaths); // Aumentar score do time if (teamRed.contains(killer)) { redTeamScore++; announceToParticipants(killer.getName() + " (Red) matou " + victim.getName() + "! Score: Red " + redTeamScore + " - Blue " + blueTeamScore); } else { blueTeamScore++; announceToParticipants(killer.getName() + " (Blue) matou " + victim.getName() + "! Score: Red " + redTeamScore + " - Blue " + blueTeamScore); } // Verificar vitória if (redTeamScore >= SCORE_TO_WIN) { endEventWithWinner("Red Team"); } else if (blueTeamScore >= SCORE_TO_WIN) { endEventWithWinner("Blue Team"); } // Ressuscitar vítima em local seguro ThreadPoolManager.getInstance().scheduleGeneral(() -> { revivePlayer(victim); }, 3000); } private void revivePlayer(L2PcInstance player) { if (player.isDead()) { player.doRevive(); // Teleportar para spawn do time if (teamRed.contains(player)) { player.teleToLocation(150086, 46733, -3412); } else { player.teleToLocation(150986, 46733, -3412); } // Heal completo player.setCurrentHp(player.getMaxHp()); player.setCurrentMp(player.getMaxMp()); player.setCurrentCp(player.getMaxCp()); } } private void endEventWithWinner(String winningTeam) { announceToAll("🏆 " + winningTeam + " VENCEU!"); // Dar recompensas extras para o time vencedor List<L2PcInstance> winners = winningTeam.equals("Red Team") ? teamRed : teamBlue; for (L2PcInstance winner : winners) { giveWinnerRewards(winner); } end(false); } @Override protected void distributeRewards() { for (L2PcInstance player : participants) { int kills = playerKills.get(player); int deaths = playerDeaths.get(player); // Recompensa base int baseReward = 50000; // 50k adena // Bonus por kills int killBonus = kills * 10000; // 10k por kill // Penalty por deaths (máximo 50% da recompensa) int deathPenalty = Math.min(baseReward / 2, deaths * 5000); int totalReward = Math.max(10000, baseReward + killBonus - deathPenalty); // Dar recompensa player.addItem("EventReward", 57, totalReward, null, true); player.sendMessage(String.format("Recompensa TvT: %d adena (K:%d D:%d)", totalReward, kills, deaths)); } } private void giveWinnerRewards(L2PcInstance player) { // Recompensas extras para vencedores player.addItem("EventWinner", 6577, 1, null, true); // Blessed scroll player.addItem("EventWinner", 57, 100000, null, true); // 100k bonus player.sendMessage("🎉 Recompensa de vitória recebida!"); } @Override protected void onEventEnd(boolean forced) { // Limpar teams for (L2PcInstance player : participants) { player.setTeam(0); player.setTitle(""); player.getAppearance().setNameColor(0xFFFFFF); player.broadcastUserInfo(); } if (!forced) { announceToAll("Team vs Team finalizado! Obrigado pela participação!"); } } @Override protected void onPlayerRegister(L2PcInstance player) { // Preparação específica para TvT } @Override protected EventLocation getEventLocation() { return new EventLocation(150536, 46733, -3412); // Centro do coliseum } @Override public int getMinPlayers() { return 4; // Mínimo 2 vs 2 } } ``` ### Capture the Flag Event ```java // CaptureFlagEvent.java public class CaptureFlagEvent extends AutomaticEvent { private L2NpcInstance redFlag; private L2NpcInstance blueFlag; private L2PcInstance redFlagCarrier; private L2PcInstance blueFlagCarrier; private int redCapturePoints = 0; private int blueCapturePoints = 0; private final int POINTS_TO_WIN = 3; public CaptureFlagEvent() { super("capture_flag", "Capture the Flag"); } @Override protected void onEventBegin() { // Dividir em teams dividePlayersIntoTeams(); // Spawnar bandeiras spawnFlags(); // Iniciar mecânica de captura startFlagMechanics(); } private void spawnFlags() { try { // Bandeira vermelha (base azul deve capturar) L2NpcTemplate redTemplate = NpcTable.getInstance().getTemplate(35001); // Custom flag NPC redFlag = new L2NpcInstance(IdFactory.getInstance().getNextId(), redTemplate); redFlag.spawnMe(150000, 46500, -3412); redFlag.setTitle("Red Flag"); // Bandeira azul (base vermelha deve capturar) L2NpcTemplate blueTemplate = NpcTable.getInstance().getTemplate(35002); blueFlag = new L2NpcInstance(IdFactory.getInstance().getNextId(), blueTemplate); blueFlag.spawnMe(151000, 46500, -3412); blueFlag.setTitle("Blue Flag"); announceToParticipants("Bandeiras spawnadas! Capture a bandeira inimiga!"); } catch (Exception e) { System.err.println("Erro ao spawnar bandeiras: " + e.getMessage()); } } public void onFlagClick(L2PcInstance player, L2NpcInstance flag) { if (!participants.contains(player)) return; if (flag == redFlag && player.getTeam() == 2) { // Blue player clicking red flag captureFlag(player, "red"); } else if (flag == blueFlag && player.getTeam() == 1) { // Red player clicking blue flag captureFlag(player, "blue"); } else { player.sendMessage("Você não pode capturar sua própria bandeira!"); } } private void captureFlag(L2PcInstance player, String flagColor) { if (flagColor.equals("red") && redFlagCarrier != null) { player.sendMessage("A bandeira vermelha já foi capturada!"); return; } if (flagColor.equals("blue") && blueFlagCarrier != null) { player.sendMessage("A bandeira azul já foi capturada!"); return; } // Capturar bandeira if (flagColor.equals("red")) { redFlagCarrier = player; redFlag.deleteMe(); player.setTitle("Carrying Red Flag"); } else { blueFlagCarrier = player; blueFlag.deleteMe(); player.setTitle("Carrying Blue Flag"); } player.broadcastUserInfo(); announceToParticipants(player.getName() + " capturou a bandeira " + flagColor + "!"); // Marcar visualmente o portador player.startAbnormalEffect(L2Character.ABNORMAL_EFFECT_MAGIC_CIRCLE); // Verificar se chegou na base para pontuar startFlagDeliveryCheck(player, flagColor); } private void startFlagDeliveryCheck(L2PcInstance player, String flagColor) { ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(() -> { if (!participants.contains(player)) return; // Verificar se jogador morreu ou deslogou if (player.isDead() || !player.isOnline()) { dropFlag(player, flagColor); return; } // Verificar se chegou na base boolean atBase = false; if (flagColor.equals("red") && player.getTeam() == 2) { // Blue team atBase = player.getDistance(151000, 46500, -3412) < 100; // Blue base } else if (flagColor.equals("blue") && player.getTeam() == 1) { // Red team atBase = player.getDistance(150000, 46500, -3412) < 100; // Red base } if (atBase) { scorePoint(player, flagColor); } }, 1000, 1000); // Verificar a cada segundo } private void scorePoint(L2PcInstance player, String flagColor) { // Pontuação if (player.getTeam() == 1) { // Red team redCapturePoints++; } else { blueCapturePoints++; } announceToParticipants(String.format("%s pontuou! Red: %d - Blue: %d", player.getName(), redCapturePoints, blueCapturePoints)); // Reset flag resetFlag(player, flagColor); // Verificar vitória if (redCapturePoints >= POINTS_TO_WIN) { endEventWithWinner("Red Team"); } else if (blueCapturePoints >= POINTS_TO_WIN) { endEventWithWinner("Blue Team"); } } private void dropFlag(L2PcInstance player, String flagColor) { player.setTitle(""); player.stopAbnormalEffect(L2Character.ABNORMAL_EFFECT_MAGIC_CIRCLE); player.broadcastUserInfo(); announceToParticipants(player.getName() + " dropou a bandeira " + flagColor + "!"); // Respawnar bandeira na posição original após 10 segundos ThreadPoolManager.getInstance().scheduleGeneral(() -> { resetFlag(player, flagColor); }, 10000); } private void resetFlag(L2PcInstance player, String flagColor) { player.setTitle(""); player.stopAbnormalEffect(L2Character.ABNORMAL_EFFECT_MAGIC_CIRCLE); player.broadcastUserInfo(); if (flagColor.equals("red")) { redFlagCarrier = null; // Respawnar bandeira vermelha try { L2NpcTemplate template = NpcTable.getInstance().getTemplate(35001); redFlag = new L2NpcInstance(IdFactory.getInstance().getNextId(), template); redFlag.spawnMe(150000, 46500, -3412); redFlag.setTitle("Red Flag"); } catch (Exception e) { e.printStackTrace(); } } else { blueFlagCarrier = null; // Respawnar bandeira azul try { L2NpcTemplate template = NpcTable.getInstance().getTemplate(35002); blueFlag = new L2NpcInstance(IdFactory.getInstance().getNextId(), template); blueFlag.spawnMe(151000, 46500, -3412); blueFlag.setTitle("Blue Flag"); } catch (Exception e) { e.printStackTrace(); } } } @Override protected void onEventEnd(boolean forced) { // Limpar bandeiras if (redFlag != null) redFlag.deleteMe(); if (blueFlag != null) blueFlag.deleteMe(); // Limpar efeitos dos players for (L2PcInstance player : participants) { player.setTitle(""); player.setTeam(0); player.stopAbnormalEffect(L2Character.ABNORMAL_EFFECT_MAGIC_CIRCLE); player.broadcastUserInfo(); } } // Implementar métodos abstratos restantes... @Override protected void onEventStart() { announceToAll("🏴 CAPTURE THE FLAG iniciando!"); } @Override protected void distributeRewards() { // Distribuir recompensas baseadas na pontuação for (L2PcInstance player : participants) { int baseReward = 40000; player.addItem("CTFReward", 57, baseReward, null, true); } } @Override protected void onPlayerRegister(L2PcInstance player) {} @Override protected EventLocation getEventLocation() { return new EventLocation(150500, 46500, -3412); } @Override public int getMinPlayers() { return 4; } } -
LINEAGE 2 🔮 Sistema de Skills Personalizadas 🔮
hamiltoncw postou um tópico no fórum em Lineage 2 - Tutoriais & Dicas
HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST "PROGRAMAÇÃO PARA LINEAGE 2" DO MEU CANAL NO YOUTUBE 🎬 ▶️ [Hidden Content]-
- 3
-
-
- SKILL
- PERSONAGENS
-
(e 1 mais)
Tags:

