Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Core
#11
Dеmon Написал:всё сделано с мыслью "да похер, сойдёт".
Или
[Изображение: oVZCK.jpg]
Ответ
#12
Dеmon;357001 Написал:Фрозен - помойка, в которой фактически ничего толком не реализовано, всё сделано с мыслью "да похер, сойдёт".
daaa
Ответ
#13
Типичный l2jcopy-paste
Ответ
#14
Соглашусь со многим сказанным, писали спантанно. Да ну и, что. Игра большая...
Думаете, лючера ваша, лучше?
Где?)
Не вижу...
Где логика?
Даже нет логики в Html:
Код:
case 1: //Choice SubClass
                    save = "choice" + playerName;
                    if (null == Html.get(save) || "".equals(Html.get(save))) {
                        Html.unset("choice");
                        Html.load(subClasser);
                        Html.ifs("top,home,choiceTitle,choice:,change,replace,replaced,bottom");
                        Html.tag("%objectId%", super.getObjectId());
                        for (final String classId : subClasses) {
                            Html.tag("%proff%", ClassId.values()[Integer.valueOf(classId)]);
                            Html.tag("%classId%", classId);
                            Html.parse("choice");
                        }
                        Html.load(subClasser);
                        Html.ifs("choice,change,replace,replaced");
                        Html.ifs("home", Html.uses("choice"));
                        Html.parse("index", true);
                        Html.set(save, Html.uses("index"));
                    }
                    html.setHtml(Html.get(save));
                    player.sendPacket(html);
                    break;
Убрать всякие теги и т. д. с кода.
save конечно нужно будет передать куда надо, чтобы уже есть, а там уже будет другой разговор.
Всего я пояснять не собираюсь, задач достаточно нужно делать.

Ну, а логин сервер?
Как же так, ну зашел?!!! Хорошо, зашел!!! Хорошо, клон?) Ага!

Где же обработка клиента? Куда дели часть, что клиент работает и зашел?
И все, что он отдал и все что обработано на сервере - это уже не получиться менять выполнив еще раз. Вся реализация будет запущена и проверена и только это можно, на остальное не будет обращать внимание.

На счет "программ читов - самые папулярные и самописные" - не все смогут работать, кроме конечно же кликеров и наведений (чтобы бил цели), скорее тут не удастся защититься на стороне сервера, движение работает со стороны клиента, а сервер лишь утверждает его, существует ли вообще, что он тут пытается отправить, есть ли действия такие? (Не будем же мы убивать сервер пока выполняется запрос с клиента, каждую точечку проверять когда бежит, мало ли куда он бежит?Главное где он завершится)

И если клиент существует и действие в клиенте и на сервере - это существует в конечной точке, то она запишится, конечно же будет выполнять, бежать и бить и так бегать по целям, - это скорее можно сделать на стороне клиента, убрать, - это, в остальном мы ничего не сможем отправить "просто так, чтобы получить, что-то ценное или не законно", немного не так построена логика игрового процесса.

В игре достаточно действий которые нужно знать серверу.
И их концепция должна быть логически построена для сервера.

И какой сервер не открываю, у них все тоже самое, почти, только немного "изменена, где-то хуже где-то лучше, кусками"

Неудобная конфигурация сервера и настроек, изменений.
Зачем так было дико делать. Непонятно, когда есть
Java Collection, Generics:
Config.get('ConfigNAme')
Config.get('ConfigNAme', value)
Если данные будут не совпадать то даже не скомпилится и если переданный тип не будет существовать он не передастся, и к тому же мы будет знать все загруженные конфиги и их типы данных, которых принять:
1. String
2. Integer/Long
3. Boolean
4. Float/Double
Больше ничего не получим.
Когда загрузились мы сможем их преобразовывать во, что нужно на сервере и проверять там где нужно...
По этому я и сказал, что больше ничего, даже других настроек:
Ибо на сервере точная копия записывается, то есть со стороны (Data Pack) ничего не сможем подсунуть несуществующего.

Вся безопасность зависит от сервера.
Вообщем все надо делать компактно и удобно, и с логикой, а не копипастом.
Ответ
#15
gre4ka Написал:Неудобная конфигурация сервера и настроек, изменений.
Зачем так было дико делать. Непонятно, когда есть
Java Collection, Generics:
Config.get('ConfigNAme')
Config.get('ConfigNAme', value)
Если данные будут не совпадать то даже не скомпилится и если переданный тип не будет существовать он не передастся, и к тому же мы будет знать все загруженные конфиги и их типы данных, которых принять:
1. String
2. Integer/Long
3. Boolean
4. Float/Double
Больше ничего не получим.
Когда загрузились мы сможем их преобразовывать во, что нужно на сервере и проверять там где нужно...
По этому я и сказал, что больше ничего, даже других настроек:
Ибо на сервере точная копия записывается, то есть со стороны (Data Pack) ничего не сможем подсунуть несуществующего.

Это было придумано еще до вас, в шаре опенов такое точно было, так что вы тут в пролете.
С одной стороны это удобно но с другой стороны каждый раз трогать коллекцию для того что бы вытащить конфиг не есть гуд.
Ответ
#16
Что там было придумано? Да вы даже не понимаете, о чем я говорю и как я придумал.
Ну сразу видно сказали не подумав.
Смотрел я ваших опенов и лючер, не вижу ничего ценного. Круглый 0.

А коллекции специально были придуманы для этого, и если вы не умеете ими правильно пользоваться, то это уже другой разговор.

Да что уж тут говорить, если вы пишите instanceof где надо и не надо, то уж тут и говорить не о чем, тут сразу склонно "непонимание ООП", а ведь этот оператор самый медленный.

Как я понял, тут одни быдло на форуме! Очень жаль! думал поделюсь, стоящими вещами, а теперь желания нет! Быдлите дальше! Теперь мне вообще все равно.
Ответ
#17
gre4ka Написал:Что там было придумано? Да вы даже не понимаете, о чем я говорю и как я придумал.
Ну сразу видно сказали не подумав.
Смотрел я ваших опенов и лючер, не вижу ничего ценного. Круглый 0.

А коллекции специально были придуманы для этого, и если вы не умеете ими правильно пользоваться, то это уже другой разговор.

Да что уж тут говорить, если вы пишите instanceof где надо и не надо, то уж тут и говорить не о чем, тут сразу склонно "непонимание ООП", а ведь этот оператор самый медленный.

Как я понял, тут одни быдло на форуме! Очень жаль! думал поделюсь, стоящими вещами, а теперь желания нет! Быдлите дальше! Теперь мне вообще все равно.

Мне Ваши посты показать, которые все находятся тут, что бы было видно, кто есть Вы? Или может быть Вам привести исходник HashMap + Properties, что бы Вы лучше понимали о чем вообще говорите, уважаемый? Не надо думать, что Вы самый умный, если есть желание вести дискас по теме архитектуры, проектирования архитектуры, оптимизации и используемых парадигм для эффективного решения задач, то пожалуйста, я не против. А выставлять себя в свете: "я самый умный, а остальные дураки" - не надо.

Так вот, о чем это я. Немного опустим Вас.
Properties использует функционал HashMap, который при добавлении новых элементов - сортирует их. А теперь подумайте и скажите: как быстро будет произведен поиск по HashMap, если нам надо достать значение ключа конфига? А теперь представьте, что эти вызовы повторяются с некоторой периодичностью. Представили? Добавьте еще с десяток потоков, которые делают тоже самое. Чувствуете? JIT & кеш процессора в этом случае не слишком будет спасать Smile
По типам данных. Вы шаблоны выучили (в данном случае не шаблоны, они в цпп, тут дженерики)? - Молодец, четь и хвала Вам. Только вот никто не будет переписывать кучу кода на пару дженерик методов, которые к тому же могут бросать каст эксепшен, если тип изначально не заложен. К сожалению у джавы хреновенькая поддержка мета-программирования.

Цитата:Ну, а логин сервер?
Как же так, ну зашел?!!! Хорошо, зашел!!! Хорошо, клон?) Ага!
Скажите спасибо тому, кто писал работу с сессиями в l2j-server. Можете переписать. Если хотите. Большинству насрать, т.к. "клон" можно создать только с помощью подмены ключа сессии, а сделать это можно через т.н. "хаки". Защита есть? - Есть, фигли чесаться.
Здесь я говорю от лица большей части программистов этой сферы. В любом случае, никто нифига не сделал, чтобы изменить ситуацию, во всяком случае, я не видел.

Цитата:И если клиент существует и действие в клиенте и на сервере - это существует в конечной точке, то она запишится, конечно же будет выполнять, бежать и бить и так бегать по целям, - это скорее можно сделать на стороне клиента, убрать, - это, в остальном мы ничего не сможем отправить "просто так, чтобы получить, что-то ценное или не законно", немного не так построена логика игрового процесса.
Вам дорога в офис NCSoft, приятного полета в корею.
Немного абстрактных(тм) рассуждений(с).

P.S: на счет Вашей фразы: "думал поделюсь, стоящими вещами" - Вы сами в это верите? Лол. Ваш код никому нахрен не нужен, нормальные люди, сами все напишут, либо заюзают фреймворк (что упростит задачу, т.к. не нужно будет заниматься отладкой).
P.P.S: если у Вас еще остались вопросы по конфигам, то без проблем выложу сорц HashMap + Properties от последнего апдейта 7й оракловской ждк.
P.P.P.S: если хотите что-либо обо мне говорить, то пройдите по ссылке в моей подписе, почитайте вики по public-fagot (хоть там и самая малость). Когда запилите такое же - с удовольствием приму, что я дурак Smile

Добавлено через 18 минут
И да. Для всех негодующих на счет пользователей зоны, администраторов на ней и вообще самой зоны.
Вас тут никто не держит. Есть овер9000 других ресурсов похожей направленности. Если вы не хотите принимать правила общения и правила сообщества, то вам прямая дорога на другие форумы, здесь вас никто не держит и задницу лизать не будет, как и плакать по вам. А если еще и правила форума нарушите... То от вас уже избавится не сообщество, а дядька Оззи.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#18
Pointer*Rage Написал:P.P.S: если у Вас еще остались вопросы по конфигам, то без проблем выложу сорц HashMap + Properties от последнего апдейта 7й оракловской ждк.
P.P.P.S: если хотите что-либо обо мне говорить, то пройдите по ссылке в моей подписе, почитайте вики по public-fagot (хоть там и самая малость). Когда запилите такое же - с удовольствием приму, что я дурак
Ммм... Пожалуйста, а можешь мне показать? Очень интересноSmile
А то я там ничего не нашел, is empty.
Мне интересно про Config.
Ответ
#19
lin Написал:Ммм... Пожалуйста, а можешь мне показать? Очень интересноSmile
А то я там ничего не нашел, is empty.
Мне интересно про Config.
Малька ошибся с HashMap, там юзается HashTable. В любом случае, для нас это не сильно что-то меняет.
J8u0
Properties
[spoiler="Hashtable"][code]
/*
* Copyright © 1994, 2013, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/

package java.util;

import java.io.*;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.BiFunction;

/**
* This class implements a hash table, which maps keys to values. Any
* non-<code>null</code> object can be used as a key or as a value. <p>
*
* To successfully store and retrieve objects from a hashtable, the
* objects used as keys must implement the <code>hashCode</code>
* method and the <code>equals</code> method. <p>
*
* An instance of <code>Hashtable</code> has two parameters that affect its
* performance: <i>initial capacity</i> and <i>load factor</i>. The
* <i>capacity</i> is the number of <i>buckets</i> in the hash table, and the
* <i>initial capacity</i> is simply the capacity at the time the hash table
* is created. Note that the hash table is <i>open</i>: in the case of a "hash
* collision", a single bucket stores multiple entries, which must be searched
* sequentially. The <i>load factor</i> is a measure of how full the hash
* table is allowed to get before its capacity is automatically increased.
* The initial capacity and load factor parameters are merely hints to
* the implementation. The exact details as to when and whether the rehash
* method is invoked are implementation-dependent.<p>
*
* Generally, the default load factor (.75) offers a good tradeoff between
* time and space costs. Higher values decrease the space overhead but
* increase the time cost to look up an entry (which is reflected in most
* <tt>Hashtable</tt> operations, including <tt>get</tt> and <tt>put</tt>).<p>
*
* The initial capacity controls a tradeoff between wasted space and the
* need for <code>rehash</code> operations, which are time-consuming.
* No <code>rehash</code> operations will <i>ever</i> occur if the initial
* capacity is greater than the maximum number of entries the
* <tt>Hashtable</tt> will contain divided by its load factor. However,
* setting the initial capacity too high can waste space.<p>
*
* If many entries are to be made into a <code>Hashtable</code>,
* creating it with a sufficiently large capacity may allow the
* entries to be inserted more efficiently than letting it perform
* automatic rehashing as needed to grow the table. <p>
*
* This example creates a hashtable of numbers. It uses the names of
* the numbers as keys:
* <pre> {@code
* Hashtable<String, Integer> numbers
* = new Hashtable<String, Integer>();
* numbers.put("one", 1);
* numbers.put("two", 2);
* numbers.put("three", 3);}</pre>
*
* <p>To retrieve a number, use the following code:
* <pre> {@code
* Integer n = numbers.get("two");
* if (n != null) {
* System.out.println("two = " + n);
* }}</pre>
*
* <p>The iterators returned by the <tt>iterator</tt> method of the collections
* returned by all of this class's "collection view methods" are
* <em>fail-fast</em>: if the Hashtable is structurally modified at any time
* after the iterator is created, in any way except through the iterator's own
* <tt>remove</tt> method, the iterator will throw a {@link
* ConcurrentModificationException}. Thus, in the face of concurrent
* modification, the iterator fails quickly and cleanly, rather than risking
* arbitrary, non-deterministic behavior at an undetermined time in the future.
* The Enumerations returned by Hashtable's keys and elements methods are
* <em>not</em> fail-fast.
*
* <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
* as it is, generally speaking, impossible to make any hard guarantees in the
* presence of unsynchronized concurrent modification. Fail-fast iterators
* throw <tt>ConcurrentModificationException</tt> on a best-effort basis.
* Therefore, it would be wrong to write a program that depended on this
* exception for its correctness: <i>the fail-fast behavior of iterators
* should be used only to detect bugs.</i>
*
* <p>As of the Java 2 platform v1.2, this class was retrofitted to
* implement the {@link Map} interface, making it a member of the
* <a href="{@docRoot}/../technotes/guides/collections/index.html">
*
* Java Collections Framework</a>. Unlike the new collection
* implementations, {@code Hashtable} is synchronized. If a
* thread-safe implementation is not needed, it is recommended to use
* {@link HashMap} in place of {@code Hashtable}. If a thread-safe
* highly-concurrent implementation is desired, then it is recommended
* to use {@link java.util.concurrent.ConcurrentHashMap} in place of
* {@code Hashtable}.
*
* @author Arthur van Hoff
* @author Josh Bloch
* @author Neal Gafter
* @see Object#equals(java.lang.Object)
* @see Object#hashCode()
* @see Hashtable#rehash()
* @see Collection
* @see Map
* @see HashMap
* @see TreeMap
* @since JDK1.0
*/
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable {

/**
* The hash table data.
*/
private transient Entry<?,?>[] table;

/**
* The total number of entries in the hash table.
*/
private transient int count;

/**
* The table is rehashed when its size exceeds this threshold. (The
* value of this field is (int)(capacity * loadFactor).)
*
* @serial
*/
private int threshold;

/**
* The load factor for the hashtable.
*
* @serial
*/
private float loadFactor;

/**
* The number of times this Hashtable has been structurally modified
* Structural modifications are those that change the number of entries in
* the Hashtable or otherwise modify its internal structure (e.g.,
* rehash). This field is used to make iterators on Collection-views of
* the Hashtable fail-fast. (See ConcurrentModificationException).
*/
private transient int modCount = 0;

/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = 1421746759512286392L;

/**
* Constructs a new, empty hashtable with the specified initial
* capacity and the specified load factor.
*
* @param initialCapacity the initial capacity of the hashtable.
* @param loadFactor the load factor of the hashtable.
* @exception IllegalArgumentException if the initial capacity is less
* than zero, or if the load factor is nonpositive.
*/
public Hashtable(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal Load: "+loadFactor);

if (initialCapacity==0)
initialCapacity = 1;
this.loadFactor = loadFactor;
table = new Entry<?,?>[initialCapacity];
threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
}

/**
* Constructs a new, empty hashtable with the specified initial capacity
* and default load factor (0.75).
*
* @param initialCapacity the initial capacity of the hashtable.
* @exception IllegalArgumentException if the initial capacity is less
* than zero.
*/
public Hashtable(int initialCapacity) {
this(initialCapacity, 0.75f);
}

/**
* Constructs a new, empty hashtable with a default initial capacity (11)
* and load factor (0.75).
*/
public Hashtable() {
this(11, 0.75f);
}

/**
* Constructs a new hashtable with the same mappings as the given
* Map. The hashtable is created with an initial capacity sufficient to
* hold the mappings in the given Map and a default load factor (0.75).
*
* @param t the map whose mappings are to be placed in this map.
* @throws NullPointerException if the specified map is null.
* @since 1.2
*/
public Hashtable(Map<? extends K, ? extends V> t) {
this(Math.max(2*t.size(), 11), 0.75f);
putAll(t);
}

/**
* Returns the number of keys in this hashtable.
*
* @return the number of keys in this hashtable.
*/
public synchronized int size() {
return count;
}

/**
* Tests if this hashtable maps no keys to values.
*
* @return <code>true</code> if this hashtable maps no keys to values;
* <code>false</code> otherwise.
*/
public synchronized boolean isEmpty() {
return count == 0;
}

/**
* Returns an enumeration of the keys in this hashtable.
*
* @return an enumeration of the keys in this hashtable.
* @see Enumeration
* @see #elements()
* @see #keySet()
* @see Map
*/
public synchronized Enumeration<K> keys() {
return this.<K>getEnumeration(KEYS);
}

/**
* Returns an enumeration of the values in this hashtable.
* Use the Enumeration methods on the returned object to fetch the elements
* sequentially.
*
* @return an enumeration of the values in this hashtable.
* @see java.util.Enumeration
* @see #keys()
* @see #values()
* @see Map
*/
public synchronized Enumeration<V> elements() {
return this.<V>getEnumeration(VALUES);
}

/**
* Tests if some key maps into the specified value in this hashtable.
* This operation is more expensive than the {@link #containsKey
* containsKey} method.
*
* <p>Note that this method is identical in functionality to
* {@link #containsValue containsValue}, (which is part of the
* {@link Map} interface in the collections framework).
*
* @param value a value to search for
* @return <code>true</code> if and only if some key maps to the
* <code>value</code> argument in this hashtable as
* determined by the <tt>equals</tt> method;
* <code>false</code> otherwise.
* @exception NullPointerException if the value is <code>null</code>
*/
public synchronized boolean contains(Object value) {
if (value == null) {
throw new NullPointerException();
}

Entry<?,?> tab[] = table;
for (int i = tab.length ; i-- > 0 Wink {
for (Entry<?,?> e = tab[i] ; e != null ; e = e.next) {
if (e.value.equals(value)) {
return true;
}
}
}
return false;
}

/**
* Returns true if this hashtable maps one or more keys to this value.
*
* <p>Note that this method is identical in functionality to {@link
* #contains contains} (which predates the {@link Map} interface).
*
* @param value value whose presence in this hashtable is to be tested
* @return <tt>true</tt> if this map maps one or more keys to the
* specified value
* @throws NullPointerException if the value is <code>null</code>
* @since 1.2
*/
public boolean containsValue(Object value) {
return contains(value);
}

/**
* Tests if the specified object is a key in this hashtable.
*
* @param key possible key
* @return <code>true</code> if and only if the specified object
* is a key in this hashtable, as determined by the
* <tt>equals</tt> method; <code>false</code> otherwise.
* @throws NullPointerException if the key is <code>null</code>
* @see #contains(Object)
*/
public synchronized boolean containsKey(Object key) {
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
return true;
}
}
return false;
}

/**
* Returns the value to which the specified key is mapped,
* or {@code null} if this map contains no mapping for the key.
*
* <p>More formally, if this map contains a mapping from a key
* {@code k} to a value {@code v} such that {@code (key.equals(k))},
* then this method returns {@code v}; otherwise it returns
* {@code null}. (There can be at most one such mapping.)
*
* @param key the key whose associated value is to be returned
* @return the value to which the specified key is mapped, or
* {@code null} if this map contains no mapping for the key
* @throws NullPointerException if the specified key is null
* @see #put(Object, Object)
*/
@SuppressWarnings("unchecked")
public synchronized V get(Object key) {
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
return (V)e.value;
}
}
return null;
}

/**
* The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

/**
* Increases the capacity of and internally reorganizes this
* hashtable, in order to accommodate and access its entries more
* efficiently. This method is called automatically when the
* number of keys in the hashtable exceeds this hashtable's capacity
* and load factor.
*/
@SuppressWarnings("unchecked")
protected void rehash() {
int oldCapacity = table.length;
Entry<?,?>[] oldMap = table;

// overflow-conscious code
int newCapacity = (oldCapacity << 1) + 1;
if (newCapacity - MAX_ARRAY_SIZE > 0)...
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#20
Пардон Smile
Я думал вы про другое, а вы дали исходы с SDK.
На сколько я понял, автор имел ввиду "ConcurrentHashMap или CopyOnWriteArrayList" и грузить конфиги в один объект, без нагрузки с Properties, так как в нем используются устаревшие расширения коллекций "Hashtable" которые синхронизируются по этому производительность уменьшается, так как в данной области будут одновременные обращения.
В многопоточности "Hashtable" проиграет в скорости и производительности в целом.
"HashMap" проиграет "ConcurrentHashMap" - так как будет эффективнее с большим количеством хранимых данных и операций доступа к ним.
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  C3 Win7 - Win10 Core.dll WhiteO 5 2,012 01-19-2016, 10:15 AM
Последний пост: feiteng

Перейти к форуму:


Пользователи, просматривающие эту тему: 3 Гость(ей)