using system; using system.collections.generic; using system.linq; using system.text; using playconquer.client; using system.io; namespace playconquer.game { public interface ijianghu { string ownname { get; set; } string customizedname { get; set; } uint uid { get; set; } byte talent { get; set; } byte stage { get; set; } byte star { get; set; } datetime startcountdwon { get; set; } datetime countdownend { get; set; } uint time { get; } uint freetimetodey { get; set; } uint freetimetodeyused { get; set; } uint inner_strength { get; set; } uint freecourse { get; set; } jianghu.jiangstages[] stagers { get; set; } byte rank { get; set; } byte level { get; set; } ushort roundbuypoints { get; set; } bool onjiangmode { get; set; } } public class jianghu : Ijianghu { public enum attackflag { none = 0, nothitfriends = 1, nothitclanmembers = 2, nothitguildmembers = 4, nothitalliedguild = 8, nohitalliesclan = 16 } public static system.collections.concurrent.concurrentdictionary <uint, ijianghu> jianghuclients = new system.collections.concurrent.concurrentdictionary <uint, ijianghu>(); public static class jianghuranking { private static system.collections.concurrent.concurrentdictionary <uint, ijianghu> toprank = new system.collections.concurrent.concurrentdictionary <uint, ijianghu>(); public static ijianghu[] toprank100 = null; private static object syncroot = new object(); public static void updaterank(ijianghu jiang) { lock (syncroot) { if (!toprank.containskey(jiang.uid)) toprank.tryadd(jiang.uid, jiang); calculateranks(); } } private static void calculateranks() { foreach (var jiang in toprank.values) jiang.rank = 0; var rankdictionar = toprank.values.toarray(); var ordonaterank = from jiang in rankdictionar orderby jiang.inner_strength descending select jiang; list<ijianghu> backup = new list<ijianghu>(); byte x = 1; foreach (var jiang in ordonaterank) { if (x == 101) break; jiang.rank = x; backup.add(jiang); x++; } toprank100 = backup.toarray(); toprank = new system.collections.concurrent.concurrentdictionary <uint, ijianghu>(); foreach (var jiang in backup) toprank.tryadd(jiang.uid, jiang); backup = null; } } public class getnewstar { public byte stage; public byte positionstar; public jiangstages.star star; } public class jiangstages { public class star { public atributestype typ; public byte level; public ushort uid; public bool activate = false; public override string tostring() { stringbuilder build = new stringbuilder(); build.append((byte)(activate ? 1 : 0) + "#" + uid + "#"); return build.tostring(); } } public enum atributestype { none = 0, maxlife,//1 pattack,//2 mattack,//3 pdefense,//4 mdefense,//5 finalattack,//6 finalmagicattack,//7 finaldefense,//8 finalmagicdefense,//9 criticalstrike,//10 skillcriticalstrike,//11 immunity,//12 breakthrough,//13 counteraction,//14 maxmana//15 } public star[] stars; public bool activate = false; public jiangstages() { stars = new star[9]; for (byte x = 0; x < 9; x++) stars[x] = new star(); } public bool containatribut(atributestype typ) { foreach (var atr in stars) if (atr.typ == typ) return true; return false; } public override string tostring() { stringbuilder build = new stringbuilder(); build.append((byte)(activate ? 1 : 0) + "#"); foreach (var obj in stars) build.append(obj.tostring()); return build.tostring(); } } public ushort valuetoroll(jiangstages.atributestype status, byte level) { return (ushort)((ushort)status + level * 256); } public byte getvaluelevel(ushort val) { return (byte)((val - (ushort)(val % 256)) / 256); } public jiangstages.atributestype getvaluetype(uint val) { return (jiangstages.atributestype)(val % 256); } public getnewstar mynewstart = null; public byte calculatejiangscorelevel() { byte c = 0; byte level1 = 0; byte level2 = 0; byte level3 = 0; byte level4 = 0; byte level5 = 0; byte level6 = 0; foreach (var stg in stagers) { if (!stg.activate) continue; c += 1; foreach (var star in stg.stars) { if (star.level == 0) continue; if (star.level >= 1) level1++; if (star.level >= 2) level2++; if (star.level >= 3) level3++; if (star.level >= 4) level4++; if (star.level >= 5) level5++; if (star.level >= 6) level6++; } } if (level1 >= 81) c++; if (level2 >= 81) c++; if (level3 >= 81) c++; if (level4 >= 81) c++; if (level5 >= 81) c++; if (level6 >= 81) c++; return c; } byte jlevel = 0; public void createrollvalue(client.gamestate client, byte mstar, byte mstage, bool super = false, byte higher = 0) { jlevel = client.entity.myjiang.calculatejiangscorelevel(); jiangstages n_stage = stagers[mstage - 1]; if (!n_stage.activate) return; mynewstart = new getnewstar(); mynewstart.positionstar = mstar; mynewstart.stage = mstage; mynewstart.star = new jiangstages.star(); mynewstart.star.activate = true; var level = mynewstart.star.level; mynewstart.star.level = getstatuslevel(super); if (higher == 1) { if (kernel.rate(4)) { mynewstart.star.level = (byte)random.next(1, 15); } } if (higher == 2) { if (kernel.rate(70)) { mynewstart.star.level = (byte)random.next(1, 5); while (mynewstart.star.level == 6 && kernel.rate(50)) { mynewstart.star.level--; } if (mynewstart.star.level > 6) mynewstart.star.level = 6; } } mynewstart.star.typ = (jiangstages.atributestype)random.next(1, 16); do { mynewstart.star.typ = (jiangstages.atributestype)random.next(1, 16); } while (!database.jianghu.cultivatestatus[mstage].contains((byte)mynewstart.star.typ)); mynewstart.star.uid = valuetoroll(mynewstart.star.typ, mynewstart.star.level); network.gamepackets.jianghuupdate upd = new network.gamepackets.jianghuupdate(); upd.atribute = mynewstart.star.uid; upd.freecourse = freecourse; upd.stage = mstage; upd.star = mstar; upd.freetimetodeyused = (byte)freetimetodeyused; upd.roundbuypoints = roundbuypoints; client.send(upd.toarray()); if (mynewstart.star.level >= 6) { foreach (var player in kernel.gamepool.values) { player.send(new network.gamepackets.message("wow, " + client.entity.name + " went down the chaotic path and improved the attribute to epic!", system.drawing.color.red, 2026)); } } } private static bool cankeepchipower(jiangstages strct, getnewstar nstar, gamestate client) { //#if notmultiplechipowers if (client.entity.viplevel > 3) { var stars = strct.stars; for (int i = 0; i < stars.length; i++) if (i != (nstar.positionstar - 1)) if (stars[i].typ == nstar.star.typ) return false; } //#endif return true; } public void applaynewstar(client.gamestate client) { if (mynewstart == null) return; jiangstages n_stage = stagers[mynewstart.stage - 1]; if (!n_stage.activate) return; jiangstages.star n_star = n_stage.stars[mynewstart.positionstar - 1]; if (!n_star.activate) { star++; n_star.activate = true; } n_star.level = mynewstart.star.level; n_star.typ = mynewstart.star.typ; n_star.uid = mynewstart.star.uid; client.loaditemstats(); if (mynewstart.stage < 9) { if (mynewstart.positionstar == 9 && !stagers[mynewstart.stage].activate) { stage++; stagers[mynewstart.stage].activate = true; sendinfo(client, network.gamepackets.jianghu.openstage, stage.tostring()); } } //jianghuranking.updaterank(this); mynewstart = null; if (client.entity.myjiang != null && client.entity.myjiang.inner_strength >= 81000) { new network.gamepackets.titlestorage().addtitle(client , 2004, 5, false); } if (jlevel != client.entity.myjiang.calculatejiangscorelevel() && jlevel != 0) { foreach (var player in kernel.gamepool.values) { if (client.entity.myjiang.calculatejiangscorelevel() < 10) break; player.send(new network.gamepackets.message(client.entity.name + " increased score level to " + client.entity.myjiang.calculatejiangscorelevel() + "!", system.drawing.color.red, 2026)); } client.send(new network.gamepackets.message("you unlocked stage " + client.entity.myjiang.calculatejiangscorelevel() + "!", system.drawing.color.red, network.gamepackets.message.system)); } } public static byte getlve = 6; public byte getstatuslevel(bool super = false) { if (super) return 6; byte first = (byte)random.next(1, 7); if (first >= 5) { first = (byte)random.next(1, 7); if (first > 6) first = 6; } return first; } public void createstatusatributes(game.entity client) { uint oldinner_strength = inner_strength; inner_strength = 0; foreach (var nstage in stagers) { if (!nstage.activate) continue; var atr = nstage.stars.where(p => p.uid != 0).toarray(); byte count_doble = 0; dictionary<uint, list<jiangstages.star>> alignementstars = new dictionary<uint, list<jiangstages.star>>(); list<jiangstages.star> normalstarts = new list<jiangstages.star>(); ushort counts_alignements = 0; for (byte x = 0; x < atr.length; x++) { var atribut = atr[x]; count_doble = 0; bool wasadd = false; for (byte y = (byte)(x + 1); y < atr.length; y++) { var atr2nd = atr[y]; if (atr2nd.typ == atribut.typ) { if (!wasadd) { if (!alignementstars.containskey(counts_alignements)) { alignementstars.add(counts_alignements, new list<jiangstages.star>()); alignementstars[counts_alignements].add(atribut); } } if (!alignementstars.containskey(counts_alignements)) { alignementstars.add(counts_alignements, new list<jiangstages.star>()); alignementstars[counts_alignements].add(atr2nd); } else alignementstars[counts_alignements].add(atr2nd); wasadd = true; x = y; count_doble++; } else { break; } } uint counts = 1; if (count_doble != 0) { counts = (byte)(count_doble + 1); counts_alignements++; } if (counts == 1) normalstarts.add(atribut); } byte percent = (byte)database.jianghu.alignmentextrapoints(count_ doble); foreach (var allignement in alignementstars.values) { for (int i = 0; i < allignement.count; i++) { database.jianghu.atribut atri_bas = database.jianghu.atributes[allignement[i].uid]; if (client != null) increasestatus(client, (jiangstages.atributestype)atri_bas.type, (ushort)((atri_bas.power + (atri_bas.power * percent) / 100))); } } count_doble = 0; foreach (var allignement in alignementstars.values) calculateinner_strengthalignements(allignement); for (int x = 0; x < normalstarts.count; x++) { database.jianghu.atribut atri_bas = database.jianghu.atributes[normalstarts[x].uid]; if (client != null) increasestatus(client, (jiangstages.atributestype)atri_bas.type, (ushort)atri_bas.power); inner_strength += database.jianghu.getstatuspoints(normalstarts[x].level); } } if (oldinner_strength != inner_strength) jianghuranking.updaterank(this); } public void calculateinner_strengthalignements(list<jiangstage s.star> collection) { ushort points = 0; for (int x = 0; x < collection.count; x++) { points += database.jianghu.getstatuspoints(collection[x].level); } if (collection.count > 0 && collection.count < 9) inner_strength += (ushort)(points + ((points * ((collection.count) * 10) / 100))); else if (collection.count == 9) inner_strength += (ushort)(points * 2); } public void increasestatus(entity client, jiangstages.atributestype status, ushort power) { switch (status) { case jiangstages.atributestype.breakthrough: Client.breaktrough += power; break; case jiangstages.atributestype.counteraction: Client.counteraction += power; break; case jiangstages.atributestype.criticalstrike: Client.criticalstrike += power; break; case jiangstages.atributestype.finalattack: Client.physicaldamageincrease += power; break; case jiangstages.atributestype.finaldefense: Client.physicaldamagedecrease += power; break; case jiangstages.atributestype.finalmagicattack: Client.magicdamageincrease += power; break; case jiangstages.atributestype.finalmagicdefense: Client.magicdamagedecrease += power; break; case jiangstages.atributestype.immunity: Client.immunity += power; break; case jiangstages.atributestype.mattack: { client.mattack += power; client.basemagicattack += power; break; } case jiangstages.atributestype.maxlife: Client.itemhp += power; break;//24283 27118 - 24283 case jiangstages.atributestype.maxmana: Client.itemmp += power; break; case jiangstages.atributestype.mdefense: { //client.mdefense += power; client.magicdefence += power; break; } case jiangstages.atributestype.pattack: { // client.tqmaxattack += power; // client.tqminattack += power; client.basemaxattack += power; client.baseminattack += power; break; } case jiangstages.atributestype.pdefense: Client.defence += power; break; case jiangstages.atributestype.skillcriticalstrike: Client.skillcstrike += power; break; } } public void decreasestatus(entity client, jiangstages.atributestype status, ushort power) { switch (status) { case jiangstages.atributestype.breakthrough: Client.breaktrough -= power; break; case jiangstages.atributestype.counteraction: Client.counteraction -= power; break; case jiangstages.atributestype.criticalstrike: Client.criticalstrike -= power; break; case jiangstages.atributestype.finalattack: Client.physicaldamageincrease -= power; break; case jiangstages.atributestype.finaldefense: Client.physicaldamagedecrease -= power; break; case jiangstages.atributestype.finalmagicattack: Client.magicdamageincrease -= power; break; case jiangstages.atributestype.finalmagicdefense: Client.magicdamagedecrease -= power; break; case jiangstages.atributestype.immunity: Client.immunity -= power; break; case jiangstages.atributestype.mattack: Client.magicattack -= power; break; case jiangstages.atributestype.maxlife: Client.maxhitpoints -= power; break; case jiangstages.atributestype.maxmana: Client.maxmana -= power; break; case jiangstages.atributestype.mdefense: Client.magicdefence -= power; break; case jiangstages.atributestype.pattack: { client.basemaxattack -= power; client.baseminattack -= power; break; } case jiangstages.atributestype.pdefense: Client.defence -= power; break; case jiangstages.atributestype.skillcriticalstrike: Client.skillcstrike -= power; break; } } public void createstardmg(jiangstages stage) { } public uint uid { get; set; } public string ownname { get; set; } public string customizedname { get; set; } public byte level { get; set; } public byte talent { get; set; } public byte stage { get; set; } public byte star { get; set; } public uint freecourse { get; set; } public byte rank { get; set; } public datetime startcountdwon { get; set; } public datetime countdownend { get; set; } public datetime removejiangmod; public datetime timerstamp; public uint time { get { return (uint)(countdownend - new datetime(1970, 1, 1).tolocaltime()).totalseconds; } } public bool onjiangmode { get; set; } public uint freetimetodey { get; set; } public uint freetimetodeyused { get; set; } public uint inner_strength { get; set; } public ushort roundbuypoints { get; set; } public random random = new random(); public jiangstages[] stagers { get; set; } public override string tostring() { if (startcountdwon.ticks > countdownend.ticks) createtime(); uint secoundesleft = (uint)((countdownend.ticks - startcountdwon.ticks) / 10000000); if (ownname.contains('#')) ownname = ownname.replace("#", ""); if (customizedname.contains('#')) customizedname = customizedname.replace("#", ""); stringbuilder build = new stringbuilder(); build.append(uid + "#" + ownname + "#" + customizedname + "#" + level + "#" + talent + "#" + stage + "#" + star + "#" + freetimetodeyused + "#" + (byte)(onjiangmode ? 0 : 1) + "#" + freecourse + "#" + secoundesleft + "#" + roundbuypoints + "#"); foreach (var obj in stagers) build.append(obj.tostring()); return build.tostring(); } public void load(string line, uint nuid = 0) { try { if (line == null) return; if (line == "") return; if (!line.contains('#')) return; string[] data = line.split('#'); if (nuid != 0) uid = nuid; else uid = uint.parse(data[0]); ownname = data[1]; customizedname = data[2]; try { level = byte.parse(data[3]); } catch (exception) { } talent = byte.parse(data[4]); stage = byte.parse(data[5]); star = byte.parse(data[6]); freetimetodey = byte.parse(data[7]); onjiangmode = byte.parse(data[8]) == 1; freecourse = uint.parse(data[9]); startcountdwon = datetime.now; timerstamp = datetime.now; countdownend = datetime.now.addseconds(uint.parse(data[10])); roundbuypoints = ushort.parse(data[11]); ushort position = 12; foreach (var nstage in stagers) { nstage.activate = byte.parse(data[position]) == 1; position++; foreach (var nstar in nstage.stars) { nstar.activate = byte.parse(data[position]) == 1; position++; nstar.uid = ushort.parse(data[position]); position++; if (nstar.activate) { nstar.typ = getvaluetype(nstar.uid); nstar.level = getvaluelevel(nstar.uid); inner_strength += database.jianghu.getstatuspoints(nstar.level); } } } } catch (exception) { } } public void deserialize(binaryreader reader) { try { level = reader.readbyte(); talent = reader.readbyte(); stage = reader.readbyte(); star = reader.readbyte(); freetimetodey = reader.readuint32(); onjiangmode = reader.readboolean(); freecourse = reader.readuint32(); startcountdwon = datetime.now; timerstamp = datetime.now; countdownend = datetime.now.addseconds(reader.readuint32()); roundbuypoints = reader.readuint16(); foreach (var nstage in stagers) { nstage.activate = reader.readboolean(); foreach (var nstar in nstage.stars) { nstar.activate = reader.readboolean(); nstar.uid = reader.readuint16(); if (nstar.activate) { nstar.typ = getvaluetype(nstar.uid); nstar.level = getvaluelevel(nstar.uid); inner_strength += database.jianghu.getstatuspoints(nstar.level); } } } } catch (exception) { } } public void serialize(binarywriter writer) { try { if (startcountdwon.ticks > countdownend.ticks) createtime(); uint secoundesleft = (uint)((countdownend.ticks - startcountdwon.ticks) / 10000000); writer.write(level); writer.write(talent); writer.write(stage); writer.write(star); writer.write(freetimetodey); writer.write(onjiangmode); writer.write(freecourse); writer.write(secoundesleft); writer.write(roundbuypoints); foreach (var nstage in stagers) { writer.write(nstage.activate); foreach (var nstar in nstage.stars) { writer.write(nstar.activate); writer.write(nstar.uid); } } } catch (exception) { } } public jianghu(uint m_uid) { talent = 3; stage = 1; star = 1; freecourse = 100000; freetimetodey = 10; uid = m_uid; countdownend = new datetime(); startcountdwon = new datetime(); timerstamp = new datetime(); removejiangmod = new datetime(); stagers = new jiangstages[9]; for (byte x = 0; x < 9; x++) stagers[x] = new jiangstages(); if (!jianghuclients.containskey(uid) && uid != 0) jianghuclients.tryadd(uid, this); onjiangmode = true; timerstamp = datetime.now; } public void resetday(client.gamestate client) { roundbuypoints = 0; freetimetodeyused = 0; sendstatus(client, client); } public void onloginclient(client.gamestate client) { sendstatus(client, client); sendstatusmode(client, true); timerstamp = datetime.now; } public void sendstatusmode(client.gamestate client, bool justlogen = false) { client.entity.jiangtalent = talent; client.entity.jiangactive = onjiangmode; if (onjiangmode == false && !justlogen) client.send(new network.gamepackets.message("you have temporarily quit the jiang hu!", system.drawing.color.red, network.gamepackets.message.system)); sendinfo(client, network.gamepackets.jianghu.infostauts, client.entity.uid.tostring(), talent.tostring(), onjiangmode ? "1" : "2"); if (onjiangmode) removejiangmod = datetime.now; client.sendscreen(client.entity.spawnpacket, false); } public void createtime() { startcountdwon = datetime.now; countdownend = datetime.now.addminutes(database.jianghu.getminute sontalent(talent)); } public void theadtime(client.gamestate client) { try { if (client == null) return; if (client.entity == null) return; if (!client.entity.fullyloaded) return; if (datetime.now > timerstamp.addminutes(1)) { if (client.entity.pkmode != enums.pkmode.jiang) { if (onjiangmode) { if (datetime.now >= removejiangmod.addminutes(10)) { onjiangmode = false; sendstatusmode(client); } } } if (client.entity.pkmode == enums.pkmode.jiang) { onjiangmode = true; removejiangmod = datetime.now; } if (freecourse < 1000000) { if (intwincastle(client.entity)) { startcountdwon = startcountdwon.addminutes(database.jianghu.getminu tesincastle(talent)); freecourse += database.jianghu.getfreecourseincastle(talent); } else { freecourse += database.jianghu.getfreecourse(talent); startcountdwon = startcountdwon.addminutes(1); } if (startcountdwon > countdownend) getreward(client); sendinfo(client, network.gamepackets.jianghu.updatetime, freecourse.tostring(), time.tostring()); if (freecourse % 10000 == 0) getreward(client); } else freecourse = 10000000; timerstamp = datetime.now; } } catch (exception) { } } public bool getrate(byte val) { return (random.next() % 100) < val; } public void getkill(client.gamestate attacker, jianghu attacked) { if (attacker.entity.jiangtalent < 4) { if (attacker.entity.jiangtalent <= attacked.talent) { attacked.talent -= 1; talent += 1; attacker.entity.jiangtalent = talent; sendinfo(attacker, network.gamepackets.jianghu.updatetalent, attacker.entity.uid.tostring(), talent.tostring()); } } } public bool samecoursestage(uint first, uint last) { if (first > 100000) return first.tostring()[2] == last.tostring()[2]; else return first.tostring()[1] == last.tostring()[1]; } public void getreward(client.gamestate client) { do freecourse++; while (freecourse % 1000 != 0); sendinfo(client, network.gamepackets.jianghu.updatetime, freecourse.tostring(), time.tostring()); createtime(); } public bool intwincastle(entity location) { ushort x = location.x; ushort y = location.y; if (location.mapid != 1002) return false; if (x <= 357 && x >= 274 && y <= 277 && y >= 110) return true; if (x >= 335 && x <= 370 && y <= 235 && y >= 232) return true; if (x >= 281 && x <= 350 && y >= 268 && y <= 322) return true; if (x >= 247 && x <= 291 && y >= 200 && y <= 243) return true; return false; } public object sync = new object(); public void sendinfo(client.gamestate client, byte mode = 1, params string[] data) { lock (sync) { try { network.gamepackets.jianghu jinag = new network.gamepackets.jianghu(); jinag.mode = mode; jinag.texts = new list<string>(data); jinag.createarray(); jinag.send(client); } catch (exception) { } } } public void sendstatus(client.gamestate client, client.gamestate attacked) { try { var dictionary = stagers.where(p => p.activate); network.gamepackets.jianghustatus stat = new network.gamepackets.jianghustatus((byte)dictionary .count()); stat.name = customizedname; stat.freetimetodey = 10;//freetimetodey; stat.talent = talent; stat.stage = stage; stat.roundbuypoints = roundbuypoints; stat.freetimetodeyused = (byte)freetimetodeyused; stat.studypoints = attacked.entity.subclasses.studypoints; if (client.entity.uid != attacked.entity.uid) stat.timer = 13751297; else stat.timer = 15500800; stat.apprend(dictionary.toarray()); client.send(stat.toarray()); } catch (exception) { } } public void updatestundypoints(client.gamestate client, ushort amount) { network.gamepackets._string str = new network.gamepackets._string(true); str.type = network.gamepackets._string.effect; str.uid = client.entity.uid; str.texts.add("zf2-e300"); client.sendscreen(str.toarray(), true); } public static bool allownamecaracters(string name) { if (name.contains('[')) return false; if (name.contains(']')) return false; if (name.contains("gm")) return false; if (name.contains("pm")) return false; if (name.contains("!") || name.contains("@") || name.contains("#")) return false; if (name.contains("$") || name.contains("%") || name.contains("^")) return false; if (name.contains("&") || name.contains("*") || name.contains("/") || name.contains("|")) return false; return true; } } }