VIP Boost Банери Кредити
Основно Начало Сървъри Marketplace Новини Форум Сървъри
Общности Хостинг Добави Boost
Ресурси
Библиотеки Карти Видеа Магазин
Инструменти
Builder Demo CFG HUD
AMXX API
Вход Регистрация

ip.inc

cerberus.cstrike.in.ua/

.inc 3.5 KB 144 реда 04.04.2026
Pawn / AMX Mod X
#if defined _ip_included
  #endinput
#endif
#define _ip_included

/*
	IP converter by Zefir<[email protected]>
		developed for Cerberus project
		http://cerberus.cstrike.in.ua/
	2 jule 2009 (c) Zefir


	WARNING!!! INPUT DATA NOT CHECKED FOR AVAILABLE RANGE
	WARNING!!! mask used only left filled, not mask as 11101111 11110000 000...

	inet_aton(ip_string[])
		convert x.x.x.x to LONG
		return unsigned long

	inet_ntoa(ip_number)
		convert LONG to x.x.x.x
		return string[16]

	inet_atom(mask_string)
		convert x.x.x.x to /xx
		return digit 0-32

	inet_ntom(mask_number)
		convert LONG to /xx
		return digit 0-32

	inet_mtoa(mask_string)
		convert /xx to x.x.x.x
		return string[16]

	inet_mton(mask_string)
		convert /xx to LONG
		return unsigned long

	inet_maskton(mask_string[])
		convert both types (/xx or x.x.x.x)  to LONG
		return unsigned long

	inet_range(net_string, &net, &mask)
		get net and mask as LONG from subnet x.x.x.x/xx OR x.x.x.x/x.x.x.x
		return true if mask /32

	in_range(net[], ip[])
		check net[] subnet contain ip[] address

	ip_local(ip)
		return true if ip as LONG be contained in any from this networks:
			127.0.0.0/8
			10.0.0.0/8
			172.16.0.0/12
			192.168.0.0/16
			169.254.0.0/16

*/

stock inet_aton(const ip_string[]) {
	static ip[16], ips[1], i, j, cur; ips[0] = 0; j = 0; cur = 0;
	copy(ip, 15, ip_string);
	while (j < 3 && (i = contain(ip[cur], ".")) > -1) {
		ip[cur + i++] = EOS;
		ips{j++} = str_to_num(ip[cur]);
		cur += i;
	}
	ips{j} = str_to_num(ip[cur]);
	return ips[0]
}

stock inet_ntoa(ip) {
	static ip_string[16], ips[1]; ip_string[0] = EOS; ips[0] = ip
	formatex(ip_string, 15, "%d.%d.%d.%d", ips{0}, ips{1}, ips{2}, ips{3});
	return ip_string;
}


stock inet_atom(const mask_string[]) {
	static ip, i; ip = inet_aton(mask_string), i = 0;
	while (!(ip & 1) && i++ < 31) ip >>>= 1;
	return 31 - i;
}

stock inet_ntom(mask) {
	static i; i = 0;
	while (!(mask & 1) && i++ < 31) mask >>>= 1;
	return 31 - i;
}

stock bool:inet_range(const net_string[], &net, &mask) {
	static lnet[16], i;
	if ((i = contain(net_string, "/")) > -1) {
		copy(lnet, i, net_string);
		mask = inet_maskton(net_string[i + 1]);
	} else {
		mask = 0;
	}
	net = inet_aton(lnet) & mask;
	return mask == 4294967295;
}

stock bool:in_range(const net_string[], const ip_string[]) {
	static net, mask;
	inet_range(net_string, net, mask);
	return inet_aton(ip_string) & mask == net;
}

// All int is signed. And mask first bit, its bit of sign. :(
// Set if mask > 0 and signed shift of mask bits count - 1
stock inet_mton(const mask_string[]) {
	static mask;
	mask = str_to_num(mask_string);
	if (!mask) return 0;
	return 4294967295 << (31 - mask);
}

stock inet_mtoa(const mask_string[])
	return inet_ntoa(inet_mton(mask_string));

stock inet_maskton(const mask_string[]) {
	if (contain(mask_string, ".") > -1)
		return inet_aton(mask_string);
	return inet_mton(mask_string);
}

/*
net: 127.0.0.0/8,    net = 2130706432, mask = 4278190080
net: 10.0.0.0/8,     net = 167772160,  mask = 4278190080
net: 172.16.0.0/12,  net = 2886729728, mask = 4293918720
net: 192.168.0.0/16, net = 3232235520, mask = 4294901760
net: 169.254.0.0/16, net = 2851995648, mask = 4294901760
*/
stock bool:ip_local(ip) {
	return	2130706432 == ip & 4278190080 ||
			167772160  == ip & 4278190080 ||
			2886729728 == ip & 4293918720 ||
			3232235520 == ip & 4294901760 ||
			2851995648 == ip & 4294901760;
}


РЕКЛАМИРАЙ ПРИ НАС!
AMXX-BG.INFO
КАК ДА ИЗПОЛЗВАМ
Добави в началото на .sma файла:
#include <ip>
1. Изтегли
Свали файла от бутона по-горе
2. Копирай
Постави в scripting/include/
3. Включи
Добави #include директивата
4. Компилирай
Използвай amxxpc или scripting/compile.exe