Jump to content

Recommended Posts

Posted

Introduction

Εδω και 1 βδομαδα αρχισα να μαθενω λιγο C# , γι αυτο αλλωστε και το basic στον τιτλο. Ακομα δεν ειμαι σε θεση να κανω κατι advanced γιατι ασχολουμαι λιγο καιρο.Τι προκειται να κανουμε ακριβως; Για οσους δεν καταλαβαν θα κανουμε 1 προγραμμα στο οποιο καποιος χρηστης του server σας θα βαζει το ονομα του χαρακτηρα του, το τιτλο του email (subject) και το body(κεντρικο σημειωμα) και θα διαλεγει τι ειδος εξυπηρετηση θελει. Θα παταει ενα κουμπι και τα στοιχεια θα πανε στο email του admin.Σε αυτο το tutorial αναφερω gmail. Ομως επειδη μια εικονα = 1000 λεξεις , το τελικο αποτελεσμα μας θα ειναι:

efs2s5.jpg

Καλο θα ηταν κατι τετοιο να το εχετε μαζι με το patch του server σας ωστε οι παικτες να το παιρνουν χωρις δευτερο κατεβασμα κ.λ.π και να μπορουν να το χρησιμοποιησουν οποτε θελησουν.

 

Τι θα χρειαστουμε

  • [C# 2010 express ( κατεβαστε το φρεε googlarete το )
  • Διαβαστε οτι γραφω , οχι μονο τον code για να καταλαβετε, ειναι απλα

 

Ας αρχισουμε

Δημιουργειστε ενα καινουριο project φυσικα Windows Form Aplication.

Σχεδιαση

Βαλτε 2 κουμπια το ενα ονομαστε το Send Email και το αλλο exit.

Βαλτε 3 label και διπλα απο το καθενα 1 textboxes εκτος απο το 3ο. στο 3ο βαλτε ενα listbox . Ονομαζετε τα label character name , mail subject kai reason αντιστοιχα.Στο listbox δεξια σας εχει add new item βαλτε οτι θελετε εγω οπως βλεπετε εβαλα: bug report, donation, server suggestions kai general problems

Τελος βαλτε ακομα 1 label και 1 textbox κατω απο αυτο . Ονομαστε το label

Mail body. Δεστε την εικονα πιο πανω για να καταλαβετε καλυτερα :)

Κωδικας

Ωραια λοιπον μεχρι εδω, τωρα ειναι το 'δυσκολο' μερος, το coding. Λοιπον καταρχας να πουμε πως στο συγκεκριμενο προγραμμα θα χρειαστει να βαλουμε κωδικα μονο στα 2 κουμπια , πουθενα αλλου. Θα ξεκινησουμε απο το κουμπι Exit που ειναι παρα πολυ απλο. Διπλο κλικ λοιπον στο κουμπι Exit και θα σας βγαλει το source code του.Ετσι οπως ειναι θα του δωσουμε την εντολη να κλεινει το προγραμμα.Γραψτε λοιπον την εξης σειρα

this.Close();

Αυτο ηταν , ετοιμο το κουμπι Exit για να το διαπιστωσετε μπορειτε να πατησετε F5 ωστε να τρεξει το προγραμμα και να το πατησετε , θα δειτε πως το προγραμμα θα κλεισει.

Διπλο κλικ τωρα στο κουμπι Send Email που ειναι το βασικο μας.

Ναι αλα για να πατησουν αυτο το κουμπι θα πρεπει να εχουν συμπληρωσει ολα τα στοιχεια τους , δε θελουμε να αφησουν κανενα στοιχειο κενο, βαζουμε λοιπον αυτον τον κωδικα :

if (textBox1.Text == "" || textBox2.Text == "" || textBox3.Text == ""
                || listBox1.SelectedItems.Count == 0 )
            {
                MessageBox.Show("You must complete all the fields", "Error founded", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                return;
            }

Με λιγα λογια λεμε αν εστω και ενα απο τα textboxes δεν ειναι συμπληρωμενα η η λιστα δεν εχει κανενα επιλεγμενο αντικειμενο να μην γινεται τιποτα και να ακυρωνεται.

Τωρα για να το κανουμε πιο απλο το κωδικα θα ορισουμε μια μεταβλητη για καθε textbox , κατω απο αυτο που βαλατε πριν βαλτε

string charname = textBox1.Text;
            string mailsubject = textBox2.Text;
            string body = textBox3.Text;
            string reason = listBox1.SelectedItem.ToString();

Τωρα λοιπον ηρθε η ωρα να δημιουργησουμε τον κωδικα ο οποιος βασικα αυτος στελνει το email.Βαλτε απο κατω το εξης

  try
            {
                MailMessage mail = new MailMessage();
                SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");

                mail.From = new MailAddress(""); // to email sas
                mail.To.Add("to_address@mfc.ae"); // to email sas
                mail.Subject = mailsubject;
                mail.Body = "Character Name: "+charname+"\n"+body;

                SmtpServer.Port = 587;
                SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password"); //sto user name balte to email sas kai sto password ton kodiko sas
                SmtpServer.EnableSsl = true;

                SmtpServer.Send(mail);
                MessageBox.Show("mail Send");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

Κοιταξτε καλα τα // , σας λενε τι ακριβως να βαλετε , μη ξεχνατε μιλαμε για Gmail.

Παντε πανω πανω και κατω απο το τελευταιο using βαλτε

using System.Net.Mail;

 

Εισαστε ετοιμοι, μπορειτε να τρεξετε το προγραμμα σας πατωντας F5 για να δειτε τα αποτελεσματα. Αν θελετε να παρετε το .exe file καντε save all και παντε στο φακελο obj και θα βρειτε το .exe αρχειο ωστε να το βαλετε στο patch σας και γενικα να μπορει να το τρεξουν ολοι.

Ολοκληρως ο κωδικας θα ειναι:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Mail;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "" || textBox2.Text == "" || textBox3.Text == ""
                || listBox1.SelectedItems.Count == 0 )
            {
                MessageBox.Show("You must complete all the fields", "Error founded", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                return;
            }

            string charname = textBox1.Text;
            string mailsubject = textBox2.Text;
            string body = textBox3.Text;
            string reason = listBox1.SelectedItem.ToString();
  try
            {
                MailMessage mail = new MailMessage();
                SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");

                mail.From = new MailAddress(""); // to email sas[
                mail.To.Add("to_address@mfc.ae"); // to email sas
                mail.Subject = mailsubject;
                mail.Body = "Character Name: "+charname+"\n"+body;

                SmtpServer.Port = 587;
                SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password"); //sto user name balte to email sas kai sto password ton kodiko sas
                SmtpServer.EnableSsl = true;

                SmtpServer.Send(mail);
                MessageBox.Show("mail Send");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }


        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

Αυτο βεβαια ειναι ενα βασικο admin contactor , μπορει να βελτιωθει κιαλο αν ασχοληθειτε , παντως πιστευω ειναι ψηλο ωραιο για τους admin , δειχνει πως ασχολουνται με τον server

ΤΕΛΟΣ

Posted

πολύ καλό, καιρό έχω να δω κάτι καινούργιο shared εδώ στο mxc ! +1 Reputation από εμένα ..!

Posted

πολύ καλό, καιρό έχω να δω κάτι καινούργιο shared εδώ στο mxc ! +1 Reputation από εμένα ..!

+1 rep ? omg

its not even coded with java  , not even check if the character name are right or no  its just a send mail program you can google it

Posted

Sorry about it , but i would like to share it in greek.

 

Then go share it in the Greek section, if you want to share it here translate it into English.

 

Mod should move this topic to the Greek section.

Posted

Then go share it in the Greek section, if you want to share it here translate it into English.

 

Mod should move this topic to the Greek section.

you are wrong since i put my [GR] tags i have the right to post it here :)
Posted

you are wrong since i put my [GR] tags i have the right to post it here :)

 

- Remember that this section is international, so you can't use your own native language, whenever you're willing to.

 

check rules next time

http://maxcheaters.com/forum/index.php?topic=218170.0

 

the main thing is to keep this forum clean, if international ppl can not read it, why would it be here?  :)

Posted

you are wrong since i put my [GR] tags i have the right to post it here :)

 

You are wrong. According to forum rules you are not allowed to use your own native language other than English since this is an English section.

 

Besides, there is nothing really special about your program.

  • 1 month later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Posts

    • what pack you use  send me on discord for it
    • package custom.events.RandomZoneEvent; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.ScheduledFuture; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.time.SchedulingPattern; import org.l2jmobius.commons.time.TimeUtil; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.gameserver.managers.ZoneManager; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.quest.Event; import org.l2jmobius.gameserver.model.zone.ZoneId; import org.l2jmobius.gameserver.model.zone.ZoneType; import org.l2jmobius.gameserver.model.zone.type.RandomZone; import org.l2jmobius.gameserver.util.Broadcast; /** * Random Zone Event - Activates one random PvP zone temporarily. No modifica la clase de la zona: usa flags PvP en runtime. * @author Juan */ public class RandomZoneEvent extends Event { private static final String CONFIG_FILE = "data/scripts/custom/events/RandomZoneEvent/config.xml"; private static int EVENT_DURATION_MINUTES = 15; private static boolean _isActive = false; private ScheduledFuture<?> _eventTask = null; private final List<ZoneType> _availableZones = new ArrayList<>(); private ZoneType _activeZone = null; public RandomZoneEvent() { loadConfig(); loadZones(); registerZoneListeners(); } /** * Registra listeners a TODAS LAS ZONAS random */ private void registerZoneListeners() { for (ZoneType zone : _availableZones) { addEnterZoneId(zone.getId()); addExitZoneId(zone.getId()); LOGGER.info("[RandomZoneEvent] Registered listener for zone: " + zone.getName()); } } private void loadConfig() { new IXmlReader() { @Override public void load() { parseDatapackFile(CONFIG_FILE); } @Override public void parseDocument(Document doc, File file) { forEach(doc, "event", eventNode -> { final StatSet att = new StatSet(parseAttributes(eventNode)); final String name = att.getString("name"); for (Node node = eventNode.getFirstChild(); node != null; node = node.getNextSibling()) { if ("schedule".equals(node.getNodeName())) { final StatSet attributes = new StatSet(parseAttributes(node)); final String pattern = attributes.getString("pattern"); final SchedulingPattern schedulingPattern = new SchedulingPattern(pattern); final StatSet params = new StatSet(); params.set("Name", name); params.set("SchedulingPattern", pattern); final long delay = schedulingPattern.getDelayToNextFromNow(); getTimers().addTimer("Schedule_" + name, params, delay + 5000, null, null); LOGGER.info("[RandomZoneEvent] Event " + name + " scheduled at " + TimeUtil.getDateTimeString(System.currentTimeMillis() + delay)); } } }); } }.load(); } private void loadZones() { for (ZoneType zone : ZoneManager.getInstance().getAllZones(RandomZone.class)) { if ((zone.getName() != null) && zone.getName().toLowerCase().startsWith("random_zone")) { _availableZones.add(zone); LOGGER.info("[RandomZoneEvent] Loaded zone: " + zone.getName() + " (id=" + zone.getId() + ")"); } } LOGGER.info("[RandomZoneEvent] Total random zones loaded: " + _availableZones.size()); } @Override public void onTimerEvent(String event, StatSet params, Npc npc, Player player) { if (event.startsWith("Schedule_")) { eventStart(null); final SchedulingPattern schedulingPattern = new SchedulingPattern(params.getString("SchedulingPattern")); final long delay = schedulingPattern.getDelayToNextFromNow(); getTimers().addTimer(event, params, delay + 5000, null, null); LOGGER.info("[RandomZoneEvent] Rescheduled for " + TimeUtil.getDateTimeString(System.currentTimeMillis() + delay)); } } @Override public boolean eventStart(Player eventMaker) { if (_isActive) { if (eventMaker != null) { eventMaker.sendMessage("RandomZoneEvent already active."); } return false; } if (_availableZones.isEmpty()) { Broadcast.toAllOnlinePlayers("[RandomZoneEvent] No zones configured."); return false; } _isActive = true; Broadcast.toAllOnlinePlayers("⚔️ Random Zone Event has started!"); _eventTask = ThreadPool.schedule(this::activateRandomZone, 5_000); return true; } private void activateRandomZone() { _activeZone = _availableZones.get(new Random().nextInt(_availableZones.size())); _activeZone.setEnabled(true); Broadcast.toAllOnlinePlayers("🔥 Random Zone Event: " + _activeZone.getName() + " is now PvP for " + EVENT_DURATION_MINUTES + " minutes!"); _eventTask = ThreadPool.schedule(this::eventStop, EVENT_DURATION_MINUTES * 60 * 1000L); } @Override public boolean eventStop() { if (!_isActive) { return false; } _isActive = false; if (_eventTask != null) { _eventTask.cancel(true); _eventTask = null; } if (_activeZone != null) { _activeZone.setEnabled(false); Broadcast.toAllOnlinePlayers("🏁 Random Zone Event ended. " + _activeZone.getName() + " is back to normal."); _activeZone = null; } else { Broadcast.toAllOnlinePlayers("🏁 Random Zone Event ended."); } return true; } @Override public void onEnterZone(Creature creature, ZoneType zone) { if (!_isActive || (_activeZone == null)) { return; } if ((zone == _activeZone) && creature.isPlayable()) { creature.setInsideZone(ZoneId.PVP, true); if (creature.isPlayer()) { creature.sendMessage("Esta zona está en modo PvP temporalmente."); } } } @Override public void onExitZone(Creature creature, ZoneType zone) { if (!_isActive || (_activeZone == null)) { return; } if ((zone == _activeZone) && creature.isPlayable()) { creature.setInsideZone(ZoneId.PVP, false); if (creature.isPlayer()) { creature.sendMessage("Abandonaste la zona PvP temporal."); } } } @Override public boolean eventBypass(Player player, String bypass) { return true; } @Override public String onEvent(String event, Npc npc, Player player) { return super.onEvent(event, npc, player); } @Override public String onFirstTalk(Npc npc, Player player) { return null; } public static void main(String[] args) { new RandomZoneEvent(); } } i have this but its not working
    • ZonePvPSpawnBossRadio=0 ZonePvPSpawnBossBarakiel=0 at the Customs.ini in L2Server folder. Im prety sure this is it because i had the same problem with you in cruma 1 floor for example and i couldn't fix it but i fixed it finally by changing these 2 lines
    • Siege Reward Start PM Msg Rework Config root BossDieAnnounce and BossDieSound in the L24Team.properties and Config.java files for global raid boss death notifications and sounds. Adds a new reward_list table to the DB.sql file to track castle rewards. Improves character creation logic for thread safety and validation. Adds extensive state checks to the RequestEnchantItem method to prevent enchantments during inappropriate player states. Fixed auto-attack animation bug (there was no attack animation, only damage animation) Clean Code Other fixes I forgot to list! Java 14 Fixed issue where deleting a character would prevent it from leaving the screen or being removed, or even after a delete CD (it would only exit when re-logging in or creating a new character). Added Premium System from the other C2 project (Needs testing and improvement). Added the "Improved" Community Board (incomplete).
  • Topics

×
×
  • Create New...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock