Jump to content
  • 0

Enchant Configs Messed up??


Question

Posted

 

 

Hello i have this abstractEnchantPacket & configs working without errors but i think are messed up..

With 60% enchant ratios in blessed and they take the ratio of crystal scrolls (90%) somehow.. (tested)

What is messed up here?

/*
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program. If not, see <http://www.gnu.org/licenses/>.
 */
package net.sf.l2j.gameserver.network.clientpackets;

import java.util.HashMap;
import java.util.Map;

import net.sf.l2j.Config;
import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
import net.sf.l2j.gameserver.model.item.kind.Item;
import net.sf.l2j.gameserver.model.item.kind.Weapon;
import net.sf.l2j.gameserver.model.item.type.CrystalType;
import net.sf.l2j.gameserver.model.item.type.WeaponType;

public abstract class AbstractEnchantPacket extends L2GameClientPacket
{
	public static final Map<Integer, EnchantScroll> _scrolls = new HashMap<>();
	
	public static final class EnchantScroll
	{
		protected final boolean _isWeapon;
		protected final CrystalType _grade;
		private final boolean _isBlessed;
		private final boolean _isCrystal;
		
		public EnchantScroll(boolean wep, boolean bless, boolean crystal, CrystalType type)
		{
			_isWeapon = wep;
			_grade = type;
			_isBlessed = bless;
			_isCrystal = crystal;
		}
		
		/**
		 * @param enchantItem : The item to enchant.
		 * @return true if support item can be used for this item
		 */
		public final boolean isValid(ItemInstance enchantItem)
		{
			if (enchantItem == null)
				return false;
			
			// checking scroll type and configured maximum enchant level
			switch (enchantItem.getItem().getType2())
			{
				case Item.TYPE2_WEAPON:
					if (!_isWeapon || (Config.ENCHANT_MAX_WEAPON > 0 && enchantItem.getEnchantLevel() >= Config.ENCHANT_MAX_WEAPON))
						return false;
					break;
				
				case Item.TYPE2_SHIELD_ARMOR:
				case Item.TYPE2_ACCESSORY:
					if (_isWeapon || (Config.ENCHANT_MAX_ARMOR > 0 && enchantItem.getEnchantLevel() >= Config.ENCHANT_MAX_ARMOR))
						return false;
					break;
				
				default:
					return false;
			}
			
			// check for crystal type
			if (_grade != enchantItem.getItem().getCrystalType())
				return false;
			
			return true;
		}
		
		/**
		 * @return true if item is a blessed scroll.
		 */
		public final boolean isBlessed()
		{
			return _isBlessed;
		}
		
		/**
		 * @return true if item is a crystal scroll.
		 */
		public final boolean isCrystal()
		{
			return _isCrystal;
		}
		
		/**
		 * Regarding enchant system :<br>
		 * <br>
		 * <u>Weapons</u>
		 * <ul>
		 * <li>magic weapons has chance of 40% until +15 and 20% from +15 and higher. There is no upper limit, there is no dependance on current enchant level.</li>
		 * <li>non magic weapons has chance of 70% until +15 and 35% from +15 and higher. There is no upper limit, there is no dependance on current enchant level.</li>
		 * </ul>
		 * <u>Armors</u>
		 * <ul>
		 * <li>non fullbody armors (jewelry, upper armor, lower armor, boots, gloves, helmets and shirts) has chance of 2/3 for +4, 1/3 for +5, 1/4 for +6, ...., 1/18 +20. If you've made a +20 armor, chance to make it +21 will be equal to zero (0%).</li>
		 * <li>full body armors has a chance of 1/1 for +4, 2/3 for +5, 1/3 for +6, ..., 1/17 for +20. If you've made a +20 armor, chance to make it +21 will be equal to zero (0%).</li>
		 * </ul>
		 * @param enchantItem : The item to enchant.
		 * @return the enchant chance under double format (0.7 / 0.35 / 0.44324...).
		 */
		public final double getChance(ItemInstance enchantItem)
		{
			if (!isValid(enchantItem))
				return -1;
			
			boolean fullBody = enchantItem.getItem().getBodyPart() == Item.SLOT_FULL_ARMOR;
			if (enchantItem.getEnchantLevel() < Config.ENCHANT_SAFE_MAX || (fullBody && enchantItem.getEnchantLevel() < Config.ENCHANT_SAFE_MAX_FULL))
				return 1;
			
			double chance = 0;
			
			// Armor formula : 0.66^(current-2), chance is lower and lower for each enchant.
            if (isBlessed())
            {
                if (enchantItem.isArmor())
                    chance = Math.pow(Config.ENCHANT_CHANCE_ARMOR_BLESSED, (enchantItem.getEnchantLevel() - 2));
                // Weapon formula is 70% for fighter weapon, 40% for mage weapon. Special rates after +14.
                else if (enchantItem.isWeapon())
                {
                    if (((Weapon) enchantItem.getItem()).isMagical())
                        chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS_BLESSED : Config.ENCHANT_CHANCE_WEAPON_MAGIC_BLESSED;
                    else
                        chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS_BLESSED : Config.ENCHANT_CHANCE_WEAPON_NONMAGIC_BLESSED;
                }
            }
            else if (isCrystal())
            {
                if (enchantItem.isArmor())
                    chance = Math.pow(Config.ENCHANT_CHANCE_ARMOR_CRYSTAL, (enchantItem.getEnchantLevel() - 2));
                // Weapon formula is 70% for fighter weapon, 40% for mage weapon. Special rates after +14.
                else if (enchantItem.isWeapon())
                {
                    if (((Weapon) enchantItem.getItem()).isMagical())
                        chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS_CRYSTAL : Config.ENCHANT_CHANCE_WEAPON_MAGIC_CRYSTAL;
                    else
                        chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS_CRYSTAL : Config.ENCHANT_CHANCE_WEAPON_NONMAGIC_CRYSTAL;
                }
            }
            else
            {
                if (enchantItem.isArmor())
                    chance = Math.pow(Config.ENCHANT_CHANCE_ARMOR, (enchantItem.getEnchantLevel() - 2));
                // Weapon formula is 70% for fighter weapon, 40% for mage weapon. Special rates after +14.
                else if (enchantItem.isWeapon())
                {
                    if (((Weapon) enchantItem.getItem()).isMagical())
                        chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS : Config.ENCHANT_CHANCE_WEAPON_MAGIC;
                    else
                        chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS : Config.ENCHANT_CHANCE_WEAPON_NONMAGIC;
                }
            }
			
			return chance;
		}
	}
	
	/**
	 * Format : itemId, (isWeapon, isBlessed, isCrystal, grade)<br>
	 * Allowed items IDs must be sorted by ascending order.
	 */
	static
	{
		// Scrolls: Enchant Weapon
		_scrolls.put(729, new EnchantScroll(true, false, false, CrystalType.A));
		_scrolls.put(947, new EnchantScroll(true, false, false, CrystalType.B));
		_scrolls.put(951, new EnchantScroll(true, false, false, CrystalType.C));
		_scrolls.put(955, new EnchantScroll(true, false, false, CrystalType.D));
		_scrolls.put(959, new EnchantScroll(true, false, false, CrystalType.S));
		
		// Scrolls: Enchant Armor
		_scrolls.put(730, new EnchantScroll(false, false, false, CrystalType.A));
		_scrolls.put(948, new EnchantScroll(false, false, false, CrystalType.B));
		_scrolls.put(952, new EnchantScroll(false, false, false, CrystalType.C));
		_scrolls.put(956, new EnchantScroll(false, false, false, CrystalType.D));
		_scrolls.put(960, new EnchantScroll(false, false, false, CrystalType.S));
		
		// Blessed Scrolls: Enchant Weapon
		_scrolls.put(6569, new EnchantScroll(true, true, false, CrystalType.A));
		_scrolls.put(6571, new EnchantScroll(true, true, false, CrystalType.B));
		_scrolls.put(6573, new EnchantScroll(true, true, false, CrystalType.C));
		_scrolls.put(6575, new EnchantScroll(true, true, false, CrystalType.D));
		_scrolls.put(6577, new EnchantScroll(true, true, false, CrystalType.S));
		
		// Blessed Scrolls: Enchant Armor
		_scrolls.put(6570, new EnchantScroll(false, true, false, CrystalType.A));
		_scrolls.put(6572, new EnchantScroll(false, true, false, CrystalType.B));
		_scrolls.put(6574, new EnchantScroll(false, true, false, CrystalType.C));
		_scrolls.put(6576, new EnchantScroll(false, true, false, CrystalType.D));
		_scrolls.put(6578, new EnchantScroll(false, true, false, CrystalType.S));
		
		// Crystal Scrolls: Enchant Weapon
		_scrolls.put(731, new EnchantScroll(true, false, true, CrystalType.A));
		_scrolls.put(949, new EnchantScroll(true, false, true, CrystalType.B));
		_scrolls.put(953, new EnchantScroll(true, false, true, CrystalType.C));
		_scrolls.put(957, new EnchantScroll(true, false, true, CrystalType.D));
		_scrolls.put(961, new EnchantScroll(true, false, true, CrystalType.S));
		
		// Crystal Scrolls: Enchant Armor
		_scrolls.put(732, new EnchantScroll(false, false, true, CrystalType.A));
		_scrolls.put(950, new EnchantScroll(false, false, true, CrystalType.B));
		_scrolls.put(954, new EnchantScroll(false, false, true, CrystalType.C));
		_scrolls.put(958, new EnchantScroll(false, false, true, CrystalType.D));
		_scrolls.put(962, new EnchantScroll(false, false, true, CrystalType.S));
	}
	
	/**
	 * @param scroll The instance of item to make checks on.
	 * @return enchant template for scroll.
	 */
	protected static final EnchantScroll getEnchantScroll(ItemInstance scroll)
	{
		return _scrolls.get(scroll.getItemId());
	}
	
	/**
	 * @param item The instance of item to make checks on.
	 * @return true if item can be enchanted.
	 */
	protected static final boolean isEnchantable(ItemInstance item)
	{
		if (item.isHeroItem() || item.isShadowItem() || item.isEtcItem() || item.getItem().getItemType() == WeaponType.FISHINGROD)
			return false;
		
		// only equipped items or in inventory can be enchanted
		if (item.getLocation() != ItemInstance.ItemLocation.INVENTORY && item.getLocation() != ItemInstance.ItemLocation.PAPERDOLL)
			return false;
		
		return true;
	}
}
    /** Enchant */
    public static double ENCHANT_CHANCE_WEAPON_MAGIC_BLESSED;
    public static double ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS_BLESSED;
    public static double ENCHANT_CHANCE_WEAPON_NONMAGIC_BLESSED;
    public static double ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS_BLESSED;
    public static double ENCHANT_CHANCE_ARMOR_BLESSED;
    public static double ENCHANT_CHANCE_WEAPON_MAGIC_CRYSTAL;
    public static double ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS_CRYSTAL;
    public static double ENCHANT_CHANCE_WEAPON_NONMAGIC_CRYSTAL;
    public static double ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS_CRYSTAL;
    public static double ENCHANT_CHANCE_ARMOR_CRYSTAL;
    public static double ENCHANT_CHANCE_WEAPON_MAGIC;
    public static double ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS;
    public static double ENCHANT_CHANCE_WEAPON_NONMAGIC;
    public static double ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS;
    public static double ENCHANT_CHANCE_ARMOR;
    public static int ENCHANT_MAX_WEAPON;
    public static int ENCHANT_MAX_ARMOR;
    public static int ENCHANT_SAFE_MAX;
    public static int ENCHANT_SAFE_MAX_FULL;
		ENCHANT_CHANCE_WEAPON_MAGIC = players.getProperty("EnchantChanceMagicWeapon", 0.4);
		ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS = players.getProperty("EnchantChanceMagicWeapon15Plus", 0.2);
		ENCHANT_CHANCE_WEAPON_NONMAGIC = players.getProperty("EnchantChanceNonMagicWeapon", 0.7);
		ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS = players.getProperty("EnchantChanceNonMagicWeapon15Plus", 0.35);
		ENCHANT_CHANCE_ARMOR_BLESSED = players.getProperty("EnchantChanceArmorBlessed", 0.66);
		ENCHANT_CHANCE_WEAPON_MAGIC_BLESSED = players.getProperty("EnchantChanceMagicWeaponBlessed", 0.4);
		ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS_BLESSED = players.getProperty("EnchantChanceMagicWeapon15PlusBlessed", 0.2);
		ENCHANT_CHANCE_WEAPON_NONMAGIC_BLESSED = players.getProperty("EnchantChanceNonMagicWeaponBlessed", 0.7);
		ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS_BLESSED = players.getProperty("EnchantChanceNonMagicWeapon15PlusBlessed", 0.35);
		ENCHANT_CHANCE_ARMOR_CRYSTAL = players.getProperty("EnchantChanceArmorCrystal", 0.66);
		ENCHANT_CHANCE_WEAPON_MAGIC_CRYSTAL = players.getProperty("EnchantChanceMagicWeaponCrystal", 0.4);
		ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS_CRYSTAL = players.getProperty("EnchantChanceMagicWeapon15PlusCrystal", 0.2);
		ENCHANT_CHANCE_WEAPON_NONMAGIC_CRYSTAL = players.getProperty("EnchantChanceNonMagicWeaponCrystal", 0.7);
		ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS_CRYSTAL = players.getProperty("EnchantChanceNonMagicWeapon15PlusCrystal", 0.35);

 

2 answers to this question

Recommended Posts

  • 0
Posted (edited)

What you mean (tested)? make your blessed condition like this

if (isBlessed())
{
	if (enchantItem.isArmor())
		chance = Math.pow(Config.ENCHANT_CHANCE_ARMOR_BLESSED, (enchantItem.getEnchantLevel() - 2));
	
	// Weapon formula is 70% for fighter weapon, 40% for mage weapon. Special rates after +14.
	else if (enchantItem.isWeapon())
	{
		if (((Weapon) enchantItem.getItem()).isMagical())
			chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS_BLESSED : Config.ENCHANT_CHANCE_WEAPON_MAGIC_BLESSED;
		else
			chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS_BLESSED : Config.ENCHANT_CHANCE_WEAPON_NONMAGIC_BLESSED;
	}
	System.out.println("Config chance: " + chance);
}

I think you will solve your problem (if any) by urself.

 

Edited by melron

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

    • ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ L2DEVS — Premium L2OFF Extender for Lineage 2 Interlude 100+ Systems | Production Ready | 6+ Years Live Tested https://l2devs.com ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ L2Devs is a premium L2OFF extender built from years of real server experience. It extends the original Interlude core with 100+ configurable systems — PvP mechanics, event engines, economy control, anti-bot protection — without touching the original server source code. Every system is designed for real production: high concurrency, crash-safe routines, reduced DB load, deep configurability through external config files. No bloat. No experimental features. Only what actually works on live servers. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🔥 WHAT'S NEW — 2026 RELEASE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [NEW] Character Marketplace — Full in-game character trading. List, browse and buy characters directly from the server. Admin controls, price limits and anti-abuse validation included. [NEW] Auto Farm System — 100% functional in-game auto farm with configurable zones, skill usage and item pickup. Fully operator-controlled. [NEW] .bonus Command — Real-time bonus status viewer. Players check active rates, buffs and event bonuses at any moment with a single command. [NEW] Last Man Standing (LMS) — New event mode, last player standing wins. Configurable teams, areas and rewards. [NEW] Kill The Boss (KTB) — Team-based event, eliminate the raid boss. Full config: spawn, rewards and team balance. [NEW] Fake Hero System — Award hero status visually without affecting rankings. Configurable duration and effects. [NEW] Visual Weapons & Armor — Display alternate skins client-side without impacting actual stats. [IMPROVED] Anti-Bot Captcha v4 — Completely rebuilt from scratch. Smarter, lighter, harder to bypass. [IMPROVED] Advanced Balance System — Per-class, per-skill and per-scenario control. Fine-tune damage and healing for any situation. [FIXED] Nick Change Service — Completely reworked. Validation, history logging, edge-case fixes. Production-ready. [REWORKED] PvP Auto Announce — Rebuilt for kills, streaks and milestones. Fully configurable messages and thresholds. [REWORKED] Happy Hour Event — Flexible scheduling, rate multipliers, configurable announces. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ⚙️ GENERAL SYSTEMS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - Cached Extended IOBuffer (8192kb) - Offline Shops & Buffers (restore after restart with fixed location) - Offline Buffer System - ALT+B Augmentation House - Shift+Click Drop/Spoil List - Auto Learn Skills - Scheme Buffer - Global Trade Chat - Global Vote Reward System (Hopzone, Topzone, custom) - Achievements System - Custom Subclass (Accumulative stats) - Change Name / Title Color - Change Gender / Race (Skin) - VIP System (chat, autoloot, extended features) - .menu Command (fully configurable) - Pet Sales via Multisell - Item Bid Auctioner for Clan Halls - Show Mob Level / NPC Clan Flag - Spawn Protection System - Min Level Trade - Use Any Dyes - No Drop on Death (configurable) - Auto Potion System (by Item ID, HP/MP %, reuse delay) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ⚔️ PVP & OLYMPIAD ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - PvP Auto Announce System (rebuilt) - PvP / PK / War Reward - Epic Items Rank - Raid Boss Points Rank - Global PvP Rankings - Anti Abuse Validations - Olympiad Season Rank Pages - Restore Stats on Fight Start - Olympiad Second Time System - Last 10 Minutes Entry - Third Class Summons Control - Castle Announce & Standby Time - Champion System with Rewards - Damage Cap System - Item % Steal by Zone - Last Hit Announce (Raid/Boss) - Disable SSQ after Castle Siege ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🎯 EVENT ENGINE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - Team vs Team (TvT) - Capture The Flag (CTF) - Death Match (DM) - Last Man Standing (LMS) — NEW - Kill The Boss (KTB) — NEW - Destroy The Base (DTB) - Korean Style Events - Castle Siege Events - Happy Hour Event (reworked) - Win/Loss Rewards - Custom Team Titles & Colors - Kill Counter in Title - Firework Effects - Reset Buffs on Finish - Balance Bishops - Disconnect Recovery - Open Door / Wall System - AFK Time Control ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 💎 DROPS, ENCHANT & ITEMS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - Fully Configurable Drop System (min/max level, all mobs, RBs, individual) - Armor Enchant Bonus System (+7/+8/+9 extra bonuses) - Enchant Stats System (full control per enchant level) - Blessed Enchant Rates (armor & weapons) - Enchant Restrictions & Protections - Spellbook Drop Enable/Disable - Custom Cancel Effects (min/max configurable) - Raid Boss HP % Announce - No Sell / No Private Buy Items ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🔒 SECURITY & PERFORMANCE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - Anti-Bot & Captcha v4 (2026) — rebuilt from scratch - Anti-Exploit & Anti-Abuse (multi-layer) - Safe Enchant & Item Handling - Crash-Safe Routines - Optimized Thread Usage - Reduced Database Load - Improved Packet Handling - High Concurrency Design (tested 2000+ connections) - Tested on Live Servers 6+ Years ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🔄 HOT RELOAD — NO RESTART NEEDED ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ EnterWorld HTML | Donate Shop | Offline Buffer | Champion NPC | AntiBot | VIP System | Auction System | AutoLoot | Castle Siege Manager | Character Lock | Clan PvP Status | Auto Learn | Skill Data | Door Data | Deco Data | Multisell / Drop List | Custom Config Files ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 💰 PRICING — LAUNCH OFFER ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🔥 FULL PACK — $299 USD only cryptos (regular price $450 — save 33%)    + $30 USD/month (updates & support) Includes: ✔ Compiled extender (L2OFF Interlude) ✔ Full configuration files ✔ All 100+ systems active ✔ Client dashboard access ✔ IP change at no extra cost ✔ Monthly updates & improvements ✔ Priority support via Discord/Telegram ✔ Tested on live servers 6+ years   SOURCE CODE — $1499 USD only cryptos   ⚠️ Launch offer is limited time. Price returns to $450 after offer ends. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 📬 CONTACT ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Website: https://l2devs.com Discord & Telegram: available on the website Questions? Open a ticket or contact us on Discord. We respond fast. L2Devs — Built for servers that take quality seriously. Unique features, everything else is just a copy. Regards. The H5 and Classic versions will be available very soon!
    • “ONE FACE — AND THE WHOLE KYC FAILS.” ▪ Sometimes the task looks simple, but in reality everything comes down to the details. ▪ A client recently wrote to us. He needed a **North Carolina DL** to pass live verification on Sumsub. He already had the source file — all that was required was to carefully **replace the face in the photo**, without touching any other data. ▪ At first glance — a routine edit. But there’s a catch: such documents are often checked **via photo upload + live verification**. ▪  That’s why it’s critical not just to insert a new face, but to preserve: — texture and grain of the original photograph — lighting of the card — geometry / perspective of the photo inside the document — overall image balance ▪ Even the smallest mismatch can give away the edit. ▪ We prepared a clean version of the document, the client used it for his verification — and **it passed successfully**. ▪ Sometimes it’s not the complexity of the document that matters, but **how precisely the photo inside it is handled**. ▪ ️ If you have a similar task — write to us in private messages and briefly describe the situation. We’ll advise what can be done and which options will work best. *All data is presented with the client’s consent.* › TG: https://t.me/mustang_service ( https:// t.me/ mustang_service ) › Channel: https://t.me/+JPpJCETg-xM1NjNl ( https:// t.me/ +JPpJCETg-xM1NjNl ) #case #documents #verification #edit #kyc
    • why? why would you help him in private? tomorrow someone else will have the same request, are you going to help them all in private, instead of sharing obvious info publicly? 1. 'Lucera' - yes, they have what you described, but you would have to pay for that. 2. 'a lot of classic chronicles...' - also right, the only difference is kamaels and more features in higher version, but that's not a clean interlude, you would have to implement/remove a lot of things. there's actually no 'ready to use' free option (clean interlude but classic) and most people are going to try to sell you some garbage. so what can you do? try classic version before 3.0, you can take mobius files to test everything - maybe you like it as it is and no additional changes would be required, but if you not - the only way is you would have to implement what is missing and remove what is additional.
    • this is the first time i hear that anyone struggles with something that works correctly... your "solution" is basically a bug. and you forgot the most important thing: if you do something like that - which is changing right behaviour with wrong - it must be possible to turn it on/off
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..